InnoDB 层锁、事务、统计信息字典表 | 全方位认识 information_schema

在上一篇《InnoDB 层系统字典表|全方位认识 information_schema》中,我们详细介绍了InnoDB层的系统字典表,本期我们将为大家带来系列第六篇《InnoDB 层锁、事务、统计信息字典表|全方位认识 information_schema》

作者 罗小波·沃趣科技高级数据库技术专家
出品 沃趣科技

在上一篇《InnoDB 层系统字典表|全方位认识 information_schema》中,我们详细介绍了InnoDB层的系统字典表,本期我们将为大家带来系列第六篇《InnoDB 层锁、事务、统计信息字典表|全方位认识 information_schema》

| INNODB_LOCKS

该表提供查询innodb引擎事务中正在请求的且并未获得的且同时阻塞了其他事务的锁信息(即没有发生不同事务之间的锁等待的锁信息,在这里是查看不到的,例如,只有一个事务时,该事务所加的锁信息无法查看到)

  • 该表中的内容可以用于诊断高并发下的锁争用信息

  • 该表为memory引擎临时表,访问该表需要拥有具有process权限

下面是该表中存储的信息内容(即将废弃,8.0中使用performance_schema.data_locks视图代替)

root@localhost : information_schema 12:33:45> select * from innodb_locks\G;
*************************** 1. row ***************************
lock_id: 2476293:115:5:2
lock_trx_id: 2476293
  lock_mode: X
  lock_type: RECORD
lock_table: `luoxiaobo`.`t_luoxiaobo`
lock_index: PRIMARY
lock_space: 115
  lock_page: 5
  lock_rec: 2
  lock_data: 5
*************************** 2. row ***************************
lock_id: 2476292:115:5:2
lock_trx_id: 2476292
  lock_mode: X
  lock_type: RECORD
lock_table: `luoxiaobo`.`t_luoxiaobo`
lock_index: PRIMARY
lock_space: 115
  lock_page: 5
  lock_rec: 2
  lock_data: 5
2 rows in set, 1 warning (0.00 sec)

字段含义如下:

  • LOCK_ID:InnoDB内部的唯一锁ID号。尽管LOCK_ID列值包含事务ID(由事务ID和锁ID组成),但LOCK_ID中的数据格式随时可能会发生变化(所以请不要编写应用程序来解析LOCK_ID列值)

  • LOCK_TRX_ID:持有该锁的事务ID。可以使用该字段和INNODB_TRX表中的TRX_ID关联来在INNODB_TRX表中查询更多的事务信息

  • LOCK_MODE:锁模式(如何请求锁)。允许的值有:S [,GAP]、X [,GAP]、IS [,GAP]、IX [,GAP]、AUTO_INC、UNKNOWN。除AUTO_INC和UNKNOWN以外,其他锁模式都表示为间隙锁(如果存在)

  • LOCK_TYPE:锁类型。允许的值有,行级锁时该字段值显示为RECORD,表级锁时该字段值显示为TABLE

  • LOCK_TABLE:锁定记录相关的表名称

  • LOCK_INDEX:如果LOCK_TYPE是RECORD,则该字段显示锁定记录相关的索引名称,否则该字段值为NULL

  • LOCK_SPACE:如果LOCK_TYPE是RECORD,则该字段显示锁定记录相关的表空间ID,否则该字段值为NULL

  • LOCK_PAGE:如果LOCK_TYPE是RECORD,则该字段值显示锁定记录相关的page number,否则该字段值为NULL

  • LOCK_REC:如果LOCK_TYPE为RECORD,则该字段值显示锁定记录在页内的堆号,否则该字段值为NULL

  • LOCK_DATA:该字段值显示与锁定记录相关的数据(如果存在锁定数据记录的话)。如果LOCK_TYPE为RECORD,则该列值显示的值为锁定记录的主键值,否则为NULL。如果没有主键,则LOCK_DATA是具有唯一性的InnoDB内部行ID号值。如果对索引中锁定的键值比最大值还大,或者键值是一个间隙锁定,则LOCK_DATA列值将显示伪记录(supremum pseudo-record)。当包含已锁定记录的页面不在缓冲池中时(在锁定期间已将其分页到磁盘的情况下),InnoDB为避免不必要的磁盘操作不会从磁盘获取页面。此时,LOCK_DATA列值显示为NULL

