写点什么

GreatSQL temp 文件占用时长分析

作者:GreatSQL
  • 2025-01-03
    中国香港
  • 本文字数:2079 字

    阅读完需:约 7 分钟

GreatSQL temp 文件占用时长分析

GreatSQL DBA 在日常工作中可能会遇到这种情况,存在一个 InnoDB 引擎下的 temp_x.ibt 文件很大,但是却无法确定这个文件是什么时间由哪个连接建立的,难以支撑后续定位问题,今天这篇文章彻底讲明白这个问题。


现象:发现一个实例下面(4406 端口对外提供服务的实例)temp 文件很大,如下所示:


-rw-r----- 1 greatsql greatsql       81920 Sep 26 23:56 temp_1.ibt-rw-r----- 1 greatsql greatsql       81920 Sep 30 16:43 temp_10.ibt-rw-r----- 1 greatsql greatsql       81920 Sep 26 23:56 temp_2.ibt-rw-r----- 1 greatsql greatsql       81920 Sep 26 23:56 temp_3.ibt-rw-r----- 1 greatsql greatsql       81920 Sep 26 23:56 temp_4.ibt-rw-r----- 1 greatsql greatsql 18392023040 Oct  9 15:56 temp_5.ibt-rw-r----- 1 greatsql greatsql 18417188864 Oct 11 14:51 temp_6.ibt-rw-r----- 1 greatsql greatsql 18417188864 Oct 11 14:51 temp_7.ibt-rw-r----- 1 greatsql greatsql 18392023040 Oct  9 15:54 temp_8.ibt-rw-r----- 1 greatsql greatsql       81920 Sep 30 16:43 temp_9.ibt
$ cd /data/greatsql/dbdata/datanode4406/data/#innodb_temp$ du -sm temp_6.ibt 17565 temp_6.ibt
复制代码


单个文件大小达到 17G,而且还在持续增加。


那么,这个文件是由那个连接占用的呢?


$ ps -ef|grep greatsql|grep 4406greatsql   35049  33132 88 Sep26 ?        15-18:21:22 /data/greatsql/svr/greatsql/bin/greatsqld --defaults-file=/greatsql/conf/datanode4406.cnf --basedir=/greatsql/svr/greatsql --datadir=/greatsql/dbdata/datanode4406/data --plugin-dir=/greatsql/svr/greatsql/lib/plugin --log-error=/greatsql/logs/error4406.log --pid-file=/greatsql/dbdata/datanode4406/data/greatsql.pid --socket=/greatsql/dbdata/datanode4406/data/greatsql.sock --port=4406
复制代码


通过上述命令可以得到 GreatSQL 的进程 ID。


GreatSQL 数据库的进程为 35049 接下来通过命令查看这个进程打开的这个连接的文件名,lsof -p pid|grep port或者lsof 目录名称,可以得到这个进程在在这个端口上的连接的文件编号:


$ lsof /data/greatsql/dbdata/datanode4406/data/#innodb_temp/temp_6.ibt COMMAND    PID    USER   FD   TYPE DEVICE    SIZE/OFF        NODE NAMEgreatsqld 35049 greatsql  282uW  REG   8,17 18417188864 16642999840 /data/greatsql/dbdata/datanode4406/data/#innodb_temp/temp_6.ibt
复制代码


/proc/[pid]/fd 是一个目录,包含进程打开文件的情况,大家注意到 282uW 这个值,其中数字部分代表 fdid,这个里面 282 就是代表 fdid,然后执行下面的命令:


$ ll /proc/35049/fd/282lrwx------ 1 greatsql greatsql 64 Sep 26 23:57 /proc/35049/fd/282 -> /data/greatsql/dbdata/datanode4406/data/#innodb_temp/temp_6.ibt
复制代码


这样就得到连接建立这个文件的时间了,通过这个方法判断是否为长期不释放的连接,然后通过数据库的information_schema.innodb_session_temp_tablespaces,找到连接会话ID,它与information_schema.processlistID是一一对应关系,从而进行下一步研判和深度分析处理,异常的长连接可以 kill 处理,如下图 KILL 907即可。


greatsql> SELECT * FROM information_schema.innodb_session_temp_tablespaces ;+---------+------------+----------------------------+-------------+----------+-----------+| ID      | SPACE      | PATH                       | SIZE        | STATE    | PURPOSE   |+---------+------------+----------------------------+-------------+----------+-----------+|   29356 | 4243767288 | ./#innodb_temp/temp_8.ibt  | 18392023040 | ACTIVE   | INTRINSIC ||     473 | 4243767285 | ./#innodb_temp/temp_5.ibt  | 18392023040 | ACTIVE   | INTRINSIC ||     907 | 4243767286 | ./#innodb_temp/temp_6.ibt  | 18417188864 | ACTIVE   | INTRINSIC ||     501 | 4243767287 | ./#innodb_temp/temp_7.ibt  | 18417188864 | ACTIVE   | INTRINSIC || 1798928 | 4243767284 | ./#innodb_temp/temp_4.ibt  |      245760 | ACTIVE   | INTRINSIC ||       0 | 4243767281 | ./#innodb_temp/temp_1.ibt  |       81920 | INACTIVE | NONE      ||       0 | 4243767282 | ./#innodb_temp/temp_2.ibt  |       81920 | INACTIVE | NONE      ||       0 | 4243767290 | ./#innodb_temp/temp_10.ibt |       81920 | INACTIVE | NONE      ||       0 | 4243767289 | ./#innodb_temp/temp_9.ibt  |       81920 | INACTIVE | NONE      ||       0 | 4243767283 | ./#innodb_temp/temp_3.ibt  |       81920 | INACTIVE | NONE      |+---------+------------+----------------------------+-------------+----------+-----------+10 rows in set (0.00 sec)
greatsql> KILL 907Query OK, 0 rows affected (0.00 sec)
复制代码


感谢大家观看,不足之处还请指正。


发布于: 刚刚阅读数: 4
用户头像

GreatSQL

关注

GreatSQL社区 2023-01-31 加入

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。 社区:https://greatsql.cn/ Gitee: https://gitee.com/GreatSQL/GreatSQL

评论

发布
暂无评论
GreatSQL temp文件占用时长分析_GreatSQL_InfoQ写作社区