首页 > 数据库 > 国内数据库 > OceanBase 主备租户
在
OceanBase 数据库的容灾体系中,物理备库扮演着“准实时热备份”的关键角色。可以在当主库不可用时接管服务,最大限度降低服务停机时间,减少可能带来的数据损失。
V4.1.0 版本开始, 物理备库的产品形态从集群级变更为租户级:
Primary Tenant) 和
备租户(
Standby Tenant)。物理备库主要通过日志传输服务和日志存储服务来完成日志的传输及存储,并通过日志回放服务来保证主备租户数据的一致。其中:
Redo 日志。OceanBase 物理备库仅提供
异步同步模式。MemStore 中,保障主租户与备租户的数据最终完全一致。传统数据库是主库主动发日志给备库,而
OceanBase主租户不感知备租户的存在,也就是主租户不主动往外发日志,而是备租户主动找主租户拉取日志。
一个主租户和对应的备租户可以部署在不同的集群中,也可以部署在同一个
OceanBase 集群中。相应的,同一个
OceanBase 集群中既可以包含主租户,也可以包含备租户,也可以同时包含主备租户。
| 部署方案 | 架构描述 | 适用场景 / 特点 |
|---|---|---|
| 纯主 + 纯备 | 集群间隔离 | 适合标准的生产与灾备物理资源隔离的场景。 |
| 主备混合(多集群) | 跨集群 CROSS 主备 | 适合资源充分利用的 双活/多活架构 |
| 主备混合(单集群) | 集群内租户互为主备 | 适合测试验证、本地租户级快速演练 |
物理备库通过日志传输服务在主租户和备租户之间实时同步
Redo 日志。备租户既可以从主租户同步日志,也可以从另外一个备租户同步日志(级联同步)。
OceanBase 主备租户之间靠
日志传输服务 同步
Redo 日志,备库拉日志有两种模式:
ARCHIVELOG 模式,把 Redo 日志异步归档到
共享存储(OSS/NFS/COS 等)。备租户
不直接连主库,只去归档介质里读
Log Group 回放。类比 Oracle Far Sync;主备之间
不需要网络互通,只要求备库能访问同一个目录,备库与上游租户没有任何直接交互。MySQL 数据库的
Replication。创建空的备租户是指仅依靠主租户的日志流来初始化备租户,完全不依赖基线数据或转储文件。
备租户在拉取日志和校验状态时,需要访问主租户的部分系统视图,因此必须拥有 具备查询权限的只读账号。
STANDYRO 用户。CREATE STANDBY TENANT standby_tenant_name
LOG_RESTORE_SOURCE = 'SERVICE=ip_list USER=username@tenant_name PASSWORD=password'
RESOURCE_POOL_LIST=('pool_for_standby')
LOCALITY [=] 'locality_description'
PRIMARY_ZONE [=] primary_zone_name;
LOG_RESTORE_SOURCE:备租户的日志恢复源,指定网络直连模式的相关信息。
SERVICE:主租户所在的一个或多个 OBServer 节点的 IP 地址与 SQL 端口(默认 2881),如
10.xxx.xxx.1:2881;10.xxx.xxx.2:2881。
USER /
PASSWORD:访问主租户视图的用户名与密码。RESOURCE_POOL_LIST:指定备租户所使用的资源池。LOCALITY /
PRIMARY_ZONE:定义备租户副本的分布位置与
Primary Zone 偏好。Restore 一个备租户使用最广的是 通过备份恢复功能创建备租户的方式,该方式先从数据备份集恢复出基线数据,再从日志归档重放日志,最后开启持续同步。
Clog 保存时间的限制,可用于大规模生产数据的备库建设或跨集群灾备重建。RESTORE 租户:从源租户的物理备份恢复出一个备租户。语句就是执行恢复的命令,备份恢复的文章中提到过了。
ALTER SYSTEM RESTORE dest_tenant_name FROM uri [ UNTIL {TIME='timestamp' | SCN=scn} ]
WITH 'pool_list=pool_name[&locality=locality][&primary_zone=zone_name][&concurrency=int_num]';
-- 系统租户执行恢复,指定备份路径和日志归档路径,并指定资源池
ALTER SYSTEM RESTORE mysql FROM 'file:///data/obbackup/data,file:///data/obbackup/archive' WITH 'pool_list=p1&primary_zone=zone1';
RECOVER 租户:
RESTORE 命令创建的备租户,默认不会与源租户持续同步,需要执行
RECOVER 命令开启持续同步模式。在目标集群中开启备租户的日志同步:ALTER SYSTEM RECOVER STANDBY TENANT = mysql_back UNTIL UNLIMITED;
-- 1. 在主租户 obmysql 中创建只读同步用户,并授权
obclient -h192.168.182.22 -P2881 -uroot@obmysql -p'OBexampas123%^&' -c -A -Doceanbase
CREATE user rep_user identified by 'rep_user';
GRANT SELECT ON *.* TO rep_user;
-- 2. 查询主租户的 IP 列表:
SELECT * FROM DBA_OB_ACCESS_POINT;
+-----------+-------------+----------------+----------+
| TENANT_ID | TENANT_NAME | SVR_IP | SQL_PORT |
+-----------+-------------+----------------+----------+
| 1002 | obmysql | 192.168.182.21 | 2881 |
| 1002 | obmysql | 192.168.182.22 | 2881 |
| 1002 | obmysql | 192.168.182.23 | 2881 |
+-----------+-------------+----------------+----------+
-- 3. root 用户登录 sys 租户 创建备租户 mysql_back
obclient -h192.168.182.22 -P2881 -uroot@sys -p'OBexampas123%^&' -c -A -Doceanbase
obclient [oceanbase]> CREATE RESOURCE UNIT unit1 MAX_CPU 2, MEMORY_SIZE='2G';
Query OK, 0 rows affected (0.021 sec)
obclient [oceanbase]> CREATE RESOURCE POOL pool1 UNIT='unit1',UNIT_NUM=1,ZONE_LIST=('zone1','zone2','zone3');
Query OK, 0 rows affected (0.090 sec)
obclient [oceanbase]> CREATE STANDBY TENANT mysql_back LOG_RESTORE_SOURCE = 'SERVICE=192.168.182.21:2881;192.168.182.22:2881;192.168.182.23:2881 USER=rep_user@obmysql PASSWORD=rep_user'
-> RESOURCE_POOL_LIST=('pool1');
Query OK, 0 rows affected (1 min 27.861 sec)
-- 4. 查询租户,状态为 normal
SELECT tenant_id, tenant_name, tenant_type, status
FROM oceanbase.DBA_OB_TENANTS
WHERE tenant_name = 'mysql_back';
+-----------+-------------+-------------+--------+
| tenant_id | tenant_name | tenant_type | status |
+-----------+-------------+-------------+--------+
| 1008 | mysql_back | USER | NORMAL |
+-----------+-------------+-------------+--------+
-- 5. 设置同步
ALTER SYSTEM RECOVER STANDBY TENANT = mysql_back UNTIL UNLIMITED;
-- 6. 测试同步效果
obclient -h192.168.182.22 -P2881 -uroot@obmysql -p'OBexampas123%^&' -c -A -Doceanbase
obclient [oceanbase]> use lab4spm;
Database changed
obclient [lab4spm]> select * from tb1;
Empty set (0.160 sec)
obclient [lab4spm]> insert into tb1 values(1,1,'aa','aaa');
Query OK, 1 row affected (0.403 sec)
obclient -h192.168.182.22 -P2881 -uroot@mysql_back -p'OBexampas123%^&' -c -A -Dlab4spm
obclient [lab4spm]> select * from tb1;
+------+------+------+------+
| c1 | c2 | c3 | c4 |
+------+------+------+------+
| 1 | 1 | a | a |
+------+------+------+------+
无论是基于 日志归档还是 网络直连的物理备库,都支持 在线动态修改日志恢复源,且支持在两种传输模式之间自由切换。
典型场景:
ip_list 节点列表。ALTER SYSTEM SET LOG_RESTORE_SOURCE =
'{ SERVICE=$ip_list USER=$user_name@$tenant_name PASSWORD=$password | LOCATION=$archive_path }'
[TENANT = $tenant_name];
SERVICE 模式(网络直连):SERVICE=192.168.1.1:2881;192.168.1.2:2881,多 IP 间用分号分隔)及只读鉴权账号。LOCATION 模式(日志归档):LOCATION=file:///data/1/sh_archive 或
LOCATION=oss://bucket/path)。TENANT 作用域:sys 租户
下执行时:必须显式指定
TENANT = standby_tenant_name。TENANT 关键字。--查看同步模式
obclient -h192.168.182.22 -P2881 -uroot@sys -p'OBexampas123%^&' -c -A -Doceanbase
obclient [oceanbase]> SELECT TENANT_ID,ID,TYPE,VALUE,RECOVERY_UNTIL_SCN FROM CDB_OB_LOG_RESTORE_SOURCE\G
*************************** 1. row ***************************
TENANT_ID: 1004
ID: 1
TYPE: LOCATION
VALUE: file:///data/obbackup/archive
RECOVERY_UNTIL_SCN: 4611686018427387903
*************************** 2. row ***************************
TENANT_ID: 1008
ID: 1
TYPE: SERVICE
VALUE: IP_LIST=192.168.182.21:2881;192.168.182.22:2881;192.168.182.23:2881,USER=rep_user@obmysql,PASSWORD=9B5ABB882C07295A3DD82E60DDC8B5800540836B2FDEA27570A351014A0DB7F7,TENANT_ID=1002,CLUSTER_ID=1788407972,COMPATIBILITY_MODE=MYSQL,IS_ENCRYPTED=true
RECOVERY_UNTIL_SCN: 4611686018427387903
-- 修改 mysql_back 备租户的日志恢复源
obclient [oceanbase]> ALTER SYSTEM SET LOG_RESTORE_SOURCE='LOCATION=file:///data/obbackup/archive' TENANT = mysql_back;
Query OK, 0 rows affected (0.182 sec)
obclient [oceanbase]> SELECT * FROM CDB_OB_LOG_RESTORE_SOURCE\G
*************************** 1. row ***************************
TENANT_ID: 1004
ID: 1
TYPE: LOCATION
VALUE: file:///data/obbackup/archive
RECOVERY_UNTIL_SCN: 4611686018427387903
*************************** 2. row ***************************
TENANT_ID: 1008
ID: 1
TYPE: LOCATION
VALUE: file:///data/obbackup/archive
RECOVERY_UNTIL_SCN: 4611686018427387903
-- 查看主备租户同步延迟
SELECT
t.TENANT_NAME,
t.TENANT_ROLE,
t.SYNC_SCN,
SCN_TO_TIMESTAMP(t.SYNC_SCN) AS sync_time,
CASE
WHEN t.TENANT_ROLE = 'STANDBY' THEN
ROUND(
TIMESTAMPDIFF(
MICROSECOND,
SCN_TO_TIMESTAMP(t.SYNC_SCN),
SCN_TO_TIMESTAMP((SELECT SYNC_SCN FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'obmysql'))
) / 1000.0,
2
)
ELSE 0.00
END AS delay_ms
FROM oceanbase.DBA_OB_TENANTS t
WHERE t.TENANT_NAME IN ('obmysql', 'mysql_back')
ORDER BY t.TENANT_ROLE DESC;
+-------------+-------------+---------------------+----------------------------+-----------+
| TENANT_NAME | TENANT_ROLE | SYNC_SCN | sync_time | delay_ms |
+-------------+-------------+---------------------+----------------------------+-----------+
| mysql_back | STANDBY | 1788771235729981528 | 2026-09-07 16:53:55.729981 | 108088.64 |
| obmysql | PRIMARY | 1788771343818622551 | 2026-09-07 16:55:43.818622 | 0.00 |
+-------------+-------------+---------------------+----------------------------+-----------+
-- 再次修改回来,改成基于网络同步,延迟一下子降下来了
obclient [oceanbase]> ALTER SYSTEM SET LOG_RESTORE_SOURCE = 'SERVICE=192.168.182.21:2881;192.168.182.22:2881;192.168.182.23:2881 USER=rep_user@obmysql PASSWORD=rep_user' TENANT = mysql_back;
Query OK, 0 rows affected (1.446 sec)
obclient [oceanbase]> SELECT
-> t.TENANT_NAME,
-> t.TENANT_ROLE,
-> t.SYNC_SCN,
-> SCN_TO_TIMESTAMP(t.SYNC_SCN) AS sync_time,
-> CASE
-> WHEN t.TENANT_ROLE = 'STANDBY' THEN
-> ROUND(
-> TIMESTAMPDIFF(
-> MICROSECOND,
-> SCN_TO_TIMESTAMP(t.SYNC_SCN),
-> SCN_TO_TIMESTAMP((SELECT SYNC_SCN FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'obmysql'))
-> ) / 1000.0,
-> 2
-> )
-> ELSE 0.00
-> END AS delay_ms
-> FROM oceanbase.DBA_OB_TENANTS t
-> WHERE t.TENANT_NAME IN ('obmysql', 'mysql_back')
-> ORDER BY t.TENANT_ROLE DESC;
+-------------+-------------+---------------------+----------------------------+----------+
| TENANT_NAME | TENANT_ROLE | SYNC_SCN | sync_time | delay_ms |
+-------------+-------------+---------------------+----------------------------+----------+
| mysql_back | STANDBY | 1788771973227049546 | 2026-09-07 17:06:13.227049 | -1324.30 |
| obmysql | PRIMARY | 1788771971902750369 | 2026-09-07 17:06:11.902750 | 0.00 |
+-------------+-------------+---------------------+----------------------------+----------+
OceanBase 支持通过
SWITCHOVER(
计划内无损切换) 和
FAILOVER(
故障强制接管) 两种机制改变主备租户角色,用以应对日常运维演练与突发灾难恢复场景。
SWITCHOVER:用户计划内的角色交换。
SWITCHOVER 操作后:

