排查那些长期占用锁的sql(测试)

来源:互联网 发布:淘宝 瞄准镜 编辑:程序博客网 时间:2024/06/05 11:54
1. 执行语句块:
begin
for i in 10001..1000000 loop
insert into test1 values(i,i);
end loop;

end;


2.查询哪些对象占有锁(v$locked_object;)

select * from v$locked_object;

注:object_id是拥有锁的对象(如表),session_id是会话 的id,oracle_username是会话的用户名,os_user_name是操作系统的用户名,process是操作系统的进程号(我这里是sql developer进程)。

3.查看产生该锁的sql语句。

select s.sid,sql_text from v$session s,v$sqlarea a,v$locked_object b
  where s.sid=b.session_id and s.PREV_SQL_ADDR=a.address;

说明:v$sqlarea主要保存了共享池中的sql语句信息,就是执行过的sql语句,address记录sql的存储内存地址。v$session的prev_sql_addr列记录了会话执行过的sql记录(地址)。

上面的结果说明了,是语句块执行玩没有提交造成的。如果是还在执行,sql_text应该是 insert into ...............。

4.查询该会话信息

select * from v$session s, v$locked_object l where s.sid=l.session_id;


可以通过命令  alter system kill session '129,319';杀死该会话。

0 0
原创粉丝点击