云贝教育技术文章Oracle锁的使用与oradebug休眠唤醒进程
作者:刘晓峰
原文链接:http://www.tdpub.cn/Blog/detail/id/1345.html
Oracle 锁的使用
1.问题:编译包,发现无法编译的情况,查询用户在执行锁命令
2.解决方式:编译包,无法编译的时候,可以采用以下命令查询谁加了共享锁(执行)或者排它锁(正在编译) select * from dba_lock_internal d where d.lock_id1="APPS.XXXXX" and d.mode_held <>"Null"
表上的锁也能用这个表查,但是有更快的方法, select * from gv$lock lo ,dba_objects do where do.object_id=lo.id1 and do.object_name ="XXXX"
3.查询的lock_type:
TM是表上的锁,TX是行锁,TO是临时表锁,可以查询v$lock_type获取详细信息
oradebug 休眠、唤醒进程
1、问题背景:
测试环境有一个JDBC进程池,有20个进程并行执行SQL,此SQL非常缓慢,想要hang住进程,让我的test跑完再启用
2、模拟执行缓慢的进程
查询进程 SELECT p.pid--35 ,p.spid--28095 FROM v$session s ,v$process p WHERE s.paddr = p.addr AND s.sid = userenv("sid") ;
一秒写一个 create table cux_oradebug(id number,creation_date date); declare begin for i in 1..3600 loop dbms_lock.sleep(1); insert into cux_oradebug(id,creation_date)values(i,sysdate); commit; end loop; end;
3.休眠 SQL> oradebug setospid 28095 Oracle pid: 35, Unix process pid: 28095, image: oracle@MyHost SQL> oradebug suspend
查询果然停在了148秒 select max(id)from cux_oradebug;
4.唤醒 SQL> oradebug resume
继续查询,发现ID继续上升 select max(od) from cux_oradebug