| INNODB_TRX

该表提供查询当前在InnoDB引擎中执行的每个事务(不包括只读事务)的信息,包括事务是否正在等待锁、事务什么时间点开始、以及事务正在执行的SQL语句文本信息等(如果有SQL的话)

  • 该表为memory引擎临时表,查询该表的用户需要有process权限

下面是该表中存储的信息内容

admin@localhost : information_schema 06:26:08> select * from INNODB_TRX limit 1\G;
*************************** 1. row ***************************
                trx_id: 8075544
            trx_state: RUNNING
          trx_started: 2017-09-25 18:24:20
trx_requested_lock_id: NULL
      trx_wait_started: NULL
            trx_weight: 4
  trx_mysql_thread_id: 9
            trx_query: NULL
  trx_operation_state: NULL
    trx_tables_in_use: 0
    trx_tables_locked: 2
      trx_lock_structs: 4
trx_lock_memory_bytes: 1136
      trx_rows_locked: 2
    trx_rows_modified: 0
  trx_concurrency_tickets: 0
  trx_isolation_level: READ COMMITTED
    trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 0
      trx_is_read_only: 0
trx_autocommit_non_locking: 0
1 row in set (0.00 sec)

字段含义如下:

  • TRX_ID:InnoDB引擎内部的唯一事务ID号。只读和非锁定事务不记录

  • TRX_WEIGHT:事务的权重,该数值反映了事务修改的记录行数和事务锁定的记录行数改变的行数(但不一定是确切的计数)。为了解决死锁问题,InnoDB选择权重最小的事务作为“受害者”进行回滚。另外,无论修改和锁定行的数量如何,对非事务引擎表的事务都被认为比其他事务引擎的修改权重更大(因为非事务引擎表的修改无法回滚,只能回滚支持事务的引擎)

  • TRX_STATE:事务执行状态。有效值为:RUNNING、LOCK WAIT、ROLLING BACK、COMMITTING

  • TRX_STARTED:事务开始时间

  • TRX_REQUESTED_LOCK_ID:如果TRX_STATE列值为LOCK WAIT,则该列值展示事务当前等待的锁的ID;否则该列值为NULL。可以使用该列与INNODB_LOCKS表的LOCK_ID列进行关联以查询INNODB_LOCKS表中更多的锁信息

  • TRX_WAIT_STARTED:如果TRX_STATE列值为LOCK WAIT,则该列值显示事务开始等待锁的时间,否则该列值为NULL

  • TRX_MYSQL_THREAD_ID:MySQL线程ID。可以将此列与INFORMATION_SCHEMA PROCESSLIST表的ID列进行关联以查询更多的线程信息

  • TRX_QUERY:事务正在执行的SQL语句文本

  • TRX_OPERATION_STATE:事务的当前操作(如果事务在当前有执行操作的话,否则列值为NULL)

  • TRX_TABLES_IN_USE:处理此事务的当前SQL语句时使用到的InnoDB表的数量

  • TRX_TABLES_LOCKED:当前SQL语句持有行锁涉及到的InnoDB表的数量 (因为是行锁,不是表锁,所以尽管有些行被锁定,但通常其他事务仍然可以进行读写操作)

  • TRX_LOCK_STRUCTS:事务持有的锁数量

  • TRX_LOCK_MEMORY_BYTES:此事务的锁结构在内存中占用的空间总大小

  • TRX_ROWS_LOCKED:被此事务锁定的记录近似行数。该值可能包含被标记为删除但未实际删除的行

  • TRX_ROWS_MODIFIED:此事务中修改和插入行的数量

  • TRX_CONCURRENCY_TICKETS:该列值表示当前事务在被换出之前可以执行多少工作,该数量由innodb_concurrency_tickets系统变量设置

  • TRX_ISOLATION_LEVEL:当前事务的隔离级别

  • TRX_UNIQUE_CHECKS:当前事务是否启用或禁用了唯一性检查。例如:唯一性检查可能在批量导入数据之前关闭

  • TRX_FOREIGN_KEY_CHECKS:当前事务是否打开或关闭了外键检查。例如:外键检查可能在批量导入数据之前关闭

  • TRX_LAST_FOREIGN_KEY_ERROR:最后一个外键错误的详细信息,如果无错误则该列值为NULL

  • TRX_ADAPTIVE_HASH_LATCHED:自适应散列索引是否被当前事务锁定。当自适应散列索引搜索系统被分区时,单个事务不会锁定整个自适应散列索引。自适应散列索引分区数量由innodb_adaptive_hash_index_parts系统变量设置,默认情况下参数值为8

  • TRX_ADAPTIVE_HASH_TIMEOUT:是否立即释放自适应哈希索引的搜索锁,或者保留来自MySQL的请求。当没有自适应哈希索引争用时,该值保持为零,并且语句会保留闩锁直到事务完成。当存在争用时,在争用期间,该列值会减为零,并且在每次查找行后语句立即释放闩锁。当自适应散列索引搜索系统被分区(由innodb_adaptive_hash_index_parts设置分区数量)时,该列值始终为0

  • TRX_IS_READ_ONLY:事务是否是只读事务,1表是只读

  • TRX_AUTOCOMMIT_NON_LOCKING:值为1表示该事务中的SQL是一个没有使用FOR UPDATE或LOCK IN SHARED MODE子句的SELECT语句,并且是自动提交的只包含一条语句的事务。当该列值和TRX_IS_READ_ONLY列值都是1时,InnoDB执行事务优化以减少事务相关的开销

