GreatSQL temp文件占用时长分析

GreatSQL temp文件占用时长分析

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

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

```Bash
-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,而且还在持续增加。

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

```Bash
$ ps -ef|grep greatsql|grep 4406
greatsql   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 目录名称,可以得到这个进程在在这个端口上的连接的文件编号:

```Bash
$ lsof /data/greatsql/dbdata/datanode4406/data/#innodb_temp/temp_6.ibt 
COMMAND    PID    USER   FD   TYPE DEVICE    SIZE/OFF        NODE NAME
greatsqld 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,然后执行下面的命令:

```Bash
$ ll /proc/35049/fd/282
lrwx------ 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即可。

```SQL
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 907
Query OK, 0 rows affected (0.00 sec)
```

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


Enjoy GreatSQL 😃

关于 GreatSQL

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

image-20230105161905827

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群

image-20221030163217640

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/5950.html

(0)
LomuLomu
上一篇 2025 年 1 月 12 日 上午5:46
下一篇 2025 年 1 月 12 日 上午6:46

相关推荐

  • Python深度学习(第2版)PDF免费下载

    适读人群 :想要学习深度学习的学生、职业开发者。 流行深度学习框架Keras之父执笔,涵盖Transformer架构等进展,文字生,简单方式解释复杂概念,不用一个数学公式,利用直觉自然入门深度学习。 电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍 点击原文去下载 书籍信息 作者: [美] 弗朗索瓦·肖莱出版社: 人民邮电出版社出品方…

    2024 年 12 月 31 日
    48100
  • Java 并发编程:ReentrantLock 锁与 AQS

    大家好,我是栗筝i,这篇文章是我的“栗筝i的Java技术栈”专栏的第030篇作品。在这个专栏中,我将不断为大家带来涵盖Java技术全领域的深入内容。本专栏旨在帮助那些已经具备一定Java开发基础,并且渴望全面掌握Java技术体系以丰富自身技术储备的开发者。同时,每篇文章都会提供丰富的代码示例和详尽的知识点总结,非常适合初学者和即将参加工作面试的求职者。当然,…

    未分类 2024 年 12 月 28 日
    66500
  • GreatSQL temp文件占用时长分析

    GreatSQL temp文件占用时长分析 GreatSQL DBA在日常工作中可能会遇到这种情况,存在一个 InnoDB 引擎下的 temp_x.ibt 文件很大,但是却无法确定这个文件是什么时间由哪个连接建立的,难以支撑后续定位问题,今天这篇文章彻底讲明白这个问题。 现象:发现一个实例下面(4406端口对外提供服务的实例)temp文件很大,如下所示: `…

    2025 年 1 月 10 日
    55800
  • 深入解析Java字符串编码转换方法getBytes()

    目录导航1. 方法重载解析2. 实际应用演示3. 两种编码参数方式的对比分析3.1 参数形式差异3.2 错误处理机制3.3 编码规范建议3.4 执行效率考量代码实例比较 Java语言中的getBytes()是字符串处理的重要方法,它能够将文本内容转换为特定编码格式的字节序列。该方法在String类中定义,为字符编码转换提供了灵活的实现方案。 1. 方法重载解…

    2025 年 5 月 19 日
    1.2K00
  • SuperGrok充值微信支付宝开通实用版

    国内用户开通 Grok Super 的充值教程,整理 Grok 充值、代充、国内支付、账号 ID 获取和确认充值步骤。

    未分类 2026 年 6 月 6 日
    3200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信