logstdby上以下两种情况需要用到SKIP维护操作:
1>定制规则,standby对primary特定对象的更新不做apply
2>日常维护,standby上出现GAP后skip掉无法apply的object,transcation或是特定用户的DML\DDL操作等
执行skip需要停止logical standby上的apply操作后进行。
1.定制规则过滤primary的操作
logstby并不要求与Primary的物理一致,可以使用DBMS_LOGSTDBY.SKIP的存储过程过滤掉一些并不希望apply在standby上的sql操作。目前logcial standby上支持的sql skip如下:
*DML or DDL changes for tables
*CREATE, ALTER, or DROP INDEX DDL statements
*CREATE, ALTER, DROP, or TRUNCATE TABLE statements
*CREATE, ALTER, or DROP TABLESPACE statements
*CREATE or DROP VIEW statements
eg:
1>Skipping a Table in a Logical Standby Database
SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
SQL> EXECUTE DBMS_LOGSTDBY.SKIP('SCHEMA_DDL', 'TABLE_OWNER', 'TABLE_NAME');
SQL> EXECUTE DBMS_LOGSTDBY.SKIP('DML', 'TABLE_OWNER', 'TABLE_NAME');
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
2>Skipping ALTER or CREATE TABLESPACE Statements
SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
SQL> EXEC DBMS_LOGSTDBY.SKIP('CREATE TABLESPACE', NULL, NULL, NULL);
SQL> EXEC DBMS_LOGSTDBY.SKIP('ALTER TABLESPACE', NULL, NULL, NULL);
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
dba_logstdby_skip视图可以查看logstdby上定制的skip规则。如果需要取消一些skip规则,则使用DBMS_LOGSTDBY.UNSKIP,方法同skip类似。
2.skip transaction
通过dba_logstdby_events查询未能apply的问题事件,然后使用dbms_logstdby.skip_transaction包skip掉堵塞的transaction。
eg:
1>查询堵塞的transaction
skip时需要transactions的一些特定值(xidusn, xidslt, xidsqn),通过dba_logstdby_events视图获取当前logstdby上apply事件的相关信息。
SQL> set line 200
SQL> col STATUS for a80
SQL> col STATUS_CODE for 9999999999
SQL> select xidusn, xidslt, xidsqn, status, status_code from dba_logstdby_events
where event_time = (select max(event_time) from dba_logstdby_events);
XIDUSN XIDSLT XIDSQN STATUS STATUS_CODE
-------- -------- -------- ---------------------------------------------------- ----------
4 47 10833 ORA-00959: tablespace 'TS_KXYK_DETAIL_V3_2008_N1' 959
does not exist
SQL>
2>执行skip操作
SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
Database altered.
SQL> execute dbms_logstdby.skip_transaction(xidusn_p => '4',xidslt_p =>'47',xidsqn_p => '10833');
PL/SQL procedure successfully completed.
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
Database altered.
查看standby上的alert.log,可以看到skip transaction的日志,类似如下:
… …
LOGSTDBY: Skip Transaction xid 0x0004.02b.00002959, chunk[0],
scn: 0x0000.01a375c
… …
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/751371/viewspace-707990/ ,如需转载,请注明出处,否则将追究法律责任。