A quest for the full InnoDB status
When running InnoDB you are able to dig into the engine internals, look at various gauges and counters, see past deadlocks and the list of all open transactions. This is in your reach with one simple command -
SHOW ENGINE INNODB STATUS
. On most occasions it works beautifully. The problems appear when you have a large spike in number of connections to MySQL, which often happens when several transactions kill the database performance resulting in very long execution times for even simplest queries, or a huge deadlock.
In such rare cases
SHOW ENGINE INNODB STATUS
often fails to provide the necessary information. The reason is that its output is limited to 64000 bytes, so a long list of transactions or a large deadlock dump may easily exhaust the limit. MySQL in such situation truncates the output so it fits the required size and obviously this is not good since you may lose some valuable information from your sight.
With large deadlocks you can actually deal by intentionally creating a new tiny deadlock which will replace the previous one in the output thus reducing the space occupied by that section of InnoDB status. Baron once wrote an article on how to do this.
There is not such easy way for the long transaction list, but fortunately there are some alternatives to the limited MySQL command output.
First one is that you can have innodb-status-file option set in your my.cnf. This will make InnoDB to write the full status output into
innodb_status.<PID>
file located in MySQL data directory. Unfortunately this is a startup time parameter, so unless you set it early, it will not be available in an emergency situation.
Other possibility is to create a special InnoDB table called innodb_monitor
CREATE TABLE innodb_monitor(a INT) ENGINE=innodb;
Creating it causes the full status to be periodically printed into MySQL error log. You can later disable logging by simply dropping the table. The problem I faced many times is that people do not configure their error log at all, so the messages disappear into nothingness. So what then?
I discovered that InnoDB will still create the status file on disk even if you do not specify innodb-status-file option. The file is actually used for every
SHOW ENGINE INNODB STATUS
call, so whenever someone runs the command, InnoDB writes the output to that file first and then the stored information is read back to user. To make things more difficult, MySQL keeps the file deleted, so it is not possible access it with a simple catfilename or any other command through the file system. However on many systems such as Linux or Solaris, but possibly also others, there is a relatively simple way to access deleted but not-yet-closed files (file is physically removed only after it is no longer open by any process).
First be sure to run
SHOW ENGINE INNODB STATUS
at least once. Then see what MySQL process ID is:
garfield ~ # ps ax | grep [m]ysqld
? Ssl : /usr/sbin/mysqld --defaults-file=/etc/mysql/my.cnf
In my case the process ID is 11886, so I will be using it in the examples, but you should of course use whatever PS returned to you.
Now you can use /proc to see all the file descriptors that are being kept open by the process. So go to /proc/<PID> and list all the files that were deleted.
garfield ~ # cd /proc//fd
garfield fd # ls -l | grep deleted
lrwx------ root root Oct : -> /tmp/iblnLBhO (deleted)
lrwx------ root root Oct : -> /tmp/ibuQBSgo (deleted)
lrwx------ root root Oct : -> /tmp/ibLVtBuZ (deleted)
lrwx------ root root Oct : -> /tmp/ibsMzkIA (deleted)
lrwx------ root root Oct : -> /tmp/ibj08Rkc (deleted)
The entries are presented as symbolic links from file descriptor number to a real path as in
-> /tmp/iblnLBhO
One of these entries is what you are looking for, it’s often (always?) the file with the lowest file descriptor number, so in my case it should be 5. But of course you can try reading a few first bytes from every such file to discover where InnoDB status is. You can also help yourself with lsof
tool available for many platforms:
garfield fd # lsof -c mysqld | grep deleted
mysqld mysql 5u REG , /tmp/ibuQBSgo (deleted)
mysqld mysql 6u REG , /tmp/ibLVtBuZ (deleted)
mysqld mysql 7u REG , /tmp/ibsMzkIA (deleted)
mysqld mysql 8u REG , /tmp/ibj08Rkc (deleted)
mysqld mysql 12u REG , /tmp/iblnLBhO (deleted)
The 4th column contains file descriptor numbers and in the 7th column there are the file sizes. This makes it obvious that InnoDB status has to be under file descriptor 5 since it’s the only non-zero length file.
So while you are still in /proc/<PID> directory, you can try looking into that file:
garfield fd # cat
=====================================
:: INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last seconds
----------
SEMAPHORES
----------
... snip ...
Keep in mind the file will only be refreshed when you run
SHOW ENGINE INNODB STATUS
command.
参考:http://www.mysqlperformanceblog.com/2008/10/31/full-innodb-status/
A quest for the full InnoDB status的更多相关文章
- mysql 查看存储引擎的状态 show engine innodb status 详解
首先,让我们来了解一下 SHOW INNODB STATUS 输出的基础,它打印了很多关于 InnoDB 内部性能相关的计数器.统计.事务处理信息等.在 MySQL 5 中,InnoDB 的性能统计结 ...
- mysql之show engine innodb status解读
注:以下内容为根据<高性能mysql第三版>和<mysql技术内幕innodb存储引擎>的innodb status部分的个人理解,如果有错误,还望指正!! innodb存 ...
- mysql:innodb monitor(show engine innodb status)探秘
在旧的版本里面是show innodb status命令,新版本后改动了一些:show engine innodb status; 我们最熟悉的,应当就是show innodb status命令,可以 ...
- InnoDB Status Output – Buffer Pool and Spin Rounds
InnoDB has a good source of information about its status which can be requested every time you need ...
- Using SHOW PROCESSLIST and mysqladmin debug Output in Conjunction with SHOW INNODB STATUS
When InnoDB appears hung, I know the natural reaction is to check SHOW ENGINE INNODB STATUS. In fact ...
- show engine innodb status 详解
找个mysql客户端,执行show engine innodb status得到如下结果: 详细信息如下: ************************************** ======= ...
- show engine innodb status\G
mysql> show engine innodb status\G *************************** 1. row *************************** ...
- show engine innodb status解读
xiaoboluo768 注:以下内容为根据<高性能mysql第三版>和<mysql技术内幕innodb存储引擎>的innodb status部分的个人理解,如果有错误,还 ...
- (Sqlyog或Navicat不友好处)SHOW ENGINE INNODB STATUS 结果为空或结果为=====================================
因为最近在学习innodb引擎,所以就在自己的sqlyog上执行上述命令: SHOW ENGINE INNODB STATUS 结果显示如下: 换了个客户端navicat,执行如下: 最后登录到服务器 ...
随机推荐
- SVG 2D入门1 - SVG综述
位图与矢量图 以前,浏览器中显示的图形,例如jpeg.gif等,都是位图,这些图像格式是基于光栅的.在光栅图像中,图像文件定义了图像中每个像素的颜色值.浏览器需要读取这些值并做出相应行动.这种图像的再 ...
- BZOJ 1034 泡泡堂
贪心可过.原来浙江省选也不是那么难嘛.. 作者懒,粘的题解.此题类似于田忌赛马的策略,只要站在浙江队一方和站在对手一方进行考虑即可. #include<iostream>#include& ...
- python构建模拟模型——网站独立访问用户数量
背景:发现一个有趣的现象,即一些用户在每一月都仅仅访问网站一次,我们想要了解这些人数量的变化趋势. 建立数学模型:简化问题,根据瓮模型推导出公式(具体推导见<数据之魅>,有时间再补充... ...
- [Java Basics] Stack, Heap, Constructor, I/O, Immutable, ClassLoader
Good about Java: friendly syntax, memory management[GC can collect unreferenced memory resources], o ...
- poll函数和串口设置
2015.1.24 今天星期六,多云,早晨8:17起床的,今天是来南京起床最迟的一天,因为昨晚睡得有点迟,今天又不用上课,整个人有点放松.收拾好来到教室,教室门没有开,胡明也到了,其他人还在宿舍睡觉, ...
- Qt之动画框架
简述 Qt动画框架旨在为创建动画和平滑的GUI提供了一种简单的方法.通过Qt动画属性,该框架为部件和其它QObject对象的动画操作提供了非常大的自由性,框架也可以被用于图形视图框架中,动画框架中许多 ...
- java web目录结构
转自:http://blog.csdn.net/javaloveiphone/article/details/7828894 Javaweb项目的源文件与字节码文件的目录结构 1.新建项目的源文件目录 ...
- 递归神经网络之理解长短期记忆网络(LSTM NetWorks)(转载)
递归神经网络 人类并不是每时每刻都从头开始思考.正如你阅读这篇文章的时候,你是在理解前面词语的基础上来理解每个词.你不会丢弃所有已知的信息而从头开始思考.你的思想具有持续性. 传统的神经网络不能做到这 ...
- 162. Find Peak Element
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- ZOJ 1202 Divide and Count
原题链接 题目大意:某人手上有一大批钻石,他同时有一些盒子恰好放下这些钻石,每个盒子可以放一个或多个,问一共有几种方法. 解法:这其实是一道排列与组合计算题,主要是写出组合算法的代码,把计算公式转为程 ...