前言
今天同事那边在用Informatica对Oracle表做update时发现表被锁住了,报错:“ORA-00054 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”,一般在用户修改记录之前,悲观锁就会发生作用。检查了数据库,发现有几个会话一直在lock表。因为Informatica工作流已经停止了,但是数据库这边任然显示会话正在运行,与开发同事沟通后,确定为异常会话,于是需要将锁表的会话杀死(可能会报错:ORA-00031: session marked for kill。需要在系统级别杀死),下面是具体的操作过程:
一、检查当前数据库环境中是否存在锁表行为
SELECT P.SPID,
A.SERIAL#,
C.OBJECT_NAME,
B.SESSION_ID,
B.ORACLE_USERNAME,
B.OS_USER_NAME
FROM V$PROCESS P, V$SESSION A, V$LOCKED_OBJECT B, ALL_OBJECTS C
WHERE P.ADDR = A.PADDR
AND A.PROCESS = B.PROCESS
AND C.OBJECT_ID = B.OBJECT_ID;
SPID SERIAL# OBJECT_NAME SESSION_ID ORACLE_USERNAME OS_USER_NAME
------------------------ ---------- ------------------------------ ---------- ------------------------------ ------------------------------
12335 43783 MGMT_TASK_QTABLE 1164 SYS oracle
12335 43783 MGMT_COLLECTION_TASKS 1164 SYS oracle
8961 61427 CF_PROCTRANSACTION 1165 BDDJ XiaoBu
22255 3009 CF_PROCTRANSACTION 1165 BDDJ XiaoBu
32266 42847 CF_PROCTRANSACTION 1165 BDDJ XiaoBu
17322 44591 CF_PROCTRANSACTION 1165 BDDJ XiaoBu
6 rows selected.
二、查询有锁表行为的bddj相关sid等信息
SELECT sid, serial#, username, status, osuser FROM v$session where serial# = '3009';
SELECT sid, serial#, username, status, osuser FROM v$session where serial# = '3009';
SELECT sid, serial#, username, status, osuser FROM v$session where serial# = '42847';
SELECT sid, serial#, username, status, osuser FROM v$session where serial# = '44591';
SQL> SELECT sid, serial#, username, status, osuser FROM v$session where serial# = '61427';
SID SERIAL# USERNAME STATUS OSUSER
---------- ---------- ------------------------------ -------- ------------------------------
1172 61427 BDDJ INACTIVE XiaoBu
SQL> SELECT sid, serial#, username, status, osuser FROM v$session where serial# = '3009';----------这个查询出来状态为active,要杀了它
SID SERIAL# USERNAME STATUS OSUSER
---------- ---------- ------------------------------ -------- ------------------------------
1165 3009 BDDJ ACTIVE XiaoBu
SQL> SELECT sid, serial#, username, status, osuser FROM v$session where serial# = '42847';
SID SERIAL# USERNAME STATUS OSUSER
---------- ---------- ------------------------------ -------- ------------------------------
1149 42847 BDDJ INACTIVE XiaoBu
SQL> SELECT sid, serial#, username, status, osuser FROM v$session where serial# = '44591';
SID SERIAL# USERNAME STATUS OSUSER
---------- ---------- ------------------------------ -------- ------------------------------
13 44591 BDDJ INACTIVE XiaoBu
三、执行杀进程语句
alter system kill session '1172,61427';
alter system kill session '1165,3009';
alter system kill session '1149,42847';
alter system kill session '13,44591';
杀完进程后再次检查当前环境内是否有锁表行为:
SQL> select * from v$locked_object;
XIDUSN XIDSLOT XIDSQN OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME PROCESS LOCKED_MODE
---------- ---------- ---------- ---------- ---------- ------------------------------ ------------------------------ ------------------------ -----------
1 6 95027 132360 1165 BDDJ XiaoBu 8252:1244 3
发现这个进程还是存在,再次杀一次:
SQL> alter system kill session '1165,3009';
alter system kill session '1165,3009'
*
ERROR at line 1:
ORA-00031: session marked for kill
提示不能在oracle级别正常杀死,接下来去os级别杀:
[root@s197242 zyd]# kill -9 22255
22255是第一步查询中查出来的spid。
再次检查,发现现在环境中没有spid为22255, SERIAL#为3009的进程了,说明已经被正常杀死:
SQL> SELECT p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,b.os_user_name
FROM v$process p, v$session a, v$locked_object b, all_objects c
WHERE p.addr = a.paddr
AND a.process = b.process
AND c.object_id = b.object_id;
SPID SERIAL# OBJECT_NAME SESSION_ID ORACLE_USERNAME OS_USER_NAME
------------------------ ---------- ------------------------------ ---------- ------------------------------ ------------------------------
12661 279 CF_PROCTRANSACTION 48 BDDJ Administrator
10602 8761 CF_PROCTRANSACTION 48 BDDJ Administrator
10600 40677 CF_PROCTRANSACTION 48 BDDJ Administrator
总结
今天同事那边在用Informatica对Oracle表做update时发现表被锁住了,报错:“ORA-00054 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”,一般在用户修改记录之前,悲观锁就会发生作用。检查了数据库,发现有几个会话一直在lock表。因为Informatica工作流已经停止了,但是数据库这边任然显示会话正在运行,与开发同事沟通后,确定为异常会话,于是需要将锁表的会话杀死(可能会报错:ORA-00031: session marked for kill。需要在系统级别杀死),上面是具体的操作过程。