首批通过分布式安全可靠测评,为关键业务系统打造
配置备库延迟
更新时间:2026-07-01 10:36:40
OceanBase 数据库的备库延迟功能用于使备库主动延迟一段时间再从上游同步日志,使其保持一个历史时间点的数据副本。
备库延迟功能常用于以下场景:
防范人为误操作:当主库发生误删表或误更新数据时,可以利用延迟的备库上未受影响的历史数据副本进行快速恢复。
时间窗口内的数据保护:在配置的延迟时间内,当发现主库有问题时,可从延迟的备库上导出正确的数据。
使用限制及注意事项
配置备库延迟时,需要注意的事项如下表所示。
| 注意项 | 说明 |
|---|---|
| 版本限制 | 对于 V4.4.2 版本,OceanBase 数据库从 V4.4.2 BP2 版本开始支持备库延迟功能。 |
| 保护模式要求 | 仅 MAXIMUM PERFORMANCE(最大性能)模式下的备库(备租户)可以设置延迟同步。 |
| 保护模式切换 | 对于基于网络的物理备库,延迟的备库切换到最大保护或最大可用模式后,延迟配置会自动失效;切回最大性能模式后会自动恢复。 在最大保护或最大可用模式的备库上设置延迟,系统会报错;但如果先为备库设置延迟(且强同步的下游为该备库),主库再切换到最大保护或最大可用模式,则可能会导致主库的日志同步卡住。 |
| Switchover 限制 | 延迟的备库不允许执行 Switchover,如果要执行 Switchover,需先将该备库的延迟时间(DELAY 参数) 设置为 0 秒,并等待追平日志。 |
| Flashback 限制 | 延迟的备库不允许执行 Flashback 接入新主库,需先将该备库的延迟时间(DELAY 参数) 设置为 0 秒。 |
| 角色切换后配置 | 完成 Switchover 后,备库的延迟配置不会保留,需要重新设置该备库的延迟时间。 |
| Failover | 延迟的备库允许执行 Failover,需要保证 RPO ≈ recover_delay(延迟期间的日志未拉取到备库)。 |
| 主库归档日志的保留时间 | 需保证 主库归档日志的保留时间 ≥ recover_delay,否则日志可能被清理导致断档。 |
| 多备库配置 | 各备库可独立配置不同延迟时间。 |
| 备库延迟基准 | 以主库事务的提交时间(SCN 时间戳)为基准。 |
| 时钟同步 | 依赖 NTP 来保证主备库的时钟同步,系统不会做时钟偏差补偿。 |
配置建议
备库延迟时间:建议设置为 30 分钟 ~ 2 小时,以平衡误操作的发现时间和 RPO。
归档保留时间:需要保证主库日志归档的保留时间大于备库的延迟时间,避免日志被清理。
多备库场景:建议部署一个实时备库 + 一个延迟备库,兼顾 HA(High Availability)和数据保护。
设置备库的延迟时间
对于 MAXIMUM PERFORMANCE(最大性能)模式下的备租户,可以根据业务需要,设置备库延迟时间。具体操作如下:
使用管理员用户登录备租户或备租户所在集群的
sys租户。说明
MySQL 模式的管理员用户为
root用户,Oracle 模式的管理员用户为SYS用户。连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -A执行以下命令,查看当前备租户的保护模式。仅
MAXIMUM PERFORMANCE(最大性能)模式下的备租户可以设置延迟。备租户所在集群的系统租户(
sys租户)查看该备租户的保护模式obclient(root@sys)[oceanbase]> SELECT TENANT_NAME, PROTECTION_MODE, PROTECTION_LEVEL FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'standby_tenant';备租户查看本租户的保护模式。
MySQL 模式Oracle 模式MySQL 模式下,查询语句如下:
obclient(root@standby_tenant)[oceanbase]> SELECT TENANT_NAME, PROTECTION_MODE, PROTECTION_LEVEL FROM oceanbase.DBA_OB_TENANTS;Oracle 模式下,查询语句如下:
obclient(sys@standby_tenant)[SYS]> SELECT TENANT_NAME, PROTECTION_MODE, PROTECTION_LEVEL FROM SYS.DBA_OB_TENANTS;
查询结果的示例如下:
+----------------+---------------------+---------------------+ | TENANT_NAME | PROTECTION_MODE | PROTECTION_LEVEL | +----------------+---------------------+---------------------+ | standby_tenant | MAXIMUM PERFORMANCE | MAXIMUM PERFORMANCE | +----------------+---------------------+---------------------+ 1 row in set根据查询结果,确认备租户的保护模式为
MAXIMUM PERFORMANCE(最大性能)模式。执行以下命令,获取当前备租户的日志恢复源配置。
备租户所在集群的系统租户(
sys租户)查看该备租户的日志恢复源信息obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE\G备租户查看本租户的日志恢复源信息
MySQL 模式Oracle 模式MySQL 模式下,查询语句如下:
obclient(root@standby_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE\GOracle 模式下,查询语句如下:
obclient(sys@standby_tenant)[SYS]> SELECT * FROM SYS.DBA_OB_LOG_RESTORE_SOURCE\G
查询结果的示例如下:
*************************** 1. row *************************** TENANT_ID: 1002 ID: 1 TYPE: SERVICE VALUE: IP_LIST=6.xx.xxx.91:2881+2882,USER=rep_user@mysql001,PASSWORD=4E9*************************************,TENANT_ID=1002,CLUSTER_ID=10001,COMPATIBILITY_MODE=MYSQL,IS_ENCRYPTED=true RECOVERY_UNTIL_SCN: 4611686018427387903 RECOVERY_DELAY: 0 1 row in set更新日志恢复源配置,指定备租户(备库)的延迟时间。
语句如下:
ALTER SYSTEM SET LOG_RESTORE_SOURCE ='SERVICE=$ip_list USER=$user_name@$tenant_name PASSWORD=$password DELAY=$delay_time' [TENANT = standby_tenant_name];部分参数说明如下:
$ip_list、$user_name、$tenant_name、$password:日志恢复源配置信息,此处填写步骤二中获取的信息。$delay_time:指定备租户(备库)延迟拉取日志的时间,指定数值(不带单位)时,默认单位为秒。支持指定带单位的数值,单位可以是 us(微秒)、ms(毫秒)、m(分钟)、h(1小时)、d(天)。如果不指定该参数,则延迟时间默认为 0 秒,表示备库不延迟。
根据上一步获取到的日志恢复源的配置,设置备库的延迟时间为 30 分钟即 1800 秒,示例如下:
备租户所在集群的系统租户(
sys租户)设置该备租户的延迟时间obclient(root@sys)[oceanbase]> ALTER SYSTEM SET LOG_RESTORE_SOURCE = 'SERVICE=6.xx.xx.91:2881 USER=rep_user@mysql001 PASSWORD=****** DELAY=1800' TENANT = standby_tenant;备租户设置本租户的延迟时间
obclient> ALTER SYSTEM SET LOG_RESTORE_SOURCE = 'SERVICE=6.xx.xx.91:2881 USER=rep_user@mysql001 PASSWORD=****** DELAY=1800';
设置备库(备租户)延迟后,对比设置前:
如果是增大延迟时间,则备库会在当前位点停止日志同步,等待停止同步的时间达到设置的延迟时间后恢复同步。
如果是缩小延迟时间,则备库会立即追赶日志。
如果是延迟时间清零,则备库会在当前位点开始全速追赶日志,尽快追平。
配置成功后,查看备库的延迟配置。显示结果的单位为微秒。
备租户所在集群的系统租户(
sys租户)查看该备租户的延迟配置obclient(root@sys)[oceanbase]> SELECT TENANT_ID, recovery_delay FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE;查询结果的示例如下:
+-----------+----------------+ | TENANT_ID | recovery_delay | +-----------+----------------+ | 1002 | 1800000000 | +-----------+----------------+ 1 row in set备租户查看本租户的延迟配置
MySQL 模式Oracle 模式MySQL 模式下,查询语句如下:
obclient(root@standby_tenant)[oceanbase]> SELECT recovery_delay FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE;Oracle 模式下,查询语句如下:
obclient(sys@standby_tenant)[SYS]> SELECT recovery_delay FROM SYS.DBA_OB_LOG_RESTORE_SOURCE;查询结果的示例如下:
+----------------+ | recovery_delay | +----------------+ | 1800000000 | +----------------+ 1 row in set
查看备库延迟状态
备库延迟设置成功后,可以通过视图查看备库的延迟状态。
备租户所在集群的系统租户(
sys租户)查看备租户的延迟状态obclient(root@sys)[oceanbase]> SELECT tenant_name, sync_scn, replayable_scn, readable_scn, TIMESTAMPDIFF(SECOND, SCN_TO_TIMESTAMP(sync_scn), NOW()) AS actual_delay_seconds FROM oceanbase.DBA_OB_TENANTS WHERE tenant_role = 'STANDBY';命令中,
actual_delay_seconds为sync_scn与当前时间的差值,也就是实际延迟时间,单位为秒。备租户查看本租户的延迟状态
MySQL 模式Oracle 模式MySQL 模式下,查询语句如下:
obclient(root@standby_tenant)[oceanbase]> SELECT tenant_name, sync_scn, replayable_scn, readable_scn, TIMESTAMPDIFF(SECOND, SCN_TO_TIMESTAMP(sync_scn), NOW()) AS actual_delay_seconds FROM oceanbase.DBA_OB_TENANTS;命令中,
actual_delay_seconds为sync_scn与当前时间的差值,也就是实际延迟时间,单位为秒。Oracle 模式下,查询语句如下:
obclient(sys@standby_tenant)[SYS]> SELECT tenant_name, sync_scn, replayable_scn, readable_scn, TIMESTAMPDIFF(SECOND, SCN_TO_TIMESTAMP(sync_scn), NOW()) AS actual_delay_seconds FROM SYS.DBA_OB_TENANTS;命令中,
actual_delay_seconds为sync_scn与当前时间的差值,也就是实际延迟时间,单位为秒。查询结果的示例如下:
+----------------+---------------------+---------------------+---------------------+----------------------+ | tenant_name | sync_scn | replayable_scn | readable_scn | actual_delay_seconds | +----------------+---------------------+---------------------+---------------------+----------------------+ | standby_tenant | 1780553786243403000 | 1780553786243403000 | 1780553786243403000 | 205 | +----------------+---------------------+---------------------+---------------------+----------------------+ 1 row in set
相关文档
有关备库延迟的具体应用,参见 备库延迟应用案例。