通过failover切换ADG,如何解决数据丢失问题

通过failover方式做角色切换时,目标库会放弃日志应用(日志包括主库未归档的redo日志、未传送到目标端归档日志、目标端未应用的日志),立即切换为主库角色,从而导致数据丢失。
在时间允许的情况下,可以尝试以下方案尽量减少数据丢失。步骤4~9可以在DGMGRL管理窗口,通过dgmgrl命令执行。oracle的DGMGRL在管理ADG方面是非常智能且简单易用的,建议大家尽量配置DGBroker。

操作步骤:
step1:如果主库可以mount起来,将未传送到目标端的归档日志和在线重做日志刷到standby数据库。操作成功,failover操作时可以避免数据丢失。如果主库mount失败,则执行step2。
SQL> ALTER SYSTEM FLUSH REDO TO target_db_name; ###如果该步骤执行成功,则直接跳到步骤5执行。

step2:备库节点上查询各个线程日志最大SEQUENCE号
SQL> SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) OVER (PARTITION BY thread#) AS LAST from V$ARCHIVED_LOG;
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';  

##如果可能,复制主库最近的归档日志到standby数据库上,并注册

step3:查询备库上是不是存在日志gap
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1'; 
##如果存在gap,尽可能复制主库最近缺失的日志到standby数据库上,并注册

step4:重复步骤2、3,把存在的问题尽量解决

step5:目标standby节点取消日志应用
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

step6:failover切换
SQL> ALTER DATABASE FAILOVER TO target_db_name;
##如果成功则直接执行step6,报错则执行step7

step7:执行数据丢失的failover切换
ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
##尽量解决报错,如果报错无法解决,则执行上述命令

step8:打开数据库
SQL> ALTER DATABASE OPEN;

step9:对新主库做全库备份
 

你可能感兴趣的:(ADG)