Innodb由于支持事务操作,是mysql中使用最多的存储引擎,所以如何监控Innodb存储引擎以进行性能优化是在使用mysql过程中遇到最多的,那么如何进行监控呢?
-- 显示innodb存储引擎状态的统计和配置信息
show engine innodb status;
展示的主要内容有
-----------------
BACKGROUND THREAD --后台线程
-----------------
srv_master_thread loops: 19610306 srv_active, 0 srv_shutdown, 9705136 srv_idle --统计Innodb启动后的活动
srv_master_thread log flush and writes: 29312902 --写入和刷新日志的次数
----------
SEMAPHORES --信号量包含了线程等待互斥锁或读写锁的信息
----------
OS WAIT ARRAY INFO: reservation count 52795642 --os等待数组信息,分配插槽的次数
OS WAIT ARRAY INFO: signal count 57522728 --os等待数组信息,线程通过数组得到信号的次数
RW-shared spins 0, rounds 77349143, OS waits 9180114 --共享锁期间,读写锁存器上自旋等待个数,自旋循环迭代次数以及操作系统调用的等待个数
RW-excl spins 0, rounds 179767865, OS waits 2534243 --排他锁期间,读写锁存器上自旋等待个数,自旋循环迭代次数以及操作系统调用的等待个数
RW-sx spins 2068750, rounds 40171680, OS waits 844522 --共享排他锁期间,读写锁存器上自选等待个数,自旋循环迭代次数以及操作系统调用的等待个数
Spin rounds per wait: 77349143.00 RW-shared, 179767865.00 RW-excl, 19.42 RW-sx --对于每一个互斥锁,操作系统调用等待的每一个自旋循环迭代个数
------------
TRANSACTIONS --包含所有当前正在执行的事务的信息
------------
Trx id counter 1888483436 --当前事务id
Purge done for trx s n:o < 1888483436 undo n:o < 0 state: running but idle --所有编号小于1888483436的事务都已经从历史记录列表中清除了,清除旧的MVCC行时所用的事务id,这个值与当前事务ID进行比较,就可以知道有多少老版本的数据未被清除
History list length 17 --历史列表的长度,位于Innodb数据文件的撤销空间里的页面的数目,如果事务执行了更新并提交,该数目就会增加,当清理进程移除旧版本数据时,该数目会减少
LIST OF TRANSACTIONS FOR EACH SESSION: 当前事务列表
---TRANSACTION 422068961001072, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068960999248, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961005632, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961013840, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961012016, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961010192, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961001984, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961000160, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961017488, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961011104, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961012928, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961004720, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961002896, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961003808, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422068961007456, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
--------
FILE I/O --各种IO操作的Innodb内部线程以及执行了多少次IO操作
--------
-- 有四个线程
-- insert buffer thread 负责插入缓冲合并
-- log thread 负责异步刷日志
-- read thread 执行预读操作以尝试预先读取Innodb预感需要的数据
-- write thread 刷脏缓冲
I/O thread 0 state: waiting for completed aio requests (insert buffer thread) --IO线程的状态
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0 -- 挂起操作的信息,aio是指异步io
83934578288 OS file reads, 282688772 OS file writes, 190348192 OS fsyncs --innodb启动后的总统计信息
984.40 reads/s, 16384 avg bytes/read, 10.15 writes/s, 9.12 fsyncs/s --最后一次显示后的总统计信息
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX --插入缓冲区与自适应散列统计信息
-------------------------------------
Ibuf: size 1, free list len 3078, seg size 3080, 8815726 merges --在页中插入缓冲索引树的当前大小,空闲列表的长度,在包含插入缓冲树与头信息的文件段中已分配页的个数,被合并页的个数
merged operations:
insert 6898371, delete mark 38430046, delete 1226485 --通过类型区分,索引页被执行合并操作的次数
discarded operations:
insert 1019, delete mark 0, delete 0 --无须合并丢弃操作的数量
Hash table size 34673, node heap has 1 buffer(s)
Hash table size 34673, node heap has 74 buffer(s)
Hash table size 34673, node heap has 1 buffer(s)
Hash table size 34673, node heap has 1 buffer(s)
Hash table size 34673, node heap has 1 buffer(s)
Hash table size 34673, node heap has 2 buffer(s)
Hash table size 34673, node heap has 28 buffer(s)
Hash table size 34673, node heap has 7 buffer(s)
5203.54 hash searches/s, 128.14 non-hash searches/s --成功使用自适应散列索引查找的数量,当不能使用自适应索引时向下搜索B树的次数
---
LOG --Innodb日志中活动信息
---
Log sequence number 319041331834 --当前日志序号
Log flushed up to 319041331699 -- 日志已经刷到的位置
Pages flushed up to 319033170877
Last checkpoint at 319033170877 -- 上一个检查点,当前日志序列号LSN
0 pending log flushes, 0 pending chkp writes
169033177 log i/o's done, 8.92 log i/o's/second --挂起的日志写入次数,挂起的检查点写入个数,innodb启动后的IO操作个数,从最近一次显示之后的每秒IO操作个数
----------------------
BUFFER POOL AND MEMORY --Innodb缓冲池与内存使用情况
----------------------
Total large memory allocated 137428992 --分配的内存
Dictionary memory allocated 1204989 --被数据字典表与索引对象所占空间的字节数
Buffer pool size 8191 --缓冲池个数
Free buffers 1024 --空闲缓冲区个数
Database pages 7052 --当前缓冲区LRU队列的长度(分配用来存储数据库页的页数)
Old database pages 2583 --旧的LRU队列的长度
Modified db pages 530 --需要刷新的页面的数量(脏数据库页数)
Pending reads 0 --挂起读操作的个数
Pending writes: LRU 0, flush list 0, single page 0 --通过LRU算法,等待刷新的页数
Pages made young 983912385, not young 304833753259 --因为最近第一次被访问时,变成新页面的数目和没有变成新页面的数目
1.54 youngs/s, 16246.04 non-youngs/s -- 上述两个值每秒的速率
Pages read 83934649301, created 4135172, written 103030852 --读操作的页面数目,在缓冲区中创建但是没有读取的页面数目,写操作的页面数目
984.40 reads/s, 0.17 creates/s, 1.15 writes/s -- 上述值美妙的速率
Buffer pool hit rate 972 / 1000, young-making rate 0 / 1000 not 478 / 1000 --读取到的页面数与获得的缓冲池页面的比例,变为新页面的页面数与获得缓冲池页面的比例,没有变为新页面的页面数与获得缓冲池页面的比例
Pages read ahead 913.79/s, evicted without access 5.60/s, Random read ahead 0.00/s --预读的速率与不通过访问剔除的预读页面的个数
LRU len: 7052, unzip_LRU len: 0 --LRU列表的长度,unzip_LRU列表的长度
I/O sum[4121]:cur[0], unzip sum[0]:cur[0] --IO操作的次数:当前间隔的IO
--------------
ROW OPERATIONS --行操作
--------------
0 queries inside InnoDB, 0 queries in queue --当前有多少个正在执行的查询,在innodb_thread_concurrency队列中的查询个数
0 read views open inside InnoDB --只读视图的数量
Process ID=1543, Main thread ID=140593683990272, state: sleeping --线程id以及状态
Number of rows inserted 56092883, updated 133093048, deleted 40729879, read 477150639699 --从innodb启动后,插入、更新、删除、读取的行数
0.19 inserts/s, 7.73 updates/s, 0.00 deletes/s, 138100.85 reads/s -- 速率
-- 展示Innodb的互斥体信息
show engine innodb mutex;
Type Name Status
InnoDB rwlock: dict0dict.cc:2782 waits=4
InnoDB rwlock: dict0dict.cc:1228 waits=80
InnoDB rwlock: log0log.cc:846 waits=75
InnoDB sum rwlock: buf0buf.cc:1460 waits=11
-- name列显示了创建互斥体的源文件和行号
-- status列显示了互斥体在操作系统上的等待次数
show status like 'innodb%log%'
Variable_name Value
Innodb_log_waits 0 日志文件太小时,操作必须等待日志刷新的等待时间计数器,该值如果长期大于0,可以适当增加日志文件大小
Innodb_log_write_requests 4539 日志写入请求的数量
Innodb_log_writes 22 数据被写入日志的次数
Innodb_os_log_fsyncs 1020 操作系统文件同步的数量(fsync()方法调用)
Innodb_os_log_pending_fsyncs 0 阻塞的文件同步请求的数量,如果该值开始增长并长期大于0,需要检查磁盘访问问题
Innodb_os_log_pending_writes 0 阻塞的日志写请求的次数,如果该值开始增长并长期大于0,需要检查磁盘访问问题
Innodb_os_log_written 2855424 写入日志中的字节总量
Innodb_available_undo_logs 128
缓冲池是Innodb缓存频繁访问数据的地方,对缓冲池内数据的任何更新也会被缓存
-- 可以查看存储引擎的统计信息,其中包含有缓冲池的信息
show engine innodb status;
截取出缓冲池的信息来进行分析
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 223164
Buffer pool size 8191
Free buffers 7374 空的且可用于缓冲数据的缓冲段个数
Database pages 809
Old database pages 299
Modified db pages 0 发生变化的页数
Pending reads 0 等待中的读请求个数
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 503, created 306, written 2534
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 809, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
在查看一下缓冲区相关的变量
show status like 'innodb%buf%'
Variable_name Value
Innodb_buffer_pool_pages_data 809 含有数据的页数,包括不变和改变的页
Innodb_buffer_pool_bytes_data 13254656 含有数据的字节数
Innodb_buffer_pool_pages_dirty 0 改变的字节数
Innodb_buffer_pool_bytes_dirty 0 改变的页的数目
Innodb_buffer_pool_pages_flushed 2525 缓冲池页面被刷新的次数
Innodb_buffer_pool_pages_free 7374 空页面的数目
Innodb_buffer_pool_pages_misc 8 用于管理工作的页数,公式为'Innodb_buffer_pool_pages_total-Innodb_buffer_pool_pages_free-Innodb_buffer_pool_pages_data'
Innodb_buffer_pool_pages_total 8191 缓冲池中的总页数
Innodb_buffer_pool_read_ahead_rnd 0 扫描大块数据时发生随机读头的数量
Innodb_buffer_pool_read_ahead 0
Innodb_buffer_pool_read_ahead_evicted 0
Innodb_buffer_pool_read_requests 107632 逻辑读请求的次数
Innodb_buffer_pool_reads 504 直接从磁盘中逻辑读取的次数(没有从缓冲池中读)
Innodb_buffer_pool_wait_free 0 如果缓冲池繁忙且没有空页,innodb需要等待页面刷新,该值表示等待次数,若始终大于0,可适当增加缓冲池大小
Innodb_buffer_pool_write_requests 47403 写入innodb缓冲池的次数
使用show status like '变量'
来查询,这些变量用来跟踪尝试的连接、退出的连接、网络流量和线程统计
Com_*变量统计了每种类型的SQL发起的次数
通过Create_tmp%来查看隐式临时文件和临时表的统计
select_*变量统计select查询的计数器
information_schema数据库中有几个对于innodb的特殊表,可以用于监控压缩、事务和锁
https://zhhll.icu/2021/数据库/关系型数据库/MySQL/进阶/29.Innodb监控/
本文由 mdnice 多平台发布