通过sqoop工具全量抽取TiDB6.5.10版本的大表时会将内存打满导致TiDB服务重启

Bug 反馈
TiDB从5.0.6升级到6.5.10以后通过sqoop工具全量抽取大表时会将内存打满,导致TiDB服务进程重启。
如果开启内存数据溢出落盘功能时,也会将相关磁盘IO打满。
【 TiDB 版本】
TiDB6.5.10
【 Bug 的影响】
1、TiDB server节点内存打满
2、TiDB server节点磁盘IO 100%
3、TiDB server节点进程重启
【可能的问题复现步骤】
1、系统内存资源和数据库参数配置情况
MySQL [(none)]> system free -g
total used free shared buff/cache available
Mem: 377 120 228 1 28 254
Swap: 0 0 0

MySQL [(none)]> show variables like ‘%tidb_mem_quota_query%’;
±---------------------±-----------+
| Variable_name | Value |
±---------------------±-----------+
| tidb_mem_quota_query | 53687091200|
±---------------------±-----------+
1 row in set (0.00 sec)

MySQL [(none)]> show variables like ‘%tidb_server_memory_limit’;
±-------------------------±------+
| Variable_name | Value |
±-------------------------±------+
| tidb_server_memory_limit | 20% |
±-------------------------±------+

MySQL [(none)]> show variables like ‘%storage_on%’;
±-------------------------------±------+
| Variable_name | Value |
±-------------------------------±------+
| tidb_enable_tmp_storage_on_oom | ON |
±-------------------------------±------+

2、通过sqoop工具按照主键ID分两批对3亿的表进行全量抽取。
抽取命令:
sqoop import -D mapred.job.queue.name=default --driver com.mysql.jdbc.Driver --connect ‘jdbc:mysql://xxx:4000/xx_db?tinyInt1isBit=false&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&dontTrackOpenResources=true&defaultFetchSize=1000&useCursorFetch=true’ --username ‘xxx’ --password --query “select * from tmp_table where $CONDITIONS” -m 2 --split-by “tmp_table.id” --boundary-query “select min(id) , max(id) from tmp_table where 1=1” --hive-drop-import-delims --fields-terminated-by “\001” --null-string ‘\N’ --null-non-string ‘\N’ --delete-target-dir --target-dir “/tmp/import_tmp/xdf_ods/tmp_table/partiton_tmp_dir/dt=20240903/0/0”

内存使用情况:

磁盘IO情况:

3、同样的抽取命令在TiDB5.0.6版本下内存使用正常
内存使用情况:

【看到的非预期行为】

【期望看到的行为】

【相关组件及具体版本】
Sqoop工具、TiDB6.5.10
【其他背景信息或者截图】

你抽取数据的sql要优化,之前我这也发生过这种sql非常慢把库卡死,优化sql后就可以了,百来亿的表数据都没问题。

我看那个内存占用,猜着是返回结果太多,导致占用内存多,8.3 版本支持了服务端的 cursor fetch,可以试下 8.3,参考:https://docs.pingcap.com/zh/tidb/dev/release-8.3.0#稳定性
当然看你刚升了上来,估计也不能马上再升级了
你可以调整下 tidb_distsql_scan_concurrency 参数设置,默认 15 ,我建议保守点你降低到 3 看下

tidb_distsql_scan_concurrency调整到3,问题还是存在。

sqoop 工具又并发控制吗,如果是单条 SQL ,你这个配置应该不会 OOM 啊,工具并行度可以调低点, 建议从慢查询分析下,看下执行数据抽取的 SQL 有啥问题。

开启了两个并发, show processlist 就两个select * from tmp_table where id >= ? and id <? 语句并且都是根据主键拆分查询的

优化抽数sql或者控制sql内存使用,6.5还是7.5的功能来着,记不清了