---
title: "Failover - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: Failover 当主租户不可用时，可以将备租户切换为主租户继续提供服务。 使用限制 执行 Failover 时，要求备租户所有日志流的副本均在线，否则需要等待对应的副本永久下线。 备租户或备租户所在集群的 sys 租户可以分别通过 DBA_OB_LS 视图或 CDB_OB_LS 视图查询所有日志流副本是否在线，有关…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.6.0

# Failover

更新时间：2026-06-25 12:04:39

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.6.0/zh-CN/600.manage/400.high-availability/300.physical-standby-database-disaster-recovery/600.role-switch/300.perform-failover.md)  

当主租户不可用时，可以将备租户切换为主租户继续提供服务。

## 使用限制

- 执行 Failover 时，要求备租户所有日志流的副本均在线，否则需要等待对应的副本永久下线。

  备租户或备租户所在集群的`sys` 租户可以分别通过 `DBA_OB_LS` 视图或 `CDB_OB_LS` 视图查询所有日志流副本是否在线，有关日志流副本的详细说明信息，请参见 [副本介绍](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682017)。
 - 执行 Failover 时，不会检查对应主租户的状态，因此除主租户故障的容灾需求外，Failover 操作也可以用于独立的一个主租户在某一个时间点的快照并用于后续业务验证的需求场景。
 - 不允许在通过服务名建立的 Session 中执行 Failover 命令。有关服务的相关操作及说明，参见 [创建服务](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682942)。

  #### 注意

  执行 Failover 时，如果待执行 Failover 命令的租户下有服务名，则系统会自动删除该租户的服务名。

## 背景信息

Failover 操作只会对日志文件做修改，不会对数据文件做修改。

由于 OceanBase 数据库的每个租户均有多个日志流，而 Failover 操作需要在操作执行完成后达到数据一致的状态，故系统会选择所有日志流的同步位点中 SCN 最小的值作为 Failover 的执行位点。执行Failover 操作后，租户下的所有日志流都会统一回退到该位点。

## 操作步骤

1. 使用管理员用户登录备租户或备租户所在集群的 `sys` 租户。
 2. 执行 `ACTIVATE STANDBY VERIFY` 命令，验证 `ACTIVATE STANDBY` 命令是否可以执行成功。

      - 备所在集群的 `sys` 租户执行 `ACTIVATE STANDBY VERIFY` 命令

       ```sql
       ALTER SYSTEM ACTIVATE STANDBY TENANT [=] tenant_name VERIFY;

       ```

       示例：

       ```shell
       obclient(root@sys)[(none)]> ALTER SYSTEM ACTIVATE STANDBY TENANT = mysql VERIFY;

       ```
      - 备租户执行 `ACTIVATE STANDBY VERIFY` 命令

       ```shell
       obclient> ALTER SYSTEM ACTIVATE STANDBY VERIFY;

       ```

       命令执行后，如果返回 `OK`，则表示验证通过，可以执行下一步。

       如果出现报错，请根据提示的文本信息参考文档 [Switchover 或 Failover 相关问题](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005682335) 进行处理后，再重新执行本命令。
 3. 验证通过后，执行 `ACTIVATE STANDBY` 命令，将备租户切换为主租户。

      - 备租户所在集群的 `sys` 租户将备租户切换为主租户

       ```sql
       ALTER SYSTEM ACTIVATE STANDBY TENANT = tenant_name;

       ```
      - 备租户将本租户切换为主租户

       ```sql
       ALTER SYSTEM ACTIVATE STANDBY;

       ```
 4. 查询 `DBA_OB_TENANTS` 视图，确认备租户是否已切换为主租户。

      - 备租户所在集群的 `sys` 租户查询视图

       ```shell
       obclient(root@sys)[(none)]> SELECT TENANT_NAME, TENANT_TYPE, TENANT_ROLE, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS;

       ```
      - 备租户查询视图

       MySQL 模式：

       ```shell
       obclient [oceanbase]> SELECT TENANT_NAME, TENANT_TYPE, TENANT_ROLE, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS;

       ```

       Oracle 模式：

       ```shell
       obclient [SYS]> SELECT TENANT_NAME, TENANT_TYPE, TENANT_ROLE, SWITCHOVER_STATUS FROM SYS.DBA_OB_TENANTS;

       ```

   查询结果的示例如下：

   ```shell
   +-----------------+-------------+-------------+-------------------+
   | TENANT_NAME     | TENANT_TYPE | TENANT_ROLE | SWITCHOVER_STATUS |
   +-----------------+-------------+-------------+-------------------+
   | standby_tenant  | USER        | PRIMARY     | NORMAL            |
   +-----------------+-------------+-------------+-------------------+
   1 row in set

   ```

   根据查询结果，原备租户的 `TENANT_ROLE` 变为 `PRIMARY`，且 `SWITCHOVER_STATUS` 为 `NORMAL`，则表示备租户切主成功。

## Failover 后的注意事项

