问题现象
某租户 Unit 从某台机器上迁移后, 该租户在当前机器上
OB_SQL_PHY_PLAN这个 mod 内存使用仍不断增加, 直至超过租户内存大小,您可以通过如下命令查看。obclient> select tenant_id, svr_ip, svr_port, mod_name, hold, used from oceanbase.__all_virtual_memory_info where tenant_id = 'xxx' and label = 'OB_SQL_PHY_PLAN' order by hold desc limit 20;日志中可以看到,内部请求出现 -4013 报错。
可能出现合并卡住等内部任务失败的情况。
关键诊断信息
触发条件
Unit 迁移。
事前巡检
查看是否有做过 Unit 迁移。
select * from oceanbase.__all_rootservice_job where job_type = 'MIGRATE_UNIT';查看 Unit 迁移后,机器上被迁走的租户内存是否存在
OB_SQL_PHY_PLAN占用很高的问题,可考虑对该内存增长情况进行监控。select tenant_id,svr_ip,svr_port,mod_name,hold,used from oceanbase.__all_virtual_memory_info where tenant_id = 'xxx' and label = 'OB_SQL_PHY_PLAN' order by hold desc limit 20;
事后诊断
确认是否做过 Unit 迁移。
select * from oceanbase.__all_rootservice_job where job_type = 'MIGRATE_UNIT';机器上被迁走的租户内存是否存在
OB_SQL_PHY_PLAN占用很高的问题。select tenant_id,svr_ip,svr_port,mod_name,hold,used from oceanbase.__all_virtual_memory_info where tenant_id = 'xxx' and label = 'OB_SQL_PHY_PLAN' order by hold desc limit 20;
问题原因
租户 Unit 从 A 机器迁移到 B 机器后,A 机器上租户对应 plan cache 释放但并没有删除,设置为 invalid 状态。当内部切租户在 A 机器上执行 A 租户请求时,生成的执行计划不会加入到 plan cache 中。当请求结束,需要将 plan 对象 free 时,会先看 plan cache 中是否有该 plan,发现没有,后面没有再执行真正的 free 动作,导致 plan 内存没有释放,出现内存泄漏。
问题的风险及影响
会持续内存泄漏,直至泄漏量为被迁移租户内存大小,可能导致机器内存不足。
当内存泄露到租户内存上限,内部依赖切租户执行的任务可能会失败,比如刷 location、刷 schema、合并以及在 RS 节点上各种需要切租户执行的 SQL 可能会失败,从而导致内部相关任务失败,最终可能影响业务执行请求。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响版本
OceanBase 数据库 V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本
解决方法
重启内存泄漏的 OBServer。
升级到问题已修复版本,目前已修复的版本包含 OceanBase 数据库 V3.2.3 BP10(oceanbase-3.2.3.3-110000092023091219)及之后版本、V3.2.4 BP5(oceanbase-3.2.4.5-105000012023081513)及之后版本。
规避方式
在升级到已修复该问题的版本前,做完 Unit 迁移后,对 Unit 迁移前所在的 OBServer 进行重启。