Oracle DataGuard 故障转移切换 (Failover)

发布于:2024-12-06 ⋅ 阅读:(91) ⋅ 点赞:(0)
概述:

根据上篇文章,FAILOVER切换一般是PRIMARY数据库发生故障后的切换,这种情况是STANDBY数据库发挥其作用的情况。这种切换发生后,可能会造成数据的丢失。而且这个过程不是可逆的,DATA GUARD环境会被破坏。

由于PRIMARY数据库已经无法启动,所以FAILOVER切换所需的条件并不多,只要检查STANDBY是否运行在最大保护模式下,如果是的话,需要将其置为最大性能模式,否则切换到PRIMARY角色也无法启动。

注意:故障转移会破坏 DG 的主从关系,使其变为互不相关的两个数据库,谨慎使用。

(一)故障转移操作流程图

在这里插入图片描述

(二)故障转移操作流程

以下操作步骤根据上面流程图步骤进行。

步骤 1:刷新所有未发送到备库的日志到备库

如果主库还可以启动到 mount 状态,则刷新所有未发送的归档日志和在线 redo 日志到备库。如果这一步成功了,则可以保证数据零丢失。
如果主库不能 mount,则执行第 2 步。

SQL> ALTER SYSTEM FLUSH REDO TO 'target_db_name';

其中,target_db_name 为备库的 db_unique_name
如果上面的语句执行成功,则直接跳到步骤 5;如果执行报错,则执行步骤 2。

步骤 2:确认备库接收到的最新的归档日志文件

在备库上使用 V$ARCHIVED_LOG 视图,查询每个实例的最大日志序列号的日志,通过查询出的日志序列号与主库的最大日志序列号比较(主库的直接到服务器上去查看归档日志文件),可以知道缺失了哪些归档日志文件。

SQL> SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) OVER (PARTITION BY thread#) AS LAST FROM V$ARCHIVED_LOG;

THREAD       LAST
---------- ----------
1          100

如果可能,对于还未传输到备库的日志文件,直接从主数据库上拷贝过去,然后注册日志。

SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '路径';
步骤 3:确认和解决日志 GAP

在备库上查询 V$ARCHIVE_GAP 视图,确认是否存在日志 GAP。

SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;

THREAD#    LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------
1            90             92

在这个例子中,GAP 存在于线程 1 的 90, 91, 92 号归档日志上,如果可能,拷贝这些日志到备库服务器上,然后注册日志。

SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '路径';
步骤 4:重复步骤 3 直到把所有 GAP 解决

继续在备库上查询 V$ARCHIVE_GAP 视图,直到没有数据返回,说明没有 GAP。
如果在执行了步骤 2 到步骤 4 后,依然无法解决日志 GAP(例如,主服务器宕机,我们无法访问主数据库,导致日志无法同步到备库),则执行 failover 切换后会存在数据丢失。

步骤 5:备库停止日志应用

执行如下操作:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
步骤 6:完成所有已经接收日志的应用

在备库上执行如下操作:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;

如果这个操作未报错,则执行步骤 7。
如果发生报错,尝试解决错误,再次执行以上 SQL 语句,如果报错无法解决,可以在目标备库执行以下语句来进行故障转移(会丢失数据)。

SQL> ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;

这个语句完成后跳到第 9 步执行。

步骤 7:确认目标备库准备切换为主库

查看目标备库 v$database 视图的 SWITCHOVER_STATUS 列。

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS
-----------------
TO PRIMARY

如果 SWITCHOVER_STATUS 的值为 “TO PRIMARY” 或者 “SESSIONS ACTIVE”,则说明备库已经准备切换为主库。如果不是这两个值,确认 Redo 日志应用是否还是活跃的,继续查询,直到变为这两个值中的一个为止。

步骤 8:切换物理备库为主库

使用下面的 SQL 语句进行切换:

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
步骤 9:打开新的主库
SQL> ALTER DATABASE OPEN;
后续
  1. 在打开数据库之后,建议做一个完整备份
  2. 如果主服务器/数据库重新启动,则需要还原失败的主数据库

网站公告

今日签到

点亮在社区的每一天
去签到