| INNODB_LOCK_WAITS

该表提供查询关于每个被阻塞的InnoDB事务的锁等待记录,包括发生锁等带事务所请求的锁和阻止该锁请求被授予的锁

  • 该表为memory引擎表,访问该表用户需要有process权限

下面是该表中存储的信息内容

root@localhost : information_schema 12:38:55> select * from innodb_lock_waits\G;
*************************** 1. row ***************************
requesting_trx_id: 2476294
requested_lock_id: 2476294:115:5:2
  blocking_trx_id: 2476292
blocking_lock_id: 2476292:115:5:2
1 row in set, 1 warning (0.00 sec)

字段含义如下:

  • REQUESTING_TRX_ID:正在请求锁(发生锁等待的)的事务ID

  • REQUESTED_LOCK_ID:正在请求的锁ID。 可通过该字段与INNODB_LOCKS表的LOCK_ID列做join,从INNODB_LOCKS表中查询更多的锁信息

  • BLOCKING_TRX_ID:正在阻塞另外一个事务获得锁(持有锁的)的事务ID

  • BLOCKING_LOCK_ID:正在阻塞另外一个事务获得锁的锁ID。可通过该字段与INNODB_LOCKS表的LOCK_ID列做join,从INNODB_LOCKS表中查询更多的锁信息

| INNODB_BUFFER_PAGE

该表提供查询关于buffer pool中的页相关的信息

  • 注意:
    • 对该表的查询操作可能会导致明显的性能下降(此表主要用于专家级性能监视、或者为MySQL开发性能相关的扩展使用),所以,除非必须,否则不要在生产环境中对该表进行查询,如果确有需要查询该表,可以使用tcpdump生产环境的网络流量到一个测试实例中,并在测试实例中查询该表
    • 当删除表、表中的数据行、分区表的某个分区、或表的索引时,相关联的页将仍然保留在缓冲池中,直到其他数据需要更多的缓冲池空间时才会从缓冲池中驱逐这些页,当这些页被驱逐时才会更新INNODB_BUFFER_PAGE表中的记录信息
  • 查询该表需要用户具有PROCESS权限,该表为Memory引擎临时表

下面是该表中存储的信息内容

root@localhost : information_schema 11:50:15> select * from INNODB_BUFFER_PAGE limit 1\G;
*************************** 1. row ***************************
        POOL_ID: 0
      BLOCK_ID: 0
          SPACE: 0
    PAGE_NUMBER: 7
      PAGE_TYPE: SYSTEM
    FLUSH_TYPE: 1
      FIX_COUNT: 0
      IS_HASHED: NO
