ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PL/SQL连接oracle时,JOBS无法打开,无法创建JOB问题处理

PL/SQL连接oracle时,JOBS无法打开,无法创建JOB问题处理

原创 Linux操作系统 作者:quzhenfang 时间:2011-12-21 13:39:49 0 删除 编辑

今日同事遇到个小问题,无法通过PL/SQL工具创建job,其现象是无法打开JOBS栏位,心想,这个应该和DBA_JOBS_RUNNING视图有关系吧。可能是资源被占用,检查数据库锁,最终发现一个JOB运行过程中,出现了锁资源等待。通过常用到查找锁SQL检查出问题,将JOB的进程杀死,问题解决。具体SQL如下:

1、找到谁持有锁不释放
column object_name format a20
column username format a20
SELECT  s.username,decode(l.type,’TM’,'TABLE LOCK’,'TX’,'ROW LOCK’,NULL) LOCK_LEVEL,  o.object_name,  s.sid ,l.block FROM v$session s,v$lock l,dba_objects o  WHERE s.username=’OCBC’ and l.sid = s.sid  AND l.id1 = o.object_id(+)  AND s.username is NOT NULL order by s.username;
如果block列为1,说明对应的sid会话正持有object_name锁,其它和object_name有关的锁在等待sid提交或回滚。

2、根据sid获得这个连接的详细信息(操作系统用户、进程ID、程序名、机器名、终端名)
set linesize 120
column OSUSER format a15
column OSPID format a10
column MACHINE format a15
column TERMINAL format a12
column PROGRAM format a15
select s.SID, s.OSUSER, p.spid as OSPID, s.MACHINE,s.TERMINAL, s.PROGRAM from v$session s, v$process p where s.sid=12 and s.paddr=p.addr;

3、获得这个连接正在执行的sql文
set linesize 120
column SQL_TEXT format a100
select b.sql_text from v$session a, v$sql b where a.sid=12 and a.SQL_ADDRESS=b.ADDRESS(+);

检查当前持锁不释放的连接具体信息:
SELECT /*+ rule */ systimestamp dt, s.username,s.sid,l.block,s.OSUSER, p.spid as OSPID, s.MACHINE,s.TERMINAL, s.PROGRAM,q.sql_text  FROM v$session s,v$lock l, v$process p,v$sql q WHERE l.block=1 and l.sid = s.sid and s.paddr=p.addr and s.SQL_ADDRESS=q.ADDRESS;

如果想知道堵塞的sid及sql语句是什么,用下面语句(oracle10g测试通过),
select distinct b.sid, a.piece, a.sql_text from v$sqltext_with_newlines a, (select decode(s.sql_address,'00',s.prev_sql_addr,sql_address) sql_address,decode(s.sql_hash_value,0, s.prev_hash_value,s.sql_hash_value) sql_hash_value, s.sid from v$session s,v$lock l WHERE l.sid = s.sid and l.block=1) b where rawtohex(a.address)=b.sql_address and a.hash_value=b.sql_hash_value order by b.sid,a.piece ASC

如果想知道被堵塞sid及正执行的sql语句是什么,用下面语句(oracle10g测试通过),
select distinct b.sid, a.piece, a.sql_text from v$sqltext_with_newlines a, (select decode(s.sql_address,'00',s.prev_sql_addr,sql_address) sql_address,decode(s.sql_hash_value,0, s.prev_hash_value,s.sql_hash_value) sql_hash_value, s.sid from v$session s WHERE s.sid in (select sid from v$lock where lmode=0 and id1=(select l.ID1 from v$lock l WHERE l.block=1 and rownum<2) )) b where rawtohex(a.address)=b.sql_address and a.hash_value=b.sql_hash_value order by a.piece ASC

查看持锁会话服务器端:oracle服务进程id
select a.sid, b.spid from (select s.sid, s.paddr from v$session s,v$lock l WHERE l.sid = s.sid and l.block=1) a, v$process b where a.paddr=b.addr;


查看持锁会话客户端:用户程序进程id
select s.sid, s.process from v$session s,v$lock l WHERE l.sid = s.sid and l.block=1;
如果客户端在unix上,process就是用户进程id。
如果客户端在window上,process中前面数字就是用户进程id(如:728)。
SID PROCESS
---------- ------------
147 728:3920

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14272606/viewspace-713691/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-02-22

  • 博文量
    18
  • 访问量
    40565