Oracle数据库运维

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/yexiaomodemo/article/details/98752329

1、未提交事务引起的表的行锁

1.1、判断哪个SESSION执行了DML(Insert/Update/Delete) 但是未提交 (Commit ),引起的行锁

--找到修改了数据,但是未提交的Session,选择WAIT_CALSS='Idle',也就是Session处于休息状态,但是有锁定的表
SELECT A.SID,A.SERIAL#,A.USERNAME,A.EVENT,A.WAIT_CLASS,A.SECONDS_IN_WAIT,A.PREV_EXEC_START,b.LOCKED_MODE,C.OWNER,C.OBJECT_NAME,C.OBJECT_TYPE
FROM V$SESSION A
INNER JOIN V$LOCKED_OBJECT B
ON A.SID=b.SESSION_ID
INNER JOIN DBA_OBJECTS C
ON B.OBJECT_ID=c.OBJECT_ID
WHERE A.WAIT_CLASS='Idle'
AND A.SECONDS_IN_WAIT>10/*SESSION空闲后一段时间还锁定的才算有问题,这里随便给了个数值10秒*/

如果确认这些SESSION确实有问题,可以直接KILL掉,传入前面语句的SID和SERIAL#

ALTER SYSTEM KILL SESSION 'SID,SERIAL#'

如上图,我杀了这两个
ALTER SYSTEM KILL SESSION '139,3558' ;

注:ORACLE有个很有趣的地方,就是KILL SESSION的时候需要填“”SERIAL#“,是为了避免刚刚查询的时候获得了一个SID,然后你打算杀掉他,在这个时间之间,打算杀掉的SESSION结束了断开连接,然后新的SESSION复用了这个SID,也就是避免误杀,SQL SERVER 直接KILL可以了。

内容摘自:Oracle未提交事务引起的锁

2、判断哪些SESSION被阻塞了,且定位到是谁阻塞了,是由于哪个表哪个行引起的阻塞

--当SESSION被阻塞,通过ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#这几个字段找到ROWID,然后通过ROWID找到被锁定的记录
SELECT SID,SERIAL#,AUDSID,PADDR,USER#,USERNAME,EVENT,WAIT_CLASS,SECONDS_IN_WAIT,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,
        BLOCKING_SESSION_STATUS,BLOCKING_INSTANCE,BLOCKING_SESSION,C.OWNER,C.OBJECT_NAME,C.OBJECT_TYPE
        ,dbms_rowid.rowid_create(1,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#)
FROM V$SESSION A
INNER JOIN V$LOCKED_OBJECT B
ON A.SID=b.SESSION_ID
INNER JOIN DBA_OBJECTS C
ON B.OBJECT_ID=c.OBJECT_ID
WHERE BLOCKING_SESSION IS NOT NULL ;

通过上面返回的OBJECT_NAME 和ROWID,知道是由于那个行引起的阻塞

SELECT * FROM 前面返回的表名称
where ROWID=前面返回的ROWID

内容摘自:Oracle未提交事务引起的锁

猜你喜欢

转载自blog.csdn.net/yexiaomodemo/article/details/98752329