NEWEST_MODIFICATION: 25646701632
OLDEST_MODIFICATION: 0
    ACCESS_TIME: 1508663684
    TABLE_NAME: NULL
    INDEX_NAME: NULL
NUMBER_RECORDS: 0
      DATA_SIZE: 0
COMPRESSED_SIZE: 0
    PAGE_STATE: FILE_PAGE
        IO_FIX: IO_NONE
        IS_OLD: NO
FREE_PAGE_CLOCK: 0
1 row in set (0.07 sec)

字段含义如下:

  • POOL_ID:buffer pool instance ID。用于区分多个缓冲池实例的标识符ID

  • BLOCK_ID:缓冲池块ID

  • SPACE:表空间ID。与INNODB_SYS_TABLES表中的SPACE列值相同

  • PAGE_NUMBER:页编号

  • PAGE_TYPE:页类型。有效值为:ALLOCATED(新分配的页面)、INDEX(BTREE节点页)、UNDO_LOG(undo日志页面)、INODE(索引节点页)、IBUF_FREE_LIST(插入缓冲区空闲列表页)、IBUF_BITMAP(插入缓冲区位图页)、SYSTEM(系统页)、TRX_SYSTEM(事务系统数据页)、FILE_SPACE_HEADER(文件空间头部页)、EXTENT_DESCRIPTOR(区块描述符页)、BLOB(未压缩的BLOB页)、COMPRESSED_BLOB(First 压缩 BLOB 页)、COMPRESSED_BLOB2(Subsequent 压缩 BLOB页)、IBUF_INDEX(插入缓冲索引页)、RTREE_INDEX(RTREE索引页)、UNKNOWN(未知页)

  • FLUSH_TYPE:刷新类型

  • FIX_COUNT:在缓冲池中使用该块的线程数。当该列值为零时,该区块将被驱逐

  • IS_HASHED:在此页上是否构建了hash索引

  • NEWEST_MODIFICATION:最新发生修改的LSN号

  • OLDEST_MODIFICATION:最早发生修改的LSN号

  • ACCESS_TIME:表示页首次被访问时间的抽象数字

  • TABLE_NAME:页所属的表名称,该列仅适用于INDEX类型的页

  • INDEX_NAME:页所属的索引名称,索引包括聚集索引或二级索引的名称。该列仅适用于INDEX类型的页

  • NUMBER_RECORDS:页内包含的记录数

  • DATA_SIZE:页内包含的记录的总数据字节大小。该列仅适用于INDEX类型的页

  • COMPRESSED_SIZE:压缩页的页大小。对于未压缩的页该列值为空

  • PAGE_STATE:页状态。有效值为:NULL(表示该页是干净的压缩页或者是flush列表中的压缩页或者是用作缓冲池watch sentinels的页)、NOT_USED(表示该页在空闲列表中)、READY_FOR_USE(表示该页为未分配的空闲页)、FILE_PAGE(表示该页为缓冲文件页)、MEMORY (表该页包含一个主内存对象)、REMOVE_HASH(表示该页在被放入空闲列表之前需要删除散列索引)

  • IO_FIX:表示该页是否有I/O操作被挂起:IO_NONE表示没有的I/O操作被挂起、IO_READ 表示该页有读操作被挂起、IO_WRITE 表示该页有写入操作被挂起

  • IS_OLD:表示块是否位于LRU列表中旧块的子列表中

  • FREE_PAGE_CLOCK:表示freed_page_clock计数器的值。 freed_page_clock计数器用于跟踪从LRU列表的末尾移除的块的数量

PS:该表中记录的信息与show engine innodb status语句和show status like '%buffer_pool%';语句的输出信息中一些页的统计信息类似,他们是基于相同数据集输出的,如下

# show engine语句
root@localhost : (none) 11:15:59> show engine innodb 
status\G;
............
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 1099431936
Dictionary memory allocated 106991
Buffer pool size  65528
Free buffers      65165
Database pages    363
Old database pages 0
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 328, created 35, written 39
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: 363, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
............

