MySQL中查看InnoDB状态的一个小技巧
这是学习笔记的第 1742 篇文章
MySQL中如果要查看InnoDB的状态,如果想看到更完整的信息,毫无疑问就是命令show engine innodb status。
当然还有几类查看的方式,比如information_schema中INNODB_XX的数据字典和新版本中的sys schema,里面是可以提供一些InnoDB不同维度的信息,但是相比show engine innodb status命令的输出,这些结果明显要淡薄许多。
所以相比于命令 show engine innodb status,目前来看似乎没有专门的工具来解读这些信息,比如我希望能他能够转义成json格式,这样我可以在报告中去抓取相应的内容来组织成报告,看起来就一目了然了,如果没有的话,只能自己先做了。
而同时,sys schema是给MySQL开了一个好头,里面的等待事件虽然少而且简陋,但是等待模型是Oracle中久经考验的方法论,所以按照等待模型来做问题的分析是一种非常不错的借鉴思路,毫无疑问,在优化的路上MySQL会越来越完善。 我想不出几个版本,也会有类似awr或者statspack的这样一套工具了。
问一个问题,在没有这些报告工具之前,我们要读取InnoDB的状态毫无疑问是命令的方式来触发,很多时候我们是执行了命令,然后上下翻屏幕去找相应的信息,很显然这些内容我们没有保留下来,show engine innodb status的结果不是实时的,如果要想查看上一次的命令结果该怎么办呢,有一个小技巧。
我们是通过mysqld的进程号在系统层面来找到句柄的信息。
首先查看mysqld的进程号。
# ps -ef|grep mysqld|grep -v grep
root 2122 1 0 19:54 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/dev01.pid
mysql 2382 2122 0 19:54 ? 00:00:13 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysqld.log --pid-file=/data/mysql/dev01.pid --socket=/tmp/mysql.sock
在这里就是找mysqld的进程号,即2382
在操作系统层面我们来看下句柄的信息,可以看到输出了一个列表。
# ll /proc/2382/fd|grep deleted
lrwx------ 1 root root 64 Sep 12 23:29 11 -> /tmp/ibq9KpG4 (deleted)
lrwx------ 1 root root 64 Sep 12 23:29 4 -> /tmp/ibuuKHaH (deleted)
lrwx------ 1 root root 64 Sep 12 23:29 5 -> /tmp/ibET4ZCa (deleted)
lrwx------ 1 root root 64 Sep 12 23:29 6 -> /tmp/ib4nyi5D (deleted)
lrwx------ 1 root root 64 Sep 12 23:29 7 -> /tmp/ib1XzG2A (deleted)
在这么多的文件里,我们看到文件都是序号,会映射到指定目录下面。
那么那个文件才是我们要找的呢?我们通过lsof来间接印证。
可以看到会根据lsof的方式来输出句柄信息。
# lsof -c mysqld|grep deleted
mysqld 2382 mysql 4u REG 253,0 3942 1576539 /tmp/ibuuKHaH (deleted)
mysqld 2382 mysql 5u REG 253,0 0 1576540 /tmp/ibET4ZCa (deleted)
mysqld 2382 mysql 6u REG 253,0 0 1576541 /tmp/ib4nyi5D (deleted)
mysqld 2382 mysql 7u REG 253,0 0 1576542 /tmp/ib1XzG2A (deleted)
mysqld 2382 mysql 11u REG 253,0 0 1576543 /tmp/ibq9KpG4 (deleted)
需要注意第7列,这是唯一一个句柄内容非空的,在这个场景里就是show engine innodb status的输出结果,即文件/tmp/ibuuKHaH映射到的4号文件。
# ll 4
lrwx------ 1 root root 64 Sep 12 23:29 4 -> /tmp/ibuuKHaH (deleted)
如果要查看命令的完整内容,则需要查看的就是4号文件。
# cat 4
=====================================
2018-09-12 23:28:26 0x7f8e7bf74700 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 22 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 6 srv_active, 0 srv_shutdown, 12793 srv_idle
srv_master_thread log flush and writes: 12799
。。。。
后续需要基于这些内容来做更多的定制和解析。