首批通过分布式安全可靠测评,为关键业务系统打造
主备库同步正常但 switchover 多次重试才成功
更新时间:2026-05-09 07:56
适用版本
OceanBase 数据库 V3.x 版本。
问题现象
创建完备集群后,检查如下几个地方确认数据同步已经完成。
- OCP 显示备集群延迟在 0.x 秒。
- 备集群执行
select count(*) from __all_virtual_clog_stat where is_in_sync!=1返回 0 条记录。 - 主备集群查询
v$ob_cluster、v$ob_standby_status、v$ob_cluster_stat都显示主备库已经同步,允许切换。
通过 OCP 执行 switchover 返回 -4012 timeout,后续经过多次尝试均不成功,直到两个小时后才成功,而 max_stale_time_for_weak_consistency 参数的值恰好为两小时。
问题原因
在主切换成备的过程中,会用 __all_ddl_operation 这张表最后一行记录的 row_scn 和最小可读位点(当前时间 - max_stale_time_for_weak_consistency)两个值的最大值作为读版本号来读内部表的数据。
本示例中 max_stale_time_for_weak_consistency='2h',并且也很久没有更新过 DDL,因此取到的版本号是 swithover 开始两个小时前的时间点。因为 undo_retention 的设置远小于 max_stale_time_for_weak_consistency,swithover 取到的最小版本号已经被回收,就报了 snapshot_discard,取不到该版本的数据。
在切换开始后,主集群不再有任何更新操作,也不再根据 undo_retention 回收数据,因此恰好过了两个小时,读的版本号变成了执行开始的时间点,就能读到数据,切换就成功了。
解决方法
可从下述方法中选择一项进行规避。
max_stale_time_for_weak_consistency设置为默认值 5s。- 在对应业务租户里面做 DDL 操作。