- 租户在执行 Failover 命令切换为主租户的过程中，如果该租户有服务名，则系统会自动删除该租户的服务名。但是，系统不会删除原主租户的服务名。

  例如，服务名 service1 下有一个主租户 tenantA 和其对应的备租户 tenantB，在租户 tenantB 上执行 Failover 命令切换为主租户时，由于脱离了原来的主备关系，tenantB 的服务名 service1 会被系统删除，而 tenantA 的服务名 service1 会保留。
 - 由于 Failover 操作会将所有日志流已同步的数据恢复到一致性位点，保证该位点之前的所有日志流的数据是完整的。故执行 Failover 操作后：

     - 不支持原主租户降备后接入成为新主租户的备租户。

## 后续操作：将原主租户的备租户接入新主租户

OceanBase 数据库支持在 Failover 后，通过备租户日志裁剪到指定位点的运维命令将原主租户的备租户接入新主租户，待接入的备租户可以是以下两种：

- 原主租户宕机前就已存在的备租户
 - 原主租户宕机后利用原主租户物理备份恢复出来的备租户

### 语法说明

备租户日志裁剪运维命令支持将备租户的日志裁剪到指定位点，这个指定位点一定要大于等于该备租户的同步位点。

```sql
ALTER SYSTEM FLASHBACK STANDBY LOG TO SCN = $flashback_log_scn [TENANT = 'tenant_name'];

```

参数说明如下：

- `flashback_log_scn`：备租户日志裁剪到的指定位点。
 - `tenant_name`：指定租户的租户名，如果直连租户登录，此处可省略。

### 注意事项

在进行后续操作前，你需要确保以下条件：

- 使用该命令前需要保证备租户已停止同步并且恢复源为空。
 - 不允许租户有合法副本在下线的机器上。
 - 只允许备租户做日志裁剪操作，租户的 `STATUS` 和 `SWITCHOVER_STATUS` 都需要是 `NORMAL`， `SWITCHOVER_STATUS` 还可以是 `FLASHBACK_AND_STAY_STANDBY_STATUS`。
 - 设置的日志裁剪位点需要大于等于租户的同步位点。
 - 该命令会自动清除租户的 service name（如有）。
 - 租户 `SWITCHOVER_STATUS` 为 `FLASHBACK_AND_STAY_STANDBY_STATUS` 时，不允许租户继续同步，不允许修改租户的恢复源。

### 操作步骤

