资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

oracle怎么清线程 线程清理处理程序如何实现

如何杀掉Oracle中的会话

有时,Oracle中造成一些表被死锁或者会话异常退出,如执行了更新记录操作后,既没有commit也没有rollback,网络就断开了,也会造表或记录被锁住,待到超时后才会被解开,那样都会造成应用操作被阻塞。

企业建站必须是能够以充分展现企业形象为主要目的,是企业文化与产品对外扩展宣传的重要窗口,一个合格的网站不仅仅能为公司带来巨大的互联网上的收集和信息发布平台,成都创新互联面向各种领域:发电机租赁成都网站设计网络营销推广解决方案、网站设计等建站排名服务。


可以以Oralce管理员权限用户登录Oracle数据,查询到被锁的对象,然后杀除指定的会话。

用下面的语句查询被锁的对象,可以带上更多约束条件,如schemaname等更精确的匹配。

SELECT

a.object_id, a.session_id, b.object_name, c.*

FROM

v$locked_object a, dba_objects b, v$session c

WHERE

a.object_id = b.object_id

AND

a.SESSION_ID = c.sid(+)

杀Seesion的SQL语句语法如下:

alter system kill session 'sid, serial#'

如上面查出来的一条记录的sid是53, serial#为663,就执行以下的语句 alter system kill session '53,663'

如果要一次性杀死多个会话,一个一个填写sid和serial#十分的繁琐,应该在查询被锁对象的同时拼凑出多条的杀会话语句,以分号分隔,一起复制下来,然后就可以批量的执行了。

拼凑kill语句的方式如下,下面加了一个过滤条件和一个排序,杀除真正关心的表,并且着重注意超时时间过长的会话。

SELECT 'alter system kill session ''' || c.sid || '' || ',' || c.serial# ||''';',

a.object_id, a.session_id, b.object_name, c.*

FROM v$locked_object a, dba_objects b, v$session c

WHERE a.object_id = b.object_id

AND a.SESSION_ID = c.sid(+)

AND schemaname = 'Unmi'

ORDER BY logon_time

你遇到过下面类似的情况吗?一个用户进程长期占用资源而不释放,导致Oracle进程占用了系统的大量资源,Oralce系统的效率变得很低。如果简单的关闭重启Oracle

实例,势必影响所有的用户。有没有办法仅仅只Kill掉有问题的用户进程而不用关闭整个Oralce实例呢?答案是可以的,使用Oralce提供的一个名叫Orakill的工具。

大家都知道,Windows

2000是一个基于线程的操作系统,而不是象Unix、Linux那样基于进程的操作系统。整个Oracle的后台进程、用户进程等,在Windows

2000环境下,都包含在ORACLE.EXE这单独的一个体系进程中了,通过查看’任务管理器’――’进程’就可以看到。如果你不是使用MTS多线程服

务器的模式,如果你Kill掉ORACLE.EXE这个进程,将导致整个Oracle实例关闭,如同使用Shutdown

abort命令一样。

由于Windows自己没有提过一个专门用来Kill掉单个线程的工具,因此Oracle从Oracle7.3.3.6开始,自己提供了一个基于字符界面的用来在Windows环境下强制Kill掉一个线程的工具――Orakill。

在NT中如果使用alter system kill

session

'sid,serial#'来清楚会话,在执行之后该会话的状态会变为KILLED,但是有时候这个状态会保持很长时间,直到最后被清除。

如果想更快地从内存中清理这个会话,那么可以在使用了alter

system之后,再在NT中使用Orakill实用程序(该程序随Oracle数据库同时安装)直接清除该会话的线程。

Orakill的使用方法如下:

Dos提示符下:orakill sid thread

说明: sid Oracle的Sid号

thread Oracle的线程id号

首先取得被杀掉的会话的Thread Number:

SET pagesize 100

SET linesize 100

COLUMN Program format a20

SELECT s.sid AS "Sid", s.serial# AS "Serial#", p.spid AS

"ThreadID",

s.osuser

AS "OSUser", s.program AS "Program"

FROM v$process p, v$session s

WHERE p.addr = s.paddr(+)

ORDER BY s.sid

输出可能如下:

Sid Serial# ThreadID OSUser Program

--- ------- -------- ------ -------

...

10 809 102 User01 Prog.exe

11 345 333 SeUser App.exe

15 719 422 User01 Prge.exe

20 345 123 SeUs Acco.exe

555

324

然后在命令行窗口执行Orakill命令

例:orakill ORCL 555

orakill ORCL 324

orakill的命令帮助如下:

C:orakill

Usage: orakill sid thread

where sid = the Oracle instance to target

thread = the thread id of the thread to kill

The thread id should be retrieved from the spid column of a query

such

as:

