Innodb 监控
Innodb 因为反对事务操作,是 mysql 中应用最多的存储引擎,所以如何监控 Innodb 存储引擎以进行性能优化是在应用 mysql 过程中遇到最多的,那么如何进行监控呢?
show engine
-- 显示 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 -- 速率
<!– more –>
-- 展现 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
通过查看日志文件
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 '变量'
来查问,这些变量用来跟踪尝试的连贯、退出的连贯、网络流量和线程统计
- Connections
- Max_used_connections
- Threads_connected
- Aborted_clients
- Aborted_connects 如果不为 0,示意有人尝试连贯失败
- Bytes_received
- Bytes_sent
- Slow_launch_threads
- Threads_cached
- Threads_created
- Threads_running
二进制日志状态
- Binlog_cache_use 和 Binlog_cache_disk_use 示意在二进制日志缓存中有多少事务被存储过,以及多少事务因为超过二进制日志缓存而被存储到一个临时文件中
- Binlog_stmt_cache_use 和 Binlog_stmt_cache_disk_use 示意非事务语句对应的度量值
命令计数器
Com_* 变量统计了每种类型的 SQL 发动的次数
临时文件和长期表
通过 Create_tmp% 来查看隐式临时文件和长期表的统计
select 类型
select_* 变量统计 select 查问的计数器
- Select_full_join 穿插连贯或并没有条件匹配表中行的连贯的数目,如果存在,须要查看 sql 语句
- Select_full_range_join 应用在表 t1 中的一个值来从表 t2 中通过参考索引的区间内获取行所做的连接数,比 Select_scan 开销大些
- Select_range 扫描表的一个索引区间的连贯数目
- Select_range_check 在表 t2 中从新评估表 t1 中的每一行的索引是否开销最小所做的连接数,意味着表 t2 中对该连贯而言并没有应用索引,这种查问应该防止,开销很大
- Select_scan 扫描整张表的连贯数目
排序
- Sort_merge_passes 依赖于 sort_buffer_size 服务器变量,sort_buffer_size 来包容排序的行块,当实现排序后,会将这些排序后的行合并到后果集中,此时就会减少 Sort_merge_passes 值
- Sort_scan 和 Sort_range 当 mysql 从文件排序后果中读取曾经排好序的行并返回给客户端会导致这两个变量的增长,如果是当 Select_scan 减少时 Sort_scan 减少;如果是 Select_range 减少时 Sort_range 减少
information_schema 数据库中对于 innodb 的表
information_schema 数据库中有几个对于 innodb 的非凡表,能够用于监控压缩、事务和锁
- INNODB_CMP 表 显示压缩表的详细信息和统计信息
- INNODB_CMP_RESET 表 与 INNODB_CMP 信息雷同,然而会在查问表时将重置统计信息,能够定期跟踪统计信息
- INNODB_CMPMEM 表 显示在缓冲池中应用压缩的详细信息和统计信息
- INNODB_CMPMEM_RESET 表 与 INNODB_CMPMEM 信息雷同,然而会在查问表时将重置统计信息,能够定期跟踪统计信息
- INNODB_TRX 表 显示所有事务的详细信息和统计信息,包含事务状态和以后正在运行的查问信息
- INNODB_LOCKS 表 显示事务申请的锁的详细信息和统计信息,形容每个锁的状态、模式、类型等信息
- INNODB_LOCK_WAITS 表 显示被阻塞的事务申请的锁的详细信息和统计信息,形容每个锁的状态、模式、类型和阻塞事务
https://zhhll.icu/2021/ 数据库 / 关系型数据库 /MySQL/ 进阶 /29.Innodb 监控 /
本文由 mdnice 多平台公布