首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库 V3.x 版本迁移过程中宏块重用失效
更新时间:2024-08-22 07:16
问题现象
OceanBase 数据库 V3.x 版本中迁、复制、rebuild 会从源端拷贝数据,如果源端存在多个 major sstable 的时候在目的端没有重用目的端对应的宏块数据,表现行为为目的端的可用存储空间大于等于源端被迁移的分区所占用的存储空间,但是目的端迁移过程中会报错-4184。
源端存在多个基线的场景如下:
max_kept_major_version_number用于设置数据保留的冻结版本数量,默认值为 2,允许源端存在两个 major。- 如果源端存在 restore point 或 backup point,这个时候快照会保留对应的 major 版本。
- 如果源端在建索引过程中,可能会保留了多个基线。
存储空间放大的倍数最坏的情况下为(基线 sstable 个数 - 1)倍。
其他场景可能造成迁移目的端报错 -4184 的是目的端存在宏块泄漏,表现上是分配的宏块个数大于 sstable 占用的宏块个数,详细请参考 Unit 无法 GC 导致无法负载均衡。
问题原因
产生问题的原因是只重用了当 sstable 完整生成好了以后的宏块,没有重用 sstable 生成过程中的宏块。
问题的风险及影响
迁移的目的端可用存储空间和源端占用的存储空间对等,但是迁移会失败,影响迁移、复制、rebuild。
影响版本
OceanBase 数据库 V3.x 所有版本。
解决方法及规避方式
- 将
max_kept_major_version_number设置为 1。 - 如果存在正在创建的索引并且源端存储空间不足的场景下,取消建索引的任务,进行分区的迁移复制。
- 如果源端正在数据备份或者创建了 restore point,迁移报错存储空间不足的场景下取消数据备份或者 restore point。