问题现象
出现场景:
基线中已经有比较多的数据了(比如业务导入了 1 亿数据),此时 MAJOR 中已经有大量的宏块。
业务又插入了相对少量的数据(比如业务又导入了 1 千万行),这部分
INSERT做了转储。业务将刚插入的数据删除,这部分删除的操作也可能做了转储。
在上述操作结束后,再做一次合并。
表现:
集群合并一直持续进行,合并过程中 IO 带宽被打满。
关键诊断信息
触发条件
基线中已经有比较多的数据了(比如业务导入了 1 亿数据),此时 MAJOR 中已经有大量的宏块。
业务又插入了相对少量的数据(比如业务又导入了 1 千万行),这部分
INSERT做了转储。业务将刚插入的数据删除,这部分删除的操作也可能做了转储。
在上述操作结束后,再做一次合并。
问题原因
合并过程中,针对增量数据中删除的每一行,会尝试访问 MAJOR 中对应范围的宏块(判断对应的宏块是复用还是重写),每一行的判断都会执行一次 2M 宏块读(同时这部分数据不会进 CACHE),如果对应范围的宏块一直不包含所删除行的数据,那么每一个删除行都会反复读取一次同一个宏块,造成大量的读 IO。
问题的风险及影响
合并可能会卡住较长时间,但最终合并可以顺利结束。同时 IO 带宽打满可能会影响前台业务。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库 V4.2.1 GA(oceanbase-4.2.1.0-100000182023092722)及之后版本。
解决方法及规避方式
升级到问题已修复版本,目前已修复的版本包含 OceanBase 数据库 V4.2.1 BP1(oceanbase-4.2.1.1-101000062023103122)及之后版本。
等待合并完成即可,如果担心影响前台业务,可尝试调小转储线程或减小后台任务 IO 带宽。