# show status语句
root@localhost : (none) 11:18:06> show status like '%buffer_pool%';
+---------------------------------------+--------------------------------------------------+
| Variable_name                        | Value                                            |
+---------------------------------------+--------------------------------------------------+
| Innodb_buffer_pool_dump_status        | Dumping of buffer pool not started              |
| Innodb_buffer_pool_load_status        | Buffer pool(s) load completed at 180204 14:41:11 |
| Innodb_buffer_pool_resize_status      |                                                  |
| Innodb_buffer_pool_pages_data        | 363                                              |
| Innodb_buffer_pool_bytes_data        | 5947392                                          |
| Innodb_buffer_pool_pages_dirty        | 0                                                |
| Innodb_buffer_pool_bytes_dirty        | 0                                                |
| Innodb_buffer_pool_pages_flushed      | 39                                              |
| Innodb_buffer_pool_pages_free        | 65165                                            |
| Innodb_buffer_pool_pages_misc        | 0                                                |
| Innodb_buffer_pool_pages_total        | 65528                                            |
| 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      | 1718                                            |
| Innodb_buffer_pool_reads              | 329                                              |
| Innodb_buffer_pool_wait_free          | 0                                                |
| Innodb_buffer_pool_write_requests    | 515                                              |
+---------------------------------------+--------------------------------------------------+
18 rows in set (0.01 sec)

| INNODB_BUFFER_PAGE_LRU

该表提供查询缓冲池中的页面信息,与INNODB_BUFFER_PAGE表不同,INNODB_BUFFER_PAGE_LRU表保存有关innodb buffer pool中的页如何进入LRU链表以及在buffer pool不够用时确定需要从缓冲池中逐出哪些页

  • 与INNODB_BUFFER_PAGE表一样,不要在生产系统上查询,查询该表可能需要MySQL分配一大块连续的内存,且分配用于查询该表的内存时可能会导致内存不足错误,特别是buffer pool分配大小超过数GB的数据库实例中。另外,查询此表时MySQL需要遍历LRU链表,遍历时会锁定缓冲池的数据结构,这会降低数据库实例的并发性能,特别是buffer pool分配大小超过数GB的数据库实例中

  • 该表为Memory引擎临时表

下面是该表中存储的信息内容

admin@localhost : information_schema 06:35:36> select * from INNODB_BUFFER_PAGE_LRU where TABLE_NAME='`sbtest`.`sbtest1`' limit 1\G;
*************************** 1. row ***************************
        POOL_ID: 0
  LRU_POSITION: 192
          SPACE: 32
    PAGE_NUMBER: 108304
      PAGE_TYPE: INDEX
    FLUSH_TYPE: 0
      FIX_COUNT: 0
      IS_HASHED: NO
NEWEST_MODIFICATION: 0
OLDEST_MODIFICATION: 0
    ACCESS_TIME: 0
    TABLE_NAME: `sbtest`.`sbtest1`
    INDEX_NAME: i_c
NUMBER_RECORDS: 124
      DATA_SIZE: 16120
COMPRESSED_SIZE: 0
    COMPRESSED: NO
        IO_FIX: IO_NONE
        IS_OLD: NO
FREE_PAGE_CLOCK: 0
1 row in set (0.00 sec)

字段含义如下:

  • INNODB_BUFFER_PAGE_LRU表与INNODB_BUFFER_PAGE表具有相同的列,这里不再赘述,但要注意:INNODB_BUFFER_PAGE_LRU表多了一个LRU_POSITION列,少了一个BLOCK_ID列。LRU_POSITION列表示页在LRU链表中的位置

| INNODB_TEMP_TABLE_INFO

该表提供查询有关在InnoDB实例中当前处于活动状态的用户(已建立连接的用户,断开的用户连接对应的临时表会被自动删除)创建的InnoDB临时表的信息。 它不提供查询优化器使用的内部InnoDB临时表的信息查询。INNODB_TEMP_TABLE_INFO表在首次查询时创建,且数据仅存在于内存中。 不会持久化到磁盘

  • 该表为memory引擎临时表,查询该表的用户需要有process权限

下面是该表中存储的信息内容

