oracle 锁表时,怎么查出是哪些SQL语句导致了锁表

如题所述

为了找出是哪些SQL语句导致了锁表,可以执行以下SQL查询:

SELECT S.SID SESSION_ID, S.USERNAME, DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(REQUEST)) MODE_REQUESTED, O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')', S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2 FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID;

通过执行上述查询,可以获取有关数据库中锁的信息。SESSION_ID, USERNAME, MODE_HELD, MODE_REQUESTED, OBJECT_NAME, LOCK_TYPE, LOCK_ID 分别表示拥有锁的会话ID, 拥有锁的用户名, 锁的持有模式, 锁的请求模式, 锁所在的数据库对象名, 锁的类型, 锁的ID。

如果查询结果显示存在死锁,可以通过以下步骤进一步查找具体是哪些SQL语句导致了表的死锁:

1. 查找哪个过程被锁:可以使用 V$DB_OBJECT_CACHE 视图进行查询,例如:

SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND CLOCKS!='0';

2. 通过SID查找哪个会话:可以使用 V$ACCESS 视图进行查询,例如:

SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';

3. 查出SID和SERIAL#:可以使用 V$SESSION 视图进行查询,例如:

SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID';

同时也可以使用 V$PROCESS 视图查找SPID,例如:

SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';

4. 杀死进程:首先需要杀死Oracle进程,可以使用以下命令:

ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';

然后需要杀死操作系统进程,以Linux为例,可以使用以下命令:

KILL -9 刚才查出的SPID或ORAKILL 刚才查出的SID 刚才查出的SPID。
温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