数据库: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;
功能:将数据库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;
解决方案 »
- oracle存储过程用execute immediate返回为空时报异常
- 问一个存储过程的问题,各位高手来看看,我卡住了
- update select?pls help!
- 怎样将多个不在同台服务器上的oracle数据库,里面的数个相同结构的表,保持数据同步◎◎◎◎◎◎◎◎◎◎◎
- orcale视图的问题,实在解决不了!请求帮忙
- Oracle中视频文件存成什么格式?
- Oracle的一件怪事,大家帮忙解决啊!
- 数据库遭到毁灭性毁坏,急需恢复!!!
- 请教:从其他数据库到ORACLE数据类型的变化
- 吐槽前程序员写的查询语句,看得蛋疼啊
- SQL高手进ORACLE中如何取连号?
- A表到B表,插入多行数据遇到的问题[在线给分]
修改你的sql或者想其它的方法吧。
2、数据库B中的表sysdmlreceive和sysdmlreceiveblob中的数据不是一直保留的,在数据库B中也有job定期(一分钟或半小时)处理表sysdmlreceive和sysdmlreceiveblob中的数据,处理完后立即清除。所以一般不会存在not in执行时间过长的问题,还有我们把job的执行周期改为半小时后观察,仍然存在原帖所描述的问题。还请再指教!
如果可能,考虑一下用
execute immediate 'truncate table sysdmlsend' ;
execute immediate 'truncate table sysdmlsendblob';
4楼能给出具体优化的方法吗?
表sysdmlsend和sysdmlsendblob中的数据不会积累很多,可以按照5楼的说法优化一下。另外说明一下
数据库A距离数据库B比较远,不是局域网中,是广域网,好比A在“苏州”,B在“南京”。
另外,当出现原帖所描述的问题后
1、有时能自行恢复正常
2、有时通过重启服务器,可恢复正常
3、如果1和2都不能解决问题,只能将job和存储过程删除后重建了