FAILOVER:主租户遭遇不可逆硬件故障或机房灾难时所做切换。FAILOVER 操作后:

SWITCHOVER 实施指南 刚刚配置好的主备租户:
obmysql 是主,
mysql_back 是备。我们登录
sys 租户进行切换测试一下:
1、 预检查(VERIFY):验证主备状态与网络同步是否正常。
obclient -h192.168.182.22 -P2881 -uroot@sys -p'OBexampas123%^&' -c -A -Doceanbase obclient [oceanbase]> ALTER SYSTEM SWITCHOVER TO STANDBY TENANT = obmysql VERIFY; Query OK, 0 rows affected (0.082 sec)
SWITCHOVER 要求主库与备库状态正常,主备库之间同步状态正常。
2、验证通过后,将主租户
SWITCHOVER 为备租户:
obclient [oceanbase]> ALTER SYSTEM SWITCHOVER TO STANDBY TENANT = obmysql; Query OK, 0 rows affected (2.874 sec)
3、状态校验:查询
DBA_OB_TENANTS 视图,确认主租户是否已切换为备租户。
SELECT TENANT_NAME, TENANT_TYPE, TENANT_ROLE, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'obmysql'; +-------------+-------------+-------------+-------------------+ | TENANT_NAME | TENANT_TYPE | TENANT_ROLE | SWITCHOVER_STATUS | +-------------+-------------+-------------+-------------------+ | obmysql | USER | STANDBY | NORMAL | +-------------+-------------+-------------+-------------------+
确认
TENANT_ROLE 变更为
STANDBY 且
SWITCHOVER_STATUS 恢复为
NORMAL。
1、 预检查(VERIFY):在目标集群下验证备升主条件。
obclient [oceanbase]> ALTER SYSTEM SWITCHOVER TO PRIMARY TENANT = mysql_back VERIFY; Query OK, 0 rows affected (1.622 sec)
2、将备租户
SWITCHOVER 为主租户:
obclient [oceanbase]> ALTER SYSTEM SWITCHOVER TO PRIMARY TENANT = mysql_back; Query OK, 0 rows affected (1.519 sec)
3、状态校验:查询 DBA OBTENANTS 视图,确认备租户是否已切换为主租户。
SELECT TENANT_NAME, TENANT_TYPE, TENANT_ROLE, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mysql_back'; +-------------+-------------+-------------+-------------------+ | TENANT_NAME | TENANT_TYPE | TENANT_ROLE | SWITCHOVER_STATUS | +-------------+-------------+-------------+-------------------+ | mysql_back | USER | PRIMARY | NORMAL | +-------------+-------------+-------------+-------------------+
确认
TENANT_ROLE 变更为
PRIMARY 且
SWITCHOVER_STATUS 恢复为
NORMAL。
obmysql)的日志恢复源为当前的主租户(
mysql_back)。obclient [oceanbase]> ALTER SYSTEM SET LOG_RESTORE_SOURCE = 'SERVICE=192.168.182.21:2881;192.168.182.22:2881;192.168.182.23:2881 USER=rep_user@mysql_back PASSWORD=rep_user' TENANT = obmysql;
Query OK, 0 rows affected (0.960 sec)
-- 查询同步延时
SELECT
t.TENANT_NAME,
t.TENANT_ROLE,
t.SYNC_SCN,
SCN_TO_TIMESTAMP(t.SYNC_SCN) AS sync_time,
CASE
WHEN t.TENANT_ROLE = 'STANDBY' THEN
ROUND(
TIMESTAMPDIFF(
MICROSECOND,
SCN_TO_TIMESTAMP(t.SYNC_SCN),
SCN_TO_TIMESTAMP((SELECT SYNC_SCN FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'obmysql'))
) / 1000.0,
2
)
ELSE 0.00
END AS delay_ms
FROM oceanbase.DBA_OB_TENANTS t
WHERE t.TENANT_NAME IN ('obmysql', 'mysql_back')
ORDER BY t.TENANT_ROLE DESC;
+-------------+-------------+---------------------+----------------------------+----------+
| TENANT_NAME | TENANT_ROLE | SYNC_SCN | sync_time | delay_ms |
+-------------+-------------+---------------------+----------------------------+----------+
| obmysql | STANDBY | 1788777486930797436 | 2026-09-07 18:38:06.930797 | -92.44 |
| mysql_back | PRIMARY | 1788777485820877515 | 2026-09-07 18:38:05.820877 | 0.00 |
+-------------+-------------+---------------------+----------------------------+----------+
2 rows in set (0.230 sec)
注意:执行
SWITCHOVER操作时,必须先将主租户切换为备租户,再将备租户切换为主租户,以避免出现双主租户的问题。
SWITCHOVER 在基于日志归档的物理备库场景中,
SWITCHOVER 操作前需要先在备租户中开启日志归档。
SWITHOVER 操作执行成功后,由于原主租户后续需要通过持续读取新主租户(原备租户) 的归档日志来同步新主租户(原备租户)上的所有修改操作,因此,要求新主租户(原备租户)开启日志归档模式。SWITCHOVER 操作相同。SWITCHOVER 操作相同。ALTER SYSTEM SET LOG_RESTORE_SOURCE = 'LOCATION=file:///data/obbackup/archive' TENANT = new_standby_tenant;
FAILOVER 当主租户发生致命故障(集群宕机、数据损坏或机房失联)且短期内无法恢复时,需要
在备库强行激活(
ACTIVATE)接管业务。
FAILOVER 完成后需要整个租户达到数据一致的状态,因此
FAILOVER 操作会将租户统一恢复到所有日志流的最小同步位点,也意味着
FAILOVER 不能保证数据零丢失。
将备租户
FAILOVER 为主租户的步骤如下:
ALTER SYSTEM ACTIVATE STANDBY [TENANT = tenant_name] VERIFY;
ACTIVE)ALTER SYSTEM ACTIVATE STANDBY [TENANT = tenant_name];
执行激活命令,备库会将所有日志流统一恢复到**最小同步位点,并截断多余日志完成提主。命令同物理备份恢复的解耦。
SELECT TENANT_NAME, TENANT_TYPE, TENANT_ROLE, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'tenant_name';
主备租户的 OCP 白屏操作,
OBCP 考试中会考到,练习一两遍就会了。最后,提醒一下:
**
Switchover:从主租户发起执行日常切换;
Failover:从备租户发起执行容灾切换,因为主库已经故障了。**
这里是《实战派K8S&DB》,更多干货敬请关注公众号。如果本文对你有所帮助,欢迎点赞、推荐和转发,也欢迎关注后续文章,一起考证、一起学习
Oceanbase 分布式数据库。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31444449/viewspace-3181875/ ,如需转载,请注明出处,否则将追究法律责任。