首页 > 数据库 > Oracle > 正文

找到并终止Oracle9i里被锁定的会话

2024-08-29 13:32:04
字体:
来源:转载
供稿:网友
国内最大的酷站演示中心!

由于oracle有内部锁定(的机制),因此有些时候它对于找到并终止oracle里锁定数据库资源的会话很有用。首先,你需要找到所有的oracle会话。下面是一段脚本,用来显示oracle内所有会话的细节。  

remsession.sql - displays all connected sessions
set echo off;
set termout on;
set linesize 80;
set pagesize 60;
set newpage 0;

select
   rpad(c.name||':',11)||rpad(' current logons='||
   (to_number(b.sessions_current)),20)||'cumulative logons='||
   rpad(substr(a.value,1,10),10)||'highwater mark='||
   b.sessions_highwater information
from
   v$sysstat a,
   v$license b,
   v$database c
where
   a.name = 'logons cumulative'
;

ttitle "dbnamedatabase|unix/oracle sessions";

set heading off;
select 'sessions on database '||substr(name,1,8) from v$database;
set heading on;
select
   substr(a.spid,1,9) pid,
   substr(b.sid,1,5) sid,
   substr(b.serial#,1,5) ser#,
   substr(b.machine,1,6) box,
   substr(b.username,1,10) username,
   substr(b.osuser,1,8) os_user,
   substr(b.program,1,30) program
from
   v$session b,
   v$process a
where
   b.paddr = a.addr
and
   type='user'
order by
   spid;
ttitle off;
set heading off;
select 'to kill, enter sqlplus>  alter system kill session',
''''||'sid, ser#'||''''||';' from dual;
spool off;


tue mar 19                                                             page   11
                                dbname database
                              unix/oracle sessions

pid       sid   ser#  box    username   os_user  program
--------- ----- ----- ------ ---------- -------- ------------------------------
6230      51    251   mwc/co apps       teilers  s:/orant/bin/f50run32.exe
6233      69    2729  mwc/co apps       teilers  s:/orant/bin/r30rbe32.exe
6823      75    661   corp-h apps       applmgr  [email protected] (tns v1-v3)
6823      85    317   corp-h apps       applmgr
779       122   1307  corp-h apps       applmgr
9322      116   242   45a_10 apps       lmichel  f50run32.exe
9330      67    440   corp-h apps       applmgr

一旦我们找到了oracle里所有的会话,那么下一步就是运行一个脚本来检测所有已经被锁定的会话。这是因为,oracle可能无法以足够快的速度检测到一个不活动(dead)的会话,用以防止对数据访问的阻断(blockage)。你可以运行下面的脚本以定位那些管制着锁定资源的会话。

select
   sess.sid,
   sess.serial#,
   lo.oracle_username,
   lo.os_user_name,
   ao.object_name,
   lo.locked_mode
from
   v$locked_object lo,
   dba_objects     ao,
   v$session       sess
where
   ao.object_id = lo.object_id
and
   lo.session_id = s.sid;

tue mar 19                                                             page    1
                                     locked
                                    objects

            oracle     os         object
  sid  ser# user       user       name                           locked_mode
----- ----- ---------- ---------- ------------------------------ -----------
   21    56 apps       applmgr    fnd_concurrent_requests                  2
   77   535 apps       applmgr    mtl_system_items                         2
  126   161 apps       oracle     so_lines_all                             2

一旦定位了已锁定的会话,你就可以使用下面的脚本来自动地创建alter session句法,用来终止你所希望终止的会话,这样就能够将锁定的会话从oracle里清除掉。

spoolrun_nuke.sql

select
   'alter system kill session '''||
    sess.sid||', '||sess.serial#||';'
from
   v$locked_object lo,
   dba_objects     ao,
   v$session       sess
where
   ao.object_id = lo.object_id
and
   lo.session_id = s.sid;

在创建完run_nuke.sql文件之后,你就可以迅速地选择那些要被终止的会话并单独地运行它们。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表