1. 备租户停止同步，然后确认备租户的 `SYNC_SCN` 等于 `RECOVERY_UNTIL_SCN`。

      1. 执行以下命令，停止备租户的日志同步。

        ```sql
        ALTER SYSTEM RECOVER STANDBY [TENANT [=] tenant_name] CANCEL;

        ```

        示例如下：

             - 备租户所在集群的 `sys` 租户停止备租户的日志同步。

              ```shell
              obclient(root@sys)[(none)]> ALTER SYSTEM RECOVER STANDBY TENANT = standby3 CANCEL;

              ```
             - 备租户停止本租户的日志同步。

              ```shell
              obclient> ALTER SYSTEM RECOVER STANDBY CANCEL;

              ```
      2. 执行以下命令，确认备租户的 `SYNC_SCN` 是否等于 `RECOVERY_UNTIL_SCN`。

             - 备租户所在集群的 `sys` 租户查询视图确认

              ```shell
              obclient(root@sys)[(none)]> SELECT TENANT_ID, SYNC_SCN, RECOVERY_UNTIL_SCN FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_ID=xxxx;

              ```
             - 备租户查询视图确认

              MySQL 模式：

              ```shell
              obclient(root@standby3)[(none)]> SELECT TENANT_ID, SYNC_SCN, RECOVERY_UNTIL_SCN FROM oceanbase.DBA_OB_TENANTS;

              ```

              ```shell
              obclient(sys@standby3)[SYS]> SELECT TENANT_ID, SYNC_SCN, RECOVERY_UNTIL_SCN FROM SYS.DBA_OB_TENANTS;

              ```
 2. 设置备租户的恢复源为空，查询视图 `CDB_OB_LOG_RESTORE_SOURCE` 确认是否修改成功。

      1. 执行以下命令，设置备租户的恢复源为空。

        语句如下：

        ```sql
        ALTER SYSTEM SET LOG_RESTORE_SOURCE = '' [TENANT [=] tenant_name];

        ```

        示例如下：

             - 备租户所在集群的 `sys` 租户将备租户的恢复源置为空。

              ```shell
              obclient(root@sys)[(none)]> ALTER SYSTEM SET LOG_RESTORE_SOURCE = '' TENANT = standby3;

              ```
             - 备租户将本租户的恢复源置为空。

              ```shell
              obclient> ALTER SYSTEM SET LOG_RESTORE_SOURCE = '';

              ```
      2. 查询视图 `CDB_OB_LOG_RESTORE_SOURCE`，确认是否修改成功。

              ```shell
              obclient(root@sys)[(none)]> SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE WHERE TENANT_ID = xxxx;

              MySQL 模式：

              ```shell
              obclient(root@standby3)[(none)]> SELECT * FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE;

              ```

              ```shell
              obclient(sys@standby3)[SYS]> SELECT * FROM SYS.DBA_OB_LOG_RESTORE_SOURCE;

              ```
 3. 确认日志裁剪位点，运维命令对日志裁剪位点只有一个要求，即大于等于租户同步位点。如何设置一个有意义的值请参考下文 **场景最佳实践** 小节。这里的使用步骤介绍假设了日志裁剪位点为任意大于等于租户同步位点的值。
 4. 查询视图 `DBA_OB_TENANTS`，确认相关信息。

   主要确认以下信息：

      - 确认即将设置的日志裁剪位点大于等于备租户的 `SYNC_SCN`。
      - 确认备租户的 `STATUS` 为 `NORMAL`，`SWITCHOVER_STATUS` 为 `NORMAL` 或者 `FLASHBACK_AND_STAY_STANDBY_STATUS`。

   查询语句如下：

       ```shell
       obclient(root@sys)[(none)]> SELECT TENANT_ID, SYNC_SCN, STATUS, SWITCHOVER_STATUS
       FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_ID=xxxx;

       MySQL 模式：

       ```shell
       obclient(root@standby3)[(none)]> SELECT TENANT_ID, SYNC_SCN, STATUS, SWITCHOVER_STATUS
       FROM oceanbase.DBA_OB_TENANTS;

       ```

       MySQL 模式：

       ```shell
       obclient(sys@standby3)[SYS]> SELECT TENANT_ID, SYNC_SCN, STATUS, SWITCHOVER_STATUS
       FROM SYS.DBA_OB_TENANTS;

       ```
 5. 查询视图 `DBA_OB_SERVERS` ，不允许租户有合法副本在下线的机器上。

   登录备租户所在集群的 `sys` 租户，执行以下语句进行查询。

   ```shell
   obclient(root@sys)[(none)]> SELECT COUNT(*)
   -> FROM CDB_OB_LS_LOCATIONS
   -> WHERE (SVR_IP, SVR_PORT) IN (
   ->     SELECT SVR_IP, SVR_PORT
   ->     FROM oceanbase.DBA_OB_SERVERS
   ->     WHERE STATUS = 'INACTIVE'
   -> )
   -> AND TENANT_ID = xxxx;

   ```

   如果查询结果为空，则表示没有合法副本在下线的机器上。
 6. 执行备租户日志裁剪运维命令。

   ```

### 场景最佳实践

此小节介绍了一些 Failover 操作的场景最佳实践。

#### 注意

推荐使用 OCP 来实现下述最佳实践。

#### 选择新主租户并接管其他备租户

在一主多备场景下，识别同步位点最大的备租户，将其 Failover 成主租户，然后将剩下的备租户接入新主租户。避免有了新主租户之后，原主租户的其他备租户就作废了。具体需要完成以下两个操作：

1. 选出新主租户。

   主要进行如下操作：

      - 对原主租户下面的所有备租户发送停止同步命令。
      - 设置主租户下所有备租户的 `LOG_RESTORE_SOURCE` 为空。
      - 读取所有备租户的同步位点，找到同步位点最大的备租户，并将其 Failover 成主租户。如果需要指定某一个备租户作为新主租户，那同步位点比新主租户更大的备租户就不能接入新主租户。
 2. 备租户 FLASHBACK 接入新主库。

   主要进行如下操作：

      - 确认新主租户的 Failover 位点，通过视图 `DBA_OB_TENANTS` 获取新主租户的 `FLASHBACK_LOG_SCN`。
      - 对剩下的备租户发送 `FLASHBACK` 命令，设置其 `FLASHBACK_SCN` 为新主的 Failover 位点。
      - 将剩下的备租户的 `LOG_RESTORE_SOURCE` 设置为新主。
      - 设置备租户恢复终点为 `UNLIMITED`。
      - 为备租户设置与新主租户相同的 service name（如有）。

#### 利用原主租户的物理备份为新主租户创建备租户

利用原主租户的物理备份，为新主租户创建备租户。将原主租户的物理备份有效再利用，避免新主租户需要先等物理备份完成后才能创建备租户以及原主租户物理备份不再有消费价值。为主租户搭建备租户的时候可以新增选择：从原主租户备份恢复出一个备租户。这个场景其实和上面一个场景是一样的，只是备租户创建的时间不一样。需要完成以下两个操作：

1. 基于原主租户的备份创建一个备租户。

   主要进行如下操作：

      - 确认新主租户的 Failover 位点，通过视图 `DBA_OB_TENANTS` 获取租户的 `FLASHBACK_LOG_SCN`。
      - 从原主租户的备份和归档中恢复出一个备租户，指定恢复位点为新主租户的 Failover 位点。
 2. 执行上一个场景中的第二步：备租户 FLASHBACK 接入新主租户。

## 相关文档

- [DBA_OB_TENANT_FLASHBACK_LOG_SCN](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684007)
 - [CDB_OB_TENANT_FLASHBACK_LOG_SCN](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005684122)
 - [DBA_OB_TENANTS](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005683982)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