admin@localhost : information_schema 06:37:36> select * from INNODB_TEMP_TABLE_INFO;
+----------+-------------+--------+-------+----------------------+---------------+
| TABLE_ID | NAME        | N_COLS | SPACE | PER_TABLE_TABLESPACE | IS_COMPRESSED |
+----------+-------------+--------+-------+----------------------+---------------+
|      130 | #sqldd5_b_0 |      4 |  165 | FALSE                | FALSE        |
+----------+-------------+--------+-------+----------------------+---------------+
1 row in set (0.00 sec)

字段含义如下:

  • TABLE_ID:活跃临时表ID

  • NAME:活跃临时表的表名称

  • N_COLS:临时表中的列数量。该数字中总是包含由InnoDB创建的三个隐藏列(DB_ROW_ID,DB_TRX_ID和DB_ROLL_PTR)

  • SPACE:临时表所在表空间的表空间ID(数值)。在5.7中,未压缩的InnoDB临时表都保存在共享临时表空间文件中。共享临时表空间的数据文件定义由innodb_temp_data_file_path系统参数配置。默认情况下,位于数据目录中的名为ibtmp1文件,压缩的临时表保存在由tmpdir系统参数定义的路径下,每个表独立一个临时表空间文件。临时表空间的SPACE ID始终为非零值,且在服务器重新启动时动态随机生成一个值

  • PER_TABLE_SPACE:是否是独立临时表空间,TRUE表示临时表保存在独立表空间文件中。FALSE表示临时表保存在共享临时表空间文件中

  • IS_COMPRESSED:值为TRUE表示临时表启用了压缩

| INNODB_BUFFER_POOL_STATS

该表提供查询一些Innodb buffer pool中的状态信息,该表中记录的信息与SHOW ENGINE INNODB STATUS输出的信息类似相同,另外,innodb buffer pool的一些状态变量也提供了部分相同的值

  • 将缓冲池中的页设置为“young”或“not young”的概念指的是将缓冲池中的页在缓冲池数据结构中首尾相连构成一个链表(LRU list),划分一个中点(按照innodb_old_blocks_pct系统变量值划分,默认值为37%),把链表分为两个子链表(前半部分叫young sublist,也就是热点数据页、后半部分叫old sublist,也就是刚刚读入buffer pool中的数据页),把数据页在这两个子链表之间进行传送。 在old sublist链表中的页在innodb_old_blocks_time定义的时间内连续两次被访问,则会被移动到LRU list首部,即,young sublist链表中成为热点数据页。而处于young sublist链表中的“young”页达到一定时间就会从缓冲池中老化,成为old sublist链表中的“not young”页,“not young”页更接近驱逐点(当缓冲池中没有足够的空闲页时,这些接近驱逐点位置的页就会被驱逐)

  • 查看该表需要有process权限,该表为Memory引擎临时表

下面是该表中存储的信息内容

admin@localhost : information_schema 06:50:38> select * from INNODB_BUFFER_POOL_STATS limit 1\G;
*************************** 1. row ***************************
                    POOL_ID: 0
                  POOL_SIZE: 32764
                FREE_BUFFERS: 32074
              DATABASE_PAGES: 690
          OLD_DATABASE_PAGES: 235
    MODIFIED_DATABASE_PAGES: 0
          PENDING_DECOMPRESS: 0
              PENDING_READS: 0
          PENDING_FLUSH_LRU: 0
          PENDING_FLUSH_LIST: 0
            PAGES_MADE_YOUNG: 0
        PAGES_NOT_MADE_YOUNG: 0
      PAGES_MADE_YOUNG_RATE: 0
  PAGES_MADE_NOT_YOUNG_RATE: 0
          NUMBER_PAGES_READ: 294
        NUMBER_PAGES_CREATED: 396
        NUMBER_PAGES_WRITTEN: 1785
            PAGES_READ_RATE: 0
          PAGES_CREATE_RATE: 0
          PAGES_WRITTEN_RATE: 0
            NUMBER_PAGES_GET: 10822
                    HIT_RATE: 0
