首批通过分布式安全可靠测评,为关键业务系统打造
迁移将目的端已经加入到 member list 中但是对应的副本不可读
更新时间:2025-06-23 08:16
问题现象
迁移或者复制的目的端已经将对应的目的端加入到了 member list 中,但是读该副本的数据时返回 6231 报错。
SQL 层查询报 OB_REPLICA_NOT_READABLE, -6231。

OBServer 日志中报如下错误:

从现象可以确认是 1002 租户的 1 号日志流有个 migrate_status:9 导致报错。9 是 OB_MIGRATION_STATUS_HOLD 状态,表示迁移完成后更改 member list 的步骤。
问题原因
在更改 member list 的时候迁移复制这边做了类似两阶段提交的操作,先会将 migration status 改成 HOLD 状态,然后修改 member list,修改成功以后会将 HOLD 状态改成 NONE 状态;因为更改 member list 和改 migration_status 并不原子,并且再设置这个副本的可读性的时候不允许 HOLD 状态可读,导致了成员列表变更成功了,并且也切主成功了,但是不允许读写。
问题的风险及影响
迁移过程中的副本成为了 leader,但是无法提供读写服务。
影响版本
OceanBase 数据库 V4.2.1 BP1(oceanbase-4.2.1.1-101000062023103122) 之前的所有 V4.x 版本。
解决方法及规避方式
预防出现查询报错,您可以执行如下步骤:
- 先关闭 Transfer。 该功能由租户级配置项
enable_transfer控制,默认值为true,表示开启 Transfer 功能。有关配置项enable_transfer的详细说明及设置,请参见 enable_transfer。 - 先手动将迁移的源端切主,让源端不成为 leader。
- 发起 unit 迁移。
- 迁移完成以后在将 leader 切回来。
- 先关闭 Transfer。 该功能由租户级配置项
报错以后的解决方案步骤如下:
您可以执行如下命令关闭 Transfer,防止切主发生了 Transfer 造成性能的抖动。
obclient> alter system set enable_transfer = 'False' tenant = 'xxx';将查询报错的日志流 leader 切走,等迁移状态变成
NONE以后再切回来。您可以通过如下 SQL 查询迁移状态:
select migrate_status from __all_virtual_ls_info where tenant_id = xxx and ls_id = xxx and svr_ip = 'xxx' and svr_port = xxx;
升级 OceanBase 数据库版本到 V4.2.1 BP1(oceanbase-4.2.1.1-101000062023103122)及之后版本。