我是靠谱客的博主 欢呼硬币,最近开发中收集的这篇文章主要介绍PL/SQL连接oracle时,JOBS无法打开,无法创建JOB问题处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今日同事遇到个小问题,无法通过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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14272606/viewspace-713691/

最后

以上就是欢呼硬币为你收集整理的PL/SQL连接oracle时,JOBS无法打开,无法创建JOB问题处理的全部内容,希望文章能够帮你解决PL/SQL连接oracle时,JOBS无法打开,无法创建JOB问题处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部