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
【其他背景信息或者截图】