出现Logical Standby不同步现象或SQL APPLY STOP的话,首先是查看Logical Standby上的
Oracle alert log及dba_logstdby_events(如果sql apply应用失败,那么错误就会记录在
logical standby的这个视图中) .
1. 如果出现sql apply stop的现象,可能是不支持的statement或packages. 首先我们
需要查看 dba_logstdby_events 视图,查看最近的statement 。
2. 如果错误是数据库管理方面引起的,比如表空间不足等,那么我们可以在修复问题后,
重新开启: alter database start logical standby apply .
3. 如果是因为一个错误的statement输入导致,那么我们可以先忽略:
alter database stop logical standby apply .
SQL> dbms_logstdby.skip_transaction
alter database start logical standby apply .
alter database stop logical standby apply .
SQL> dbms_logstdby.skip('TABLE','schema_name','table_name',null)
alter database start logical standby apply .
SQL> alter database stop logical standby apply;
SQL> exec dbms_logstdby.skip('DML','DFMS','WIP_D_SHIP_BIN_DETAIL');
SQL> alter database start logical standby apply;
-----------------------------------------------------------------------
例子:
SQL> SET LONG 1000
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YY HH24:MI:SS';
Session altered.
SQL> SELECT EVENT_TIME, COMMIT_SCN, EVENT, STATUS FROM DBA_LOGSTDBY_EVENTS;
假设logical standby中报tablespace空间不足问题,SQL APPLY已经stop,那么可以:
SQL> ALTER SESSION DISABLE GUARD; 先停掉standby的保护模式,
加入tablespace 数据文件 ;
SQL> ALTER SESSION ENABLE GUARD;
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY;
------------------------------------------------------------------------
不要使用 SKIP_TRANSACTION 处理DML相关的Logical Standby的问题。因为一般DML
导致的failure 只是涉及一个table而已。
下面是一个例子:
Wed Jul 21 12:14:13 2010
LOGSTDBY status: ORA-00001: unique constraint (DFMS.WIP_D_SHIP_BIN_DETAIL_PK) violated
LOGSTDBY Apply process P004 pid=31 OS id=3568 stopped
Wed Jul 21 12:14:13 2010
LOGMINER: End mining logfile: /u01/product/oradata/delll10/arch/1_9086_717422003.arc
Wed Jul 21 12:14:13 2010
LOGMINER: Begin mining logfile for session 1 thread 1 sequence 9087,
/u01/product/oradata/delll10/arch/1_9087_717422003.arc
Wed Jul 21 12:14:15 2010
Errors in file /u01/product/admin/delll10/bdump/delll10_lsp0_3551.trc:
ORA-12801: error signaled in parallel query server P004
ORA-00001: unique constraint (DFMS.WIP_D_SHIP_BIN_DETAIL_PK) violated
LOGSTDBY Analyzer process P003 pid=30 OS id=3564 stopped
LOGSTDBY Apply process P006 pid=34 OS id=3573 stopped
LOGSTDBY Apply process P008 pid=29 OS id=3577 stopped
LOGSTDBY Apply process P005 pid=33 OS id=3571 stopped
LOGSTDBY Apply process P007 pid=35 OS id=3575 stopped
Wed Jul 21 12:16:27 2010
alter database stop logical standby apply
Wed Jul 21 12:16:27 2010
ALTER DATABASE STOP LOGICAL STANDBY APPLY
Completed: alter database stop logical standby apply
Wed Jul 21 12:20:16 2010
明显的是有人在Production DB上向PK字段插入的值在Logical Standby上已经存在了,
有可能是有人在Logical Standby中手工插入或修改了值。
一般可以有两种方式来进行处理:
第一种方法 :忽略这个table上操作,然后应用SQL,然后unskip, 最后初始化有重复值的table
(初始化的过程应该是drop掉table, 然后重新create,因为我们发现它的创建时间已经更改了)。
SQL> alter database stop logical standby apply;
SQL> exec dbms_logstdby.skip('DML','DFMS','WIP_D_SHIP_BIN_DETAIL');
SQL> alter database start logical standby apply;
SQL> alter database stop logical standby apply;
SQL> exec dbms_logstdby.unskip('DML','DFMS','WIP_D_SHIP_BIN_DETAIL');
SQL> EXECUTE DBMS_LOGSTDBY.INSTANTIATE_TABLE ('DFMS','WIP_D_SHIP_BIN_DETAIL','DELLL10');
SQL> alter database start logical standby apply;
第二种方式: 关闭SQL APPLY, 使用 trace event 10046 在Logical Standby上对这个
重复值进行跟踪,在Logical Standby中找到这个重复值后在Standby端删除,然后启动
SQL APPLY .
在Logical Standby上操作:
SQL> alter database stop logical standby apply;
设置10046 event 事件。
SQL> alter database start logical standby apply;
可能避免的方法:
没有直接的办法,因为logical standby本身允许在备库进行写操作,要是想避免的话,通过trigger,
在logical standby做apply的时候不会触发trigger,不过人为的对logical standby数据的操作
会触发trigger, 可以在standby上对关键表建trigger,避免dml操作 .
------------------------------------------------------------------------
某些Logical Standby不支持的语句导致sql apply stop .
例子: grant sysdba to emp ; 会收到错误:
LOGSTDBY stmt: grant sysdba to emp
LOGSTDBY status: ORA-01031: insufficient privileges
然后sql apply stop .
处理方法: 跳过这个grant DDL.
SQL> alter database stop logical standby apply;
SQL> exec DBMS_LOGSTDBY.SKIP('NON_SCHEMA_DDL');
SQL> alter database start logical standby apply;
不过由于可能后面的正常的DDL都会被跳过,所以我们需要立即执行unskip.
SQL> alter database stop logical standby apply;
SQL> exec DBMS_LOGSTDBY.UNSKIP('NON_SCHEMA_DDL');
SQL> alter database start logical standby apply;
------------------------------------------------------------------------
全表扫描导致的长运算也可能导致问题。 可以使用一下语句查出:
SQL> SELECT SAS.SERVER_ID
2 , SS.OWNER
3 , SS.OBJECT_NAME
4 , SS.STATISTIC_NAME
5 , SS.VALUE
6 FROM V$SEGMENT_STATISTICS SS
7 , V$LOCK L
8 , V$STREAMS_APPLY_SERVER SAS
9 WHERE SAS.SERVER_ID = &SLAVE_ID
10 AND L.SID = SAS.SID
11 AND L.TYPE = 'TM'
12 AND SS.OBJ# = L.ID1;
SQL> alter database stop logical standby apply;
SQL> EXECUTE DBMS_LOGSTDBY.SKIP(stmt => 'DML' , -
schema_name => 'SCOTT' , -
object_name => 'FTS');
SQL> alter database start logical standby apply;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-668726/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-668726/
本文介绍了如何解决LogicalStandby同步过程中遇到的各种问题,包括SQLAPPLYSTOP现象、表空间不足、重复键值错误等,并提供了具体的步骤和示例。
1435

被折叠的 条评论
为什么被折叠?