SELECT spid, osuser, s.program

FROM v$process p, v$session s

WHERE p.addr = s.paddr;

需要注意的是,如果你Kill掉的是Oracle的核心后台线程(DBWR, LGWR, SMON or

PMON),将导致Oracle实例关闭。检查Oracle的核心后台线程的方法如下:

sql:Select vb.name NOME, vp.programe PROCESSNAME,

vp.spid THREADID, vs,sid SID

sql:From v$session vs, v$process vp, v$bgprocess

vb

sql:Where vb.addr

‘00’ and

sql:vb.paddr = vp.addr and

sql:vp.addr = vs.paddr

查询结果如下:

NOME

PROCESSNAME

THREADID SID

----- ----------------------------------- --------- ------

PMON

ORACLE.EXE

169

1

DBW0

ORACLE.EXE

215

2

LGWR

ORACLE.EXE

280

3

CKPT

ORACLE.EXE

267

4

SMON

ORACLE.EXE

287

5

RECO

ORACLE.EXE

288

6

SNP0

ORACLE.EXE

271

7

SNP1

ORACLE.EXE

282

8

8 rows selected.

特别提醒,这里的sid指的是oracle的实例号

select instance from v$instance;

而且orakill只能用于oracle实例安装在windows上的时候

如何启动与关闭Oracle 10g的服务或线程

从Oracle10g开始,Oracle极大的增强了OEM工具,并通过服务器端进行EM工具全面展现。

在10g中,客户端可以不必安装任何Oracle客户端工具,仅凭浏览器就可以调用强大的EM工具。

在Server端,可以通过如下命令启动EM工具控制台:

emctl start dbconsole

以下是启动过程:

[oracle@danaly ~]$ emctl start dbconsole

TZ set to PRC

Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0

Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.

Starting Oracle Enterprise Manager 10g Database Control .......................... started.

------------------------------------------------------------------

Logs are generated in directory /opt/oracle/product/10.2.0/.cn_danaly/sysman/log

启动之后我们就可以通过在浏览器端输入以下url访问:

同样停止OEM可以输入如下命令:

emctl stop dbconsole

以下是停止过程:

[oracle@danaly ~]$ emctl stop dbconsole

TZ set to PRC

Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0

Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.

Stopping Oracle Enterprise Manager 10g Database Control ...... Stopped.

也可以直接键入emctl查看emctl支持的选项:

[oracle@danaly ~]$ emctl

TZ set to PRC

Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0

Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.

Invalid arguments

Unknown command option

Usage::

Oracle Enterprise Manager 10g Database Control commands:

emctl start| stop| status| setpasswd dbconsole

emctl secure

emctl set ssl test|off|on em

emctl set ldap

emctl blackout options can be listed by typing "emctl blackout"

emctl config options can be listed by typing "emctl config"

emctl secure options can be listed by typing "emctl secure"

emctl ilint options can be listed by typing "emctl ilint"

emctl deploy options can be listed by typing "emctl deploy"

Oracle进程删除不掉怎么办?

方法/步骤\x0d\x0a1.查询哪些对象被锁:\x0d\x0aselect object_name,machine,s.sid,s.serial# \x0d\x0afrom v$locked_object l,dba_objects o ,v$session s\x0d\x0awhere l.object_id = o.object_id and l.session_id=s.sid;\x0d\x0a\x0d\x0a2.杀死进程:\x0d\x0aalter system kill session '137,233'; (其中137,223分别是上面查询出的sid,serial#)\x0d\x0a\x0d\x0aPS.以上两步,可通过Oracle的管理控制台来执行。\x0d\x0a\x0d\x0a如果利用上面的方法杀死进程后,进程状态虽被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在OS一级再杀死相应的进程(线程)\x0d\x0a\x0d\x0a1.首先获得进程(线程)号:\x0d\x0aselect spid, osuser, s.program \x0d\x0afrom v$session s,v$process p\x0d\x0awhere s.paddr=p.addr and s.sid=137 (137是上面的sid)\x0d\x0a\x0d\x0a2.在OS上杀死这个进程(线程):\x0d\x0a\x0d\x0a1)在unix上,用root身份执行命令: \x0d\x0a#kill -9 12345(即上面查询出的spid)\x0d\x0a\x0d\x0a2)在windows(unix也适用)用orakill杀死线程,例:c:orakill orcl 12345\x0d\x0aorakill是oracle提供的一个可执行命令,语法为:orakill sid thread\x0d\x0a其中:\x0d\x0asid:表示要杀死的进程属于的实例名\x0d\x0athread:是要杀掉的线程号,即上面查询出的spid。


名称栏目:oracle怎么清线程 线程清理处理程序如何实现
当前地址:http://cdkjz.cn/article/hhecpd.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220