YOUNG_MAKE_PER_THOUSAND_GETS: 0
NOT_YOUNG_MAKE_PER_THOUSAND_GETS: 0
    NUMBER_PAGES_READ_AHEAD: 0
  NUMBER_READ_AHEAD_EVICTED: 0
            READ_AHEAD_RATE: 0
    READ_AHEAD_EVICTED_RATE: 0
                LRU_IO_TOTAL: 0
              LRU_IO_CURRENT: 0
            UNCOMPRESS_TOTAL: 0
          UNCOMPRESS_CURRENT: 0
1 row in set (0.00 sec)

字段含义如下:

  • POOL_ID:缓冲池ID。用于多个buffer pool instance时区分多个缓冲池实例的唯一标识符

  • POOL_SIZE:每个buffer pool instance中的页数量

  • FREE_BUFFERS:每个buffer pool instance中的空闲页数

  • DATABASE_PAGES:每个每个buffer pool instance中包含的数据页数。这个数量包括脏页和即将被清理的页

  • OLD_DATABASE_PAGES:每个buffer pool instance中old sublist链表中的页数

  • MODIFIED_DATABASE_PAGES:每个buffer pool instance中被修改(脏)的数据页的数量

  • PENDING_DECOMPRESS:每个buffer pool instance中的解压缩的页数

  • PENDING_READS:每个buffer pool instance中被挂起读取的页数量

  • PENDING_FLUSH_LRU:每个buffer pool instance中在LRU链表中被挂起刷新的页数

  • PENDING_FLUSH_LIST:每个buffer pool instance中在刷新列表中被挂起刷新的页数

  • PAGES_MADE_YOUNG:每个buffer pool instance中被移动到young sublist链表中的页数

  • PAGES_NOT_MADE_YOUNG:每个buffer pool instance中未被移动到young sublist链表中的页数

  • PAGES_MADE_YOUNG_RATE:每个buffer pool instance中每秒被移动到young sublist链表中的页数(自上次打印输出/时间以来被移动到young sublist的页数)

  • PAGES_MADE_NOT_YOUNG_RATE:每个buffer pool instance中每秒未被移动到young sublist链表中的页数(自上次打印输出/时间以来,未被移动到young sublist的页面)

  • NUMBER_PAGES_READ:每个buffer pool instance中被读取的页数

  • NUMBER_PAGES_CREATED:每个buffer pool instance中被创建的页数

  • NUMBER_PAGES_WRITTEN:每个buffer pool instance中被写入的页数

  • PAGES_READ_RATE:每个buffer pool instance中每秒被读取的页数(自上次打印输出/经过的时间以来读取的页数)

  • PAGES_CREATE_RATE:每个buffer pool instance中每秒被创建的页数(自上次打印输出/经过的时间以来被创建的页数)

  • PAGES_WRITTEN_RATE:每个buffer pool instance中每秒被写入的页数(从上次打印输出/时间以来被写入的页数)

  • NUMBER_PAGES_GET:每个buffer pool instance中逻辑读取请求的页数量

  • HIT_RATE:每个buffer pool instance中的缓冲池命中率

  • YOUNG_MAKE_PER_THOUSAND_GETS:每个buffer pool instance中The number of pages made young per thousand gets

  • NOT_YOUNG_MAKE_PER_THOUSAND_GETS:每个buffer pool instance中The number of pages not made young per thousand gets

  • NUMBER_PAGES_READ_AHEAD:每个buffer pool instance中的预读的页数

  • NUMBER_READ_AHEAD_EVICTED:每个buffer pool instance中后台线程预读入到InnoDB缓冲池的页数,且这些页是还没来得及访问就被驱逐的页

  • READ_AHEAD_RATE:每个buffer pool instance中每秒预读的页数(自上次打印输出/经过的时间以来的页数)

  • READ_AHEAD_EVICTED_RATE:每个buffer pool instance中每秒预读的且还没来得及被访问就被驱逐的页数

  • LRU_IO_TOTAL:每个buffer pool instance中的LRU IO总数

  • LRU_IO_CURRENT:每个buffer pool instance中当前的LRU IO数量

  • UNCOMPRESS_TOTAL:每个buffer pool instance中解压缩的总页数

  • UNCOMPRESS_CURRENT:每个buffer pool instance中当前解压缩的页数

| INNODB_METRICS

