Oracle DataGuard主库丢失归档日志后备库的RMAN增量恢复
目录
1 问题场景
公司1月份做了等保,数据库修改过密码。导致密码文件不一致数据未同步。因为我们备库只是作为一个备份,没有业务使用,所以时至今日才发现。归档日志也被脚本自动清理了,当时写的脚本有问题(不管日志有没有被备库应用都删除了),现在丢了差不多小半年的数据。
那么 Oracle DataGuard 主库丢失 archivelog ,如何不重建备库完成同步?
在 Oracle DataGuard 主从同步过程中可能出现主库 archivelog 丢失,备库出现GAP错误。此时,除了重新完整搭建 DataGuard 之外,可以通过主库增量备份完成备份重新同步。
2 解决方式
步骤
- 在备库上找出当前 scn ;
- 根据此 scn ,在主库上使用 rman 完成增量备份;
- 传输增量备份到备库,同时在备库上恢复;
- 重新启动备库同步。
2.1 利用rman进行增量scn的恢复
在备库上取消日志应用
SQL> alter database recover managed standby database cancel;
查看备库scn
SQL> select current_scn from v$database;
根据 scn ,在主库上进行 rman 增量备份
rman target /
RMAN> backup incremental from scn 7625847 database format '/data/oracle/forstandby_%U.bka' tag 'forstandby';
RMAN> backup current controlfile for standby format '/data/oracle/forstandbyCTRL.bkc';
copy增量备份到备库主机目录,如: /data/oracle/temp
scp /data/oracle/forstandby* oracle@db-standby:$ORACLE_BASE/temp
将备库启动到 mount 状态
SQL> shutdown immediate;
SQL> startup nomount;
SQL> alter database mount standby database;
SQL> exit
rman 恢复增量备份和控制文件备份
rman target / nocatalog
rman target / 是连接了 target DB 并进入了 rman 环境,这时还可以连接 catalog DB rman target / nocatalog 是以 nocatalog 模式连接进入了 target DB,这时是不可以再连接 catalog DB了
RMAN> crosscheck archivelog all; #把无效的expired的archivelog标出来
RMAN> delete expired archivelog all; #删除所有的无效日志
RMAN> delete noprompt archivelog all completed before 'sysdate-15'; #无提示删除15天以前所有归档日志
RMAN> catalog start with '/data/oracle/temp'; #注册增量备份文件
RMAN> recover database noredo; #注意 noredo 选项
SQL> shutdown;
SQL> startup nomount;
RMAN> restore standby controlfile from '/data/oracle/temp/forstandbyCTRL.bkc';
RMAN> shutdown;
RMAN> exit
启动备库到mount状态
SQL> startup nomount;
SQL> alter database mount standby database;
由于恢复了控制文件,因此需要重新添加新的 standby redo log file
SQL> alter database add standby logfile group 15 '/data/oracle/oradata/orcl/standby15.log' size 50M;
SQL> alter database add standby logfile group 16 '/data/oracle/oradata/orcl/standby16.log' size 50M;
SQL> alter database add standby logfile group 17 '/data/oracle/oradata/orcl/standby17.log' size 50M;
SQL> alter database add standby logfile group 18 '/data/oracle/oradata/orcl/standby18.log' size 50M;
启动备库同步
SQL> alter database open read only;
SQL> alter database recover managed standby database disconnect from session using current logfile;
查看归档日志应用以及表数据是否恢复
SQL> select max(lh.SEQUENCE#) "Lastapplied arc", max(al.SEQUENCE#) "Last recieved arc" from v$log_history lh,v$archived_log al;