---
title: 手动切主 Zone 到其他机房场景应急演练流程-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于手动切主 Zone 到其他机房场景应急演练流程相关的常见问题和使用技巧，帮助您快速解决手动切主 Zone 到其他机房场景应急演练流程的难题。
---
切换语言

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

划线反馈

# 手动切主 Zone 到其他机房场景应急演练流程

更新时间：2026-06-12 04:01

适用版本： V2.1.x、V2.2.x、V3.1.x、V3.2.x 内容类型：TechNote  

本文讲述手动切主 Zone 到其他机房场景应急演练的具体流程。

## 适用版本

OceanBase 数据库 V2.x、V3.x 版本。

## 操作步骤

演练操作步骤如下。

1. 演练开始前检查集群各 OBServer 状态，执行以下 SQL 查看。

   ```shell
   obclient> SELECT zone,
                   svr_ip,
                   svr_port,
                   inner_port,
                   with_rootserver,
                   status,
                   gmt_create,
                   CASE WHEN start_service_time = 0 THEN start_service_time ELSE usec_to_time(start_service_time) END start_service_time,
                   CASE WHEN stop_time = 0 THEN stop_time ELSE usec_to_time(stop_time) END stop_time,
                   substr(build_version, 1, instr(build_version, '-') -1)  build_version
             FROM oceanbase.__all_server
             ORDER BY  zone, svr_ip;

   ```

   当 `status` 列显示 `active`，同时 `start_service_time` 列有时间戳，且 `stop_time` 列为 0，则节点是正常状态。

   预期所有 OBServer 节点正常。
 2. 查询租户的 Primary Zone 情况，可执行以下 SQL 查看。

   ```shell
   obclient> select tenant_id, tenant_name, primary_zone from oceanbase.__all_tenant;

   ```

   #### 说明

   建议保留该数据，以便回切时候确保状态与回退前一致。
 3. 检查业务租户表 leader 分布，可执行以下 SQL 查看。

   ```shell
   obclient> SELECT now(),
                   tent.tenant_id,
                   tent.tenant_name,
                   zone,
                   svr_ip,
                   role,
                   count(*) cnt
             FROM oceanbase.__all_virtual_meta_table meta
             JOIN oceanbase.__all_tenant tent
                   ON meta.tenant_id = tent.tenant_id
             WHERE 1 = 1
                   AND tent.tenant_id = < 业务租户id >
                   AND role = 1
             GROUP BY  tent.tenant_id, zone, svr_ip, role
             ORDER BY  tent.tenant_id, role,zone;

   ```

   预期 z1~z4 的 OBServer 节点上都有 leader，且分布均匀。
 4. Clog 同步延迟检查。

   ```shell
   obclient> SELECT /*+ READ_CONSISTENCY(WEAK),
                  query_timeout(100000000) */ svr_ip,
                  count(*) count
             FROM oceanbase.__all_virtual_clog_stat
             WHERE is_in_sync = 0
             AND is_offline = 0
             GROUP BY  svr_ip
             HAVING count > 0;

   ```

   预期无结果。
 5. 保留日志。

   保留 OBServer 节点服务相关日志。目录：`/home/admin/oceanbase/log`。

   如果发生 core，保留 core 文件。目录：`/data/1/`（core 文件存储放在数据文件目录下）。
 6. 切主之前需要进行以下检查。

      - 是否指定了表级别的 primary_zone。

       ```shell
       obclient> SELECT primary_zone,
                       tenant_id,
                       table_id
                 FROM oceanbase.__all_virtual_table
                 WHERE primary_zone  <> '';

       ```
      - 是否指定了数据库级级别的 primary_zone。

       ```shell
       obclient> SELECT tenant_id,
                       database_id,
                       database_name,
                       primary_zone
                 FROM oceanbase.__all_virtual_database
                 WHERE primary_zone is NOT null;

       ```
      - 是否指定了表组的 primary_zone。

       ```shell
       obclient> SELECT tenant_id,
                       tablegroup_name,
                       primary_zone
                 FROM oceanbase.__all_virtual_tablegroup
                 WHERE primary_zone is NOT null;

       ```

   以上三种情况默认为空。如果指定了以上三种优先级别的 Primary Zone，在切主之前需要将其设置为 default。

   ```shell
   obclient> ALTER database 数据库名 set primary_zone=default;
   obclient> ALTER tablegroup 表组名 primary_zone=default;  
   obclient> ALTER table 表名 set PRIMARY_ZONE=default;

   ```
 7. 确认没有表、数据库、表组级别的 Primary Zone 设置后，修改 primary_zone list 实现手动切主。

      - 通过 OCP 直接在租户页面进行 Zone 优先级的修改。
      - 通过黑屏命令进行修改。

       ```shell
       obclient> ALTER TENANT tenant_name PRIMARY_ZONE 'zone3,zone4;zone1,zone2;zone5';

       ```
 8. 查询租户的 Primary Zone 情况。

   ```

   预期 Primary Zone 字段值为: `zone3,zone4;zone1,zone2;zone5`。
 9. 查询主副本分布情况，检查业务租户表 leader 分布。

   ```shell
   obclient> SELECT now(),
                   tent.tenant_id,
                   tent.tenant_name,
                   zone,
                   svr_ip,
                   role,
                   count(*) cnt
             FROM oceanbase.__all_virtual_meta_table meta
             JOIN oceanbase.__all_tenant tent
                   ON meta.tenant_id = tent.tenant_id
             WHERE 1 = 1
                   AND tent.tenant_id = < 业务租户id >
                   AND role = 1
             GROUP BY  tent.tenant_id, zone, svr_ip, role
             ORDER BY  tent.tenant_id, role, zone;

   ```

   预期低碳机房的 z1、z2 的 leader 会切换到 idc 机房的 z3 或 z4。

   #### 注意

   手动切主会导致应用交易部分失败。

   从低碳 leader 切到 idc 的动作可以通过历史 event 事件查询。

   ```shell
   obclient> select * from oceanbase.__all_rootservice_event_history where event like '%switch%';

   ```
 10. Clog 同步延迟检查。

    ```

    预期无结果。
 11. 切主完成后，验证业务租户访问情况。
 12. 回切，与上述步骤一样，把租户的 Primary Zone 修改回之前的状态。
 13. 回切后做如下检查，检查 OBServer 节点状态。

    ```

    status 列显示 active，同时 start_service_time 列有时间戳，且 stop_time 列为 0，则节点是正常状态。

    预期所有 OBServer 节点正常。
 14. Clog 同步延迟检查。

    ```

    预期无结果。
 15. 检查租户的 Primary Zone 情况。

    ```

    预期与演练前查询结果一致。
 16. 检查业务租户表 leader 分布。

    ```

    预期 z1~z4 的 OBServer 节点上都有 leader，且分布均匀。
 17. 演练结束。

上一篇

[业务偶发收到 the observer or zone is not the master 原因](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000284434)

下一篇

[OBServer 切主后回放日志报错 ERROR 6205(OB_TRANS_INVALID_STATE)](https://www.oceanbase.com/knowledge-base/oceanbase-database-20000045536) ![有帮助](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) 咨询热线
