参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/innodb-monitors.html
InnoDB监视器提供有关InnoDB内部状态的信息。 此信息对性能调整很有用。
14.17.1 InnoDB 监控类型
InnoDB监视器有两种类型:
- 标准的InnoDB Monitor显示以下类型的信息:
- 主要后台主题完成的工作
- 信号量等待
- 有关最新外键和死锁错误的数据
- 锁等待事务
- 活动事务持有的表和记录锁
- 待处理的I/O操作和相关统计信息
- 插入缓冲区和自适应哈希索引统计
- redo 日志数据
- buffer pool 统计信息
- 行操作数据
- InnoDB锁定监视器打印额外的锁定信息作为标准InnoDB监视器输出的一部分。
14.17.2 启用 InnoDB 监控
当InnoDB监视器启用定期输出时,InnoDB将输出写入mysqld服务器标准错误输出(stderr)。 InnoDB将诊断输出发送到stderr而不是stdout或固定大小的内存缓冲区,以避免潜在的缓冲区溢出。
在Windows上,除非另外配置,否则stderr将定向到默认日志文件。 如果要将输出定向到控制台窗口而不是错误日志,请在控制台窗口中使用--console选项从命令提示符启动服务器。
在Unix和类Unix系统上,除非另有配置,否则stderr通常会定向到终端。
启用后,每15秒I,nnoDB监控打印一次数据。 此数据在性能调整中很有用。 作为副作用,SHOW ENGINE INNODB STATUS的输出每十五秒写入MySQL数据目录中的状态文件。 该文件的名称是innodb_status.pid,其中pid是服务器进程ID。 当服务器正常关闭时,InnoDB会删除该文件。 如果发生异常关闭,则可能存在这些状态文件的实例,必须手动删除。 在删除文件之前,请检查它们以查看它们是否包含有关异常关闭原因的有用信息。 仅当启用了innodb-status-file配置选项时,才会创建innodb_status.pid文件。 默认情况下禁用它。
只有在您真正想要查看监视器信息时才应启用InnoDB监视器,因为输出生成会导致性能下降。 此外,如果监视器输出定向到错误日志,如果您以后忘记禁用监视器,则日志可能会变得非常大。
注意:
为了帮助进行故障排除,InnoDB在某些条件下临时启用标准的InnoDB Monitor输出。
InnoDB监视器输出以包含时间戳和监视器名称的标头开头。 例如:
=====================================
2014-10-16 18:37:29 0x7fc2a95c1700 INNODB MONITOR OUTPUT =====================================
标准InnoDB监视器(INNODB MONITOR OUTPUT)的标题也用于锁定监视器,因为后者通过添加额外的锁定信息产生相同的输出。
innodb_status_output和innodb_status_output_locks系统变量用于启用标准InnoDB Monitor和InnoDB Lock Monitor。
启用或禁用InnoDB监视器需要PROCESS权限。
启用标准InnoDB监视器
通过将innodb_status_output系统变量设置为ON来启用标准InnoDB监视器。
SET GLOBAL innodb_status_output=ON;
要禁用标准的InnoDB监视器,请将innodb_status_output设置为OFF。
在关闭服务器时,innodb_status_output变量设置为默认的OFF值。
获得标准的InnoDB监视器按需输出
作为启用标准InnoDB Monitor定期输出的替代方法,您可以使用SHOW ENGINE INNODB STATUS SQL语句按需获取标准InnoDB Monitor输出,该语句将输出提取到客户端程序。 如果您使用的是mysql交互式客户端,那么如果用\G替换通常的分号语句终止符,则输出更具可读性:
mysql> SHOW ENGINE INNODB STATUS\G
如果启用了InnoDB锁定监视器,则SHOW ENGINE INNODB STATUS输出还包括InnoDB Lock Monitor数据。
启用InnoDB锁定监视器
InnoDB Lock Monitor数据使用InnoDB Standard Monitor输出打印。 必须启用InnoDB标准监视器和InnoDB锁定监视器才能定期打印InnoDB锁定监视器数据。
要启用InnoDB Lock Monitor,请将innodb_status_output_locks系统变量设置为ON。 必须启用InnoDB标准监视器和InnoDB锁定监视器才能定期打印InnoDB Lock Monitor数据:
SET GLOBAL innodb_status_output=ON;
SET GLOBAL innodb_status_output_locks=ON;
要禁用InnoDB锁定监视器,请将innodb_status_output_locks设置为OFF。 将innodb_status_output设置为OFF也禁用InnoDB标准监视器。
关闭服务器时,innodb_status_output和innodb_status_output_locks变量将设置为默认的OFF值。
注意:
要为SHOW ENGINE INNODB STATUS输出启用InnoDB锁定监视器,您只需要启用innodb_status_output_locks
14.17.3 InnoDB 标准监控器和 lock 监控器 输出
锁定监视器与标准监视器相同,只是它包含其他锁定信息。 为任意监视器启用定期输出会打开同一输出流,但如果启用了锁定监视器,则流包含额外信息。 例如,如果启用“标准监视器”和“锁定监视器”,则会打开单个输出流。 在您禁用锁定监视器之前,该流包含额外的锁定信息。
使用SHOW ENGINE INNODB STATUS语句生成时,标准监视器输出限制为1MB。 此限制不适用于写入tserver标准错误输出(stderr)的输出。
示例标准监视器输出:
mysql> SHOW ENGINE INNODB STATUS\G
标准监视器输出部分
有关标准监视器报告的每个度量标准的说明,请参阅“Oracle企业管理器for MySQL数据库用户指南”中的“度量标准”一章。
- Status
此部分显示时间戳,监视器名称以及每秒平均值所基于的秒数。 秒数是当前时间与上次打印InnoDB Monitor输出之间经过的时间。
- BACKGROUND THREAD
srv_master_thread行显示主后台线程完成的工作。
- SEMAPHORES
本节报告等待信号量的线程,以及有关线程在互斥锁或rw-lock信号量上需要旋转或等待的次数的统计信息。 等待信号量的大量线程可能是磁盘I / O或InnoDB内部争用问题的结果。 争用可能是由于查询的严重并行性或操作系统线程调度中的问题。 在这种情况下,将innodb_thread_concurrency系统变量设置为小于默认值可能会有所帮助。 每个等待行的Spin轮次显示每个OS等待互斥锁的自旋锁轮次数。
mutex指标由SHOW ENGINE INNODB MUTEX报告。
- LATEST FOREIGN KEY ERROR
本节提供有关最新外键约束错误的信息。 如果没有发生此类错误,则不存在。 内容包括失败的语句以及有关失败的约束以及引用和引用表的信息。
- LATEST DETECTED DEADLOCK
本节提供有关最近死锁的信息。 如果没有发生死锁,则不存在。 内容显示涉及哪些事务,每个尝试执行的语句,他们拥有和需要的锁,以及InnoDB决定回滚以打破僵局的事务。
- TRANSACTIONS
如果此部分报告锁等待,则您的应用程序可能存在锁争用。 输出还可以帮助跟踪事务死锁的原因。 - FILE I/O
本节提供有关InnoDB用于执行各种类型I / O的线程的信息。 其中前几个专门用于一般的InnoDB处理。 内容还显示待处理I / O操作的信息和I / O性能的统计信息。
这些线程的数量由innodb_read_io_threads和innodb_write_io_threads参数控制。
- INSERT BUFFER AND ADAPTIVE HASH INDEX
此部分显示InnoDB插入缓冲区(也称为更改缓冲区)和自适应哈希索引的状态。
- LOG
此部分显示有关InnoDB日志的信息。 内容包括当前日志序列号,日志刷新到磁盘的距离以及InnoDB上次检查点的位置。 (请参见第14.12.3节“InnoDB检查点”。)该部分还显示有关挂起写入和写入性能统计信息的信息。
- BUFFER POOL AND MEMORY
本节为您提供有关读取和写入页面的统计信息。 您可以根据这些数字计算您的查询当前正在执行的数据文件I / O操作数。
有关缓冲池统计信息的说明,请参见第14.6.3.9节“使用InnoDB标准监视器监视缓冲池”。
- ROW OPERATIONS
此部分显示主线程正在执行的操作,包括每种类型的行操作的数量和性能速率。