show engine innodb status输出内容包括以下几块(我所有试验都是在mysql5.6.22上实现)
- background thread
- semphores
- latest detected deadlock(该部分内容不一定输出,只有在系统出现过死锁情况下才输出)
- latest foreign key error(该部分内容不一定输出,只有在系统出现过外键错误情况下才输出)
- transactions
- file I/O
- logs
- buffer pool and memory
- insert buffer and adaptive hash index
- row operations
1.background thread(后台线程)
Innodb存储引擎室多线程的模型,因此其后台有多个不同的后台线程负责处理不同的任务。Master thread是一个非常核心的后台线程,主要负责缓冲池中的数据异步刷新到磁盘,保证数据的一致性。Master thread具有最高的线程优先级别,其内部由多个循环(loop)组成:主循环,后台循环,刷新循环,暂停循环。
参数 |
说明 |
Srv_master_thread loops |
Master线程的循环次数,master线程在每次loop过程中都会sleep,sleep的时间为1秒。而在每次loop的过程中会选择active、shutdown、idle中一种状态执行。Master线程在不停循环,所以其值是随时间递增的。 |
Srv_active |
Master线程选择的active状态执行。Active数量增加与数据表、数据库更新操作有关,与查询无关,例如:插入数据、更新数据、修改表等。 |
Srv_shutdown |
这个参数的值一直为0,因为srv_shutdown只有在mysql服务关闭的时候才会增加。 |
Srv_idle |
这个参数是在master线程空闲的时候增加,即没有任何数据库改动操作时。 |
Log_flush_and_write |
Master线程在后台会定期刷新日志,日志刷新是由参数innodb_flush_log_at_timeout参数控制前后刷新时间差。 |
注:Background thread部分信息为统计信息,即mysql服务启动之后该部分值会一直递增,因为它显示的是自mysqld服务启动之后master线程所有的loop和log刷新操作。通过对比active和idle的值,可以获知系统整体负载情况。Active的值越大,证明服务越繁忙。 |
图2 master thread loop
在图2中可以看到,master thread作为后台程序,一直不停的在loop,而loop过程中会选择active task 或者idle task函数执行,只有在innodb_force_recovery(对应图2的srv_force_recovery)参数设置值大于2的情况下,master thread会进入suspend状态。在srv_shutdown_s