oracle 僵尸session的处理方法
2015-09-14 11:56
806 查看
很晚了现场打来电话,说操作两个模块的单据卡住了。架构是weblogic + oracle(发布在IBM AIX上,RAC)。还反馈,就在刚才在跳板机器上的pl/sql developer上执行了刷新两个模块数据的脚本,但在执行过程中,跳板机停机了,然后就无法连接。
1.确认是否是锁造成,注意集群环境视图要用GV开头,如果不用它开头,则需要单独连两个实例查询。查询结果是有锁
SELECT bs.username "Blocking User",
bs.username "DB User",
bs.SID "SID",
bs.serial# "Serial#",
bs.sql_address "address",
bs.sql_hash_value "Sql hash",
bs.program "Blocking App",
bs.machine "Blocking Machine",
bs.osuser "Blocking OS User",
bs.serial# "Serial#",
ws.username "Waiting User",
ws.SID "WSID",
ws.program "Waiting App",
ws.machine "Waiting Machine",
ws.osuser "Waiting OS User",
ws.serial# "WSerial#",
wk.TYPE lock_type,
hk.lmode mode_held,
wk.request mode_requested,
TO_CHAR(hk.id1) lock_id1,
TO_CHAR(hk.id2) lock_id2,
hk.BLOCK blocking_others
FROM gv$lock hk, gv$session bs, gv$lock wk, gv$session ws
WHERE hk.BLOCK = 1
AND hk.lmode != 0
AND hk.lmode != 1
AND wk.request != 0
AND wk.TYPE(+) = hk.TYPE
AND wk.id1(+) = hk.id1
AND wk.id2(+) = hk.id2
AND hk.SID = bs.SID(+)
AND wk.SID = ws.SID(+)
AND (bs.username IS NOT NULL)
AND (bs.username <> 'SYSTEM')
AND (bs.username <> 'SYS')
ORDER BY 1;
2. kill session, 堵塞者和被堵塞者都kill,alter system kill session 'sid,serial#';两个节点都要执行。
执行过程中报了一些错,说是session不存在。
3. 检查锁的情况,发现还是有锁,通过sid到 v$session找sid,serial#,去kill,报session找不到。
select l.INST_ID, l.sid, s.owner, s.object_name
from gv$lock l, dba_objects s
where l.ID1 = s.object_id
and s.owner <> 'SYS';
4. 这种情况只能从操作系统层面上kill了。 kill -9 SPID。
select p.INST_ID,s.SID,p.SPID
from gv$process p, gv$session s
where P.ADDR = S.PADDR
and sid = 864;
这里有几个id,
spid (system process id) 是操作系统层面的进程id
pid(process id) 是oracle给自己的进程的一个编号
sid (这个就是session 的id)
5.重新检查锁的情况,发现没有了,通知实施测试系统。
总结:数据库层面kill不掉的session,就只能通过OS层面上kill,以前处理dblink的时候也是一样的问题。
1.确认是否是锁造成,注意集群环境视图要用GV开头,如果不用它开头,则需要单独连两个实例查询。查询结果是有锁
SELECT bs.username "Blocking User",
bs.username "DB User",
bs.SID "SID",
bs.serial# "Serial#",
bs.sql_address "address",
bs.sql_hash_value "Sql hash",
bs.program "Blocking App",
bs.machine "Blocking Machine",
bs.osuser "Blocking OS User",
bs.serial# "Serial#",
ws.username "Waiting User",
ws.SID "WSID",
ws.program "Waiting App",
ws.machine "Waiting Machine",
ws.osuser "Waiting OS User",
ws.serial# "WSerial#",
wk.TYPE lock_type,
hk.lmode mode_held,
wk.request mode_requested,
TO_CHAR(hk.id1) lock_id1,
TO_CHAR(hk.id2) lock_id2,
hk.BLOCK blocking_others
FROM gv$lock hk, gv$session bs, gv$lock wk, gv$session ws
WHERE hk.BLOCK = 1
AND hk.lmode != 0
AND hk.lmode != 1
AND wk.request != 0
AND wk.TYPE(+) = hk.TYPE
AND wk.id1(+) = hk.id1
AND wk.id2(+) = hk.id2
AND hk.SID = bs.SID(+)
AND wk.SID = ws.SID(+)
AND (bs.username IS NOT NULL)
AND (bs.username <> 'SYSTEM')
AND (bs.username <> 'SYS')
ORDER BY 1;
2. kill session, 堵塞者和被堵塞者都kill,alter system kill session 'sid,serial#';两个节点都要执行。
执行过程中报了一些错,说是session不存在。
3. 检查锁的情况,发现还是有锁,通过sid到 v$session找sid,serial#,去kill,报session找不到。
select l.INST_ID, l.sid, s.owner, s.object_name
from gv$lock l, dba_objects s
where l.ID1 = s.object_id
and s.owner <> 'SYS';
4. 这种情况只能从操作系统层面上kill了。 kill -9 SPID。
select p.INST_ID,s.SID,p.SPID
from gv$process p, gv$session s
where P.ADDR = S.PADDR
and sid = 864;
这里有几个id,
spid (system process id) 是操作系统层面的进程id
pid(process id) 是oracle给自己的进程的一个编号
sid (这个就是session 的id)
5.重新检查锁的情况,发现没有了,通知实施测试系统。
总结:数据库层面kill不掉的session,就只能通过OS层面上kill,以前处理dblink的时候也是一样的问题。
相关文章推荐
- Oracle分析函数系列之first_value/last_value:在记录集中查找第一条记录和最后一条记录
- 两个经典的Oracle触发器示例(轉)
- Oracle中的NVL函数
- 查询oracle用户IP
- cx_oracle Datatypes
- oracle数据库高级应用之《自动生成指定表的insert,update,delete语句》
- oracle查询用户下每张表的信息
- ArcSDE Post失败:"error connecting to oracle: O".
- 查看oracle数据库的使用状态
- oracle——去除重复记录
- Oracle Service Bus学习笔记
- Oracle命令学习
- oracle将一个用户的权限赋予给另外一个用户
- OVM Concept: Oracle VM Agent
- 用批处理文件来手动启动和停止Oracle服务
- oracle存储过程转义字符单引号
- Oracle VM Architecture
- oracle升级版本矩阵图
- 安装oracle 12c 用Navicat for oracle连接数据库cannot load OCI DLL,193 笔记
- 分享一个Linux下安装ASM+ORACLE的自动化脚本(四)