问题现象
迁移复制 Rebuild 的时候,和源端相同存储规格的机器,或者比源端磁盘规格小但是比实际数据占用的存储空间大的机器,迁移复制 Rebuild 过程中报错 -4184(OB_SERVER_OUTOF_DISK_SPACE)。
关键诊断信息
触发条件
扩缩容或者容灾场景下触发了迁移复制 Rebuild,源端存在多版本 Major,目的端拷贝源端的 Major SSTable,但是目的端没有重用 Major SSTable,会导致目的端的存储空间放大。
事前巡检
无。
事后诊断
检查迁移报错。
select * from oceanbase.__all_rootservice_event_history where event like '%finish_mig%' and value1 = 'xxx' and value6 like '%-4184%';其中 value1 对应的是 tenant_id,value6 是错误码。
多版本 Major 是否存在。
select count(1) as cnt,tablet_id,svr_ip,svr_port,ls_id,tenant_id from oceanbase.__all_virtual_table_mgr where table_type = 10 and tenant_id = xxx group by svr_ip, svr_port ,tablet_id,tenant_id, ls_id having cnt > 1;
问题原因
迁移复制 Rebuild 的场景下会从源端拷贝 Mini SSTable,Minor SSTable 和 Major SSTable,其中 Mini SSTable 和 Minor SSTable 在迁移目的端不会重用,并且 Mini SSTable 和 Minor SSTable 相比 Major SSTable 占用存储空间小很多,暂不考虑支持重用;Major SSTable 在低版本的 OBServer 上未支持重用,造成了如果源端存在多个 Major SSTable,那么目的端不会重用数据,造成存储空间放大。
问题的风险及影响
进行扩容或者缩容会失败,Rebuild 的副本完成不了 Rebuild。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V4.1.0 GA(oceanbase-4.1.0.0-100001122023040322)及之后版本、V4.2.0 GA(oceanbase-4.2.0.0-100010082023083014)及之后版本、V4.2.1 GA(oceanbase-4.2.1.0-100000182023092722)及之后版本、V4.2.2 GA(oceanbase-4.2.2.0-100000082024011317)及之后版本、V4.2.5 GA(oceanbase-4.2.5.0-100000082024102022)及之后版本、V4.3.0(oceanbase-4.3.0.0-100000072024020200)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.3.4 BP1(oceanbase-4.3.4.1-101000022024120914)及之后版本。
规避方式
扩盘。
可以在 Major 合并完成 30 min 以后再发起迁移复制,保证
undo_retention推过以后进行迁移,这样不会存在多版本 Major。取消掉建索引的任务,推进多版本 Major SSTable 回收。