oracle中job长时间执行没有结束

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一些项目中使用了job定期执行sql语句。如果要执行的sql语句是基于dblink对远程数据库的访问,那么有时候就会出现该sql语句长时间执行一直不结束的情况。并且这时在远程数据库上并没有锁导致该sql语句等待(这可能是由于网络问题触发的oracle的一个bug吧,远程数据库与本地数据之间有防火墙时比较容易出现这个现象)。

下面总结了如何判断该job是否长时间执行没结束,并说明了处理步骤。


1)、观察job情况。
   system用户下执行语句select * from  dba_jobs;找到有问题的job,记录下该job在查询结果中job列的取值,该取值称为job号。
   broken字段为N,且this_date字段的时间比当前时间减去执行周期要晚(根据interval字段判断),则job是正常的。如果this_date字段没有值,一般认为job当前没有在执行。
   如果broken字段N,并且this_date时间不对(例如是几个小时以前,甚至几天以前),则说明该job某一次周期一直没有执行完。
   如果出现这种现象,就说明该job可能出问题了。
     
2)、查找该job目前正在执行时的会话编号sid
   select * from  dba_jobs_running where job='刚才查到的job号';
   在返回结果中记录sid列的取值

3)、查看该会话
   select * from v$session where sid='刚才查到的sid'
   记录下返回结果的 serial#列(会话序列号),paddr列(线程地址)

4)、 取得会话的线程号
select spid from  v$process  where   addr='刚才查到的线程地址' ;
记录下列spid,称为线程号

5)、使用oracle命令杀会话
     alter system kill session '会话编号sid,会话序列号serial#';

6)、查看是否成功杀掉该会话(方法与步骤一相同,多执行几次select * from  dba_jobs;观察结果)

7)、如果没有杀掉会话,就是用操作系统命令杀线程(或进程)
    这里给出windows下杀oracle会话占用的线程的方法  
    登录到数据库所在的操作系统中,打开windows命令行,键入命令:  orakill 数据库sid  刚才查到的线程号spid

   例如 orakill orcl  12345

 

 

这里给出一个自动清理问题job的存储过程,由于是存储过程,只能使用alter system kill 来杀会话,有时候会话只被标记为killed,并不能真正结束,job也无法启动下一个周期。

 

CREATE OR REPLACE PROCEDURE SYS.PRO_KILL_JOB AS
  /*清理job567 568 569 长期执行不结束的情况*/
  /*30分钟超时*/
 CURSOR   MYCUR     IS 
   select     ' ALTER SYSTEM KILL SESSION '''||s.sid ||','||  s.SERIAL#||''' immediate '   AS SQL_KILL   , J.JOB
      from dba_jobs_running j,v$session s  
      where   j.sid=s.sid and
       this_date <(sysdate-30/24/60) and 
       s.sid is not null and s.serial# is not null 
       and 
       ( j.job= 567 
         or j.job=568 
         or j.job=569  ) ;

  V_SQL_KILL  VARCHAR2(500);
  V_JOB NUMBER ;


BEGIN
   OPEN MYCUR;
  LOOP
    FETCH MYCUR
      INTO V_SQL_KILL , V_JOB;
    EXIT WHEN MYCUR%NOTFOUND;
    dbms_output.put_line(v_sql_kill);
    execute immediate  v_sql_kill ;
    COMMUNICATION.SP_DB_LOG('PRO_KILL_JOB', 1, NULL, V_JOB||' IS KILLED');
    COMMIT;
  END LOOP;
  CLOSE MYCUR;
EXCEPTION
  WHEN OTHERS THEN
    COMMUNICATION.SP_DB_LOG('PRO_KILL_JOB', 1, SQLCODE, SQLERRM);
    COMMIT;
END PRO_KILL_JOB;


 

 

 

oracle job一直运行,oracle job一直运行 oraclejob定时调用存储过程,如存储过程陷入死循环或其他原因导致,job的状态是一直运行。这时,手动调用存储过程,由于锁表的原因,存储过程也会执行不下去。此时,需要先停掉job,命令如下:BEGIN dbms_scheduler.stop_job(job_name => ‘GETHOLDS‘);END;如存储过程还是执行不了,需要检查一下存储过程的表是否被进程占用而被锁住了,找到该... 阅读详情

