Oracle DataGuard主库丢失归档日志后备库的RMAN增量恢复

警告
本文最后更新于 2022-07-01,文中内容可能已过时。

摘要

公司1月份做了等保,数据库修改过密码。导致密码文件不一致数据未同步。因为我们备库只是作为一个备份,没有业务使用,所以时至今日才发现。归档日志也被脚本自动清理了,当时写的脚本有问题(不管日志有没有被备库应用都删除了),现在丢了差不多小半年的数据。

那么 Oracle DataGuard 主库丢失 archivelog ,如何不重建备库完成同步?

在 Oracle DataGuard 主从同步过程中可能出现主库 archivelog 丢失,备库出现GAP错误。此时,除了重新完整搭建 DataGuard 之外,可以通过主库增量备份完成备份重新同步。

步骤

  • 在备库上找出当前 scn ;
  • 根据此 scn ,在主库上使用 rman 完成增量备份;
  • 传输增量备份到备库,同时在备库上恢复;
  • 重新启动备库同步。

在备库上取消日志应用

1
SQL> alter database recover managed standby database cancel;

查看备库scn

1
SQL> select current_scn from v$database;

根据 scn ,在主库上进行 rman 增量备份

1
rman target /
1
2
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

1
scp /data/oracle/forstandby* oracle@db-standby:$ORACLE_BASE/temp

将备库启动到 mount 状态

1
2
3
4
SQL> shutdown immediate;
SQL> startup nomount;
SQL> alter database mount standby database;
SQL> exit

rman 恢复增量备份和控制文件备份

1
rman target / nocatalog

rman target / 是连接了 target DB 并进入了 rman 环境,这时还可以连接 catalog DB rman target / nocatalog 是以 nocatalog 模式连接进入了 target DB,这时是不可以再连接 catalog DB了

1
2
3
RMAN> crosscheck archivelog all; #把无效的expired的archivelog标出来
RMAN> delete expired archivelog all; #删除所有的无效日志
RMAN> delete noprompt archivelog all completed before 'sysdate-15'; #无提示删除15天以前所有归档日志
1
2
3
4
5
6
7
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状态

1
2
SQL> startup nomount;
SQL> alter database mount standby database;

由于恢复了控制文件,因此需要重新添加新的 standby redo log file

1
2
3
4
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;

启动备库同步

1
2
SQL> alter database open read only;
SQL> alter database recover managed standby database disconnect from session using current logfile;

查看归档日志应用以及表数据是否恢复

1
SQL> select max(lh.SEQUENCE#) "Lastapplied arc", max(al.SEQUENCE#) "Last recieved arc" from v$log_history lh,v$archived_log al;

参考链接:Oracle DataGuard主库丢失归档日志后备库的RMAN增量恢复一例

相关内容