数据库:Oracle9i
功能:将数据库A中的表sysdmlsend 和 sysdmlsendblob 中的数据远程插入到数据库B中的表sysdmlreceive和sysdmlreceiveblob中
问题:job死
现象:next date不更新下次执行时间,last date为空,total time刷新时变化
初步判断:job调用的存储过程执行时,不知什么原因,导致运行不能结束附存储过程和job如下:create or replace procedure p_copytablere is
begin
insert into sysdmlreceive@dblink select sysid,syssql,0,sdate from sysdmlsend b where b.sysid not in(select sysid from sysdmlreceive@dblink);
insert into sysdmlreceiveblob@dblink select sysid,startsql,blobcontent,endsql from sysdmlsendblob b where b.sysid not in(select sysid from sysdmlreceiveblob@dblink);
commit;
execute immediate 'delete from sysdmlsend' ;
execute immediate 'delete from sysdmlsendblob';
commit;
    exception   
       when others then   
       null; 
end;VARIABLE jobno number;
begin
        DBMS_JOB.SUBMIT(:jobno, 'p_copytablere;',  SYSDATE, 'SYSDATE + 1/1440');
        commit;
end;

解决方案 »

  1.   

    你的这个应用不适合目前的作法,因为随着数据量的增加not in的操作很可能不会在1分钟内完成,而且会越来越慢。
    修改你的sql或者想其它的方法吧。
      

  2.   

    TO: oracledbalgtu 1、job执行的周期可以改为半小时一执行(已经做过测试,问题依然存在)
    2、数据库B中的表sysdmlreceive和sysdmlreceiveblob中的数据不是一直保留的,在数据库B中也有job定期(一分钟或半小时)处理表sysdmlreceive和sysdmlreceiveblob中的数据,处理完后立即清除。所以一般不会存在not in执行时间过长的问题,还有我们把job的执行周期改为半小时后观察,仍然存在原帖所描述的问题。还请再指教!
      

  3.   

    你把数据库B中自己处理的job停了试试,会不会是与这个job死锁了
      

  4.   

    你这个过程中的sql执行效率非常低,需要优化你的sql
      

  5.   

    如果在archive状态下,数据量大用delete 会非常的慢,效率很低,
    如果可能,考虑一下用
    execute immediate 'truncate table sysdmlsend' ; 
    execute immediate 'truncate table sysdmlsendblob';
      

  6.   

    不理解3楼说的“数据库A中的JOB与数据库B中的JOB死锁”?能再具体一点描述吗?
    4楼能给出具体优化的方法吗?
    表sysdmlsend和sysdmlsendblob中的数据不会积累很多,可以按照5楼的说法优化一下。另外说明一下
    数据库A距离数据库B比较远,不是局域网中,是广域网,好比A在“苏州”,B在“南京”。
    另外,当出现原帖所描述的问题后
    1、有时能自行恢复正常
    2、有时通过重启服务器,可恢复正常
    3、如果1和2都不能解决问题,只能将job和存储过程删除后重建了