相关推荐

oracle定时器job长时间执行无法结束

iamlaosong文 我用job每天定时执行一些存储过程,以便对数据进行处理。正常情况下,这些存储过程执行完毕需要几十秒时间,但有时不知道什么原因一天都执行不完,导致第二天的job无法顺利执行。如果不进行人工干预,这个job也许就再也不会执行下去了。通过查询和测试我知道卡死的原因是其中的一些SQL语句执行时间太长,就像服务器有时快有时慢一样,这些SQL语句执行也是时快时慢,猜想原因是不是or...

驽马十驾 才定不舍 1万+

Oracle 19c存储过程死循环(一直显示正在执行

解决存过死循环(锁)

ChocolateOreo的博客 2490

ORACLE JOB无法停止的处理

有个周末只有的JOB,目的是迁移4千万数据,跑了一宿都没跑完。无奈业务高峰到了,尝试KILL掉,可是做了如下动作居然杀了又起,多次反复,还在RAC两个节点中转移,最后无奈把其调用的存储过程改成NULL过了一会ORACLE才罢休,跑了一会ORACLE就不跑了。 找出正在执行JOB编号及其会话编号    SELECT   SID,JOB   FROM   DBA_JOBS_RUNNING...

weixin_34301132的博客 478

oracle job超时,oraclejob长时间执行没有结束

一些项目中使用了job定期执行sql语句。如果要执行sql语句是基于dblink对远程数据库的访问,那么有时候就会出现该sql语句长时间执行一直不结束的情况。并且这时在远程数据库上并没有锁导致该sql语句等待(这可能是由于网络问题触发的oracle的一个bug吧,远程数据库与本地数据之间有防火墙时比较容易出现这个现象)。下面总结了如何判断该job是否长时间执行结束,并说明了处理步骤。1)、观察...

weixin_35707846的博客 1462

oracle怎么停止job,ORACLE如何停止一個正在運行的JOB

1 相關表、視圖dba_jobsall_jobsuser_jobs 包含登錄用戶所有的JOB信息dba_jobs_running 包含正在運行job相關信息注意須使用oracle的sys用戶登錄到數據庫,才能查看dba_jobs_running, v$process, v$session表的信息。同時,登錄操作系統時,要用oracle用戶。2 問題描述為同事解決一個因為網絡連接...

weixin_39781599的博客 3045

oracle 命令 执行job_oracle job有定时执行功能

(1)、上面讲解了job的参数:与job相关的参数一个是job_queue_processes,这个是运行job时候所起的进程数,当然系统里面job大于这个数值后,就会有排队等候的,最小值是0,表示不运行job,最大值是1000,在OS上对应的进程时SNPn,9i以后OS上管理job的进程叫CJQn。可以使用下面这个SQL确定目前有几个SNP/CJQ在运行。select * from v$bgpr...

weixin_42476061的博客 203

oracle 命令 执行job_oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务...

(1)、上面讲解了job的参数:与job相关的参数一个是job_queue_processes,这个是运行job时候所起的进程数,当然系统里面job大于这个数值后,就会有排队等候的,最小值是0,表示不运行job,最大值是1000,在OS上对应的进程时SNPn,9i以后OS上管理job的进程叫CJQn。可以使用下面这个SQL确定目前有几个SNP/CJQ在运行。select * from v$bgpr...

weixin_39809168的博客 257

oracle 命令 执行job_oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。...

(1)、上面讲解了job的参数:与job相关的参数一个是job_queue_processes,这个是运行job时候所起的进程数,当然系统里面job大于这个数值后,就会有排队等候的,最小值是0,表示不运行job,最大值是1000,在OS上对应的进程时SNPn,9i以后OS上管理job的进程叫CJQn。可以使用下面这个SQL确定目前有几个SNP/CJQ在运行。select * from v$bgpr...

weixin_39705850的博客 123

ORACLE JOB以及如何停止一个正在运行的JOB

niudba的专栏 2071

