如何杀掉Oracle中的会话

如何杀掉Oracle中的会话,第1张

有时,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上的时候

1.oracle中文概念手册

连接 (connection)与会话 (session)这两个概念均与用户进程 (user process)紧密相关,但二者又具有不同的含义。

连接 :用户进程和 Oracle 实例间的通信通道(communication pathway)。这个通信通道是通过进程间的通信机制(interprocess communication mechanisms)(在同一个计算机上运行用户进程和 Oracle 进程)或网络软件(network software)(当数据库应用程序与 Oracle 服务器运行在不同的计算机上时,就需要通过网络来通信)建立的。

会话 :用户通过用户进程与 Oracle 实例建立的连接[此处连接与上文中的连接含义不同 ,主要指用户和数据库间的联系 ]。例如,当用户启动 SQL*Plus 时必须提供有效的用户名和密码,之后 Oracle 为此用户建立一个会话。从用户开始连接到用户断开连接(或退出数据库应用程序)期间,会话一直持续。

Oracle 数据库中的同一个用户可以同时创建多个会话。例如,用户名/密码为的SCOTT/TIGER 用户可以多次连接到同一个 Oracle 实例。

当系统没有运行在共享服务模式下时,Oracle 为每个用户会话创建一个服务进程(server process)。而当系统运行在共享服务模式下时,多个用户会话可以共享同一个服务进程。

2.通过实例理解(备注此实力来源于http://hi.baidu.com/bystander1983/blog/item/7201a3835d1961ab0cf4d294.html)

有A/B两个城市,需要从A运送白菜 到B城

先建一条公路

然后运送白菜过去,包括准备白菜和运送白菜以及返回等一系列的动作。

一条公路,可以运送0-n次的白菜

当然从A到B的公路也可能不只一条 。

某一次运送白菜,可以在真正上路时才开通某一条道路

一次运送不会影响别的运送的状态

对应数据库

A代表客户端进程

B代表服务器端进程

公路代表连接 ,

运送一次白菜代表一个会话

一个连接可以进行多次的会话

一个会话可以不依赖于某个连接,甚至没有连接(当我准备好了,真正开始运送时再建立连接)

一个会话不会影响别的会话

给你复制几段,顺便自己也复习一下:

连接

连接:是从客户到Oracle实例的一条物理路径。连接可以是客户端通过网络建立(客户端和数据库不在同一个服务器上),也可能是客户端和数据库都在一个服务器上通过IPC机制建立。

会话

会话是实例中的一个逻辑实体,可以在会话上执行SQL、提交事务等。

服务进程

服务进程就是代表客户会话完成工作的进程。应用向数据库发送的SQL语句最后就是由服务进程接受并执行。无论是共享服务器还是专用服务器,服务进程的作用都是处理提交的SQL语句。

区别和联系

连接与会话

一提到连接,很多人第一印象都认为连接对应的就是会话。其实不然在一个连接上可以对应0个、一个、多个会话。会话也可以独立于连接,当然此次连接的状态为空闲状态。同一条物理连接上的会话都是单独而且独立的,每个会话可以使用不同的用户身份。

会话与服务进程

专用服务器:

同一个连接上的所有会话都有同一个服务进程创建。

共享服务器:

同一个连接上的会话不一定都是由相同的服务进程创建。

连接与服务进程

专用服务器模式:

客户端向数据库服务器发出请求,当监听器监听到之后会创建一个服务进程专门为该连接服务的服务进程(或者是线程),为一一对应的关系。

共享服务器模式下:

客户端向数据库服务器发出请求,当监听收到之后会分配一个调度程序与客户建立连接。在共享服务器模式下,相当于在一个池中创建好一些服务进程。当客服端发出请求时,与客户端连接的调度程序会将请求放入请求队列,让后从服务进程的池中随机取出一个空闲的服务进程为其服务把产生的结果放到相应队列,结束之后服务进程会重新变为空闲进程。

Note:一旦客户进程与服务进程建立连接,监听就不在被需要。

1. 如果是dedicated server,则客户端只能创建dedicated server connection

2. 如果是shared server,则客户端能创建dedicated server connection和shared server connection如果是从服务器通过IPC机制连接的为dedicated server connection,如果是通过tns连接则为shared server connection。这是因为通过tns连接时需要经过网络发送请求,由监听器分配调度程序负责分配服务进程。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7861173.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存