首批通过分布式安全可靠测评,为关键业务系统打造
迁移失败,报错 4551,无数据迁移至新节点
更新时间:2026-06-01 09:21
问题现象
在负载均衡、日志流迁移、扩缩容时,检查需要的空间时偏大,目的端因空间不足,迁移报错 -4551 失败。 现象如下:


关键诊断信息
触发条件
负载均衡,日志流迁移,扩缩容。
事前巡检
当 ratio 这列大于 2 时,就不太正常了,谨慎做负载均衡,迁移,扩缩容,SQL 如下:
select a.svr_ip,
a.svr_port,
a.tenant_id,
a.DATA_DISK_IN_USE,
b.ls_agg_size,
(b.ls_agg_size / a.DATA_DISK_IN_USE) as ratio
from oceanbase.GV$ob_units a
inner join (
select svr_ip,
svr_port,
tenant_id,
sum(required_data_disk_size) as ls_agg_size
from oceanbase.__all_virtual_ls_info
group by svr_ip,
svr_port,
tenant_id
) b
on a.svr_ip = b.svr_ip
and a.svr_port = b.svr_port
and a.tenant_id = b.tenant_id;
事后诊断
搜索下面的日志。
grep 'failed to check_is_disk_full, cannot migrate in' observer.log*使用下面 SQL,观察 shared_meta_size 是否较大。
SELECT t.svr_ip, t.ls_id, t.svr_port, t.tenant_id, t.tablet_count, t.size as data_size, l.required_data_disk_size, (l.required_data_disk_size - t.size) AS shared_meta_size, ((l.required_data_disk_size - t.size) / l.required_data_disk_size) AS shared_meta_ratio FROM ( SELECT svr_ip, svr_port, ls_id, tenant_id, COUNT(tablet_id) AS tablet_count, SUM(required_size) AS size FROM oceanbase.__all_virtual_tablet_pointer_status GROUP BY svr_ip, svr_port, ls_id, tenant_id ) t INNER JOIN ( SELECT svr_ip, svr_port, ls_id, tenant_id, tablet_count, required_data_disk_size FROM oceanbase.__all_virtual_ls_info ) l ON t.svr_ip = l.svr_ip AND t.svr_port = l.svr_port AND t.ls_id = l.ls_id AND t.tenant_id = l.tenant_id WHERE ((l.required_data_disk_size - t.size) / l.required_data_disk_size) > 0.3 ORDER BY t.tenant_id;
问题原因
磁盘空间统计的 shared meta size 细分项,在每次计算时,没有进行清零,错误地累计了历史版本的数据。这个细分项记录的是 tablet 的元数据大小,通常非常小,比如,4K 这个量级。
通常情况下,有转储合并的 tablet 会发生版本累计。因此,随着时间推移,经历的时间越久,它的累积值会越大。
在负载均衡、日志流迁移、扩缩容时,检查需要的空间时偏大,目的端因空间不足,迁移报错 -4551 失败。
问题的风险及影响
影响负载均衡、日志流迁移、扩缩容。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V4.2.5 BP3(oceanbase-4.2.5.3-103000142025033110)及之后版本。
解决方法
方法一: 升级到问题已修复版本。目前已修复的版本包含 OceanBase 数据库企业版 V4.2.5 BP6 Hotfix2(oceanbase-4.2.5.6-106020012025102316)版本、V4.2.5 BP6 Hotfix3(oceanbase-4.2.5.6-106030012025112319)版本、V4.2.5 BP7(oceanbase-4.2.5.7-107000092025103121)及之后版本。
方法二:(该版本需要有 _skip_checking_ls_migration_required_size 隐藏配置项)。
-- 日志流迁移目的端,跳过磁盘空间检查
alter system set _skip_checking_ls_migration_required_size=true tenant='mysql';
-- 开启日志流迁移目的端磁盘空间检查功能
alter system set _skip_checking_ls_migration_required_size=false tenant='mysql';
警告
设置隐藏配置项 _skip_checking_ls_migration_required_size 存在一定的风险,请勿自行操作。如果需要修改,请咨询 OceanBase 技术支持。
方法三:(谨慎使用)。
目的端调大 data_disk_usage_limit_percentage(用于设置数据文件最大可以写入的百分比,超过这个阈值后,禁止数据迁入,默认值为 90),完成迁移后,需要再调整回去。
规避方式
无规避手段,做日志流迁移、扩缩容前,尽量先使用本文档中事前巡检这一节中 SQL 进行检查。