MySQL中查看InnoDB状态的一个小技巧

这是学习笔记的第 1742 篇文章

MySQL中查看InnoDB状态的一个小技巧

    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

。。。。

后续需要基于这些内容来做更多的定制和解析。