转自:http://fbirdzp.blogbus.com/logs/37979892.html
DBA_LOGSTDBY_EVENTS是Logical Standby上的一个重要视图,默认统计Standby上最新的100个Sql Apply有关的事件,除系统表空间不够以外的导致Sql Apply操作中断的事件都会记录在该视图里。
用户可以自定义DBA_LOGSTDBY_EVENTS统计事件的类型和保留的记录条数。Oracle10.1版本使用DBMS_LOGSTDBY_PUBLIC包修改,10.2版本以后使用DBMS_LOGSTDBY包进行参数调整,两者只是版本不同。以10.2版本数据库为例,如下:
- 修改DBA_LOGSTDBY_EVENTS视图保留的记录条数为10000
SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET ('MAX_EVENTS_RECORDED', '10000'); - 修改DBA_LOGSTDBY_EVENTS视图统计DDL transactions类型的事件
SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET ('RECORD_APPLIED_DDL', 'TRUE')
通过DBA_LOGSTDBY_EVENTS视图,我们可以找到导致Sql Apply异常的事件,并采取相应的措施。比如Primary上一些DDL操作或批量DML操作导致logical standby上的apply中断,我们需要SKIP掉这些堵塞的事件或是transactions,方法如下:
1. 查看logical standby上的问题事件
SQL> select xidusn, xidslt, xidsqn, status, status_code from dba_logstdby_events where event_time = (select max(event_time) from dba_logstdby_events);
2. 停止SQL Apply
SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
3. skip掉对应的object或transactions
查询logical standby上sql apply的问题事件,如下:
eg:
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
-------- -------- -------- --------------------------------------------------- -----------
1269 26 8414 ORA-01119: error in creating database file '+DG/zc/datafile/ts_logstdby_200806_n2.dbf' 1119
ORA-17502: ksfdcre:4 Failed to create file +DG/zc/datafile/ts_logstdby_200806_n2.dbf
SQL>
以上述事件为例,使用dbms_logstdby包将create tablepspace操作skip掉,操作如下:
SQL> EXECUTE DBMS_LOGSTDBY.SKIP(stmt => 'create tablespace',object_name => 'TS_LOGSTDBY_200806_N2',schema_name => 'SYS');
使用dbms_logstdby包可以skip掉objects上的DML、DDL操作或是正在等待apply的transactions,以skip掉EMPLOYEES上的所有DDL和DML操作为例,使用SQL语句如下:
SQL> EXECUTE DBMS_LOGSTDBY.SKIP (stmt => 'DML', schema_name => 'HR', object_name => 'EMPLOYEES', proc_name => null);
SQL> EXECUTE DBMS_LOGSTDBY.SKIP (stmt => 'SCHEMA_DDL', schema_name => 'HR', object_name => 'EMPLOYEES', proc_name => null);
注意skip操作需要在logical standby上已经stop apply后进行。
4. 重新开始SQL Apply
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
执行skip object ddl/dml以后,logical standby不再apply该object上的任何ddl/dml操作。如果需要恢复logstdby对该object的apply,执行unskip操作,方法同skip类似,同样需要在stop apply以后进行。
查看logical standby上已经skip的对象:
SQL> SELECT * FROM DBA_LOGSTDBY_SKIP;
logical standy上unskip操作如下:
SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
SQL> EXECUTE DBMS_LOGSTDBY.UNSKIP(..,..,..);
--eg: SQL> EXECUTE DBMS_LOGSTDBY.UNSKIP(stmt => 'DML', schema_name => 'HR', object_name => 'EMPLOYEES');
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/110321/viewspace-612665/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/110321/viewspace-612665/