点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


从oracle 12.1开始引入了新的SQL语法,用于物理备库的failover切换。
在使用过程严禁混合使用新旧两种用法。除非在切换过程中有明确的提示。
failover前准备工作
LOG_ARCHIVE_DEST_1
LOG_ARCHIVE_DEST_2
LOG_ARCHIVE_CONFIG
FAL_SERVER
STANDBY_FILE_MANAGEMENT
db_file_name_convert
log_file_name_convert
enabled_PDBs_on_standby
SQL>select group#,thread#,bytes/1024/1024 MM from v$log;
SQL>select member from v$logfile;
SQL>select group#,thread#,bytes/1024/1024 MM,status from v$standby_log;
select inst_id,dbid,name,db_unique_name,open_mode,PROTECTION_MODE,database_role,failover_STATUS,DATAGUARD_BROKER from gv$database;
select * from v$dataguard_stats;
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#,BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;
SELECT STATUS, GAP_STATUS FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;
8. 确认备库的硬件(CPU、内存、IO)性能能够支撑切换后的应用连接。
使用旧语法执行failover到Physical Standby Database
SQL> ALTER SYSTEM FLUSH REDO TO target_db_name;
如果主库不能mounted,则转到步骤2。 如果此步骤没报错,请转至步骤5。 如果时间紧急,不能等待完成,请继续步骤2。
2. 查询备库上的v$archivd_log视图,以获取redo的最大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';
SQL>SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
如果有gap,请将gap的归档日志从主库传输到备库,然后在备库中注册文件。
SQL>ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
如果此步骤完成并且没有任何错误,请继续执行步骤7。 如果发生错误,如某些归档日志未应用。请尝试解决错误并重新执行该步骤语句。然后再继续执行一步。 如果存在步骤2、步骤3和步骤4中未解决的gap。则会报错。 如果无法解决错误。则仍可以通过在目标备库上执行以下SQL语句来执行故障转移(会丢失一些数据):
SQL> ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO PRIMARY
1 row selected
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
如果步骤7中返回结果是"TO PRIMARY",则SQL语句中可以不写“WITH SESSION SHUTDOWN”; 如果命令执行不成功,请转到步骤9。
9. open新主库:
SQL> ALTER DATABASE OPEN;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
12. FAILOVER后,有3种方法将原主库转换为备库:
原主库转换为备库后,可以执行switchover将其恢复成主库。
使用新语法执行failover到Physical Standby Database
SQL> ALTER SYSTEM FLUSH REDO TO target_db_name;
如果此步骤没报错,请转至步骤5; 如果时间紧急,不能等待完成,请继续步骤2。
2. 查询备库上的v$archivd_log视图,以获取redo的最大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';
SQL>SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
如果有gap,请将gap的归档日志从主库传输到备库,然后在备库中注册文件。
SQL>ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL>ALTER DATABASE FAILOVER TO targe_db_name;
如果此步骤完成并且没有任何错误,请继续执行步骤10。
如果成功,请转到步骤10; 如果仍有错误,而且与原主库有关,请转到步骤8; 如果仍有错误,但与原主库无关,请转到步骤9。
8. 忽略与原主库交互时遇到的任何故障,并在可能的情况下继续进行failover。
SQL>ALTER DATABASE FAILOVER TO targe_db_name FORCE;
如果命令执行成功,请转到步骤10; 如果命令执行不成功,请转到步骤9。
9. 执行数据丢失故障转移:
如果无法解决报错,则仍可以通过在备库上执行以下SQL语句来执行故障转移(并丢失一些数据。)
SQL>ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
13. FAILOVER后,有3种方法将原主库转换为备库:
原主库转换为备库后,可以执行switchover将其恢复成主库。
使用data guard broker执行failover到Physical Standby Database
1. 使用dg broker检查主备库的同步状态是否正常
show database verbose 目标备库;
show configuration verbose;

本文作者:聂文峰(上海新炬王翦团队)
本文来源:“IT那活儿”公众号

最后修改时间:2022-09-23 11:41:13
文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




