600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > oracle运维平台开发 Oracle数据库运维

oracle运维平台开发 Oracle数据库运维

时间:2019-03-23 08:43:25

相关推荐

oracle运维平台开发 Oracle数据库运维

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可以了。

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。