OceanBase 的物理备库定位是准实时热备份:主库挂掉时能顶上,把停机时间和数据损失都压到最低。这套能力在 V4.1.0 做过一次形态重构,理解这个分界线是配置前的第一步。
从集群级到租户级:V4.1.0 的分水岭
V4.1.0 之前,物理备库是集群级形态,粒度粗,一备就是一整个集群。V4.1.0 及以后改为租户级,主备角色下沉绑定到租户本身,拆成主租户和备租户两种角色。
主租户就是用户创建的业务租户,读写双向都完整。备租户只提供容灾备份和只读服务,写操作一律不支持。一个主租户可以挂多个备租户,组合起来就是一套弹性的租户级高可用与多活容灾体系。
日志怎么走:三段服务拆开看
物理备库靠三块服务串起整条链路。
日志传输服务负责在主租户和备租户之间同步 Redo 日志,OceanBase 物理备库只提供异步同步这一种模式,路径上支持网络直连或日志归档。
日志存储服务给物理备库提供高可用、高可靠的日志持久化存储与读写能力。
日志回放服务让备租户读取日志存储里的日志,实时或延迟地应用到内存 MemStore。延迟回放是刻意留的口子,用来挽回误操作损失。最终目标是主备数据完全一致。
这里有个和传统数据库相反的细节:传统数据库是主库主动推日志给备库,OceanBase 的主租户根本不感知备租户存在,不主动外发日志,是备租户主动去主租户拉。方向搞反了,排查链路问题时容易找错方向。
备租户的边界:哪些同步、哪些不同步
备租户的个数、资源规格、租户名都不要求和主租户一致,生产环境建议规格同构。一个主租户可以配多个备租户。
配置项主备相互独立,不做物理同步。对主库调参后,备库要手动改一遍,否则主备切换后参数直接失效。系统变量则相反,是物理同步的,主租户上改了,备租户跟着变。
用户和密码只允许在主租户上创建、修改,更新后同步到备租户。转储两边相对独立,备租户从主租户同步合并信息,不支持独立合并。备租户能读不能写,这条是硬约束。
两种拉日志方式:归档 vs 网络直连
备租户拉日志有两条路,也能从另一个备租户拉,也就是级联同步。
日志归档方式下,主租户先开 ARCHIVELOG 模式,把 Redo 日志异步归档到共享存储,OSS、NFS、COS 这类都行。备租户不直连主库,只去归档介质里读 Log Group 回放。主备之间不需要网络互通,只要求备库能访问同一个目录,备库和上游租户没有任何直接交互。延迟在秒级到分钟级,默认约 2 分钟刷一次 Piece,不依赖主备专线质量,但表现和可用性受归档存储介质限制。代价是多一份对象存储费用,主库必须开归档,备库 Switchover 前也要开归档。
网络直连方式下,备租户直接通过网络连主租户或其他备租户读日志,类似 MySQL 的 Replication。前提是备租户和主租户网络联通,读到的既可以是主租户的在线日志,也可以是主租户的归档日志。
部署形态怎么摆
一个主租户和它的备租户可以跨集群部署,也可以塞进同一个 OceanBase 集群。同一个集群里可以只有主租户、只有备租户,也可以主备混住。

纯主加纯备是集群间隔离,适合生产与灾备物理资源隔离的标准场景。主备混合跨集群走 CROSS 主备,适合资源充分利用的双活/多活架构。主备混合单集群是集群内租户互为主备,适合验证校验和本地租户级快速演练。
建备租户的两条路
空备租户:只靠日志流初始化
创建空的备租户,完全靠主租户的日志流来初始化,不依赖基线数据或转储文件。限制很明确:主租户刚新建、还没有大量历史数据,或者主租户所在集群、日志归档介质上完好保存了该主租户自创建以来的全量历史日志。两个条件不满足就别走这条路。

备租户拉日志、校验状态时要访问主租户的部分系统视图,所以得有一个有查询权限的只读账号。用 OCP 创建备租户时,OCP 会自动在主租户里建 STANDYRO 用户。手动创建就得自己建用户并授权。
建备租户的语句大致长这样:
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 保存时间的约束,适合大体量生产数据的备库建设或跨集群灾备重建。执行恢复的语句如下,备份恢复的细节可以翻之前的文章。
ALTER SYSTEM RESTORE dest_tenant_name FROM uri [ UNTIL {TIME=’timestamp’ | SCN=scn} ]
WITH ‘pool_list=pool_name
选型判断
主备网络稳定、想省掉归档存储开销,走网络直连。主备网络不通、或者想彻底解耦上游,走日志归档,代价是对象存储费用和分钟级延迟。生产环境不建议在规格差异过大的主备之间做切换演练,参数和资源不匹配时问题会集中爆发。