oracle查询过程中卡住,查看Oracle中存储过程长时间被卡住的原因

1:查V$DB_OBJECT_CACHESELECT * FROM V$DB_OBJECT_CACHE WHERE name=‘CUX_OE_ORDER_RPT_PKG‘ AND LOCKS!=‘0‘;注意:CUX_OE_ORDER_RPT_PKG 为存储过程的名称。发现locks=22:按对象查出sid的值select /*+ rule*/ SID from V$ACCESS WHERE ob...

weixin_31328141的博客 4134

Oracle储存过程长时间运行检查

今天检查到一个奇怪的现场,Oracle存储过程执行时间过长,已经执行了2天,还在运行,这明显是不正常的。把这次检查的经过记录,方便以后查看1. 查询更在运行的JobSelect * From DBA_JOBS_RUNNING发现 job:1542,sid:1352 从2018年3月30日,跑到至今(2018年4月3日)都未结束.2.查询job执行的存储过程Select * From DBA_JOB...

woailyoo0000的博客 5712

oracle定时频率,oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。...

(1)、上面讲解了job的参数:与job相关的参数一个是job_queue_processes,这个是运行job时候所起的进程数,当然系统里面job大于这个数值后,就会有排队等候的,最小值是0,表示不运行job,最大值是1000,在OS上对应的进程时SNPn,9i以后OS上管理job的进程叫CJQn。可以使用下面这个SQL确定目前有几个SNP/CJQ在运行。select * from v$bgpr...

weixin_40007541的博客 328

查看Oracle中存储过程长时间被卡住的原因

1:查V$DB_OBJECT_CACHE SELECT * FROM V$DB_OBJECT_CACHE WHERE name='CUX_OE_ORDER_RPT_PKG' AND LOCKS!='0'; 注意:CUX_OE_ORDER_RPT_PKG 为存储过程的名称。 发现locks=2 2:按对象查出sid的值 select /*+ rule*/ SID from V...

weixin_30640291的博客 1171

oracle 停止正在运行的job

<br /><br />ORACLE如何停止一个JOB<br />1 相关表、视图<br />2 问题描述<br />为同事解决一个因为网络连接情况不佳时,执行一个超长时间SQL插入操作。<br />既然网络状况不好,就选择了使用一次性使用JOB来完成该插入操作。在JOB执行一段时间后,我发现被插入表有些问题(惭愧,当时也没有先检查检查就做了)。准备停止JOB,因为在JOB运行情况下,我的所有修改都会报系统资源忙的错误。<br />强行KILL SESSION是行不通的,因为过会儿,JOB还会重新启动,如

海盗的成长 1631

oracle 如何kill,ORACLE 如何kill掉一直运行的job

今天发现数据库一个JOB一直在执行,都执行了5个小时还在执行,所以想办法给删除掉系统环境:ORACLE 10GAIX操作系统操作步骤如下:第一步、查询出来那个job在运行,找个对应的SID字段 1、select * from dba_jobs_running--找到job对应的sid 第二部、通过以下语句查询出来SID对应的SPID, 其中SCHEMANAME='#username#'是...

weixin_34364310的博客 1116

Oracle】基于SCHEDULER的job的详解

昨天讲了关于scheduler的参数的设置详解,今天来看一下对于急于scheduler的job的设置的详解,首先还是来看一下基本的创建脚本: sys.dbms_scheduler.create_job( job_name => '"SYS"."REBUILD_JOB1"', program_name => '"SYS"."EMP_IND_REBUILD"', schedule_name =

badly9的专栏 3738

oracle操作注意事项,Oracle job操作注意事项

创建一个简单的JOB实列1、创建测试表SQL>createtablea(adate,bvarchar2(10));表已创建。2、创建一个自定义过程SQL>createorreplaceproceduretest1asbegininsertintoavalues(sysdate,'start');begindbms_stats.gather_schema_st...

weixin_39730263的博客 116
上一篇: iis中的asp.net程序无法访问oracle,提示“未找到oracle客户端和网络组件 ……”
下一篇: 集群方案分析
fupei
博客等级 码龄20年 29粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值