该表提供查询InnoDB更为详细细致的性能信息,是对InnoDB的PERFORMANCE_SCHEMA的补充。通过对该表的查询,可用于检查innodb的整体健康状况。也可用于诊断性能瓶颈、资源短缺和应用程序的问题等。

  • 该表中的每一行记录代表innodb源代码中的一个instruments点,对应源代码中的一个计数器。每个计数器都可以单独启动、停止和重置值。也可以使用通用模块名称为一组计数器执行起停与重置值操作(同属于一个模块下的一组instrument,使用模块名称即可快速起停、重置一组instruments)

  • 默认情况下,只开启了极少数的计数器。 如果要启动、停止和重置计数器,可以使用计数器的名称、或者模块的名称、或者通配符匹配名称来设置innodb_monitor_enable、innodb_monitor_disable、innodb_monitor_reset、innodb_monitor_reset_all系统变量来起停、重置计数器。如果设置这4个变量来操作这些计数器

  • 该表为memory引擎临时表,查询该表的用户需要有process权限

下面是该表中存储的信息内容

admin@localhost : information_schema 06:48:59> select * from INNODB_METRICS where COUNT_RESET > 0 limit 1\G;
*************************** 1. row ***************************
      NAME: lock_timeouts
  SUBSYSTEM: lock
      COUNT: 2
  MAX_COUNT: 2
  MIN_COUNT: NULL
  AVG_COUNT: 0.00005471806516921562
COUNT_RESET: 2
MAX_COUNT_RESET: 2
MIN_COUNT_RESET: NULL
AVG_COUNT_RESET: NULL
  TIME_ENABLED: 2017-09-25 08:40:07
  TIME_DISABLED: NULL
  TIME_ELAPSED: 36551
TIME_RESET: NULL
    STATUS: enabled
      TYPE: counter
    COMMENT: Number of lock timeouts
1 row in set (0.00 sec)

字段含义如下:

  • NAME:计数器的唯一名称

  • SUBSYSTEM:计数器对应的模块名称,使用SET GLOBAL语法+innodb_monitor_enable、innodb_monitor_disable、innodb_monitor_reset、innodb_monitor_reset_all几个系统变量与一起使用来起停、重置计数器时,需要在模块名前面加“module ”字样,例如:子系统为dml,则开启该模块下的所有计数器的SQL语句为 SET GLOBAL innodb_monitor_enable = module_dml;

  • COUNT:自计数器启用后的统计值

  • MAX_COUNT:自计数器启用以来的最大统计值

  • MIN_COUNT:自计数器启用后的最小统计值

  • AVG_COUNT:自计数器启用以来的平均统计值

  • COUNT_RESET:自上次重置计数器值以来的计数器值

  • MAX_COUNT_RESET:自上次重置计数器以来的最大计数器值

  • MIN_COUNT_RESET:自上次重置计数器以来的最小计数器值

  • AVG_COUNT_RESET:自上次重置计数器以来的平均计数器值

  • TIME_ENABLED:最近一次启动计数器的时间

  • TIME_DISABLED:最近一次关闭计数器的时间

  • TIME_ELAPSED:自计数器启动以来的经过时间,以秒为单位

  • TIME_RESET:最近一次重置计数器的时间

  • STATUS:计数器的当前状态,有效值为:enabled和disabled

  • TYPE:计数器是累计值类型,还是测量某个资源的当前值类型

  • COMMENT:计数器注释

本期内容就介绍到这里,本期内容参考链接如下:

https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-table.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-trx-table.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-lock-waits-table.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-page-lru-table.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-temp-table-info-table.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-page-table.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool-stats-table.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-metrics-table.html

| 作者简介

罗小波·沃趣科技高级数据库技术专家

IT从业多年,主要负责MySQL 产品的数据库支撑与售后二线支撑。曾参与版本发布系统、轻量级监控系统、运维管理平台、数据库管理平台的设计与编写,熟悉MySQL体系结构,Innodb存储引擎,喜好专研开源技术,多次在公开场合做过线下线上数据库专题分享,发表过多篇数据库相关的研究文章。

发表评论

电子邮件地址不会被公开。 必填项已用*标注