TiDB高并发增量读取大表报 Out Of Memory Quota服务端内存超限如何分析处理

一个好的问题描述有利于社区小伙伴更快帮你定位到问题,高效解决你的问题

【TiDB 生产】
【TiDB 版本】v8.0.0
【问题描述】JDBC定时增量拉取超大分区表,报错 Caused by: java.sql.SQLException: Out Of Memory Quota![conn_id=xxxx]
已配置 useCursorFetch=true&fetch.size=1000 ,无法改业务源码、不能改写SQL分页,仍持续触发TiDB服务端内存超限

游标只降低客户端取数,服务端仍可能把大结果放进内存。可调大 tidb_mem_quota_query 或打开 oom-use-tmp-storage,并确认会话级 tidb_enable_tmp_storage_on_oom。长期仍建议服务端下推过滤/分区裁剪。改 JDBC 不够时,用资源组或限流保护集群。

1 个赞
  • 更改 SQL 获取数据的方式,减少内存占用
  • 给 TiDB 节点继续追加内存

try it

学习下看怎么解决

看你的场景是JDBC流式读取触发TiDB端内存超限,这个报错通常是单条SQL在TiDB server端构建结果集时内存超阈值。虽然用了useCursorFetch,但TiDB对分区表+大表扫描时,cop task返回的数据量可能仍把server端内存打爆。

建议分三步排查:

  1. 先看TiDB server内存监控,确认是哪个TiDB节点OOM,查information_schema.cluster_processlist定位是哪个SQL。