【创作赢红包】Informatica停止工作流后Oracle会话未正常停止,查询Oracle被锁表并解锁完整过程


前言

今天同事那边在用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。需要在系统级别杀死),上面是具体的操作过程。

猜你喜欢

转载自blog.csdn.net/qq_28356739/article/details/129891020