冷静、沉淀

高级复制维护一例

上一篇 / 下一篇  2008-07-23 20:34:48 / 个人分类:Oracle

        这几天客户反映内网的数据不能同步到外网数据库中,导致外网数据不能更新,数据不同步,每天咨询电话居高不下,要求尽快解决。由于现场人员无法提供更详细的信息,无法,只能到客户现场诊断。


7月22日 解决错误的延迟事物

         待客户下班后,把外网的机器切换到内网,进入Oracle OEM的复制管理台,发现双向复制中,内网到外网有五千多个错误的延迟事务,由于OEM有图形界面可以操作,指导客户用界面操作,虽然简单,但发现每完成一笔事务耗时20秒左右,五千多笔事务需要耗时1w秒,大概是30个小时左右,无法接受。改用脚本实现,结果在主机上耗时不到2分钟就全部完成了!性能提高了N倍,后来仔细观察后发现OEM是每执行一笔事务,就重新查询一次,把所有出错的延迟事务重新查询出来填充到前台,时间是耗在查询和前台填充数据上面,不能不说OEM设计得太垃圾了。脚本执行完毕后,发现剩余50笔左右的错误事务,重试后发现出错信息为NO DATA FOUND,手工删除。至此,错误的延迟事务已处理完毕,但控制台仍然可以看到正常的延迟事务未能purge,查询deftrandest表发现数万笔延迟事务未能转播到外网。由于已设置定时任务在凌晨push事务,因而当晚没有处理这些事务,决定在晚上自动执行后看情况再在23日解决。


7月23 解决未能传播的延迟事务

        客户报告在控制台监控到的延迟事务仍然居高不下,与昨天没有什么区别,在网上google一把后,要求客户手工执行push函数,同时监控deftrandest表(所有未传播的事务均存储在该表)的记录是否有减少。push函数执行成功,没有出错,但发现deftrandest表的记录数没有任何变化。这就非常奇怪了:因为根据文档所述,在执行完毕push后,正常情况下deftrandest表会被清空。为什么会这样?上metalink搜索deftran,其中一篇文章提到执行push过程没有效果可能是因为其他进程lock了某些资源的原因。到达客户现场后,在后台查看job的状态,发现push的自动调度job一直没有执行成功,THIS_DATE还是08年7月16日,由此,初步推断可能是因为网络或者其他原因导致该job在16日没有执行成功,并且之后一直都没有执行成功,锁在了延迟事务的相关表。通过v$session和v$process获取正在执行的job的pid,用kill -9 pid杀掉job进程后,重新调用dbms_defer_sys.push函数,监控deftrandest表发现记录数在不断的减少,It works!几分钟后deftrandest表的记录数归0,问题解决。


环境:

主站点:HP UX 11i,Oracle9206 RAC 

复制站点:Windows2003 Server,Oracle9206


附相关脚本:

7月22日

conn repadmin/repadmin

spool exec_error.sql

select

'exec dbms_defer_sys.execute_error('''||DEFERRED_TRAN_ID||''','''||DESTINATION||''');'
from deferror;

spool off

-- 检查文件exec_error.sql

@exec_error.sql

7月23日

spool rep.log

set pagesize 0
set linesize 500

-- 定时任务信息
select job,last_date,this_date,next_date,broken,interval,failures,what from dba_jobs;

-- 监控延迟事务
select * from deftran where rownum < 10;
select count(*) from DEFTRANDEST;
select count(*) from deftran;
select count(*) from system.def$_aqcall;
select count(*) from defcall;
select count(*) from deferror;

spool off

-- Purge所有延迟事务
variable v_ret number;
exec :v_ret := DBMS_DEFER_SYS.PURGE(delay_seconds=>0);
commit;

-- 测试:尝试Push 10个事务
variable v_ret number;
exec :v_ret := DBMS_DEFER_SYS.PUSH(destination=>'WEB.WEB',parallelism=>4,transaction_count=>10,stop_on_error=>false);
commit;

-- Push所有的事务
variable v_ret number;
exec :v_ret := DBMS_DEFER_SYS.PUSH(destination=>'WEB.WEB',parallelism=>4,stop_on_error=>false);
commit;




TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-08  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 13364
  • 日志数: 838
  • 建立时间: 2007-12-28
  • 更新时间: 2008-10-02

RSS订阅

Open Toolbar