基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
业务 SQL 执行时偶发性报错:ORA-00600: internal error code, arguments: -11049, Exceed query memory limit
更新时间:2026-08-25 02:41
问题现象
业务 SQL 执行时偶发性报错,错误信息如下:
java.lang.RuntimeException: java.sql.BatchUpdateException: (conn=3221505248): ORA-00600: internal error code, arguments: -11049, Exceed query memory limit
- OBServer 版本:V4.2.5.6
- 业务租户规格:16C64G
问题原因
该问题属于 OceanBase V4.2.5 及以上版本的一个内部已知缺陷。
缺陷原理
- OceanBase 内核存在单条查询(query)的内存限制功能,默认上限为业务租户内存的 50%。
- 在执行 DML 语句时,系统会发起内部 SQL(inner sql)查询日志流(LS)的缓存,此时执行上下文会切换到 META 租户。
- 切换后,实际内存使用量仍计入业务租户,但内存检测线程在周期性重新读取租户配置和内存使用量时,会基于当前线程的上下文(即 META 租户)重新计算内存使用上限。
- 由于 META 租户的内存通常仅为业务租户的 1/10,导致计算出的内存上限远小于预期。
- 当内部 SQL 本身消耗内存较大时,就可能超过这个被错误计算的小上限,从而触发内存超限报错。
触发场景
- 单条 SQL 执行消耗了较大的内存(通常超过业务租户内存的 1/20)。
- 执行过程中触发了内部 SQL 执行,并切换到 META 租户上下文。
修复版本
- 4.2.5.7 hotfix3
- 4.3.5.5 hotfix5
- 4.4.2.0
- 4.6.0
适用版本
OceanBase V4.2.5(oceanbase-4.2.5.0-10000008202410202)及更高版本。
解决方法
方法一:调大业务租户内存规格
通过调大业务租户的内存规格,间接增加其关联的 META 租户的内存上限,使其超过单条 SQL 语句的内存使用量。
方法二:控制单条 SQL 语句的内存使用量
优化业务 SQL,例如将消耗内存大的单条 SQL 拆分为多条 SQL 分批次执行,以降低单次操作的内存峰值。
方法三:升级 OceanBase 集群版本
将 OceanBase 集群升级至已修复该问题的版本。
规避方式
如需临时规避此问题,可以连接到系统租户(sys),执行以下命令:
ALTER SYSTEM SET query_memory_limit_percentage = 100 TENANT = META$1002;
- 将参数
1002替换为实际业务租户的tenant_id。 - 将
query_memory_limit_percentage设置为 100 表示取消单条 SQL 的内存百分比限制。
问题排查
报错日志示例
完整的报错日志示例如下:
OBE-00600: internal error code, arguments: -11049, Exceed query memory limit (mem_limit=3435973836, mem_hold=3436745640), please check whether the query_memory_limit_percentage configuration item is reasonable.
错误码说明
- OceanBase 错误码:11049
- 错误原因:查询内存超出限制。
- 解决方法:检查配置项
query_memory_limit_percentage的值,确认设置是否合理。 - 说明:该错误码从 OceanBase V4.2.5 版本开始引入。
相关配置项
从 OBServer V4.2.5、V4.3.5 版本开始,新增了租户级配置项 query_memory_limit_percentage,用于指定单条 SQL 可使用的租户内存百分比。
-- 查询配置项信息
SELECT * FROM gv$ob_parameters WHERE name LIKE 'query_memory_limit_percentage';
- 作用:指定单条 SQL 可使用的租户内存百分比。当内存使用超过指定阈值后,系统会报错并中断该 SQL 的执行。
- 级别:租户级别(TENANT),动态生效(DYNAMIC_EFFECTIVE)。
- 默认值:50
- 取值范围:[0, 100]
案例分析
以客户环境为例:
- 业务租户内存规格为 64G。
- 当租户内存规格大于等于 10G 时,META 租户和用户租户的内存分配比例通常为 1:9。
- 因此,业务租户可用内存约为:
64G * (1 - 10%) = 57.6G。 - 单条 SQL 默认内存上限为:
57.6G * 50% = 28.8G。
然而,报错日志中显示的内存上限(mem_limit)为 3435973836 字节,约 3.2G,远低于预期的 28.8G。此差异正是由于缺陷导致内存检测时错误地使用了 META 租户的配置进行计算所致。