1. 确认主集群处于不可用状态,即主集群上的所有 OBServer 均已宕机。

      为了保证安全,要求主备集群中只能存在一个真正的主集群。如果主集群可用,则在备集群上执行Failover 命令会报错。因此,在执行 Failover 命令前,需要确认主集群处于不可用状态,避免后续 Failover 命令执行失败。

    2. 在各个备集群上查询集群状态,选择合适的备集群作为目标主集群。

      1. 在备集群上,查询 视图,获取集群信息。

        返回结果中:

        • CLUSTER_ROLE:表示集群角色,备集群角色应为 PHYSICAL STANDBY

        • PROTECTION_MODE:表示保护模式。

        • PROTECTION_LEVEL:表示保护级别。

        • CURRENT_SCN:表示备集群的同步进度。

        根据查询结果:

        • 当保护模式 PROTECTION_MODE 与保护级别 PROTECTION_LEVEL 均为 MAXIMUM AVAILABILITY 或者 MAXIMUM PROTECTION 时,有损 Failover 的执行结果与无损 Failover 一致,认为当前所有分区数据一致,不会执行回滚操作。

        • 当保护模式 PROTECTION_MODE 与保护级别 PROTECTION_LEVEL 为其他组合时,有损 Failover 会以租户为单位将所有分区数据回滚到一致状态。

          其中,CURRENT_SCN 表示所有租户同步进度的最小值。CURRENT_SCN 越小,执行 Failover 操作后丢失的数据就越多;如果 CURRENT_SCN01,则表示备集群的部分租户还处于构建状态,数据不完整,执行 Failover 后数据可能会清空。

        1. obclient> SELECT TENANT_ID, MIN_SYS_TABLE_SCN, MIN_USER_TABLE_SCN FROM V$OB_CLUSTER_STATS;
        2. +-----------+-------------------+--------------------+
        3. | TENANT_ID | MIN_SYS_TABLE_SCN | MIN_USER_TABLE_SCN |
        4. | 1001 | 1613813589631620 | 1613813589631620 |
        5. | 1002 | 1613813589631620 | 1613813589631620 |
        6. +-----------+-------------------+--------------------+
        7. 3 rows in set

        返回结果中:

        • TENANT_ID:表示租户 ID,TENANT_ID1 表示系统租户,其他数值表示普通租户。

        • MIN_SYS_TABLE_SCN:表示系统表的同步进度最小值。

        • MIN_USER_TABLE_SCN:表示用户表的同步进度最小值。

        系统租户在主备集群上相互独立,不会进行物理同步,有损 Failover 过程中不会执行回滚操作。

        普通租户在主备集群上物理同步,不同分区的同步进度不同,有损 Failover 以普通租户为单位执行回滚操作:

        • 所有系统表分区的回滚点为:MIN_SYS_TABLE_SCN

        • 所有用户表分区的回滚点为:MIN_USER_TABLE_SCNMIN_SYS_TABLE_SCN 的最小值

    3. 选择备集群后,登录备集群,修改配置项,加快 Failover 的速度。

      修改以下 2 个隐藏配置项,可以加快 Failover 的速度:

      • _mini_merge_concurrency:用于控制转储的并发度,默认值为 3,可以修改为 16

      • _ob_minor_merge_schedule_interval:用于调度转储的间隔时间,默认为 20s,建议修改为 3s

      具体操作如下:

      1. 在修改配置项前,建议先记录这些配置项的原始值,便于后续恢复这些配置项的值。

      2. 修改配置项的值。

        1. obclient> ALTER SYSTEM SET _ob_minor_merge_schedule_interval = '3s';
        2. Query OK, 0 rows affected
    4. 在备集群上,执行以下命令,切换为主集群。

      1. 通过系统变量 ob_query_timeout 来设置命令的超时时间,单位为微秒,默认值为 10000000 表示10 秒。更多系统变量 ob_query_timeout 的说明,请参见 。

        说明

        设置命令的超时时间为可选操作,您可以根据实际情况进行调整,建议设置为 100 秒(100000000)。

      2. 执行 Failover 命令。

        1. obclient> ALTER SYSTEM ACTIVATE PHYSICAL STANDBY CLUSTER;
        2. Query OK, 0 rows affected
    5. 查询 V$OB_CLUSTERV$OB_CLUSTER_FAILOVER_INFO 视图,观察集群状态,确定 Failover 切换位点。

      V$OB_CLUSTER_FAILOVER_INFO 视图记录了每一轮每个租户的 Failover 数据,SYS_TABLE_SCN 表示系统表的 Failover 位点,USER_TABLE_SCN 表示用户表的 Failover 位点,系统租户的 Failover 位点没有意义。

      执行 Failover 后,集群角色从 PHYSICAL STANDBY 变为 PRIMARYSTANDBY_BECAME_PRIMARY_SCN记录了所有租户中最小的 Failover 的位点。Failover 位点的含义是小于或等于该位点的数据与原主集群的数据一致。

    6. 恢复配置项的值。

      注意

      如果执行 Failover 前修改了配置项,Failover 执行完成后请务必恢复配置项的值,以免影响后续集群的正常工作。

      1. obclient> ALTER SYSTEM SET _mini_merge_concurrency = 3;
      2. Query OK, 0 rows affected