一个好的问题描述有利于社区小伙伴更快帮你定位到问题,高效解决你的问题
【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 生产】
【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 不够时,用资源组或限流保护集群。
try it
学习下看怎么解决
看你的场景是JDBC流式读取触发TiDB端内存超限,这个报错通常是单条SQL在TiDB server端构建结果集时内存超阈值。虽然用了useCursorFetch,但TiDB对分区表+大表扫描时,cop task返回的数据量可能仍把server端内存打爆。
建议分三步排查:
information_schema.cluster_processlist定位是哪个SQL。