由于Standby停机造成主备归档不一致,从而产生GAP的解决方案
环境:
Oracle9i + Suse9 + DataGuard + 默认的最大性能模式
Primary参数文件:
*.log_archive_dest_1='LOCATION=/u01/arch'
*.log_archive_dest_2='SERVICE=standby LGWR'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
Standby参数文件:
*.fal_server='primary'
*.fal_client='standby'
DB_FILE_NAME_CONVERT=('/u01/oracle/oradata/dzzds20','/u01/oracle/oradata/dzzds20')
LOG_FILE_NAME_CONVERT=('/u01/oracle/oradata/dzzds20','/u01/oracle/oradata/dzzds20')
*.standby_file_management=auto
*.standby_archive_dest='/u01/arch'
LOG_ARCHIVE_DEST_1='LOCATION=/u01/arch'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
由于停机造成主备不一致,归档#Sequence = 538 到541的归档日志未应用到备库
备库中Alert.log
Mon Jan 25 16:23:51 2010
Failed to request gap sequence. Thread #: 1, gap sequence: 538-541
All FAL server has been attempted.
SQL> select * from V$ARCHIVE_GAP;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------
1 538 541
主库有备份,但本地磁盘上的归档已通过RMAN delete archivelog 删除,必须从磁带上恢复.
现要求重新达到主备的一致性状态.
解决方案:
1 将归档538 -- 541 从磁带中恢复到Primary的归档路径.观察是否能够主动传送到Standby? 可以通过切换日志的方法来触发日志传输?
分析:
控制文件和Catalog 中记录 Sequence 538-541的信息已删除,无法恢复Archivelog. 只能先恢复控制文件.
这样必须做Resetlogs,会丢失主库之前所有的备份,且要重启Primay,影响正常业务不合适
2 重做Standby (the last restore)
分析:在Primary不down的情况下利用RMAN做Standby ,这种方案是比较彻底的,但不够理想.
参考<< RMAN学习笔记_ Duplicate重做DataGuard>>
5 最终解决方案DBMS_backup_retore 包
解决过程:
查找538-541这些归档文件在哪个Backup piece里面.
SQL> select * from v_$backup_redolog where sequence# in (538,539,540,541);
RECID STAMP SET_STAMP SET_COUNT THREAD# SEQUENCE# RESETLOGS_CHANGE# RESETLOGS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME BLOCKS BLOCK_SIZE
---------- ---------- ---------- ---------- ---------- ---------- ----------------- --------- ------------- --------- ------------ --------- ---------- ----------
408 709002012 709002011 65 1 539 1 01-JUL-09 2.6961E+12 22-JAN-10 2.6961E+12 23-JAN-10 558 512
410 709002012 709002011 65 1 538 1 01-JUL-09 2.6961E+12 22-JAN-10 2.6961E+12 22-JAN-10 1 512
411 709002595 709002594 68 1 540 1 01-JUL-09 2.6961E+12 23-JAN-10 2.6961E+12 23-JAN-10 10 512
412 709088404 709088403 70 1 541 1 01-JUL-09 2.6961E+12 23-JAN-10 2.6961E+12 24-JAN-10 1203 512
413 709088404 709088403 70 1 540 1 01-JUL-09 2.6961E+12 23-JAN-10 2.6961E+12 23-JAN-10 10 512
540归档出现在两个Backup Piece中,说明,540是重复备份的.
由此注意:备份过程中,Backup piece的Format 一定要标记backup set id, and backup piece ID;
declare
devtype varchar2(256);
done boolean;
begin
devtype := sys.dbms_backup_restore.deviceAllocate(type=>'',ident=>'t1');
sys.dbms_backup_restore.restoreSetArchivedLog(destination=>'/u01/arch/');
sys.dbms_backup_restore.restoreArchivedlog(thread=>1,sequence=>538);
sys.dbms_backup_restore.restoreArchivedlog(thread=>1,sequence=>539);
sys.dbms_backup_restore.restorebackuppiece(done=>done,handle=>'/u01/backup/dzzd/DZZDS20x_65_1.log',params=>null);
sys.dbms_backup_restore.devicedeallocate;
end;
/
declare
devtype varchar2(256);
done boolean;
begin
devtype := sys.dbms_backup_restore.deviceAllocate(type=>'',ident=>'t2');
sys.dbms_backup_restore.restoreSetArchivedLog(destination=>'/u01/arch/');
sys.dbms_backup_restore.restoreArchivedlog(thread=>1,sequence=>540);
sys.dbms_backup_restore.restoreArchivedlog(thread=>1,sequence=>541);
sys.dbms_backup_restore.restorebackuppiece(done=>done,handle=>'/u01/backup/dzzd/DZZDS20x_70_1.log',params=>null);
sys.dbms_backup_restore.devicedeallocate;
end;
/
归档恢复后,Oracle会自动传递归档到备端,备端会自动应用归档.可通过查看两边Log来观察.
应用完成后,查看GAP
SQL> select * from V$ARCHIVE_GAP;
no rows selected
至此问题解决
相关问题
1 Primary上的归档538-- 541为什么会被删掉,之前不是测试过如没用应用到Standby是不会删除本地归档的吗?
可能的原因是,当Standby被停机后,不再遵循这个规则?
进一步学习DataGuard相关文档,什么情况下会产生Gap.
2 这证明目前的备份与归档的处理策略在Dataguard环境下不够完善,
在GoldenGate环境下也同样存在问题
要改进,确保删除归档之前,归档已传输应用到了备库或远端.
3 如何手动触发FAL去取Gap 归档?
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10248702/viewspace-626241/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10248702/viewspace-626241/