Logical standby 应用时如果遇到错误可能导致主备之间的实时应用停止,alert日志中会有如下错误
Fri Sep 26 12:32:29 2014
LOGSTDBY Apply process AS03 server id=3 pid=60 OS id=6102 stoppedFri Sep 26 12:32:29 2014
LOGSTDBY Apply process AS02 server id=2 pid=59 OS id=6100 stopped
LOGSTDBY Apply process AS05 server id=5 pid=62 OS id=6106 stoppedFri Sep 26 12:32:29 2014
LOGSTDBY Apply process AS01 server id=1 pid=58 OS id=6098 stopped
Fri Sep 26 12:32:29 2014
LOGSTDBY Apply process AS04 server id=4 pid=61 OS id=6104 stopped
这样错误导致实时应用停止(会导致主备库数据不同步),系统无法自动修复这样的错误,需要手动处理
通过如下语句可以查询出
select XIDUSN, XIDSLT,XIDSQN , status , event,event_time from dba_logstdby_events orderby event_time desc
这个视图dba_logstdby_events是逻辑Standby操作日志,如果发生了错误,可以通过该视图查看近期逻辑Standby都做了些什么。默认情况下,该视图只保留最近10000条事件的记录,event字段看执行的具体语句
上图查询出55,32,50405这个事物在逻辑备库应用失败,需要手动处理
处理方法1:
执行如下包跳过失败事物
exec dbms_logstdby.skip_transaction(55,32,50405);
然后重新开启实时应用
SQL> ALTER DATABASE START LOGICALSTANDBY APPLY immediate;
处理方法2:
直接跳过遇见的错误
SQL> alter database start logicalstandby apply immediate skip failed transaction;
怎样查看逻辑备库是否实时应用
1.在逻辑备库上查询V$LOGSTDBY_STATE中的state字段如果状态为SQL APPLY NOT ON说明逻辑Standby数据库根本没启动SQL应用
select * from V$LOGSTDBY_STATE
2.不推荐使用第一种查询方案,查询不是很明确,推荐使用在主库上查询v$archive_dest_status视图查看归档到逻辑备库的日志recovery_mode如果为LOGICAL REAL TIME APPLY表明是实时应用,为其他表明非实时应用
select DEST_ID,STATUS,RECOVERY_MODE from v$archive_dest_status