ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Logical Standby上的维护操作.SKIP ---转

Logical Standby上的维护操作.SKIP ---转

原创 Linux操作系统 作者:andyxu 时间:2009-08-19 11:26:18 0 删除 编辑

转自: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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-06-26

  • 博文量
    167
  • 访问量
    292003