information_schema库下的innodb相关的表记录了元数据,状态信息,存储引擎相关的统计信息。

1.关于事务以及锁的表

  1. mysql> desc innodb_locks;
  2. +-------------+---------------------+------+-----+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +-------------+---------------------+------+-----+---------+-------+
  5. | lock_id | varchar(81) | NO | | | |
  6. | lock_trx_id | varchar(18) | NO | | | |
  7. | lock_mode | varchar(32) | NO | | | |
  8. | lock_type | varchar(32) | NO | | | |
  9. | lock_table | varchar(1024) | NO | | | |
  10. | lock_index | varchar(1024) | YES | | NULL | |
  11. | lock_space | bigint(21) unsigned | YES | | NULL | |
  12. | lock_page | bigint(21) unsigned | YES | | NULL | |
  13. | lock_rec | bigint(21) unsigned | YES | | NULL | |
  14. | lock_data | varchar(8192) | YES | | NULL | |
  15. +-------------+---------------------+------+-----+---------+-------+
mysql> desc innodb_trx;
+----------------------------+---------------------+------+-----+---------------------+-------+
| Field                      | Type                | Null | Key | Default             | Extra |
+----------------------------+---------------------+------+-----+---------------------+-------+
| trx_id                     | varchar(18)         | NO   |     |                     |       |
| trx_state                  | varchar(13)         | NO   |     |                     |       |
| trx_started                | datetime            | NO   |     | 0000-00-00 00:00:00 |       |
| trx_requested_lock_id      | varchar(81)         | YES  |     | NULL                |       |
| trx_wait_started           | datetime            | YES  |     | NULL                |       |
| trx_weight                 | bigint(21) unsigned | NO   |     | 0                   |       |
| trx_mysql_thread_id        | bigint(21) unsigned | NO   |     | 0                   |       |
| trx_query                  | varchar(1024)       | YES  |     | NULL                |       |
| trx_operation_state        | varchar(64)         | YES  |     | NULL                |       |
| trx_tables_in_use          | bigint(21) unsigned | NO   |     | 0                   |       |
| trx_tables_locked          | bigint(21) unsigned | NO   |     | 0                   |       |
| trx_lock_structs           | bigint(21) unsigned | NO   |     | 0                   |       |
| trx_lock_memory_bytes      | bigint(21) unsigned | NO   |     | 0                   |       |
| trx_rows_locked            | bigint(21) unsigned | NO   |     | 0                   |       |
| trx_rows_modified          | bigint(21) unsigned | NO   |     | 0                   |       |
| trx_concurrency_tickets    | bigint(21) unsigned | NO   |     | 0                   |       |
| trx_isolation_level        | varchar(16)         | NO   |     |                     |       |
| trx_unique_checks          | int(1)              | NO   |     | 0                   |       |
| trx_foreign_key_checks     | int(1)              | NO   |     | 0                   |       |
| trx_last_foreign_key_error | varchar(256)        | YES  |     | NULL                |       |
| trx_adaptive_hash_latched  | int(1)              | NO   |     | 0                   |       |
| trx_adaptive_hash_timeout  | bigint(21) unsigned | NO   |     | 0                   |       |
| trx_is_read_only           | int(1)              | NO   |     | 0                   |       |
| trx_autocommit_non_locking | int(1)              | NO   |     | 0                   |       |
+----------------------------+---------------------+------+-----+---------------------+-------+
24 rows in set (0.00 sec)
mysql> desc innodb_lock_waits;
+-------------------+-------------+------+-----+---------+-------+
| Field             | Type        | Null | Key | Default | Extra |
+-------------------+-------------+------+-----+---------+-------+
| requesting_trx_id | varchar(18) | NO   |     |         |       |
| requested_lock_id | varchar(81) | NO   |     |         |       |
| blocking_trx_id   | varchar(18) | NO   |     |         |       |
| blocking_lock_id  | varchar(81) | NO   |     |         |       |
+-------------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

要查询这些表,用户需要PROCESS权限

案例
创建一个测试表:

use bbd;
set global autocommit=0;
 CREATE TABLE `t2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4


insert into t2 values (0,'a'),(0,'b'),(0,'d');
commit;

mysql> select * from t2;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | d    |
+----+------+
3 rows in set (0.00 sec)

假设现在有三个会话:

Session A:
BEGIN;
SELECT id FROM t2 FOR UPDATE;
SELECT SLEEP(100);

Session B:
SELECT id FROM t2 FOR UPDATE;

Session C:
SELECT id FROM t2 FOR UPDATE;

查询sys.innodb_lock_waits

mysql> SELECT
    ->   waiting_trx_id,
    ->   waiting_pid,
    ->   waiting_query,
    ->   blocking_trx_id,
    ->   blocking_pid,
    ->   blocking_query
    -> FROM sys.innodb_lock_waits;
+----------------+-------------+------------------------------+-----------------+--------------+------------------------------+
| waiting_trx_id | waiting_pid | waiting_query                | blocking_trx_id | blocking_pid | blocking_query               |
+----------------+-------------+------------------------------+-----------------+--------------+------------------------------+
| 36110          |           8 | SELECT id FROM t2 FOR UPDATE | 36109           |            7 | SELECT SLEEP(100)            |
| 36111          |           6 | SELECT id FROM t2 FOR UPDATE | 36110           |            8 | SELECT id FROM t2 FOR UPDATE |
| 36111          |           6 | SELECT id FROM t2 FOR UPDATE | 36109           |            7 | SELECT SLEEP(100)            |
+----------------+-------------+------------------------------+-----------------+--------------+------------------------------+
3 rows in set, 3 warnings (0.00 sec)

由查询结果可知:
36110跟36111都在等待事务36109
36111同时在等待事务36110

2.关于系统相关的表

mysql> show tables from information_schema like 'INNODB_SYS%';
+--------------------------------------------+
| Tables_in_information_schema (INNODB_SYS%) |
+--------------------------------------------+
| INNODB_SYS_DATAFILES                       |
| INNODB_SYS_VIRTUAL                         |
| INNODB_SYS_INDEXES                         |
| INNODB_SYS_TABLES                          |
| INNODB_SYS_FIELDS                          |
| INNODB_SYS_TABLESPACES                     |
| INNODB_SYS_FOREIGN_COLS                    |
| INNODB_SYS_COLUMNS                         |
| INNODB_SYS_FOREIGN                         |
| INNODB_SYS_TABLESTATS                      |
+--------------------------------------------+
10 rows in set (0.00 sec)
mysql> select * from innodb_sys_tables;
+----------+---------------------------------+------+--------+-------+-------------+------------+---------------+------------+
| TABLE_ID | NAME                            | FLAG | N_COLS | SPACE | FILE_FORMAT | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE |
+----------+---------------------------------+------+--------+-------+-------------+------------+---------------+------------+
|       14 | SYS_DATAFILES                   |    0 |      5 |     0 | Antelope    | Redundant  |             0 | System     |
|       11 | SYS_FOREIGN                     |    0 |      7 |     0 | Antelope    | Redundant  |             0 | System     |
|       12 | SYS_FOREIGN_COLS                |    0 |      7 |     0 | Antelope    | Redundant  |             0 | System     |
|       13 | SYS_TABLESPACES                 |    0 |      6 |     0 | Antelope    | Redundant  |             0 | System     |
|       15 | SYS_VIRTUAL                     |    0 |      6 |     0 | Antelope    | Redundant  |             0 | System     |
|       43 | bbd/T4                          |   33 |      4 |    45 | Barracuda   | Dynamic    |             0 | Single     |
|       41 | bbd/t1                          |   33 |      4 |    25 | Barracuda   | Dynamic    |             0 | Single     |
|       42 | bbd/t2                          |   33 |      5 |    30 | Barracuda   | Dynamic    |             0 | Single     |
|       44 | bbd/t6                          |   33 |      5 |    91 | Barracuda   | Dynamic    |             0 | Single

table_id表明了创建表时的id,flag提供有关表格式和存储特性的位级信息,N_COLS表明了表有几个字段,有三个隐藏字段: (DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR)。space表明了表的表空间的id,0代表是系统表空间。

mysql> select * from INNODB_SYS_COLUMNS where TABLE_ID = 42 \G;
*************************** 1. row ***************************
TABLE_ID: 42
    NAME: id
     POS: 0
   MTYPE: 6
  PRTYPE: 1283
     LEN: 4
*************************** 2. row ***************************
TABLE_ID: 42
    NAME: name
     POS: 1
   MTYPE: 12
  PRTYPE: 2949135
     LEN: 80
2 rows in set (0.00 sec)

POS代表创建时的位置,从0开始依次递增。MTYPE代表数据类型,6 = INT, 2 = CHAR, 1 = VARCHAR,PRTYPE是一个二进制值,其位表示MySQL数据类型、字符集代码和可空性。LEN是字段长度。

mysql> select * from innodb_sys_indexes where table_id=42\G;
*************************** 1. row ***************************
       INDEX_ID: 43
           NAME: PRIMARY
       TABLE_ID: 42
           TYPE: 3
       N_FIELDS: 1
        PAGE_NO: 3
          SPACE: 30
MERGE_THRESHOLD: 50
1 row in set (0.00 sec)

TYPE表示索引的类型,1是聚簇索引,0是第二索引。N_FIELDS表示索引在表中的第几列。SPACE表示表空间的ID。

3.关于buffer pool的表

mysql> show tables from information_schema like 'INNODB_BUFFER_%';
+------------------------------------------------+
| Tables_in_information_schema (INNODB_BUFFER_%) |
+------------------------------------------------+
| INNODB_BUFFER_PAGE_LRU                         |
| INNODB_BUFFER_PAGE                             |
| INNODB_BUFFER_POOL_STATS                       |
+------------------------------------------------+
3 rows in set (0.00 sec)

innodb_buffer_page记录了内存中每个页的情况,lru这张表记录的信息与page差不多,只不过把BLOCK_ID字段换成了LRU_POSITION字段。status提供了buffer pool的状态信息,与SHOW ENGINE INNODB STATUS的信息一致。

查询innodb_buffer_page与innodb_buffer_page_lru这两张表将会特别消耗性能。

4.关于临时表的表

mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_TEMP%';
+---------------------------------------------+
| Tables_in_INFORMATION_SCHEMA (INNODB_TEMP%) |
+---------------------------------------------+
| INNODB_TEMP_TABLE_INFO                      |
+---------------------------------------------+

创建一个临时表

mysql> CREATE TEMPORARY TABLE t1 (c1 INT PRIMARY KEY) ENGINE=INNODB;
mysql> select * from innodb_temp_table_info;
+----------+--------------+--------+-------+----------------------+---------------+
| TABLE_ID | NAME         | N_COLS | SPACE | PER_TABLE_TABLESPACE | IS_COMPRESSED |
+----------+--------------+--------+-------+----------------------+---------------+
|       45 | #sql1977_b_0 |      4 |    95 | FALSE                | FALSE         |
+----------+--------------+--------+-------+----------------------+---------------+
1 row in set (0.01 sec)

NAME表示由系统生成的临时表的名称,通常是以#sql开头,N_COLS表示表中的字段数,会加上三个隐藏列,DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR。SPACE表示表空间的id。压缩的表空间会生成一个独立的表空间,非压缩的表空间就是ibtmp1。PER_TABLE_TABLESPACE跟IS_COMPRESSED表明了临时表是否压缩,TRUE表示压缩。重启之后临时表不再存在,重新创建的临时表的SPACE也跟之前不同,因为临时表空间重新生成了。

5.关于表空间原始数据的表

mysql> desc files;
+----------------------+---------------------+------+-----+---------+-------+
| Field                | Type                | Null | Key | Default | Extra |
+----------------------+---------------------+------+-----+---------+-------+
| FILE_ID              | bigint(4)           | NO   |     | 0       |       |
| FILE_NAME            | varchar(4000)       | YES  |     | NULL    |       |
| FILE_TYPE            | varchar(20)         | NO   |     |         |       |
| TABLESPACE_NAME      | varchar(64)         | YES  |     | NULL    |       |
| TABLE_CATALOG        | varchar(64)         | NO   |     |         |       |
| TABLE_SCHEMA         | varchar(64)         | YES  |     | NULL    |       |
| TABLE_NAME           | varchar(64)         | YES  |     | NULL    |       |
| LOGFILE_GROUP_NAME   | varchar(64)         | YES  |     | NULL    |       |
| LOGFILE_GROUP_NUMBER | bigint(4)           | YES  |     | NULL    |       |
| ENGINE               | varchar(64)         | NO   |     |         |       |
| FULLTEXT_KEYS        | varchar(64)         | YES  |     | NULL    |       |
| DELETED_ROWS         | bigint(4)           | YES  |     | NULL    |       |
| UPDATE_COUNT         | bigint(4)           | YES  |     | NULL    |       |
| FREE_EXTENTS         | bigint(4)           | YES  |     | NULL    |       |
| TOTAL_EXTENTS        | bigint(4)           | YES  |     | NULL    |       |
| EXTENT_SIZE          | bigint(4)           | NO   |     | 0       |       |
| INITIAL_SIZE         | bigint(21) unsigned | YES  |     | NULL    |       |
| MAXIMUM_SIZE         | bigint(21) unsigned | YES  |     | NULL    |       |
| AUTOEXTEND_SIZE      | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATION_TIME        | datetime            | YES  |     | NULL    |       |
| LAST_UPDATE_TIME     | datetime            | YES  |     | NULL    |       |
| LAST_ACCESS_TIME     | datetime            | YES  |     | NULL    |       |
| RECOVER_TIME         | bigint(4)           | YES  |     | NULL    |       |
| TRANSACTION_COUNTER  | bigint(4)           | YES  |     | NULL    |       |
| VERSION              | bigint(21) unsigned | YES  |     | NULL    |       |
| ROW_FORMAT           | varchar(10)         | YES  |     | NULL    |       |
| TABLE_ROWS           | bigint(21) unsigned | YES  |     | NULL    |       |
| AVG_ROW_LENGTH       | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_LENGTH          | bigint(21) unsigned | YES  |     | NULL    |       |
| MAX_DATA_LENGTH      | bigint(21) unsigned | YES  |     | NULL    |       |
| INDEX_LENGTH         | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_FREE            | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_TIME          | datetime            | YES  |     | NULL    |       |
| UPDATE_TIME          | datetime            | YES  |     | NULL    |       |
| CHECK_TIME           | datetime            | YES  |     | NULL    |       |
| CHECKSUM             | bigint(21) unsigned | YES  |     | NULL    |       |
| STATUS               | varchar(20)         | NO   |     |         |       |
| EXTRA                | varchar(255)        | YES  |     | NULL    |       |
+----------------------+---------------------+------+-----+---------+-------+
38 rows in set (0.00 sec)

files表包含了独占表空间,一般表空间,系统表空间,临时表空间,还有undo表空间(如果有)的信息。

mysql> select file_id,file_name,tablespace_name,table_name,total_extents from files order by 1;
+---------+---------------------------------------+--------------------------+------------+---------------+
| file_id | file_name                             | tablespace_name          | table_name | total_extents |
+---------+---------------------------------------+--------------------------+------------+---------------+
|       0 | ./ibdata1                             | innodb_system            | NULL       |            12 |
|       2 | ./mysql/plugin.ibd                    | innodb_file_per_table_2  | NULL       |             0 |
|       3 | ./mysql/servers.ibd                   | innodb_file_per_table_3  | NULL       |             0 |
|       4 | ./mysql/help_topic.ibd                | innodb_file_per_table_4  | NULL       |             0 |
|       5 | ./mysql/help_category.ibd             | innodb_file_per_table_5  | NULL       |             0 |
|       6 | ./mysql/help_relation.ibd             | innodb_file_per_table_6  | NULL       |             0 |
|       7 | ./mysql/help_keyword.ibd              | innodb_file_per_table_7  | NULL       |             0 |
|       8 | ./mysql/time_zone_name.ibd            | innodb_file_per_table_8  | NULL       |             0 |
|       9 | ./mysql/time_zone.ibd                 | innodb_file_per_table_9  | NULL       |             0 |
|      10 | ./mysql/time_zone_transition.ibd      | innodb_file_per_table_10 | NULL       |             0 |
|      11 | ./mysql/time_zone_transition_type.ibd | innodb_file_per_table_11 | NULL       |             0 |
|      12 | ./mysql/time_zone_leap_second.ibd     | innodb_file_per_table_12 | NULL       |             0 |
|      13 | ./mysql/innodb_table_stats.ibd        | innodb_file_per_table_13 | NULL       |             0 |
|      14 | ./mysql/innodb_index_stats.ibd        | innodb_file_per_table_14 | NULL       |             0 |
|      15 | ./mysql/slave_relay_log_info.ibd      | innodb_file_per_table_15 | NULL       |             0 |
|      16 | ./mysql/slave_master_info.ibd         | innodb_file_per_table_16 | NULL       |             0 |
|      17 | ./mysql/slave_worker_info.ibd         | innodb_file_per_table_17 | NULL       |             0 |
|      18 | ./mysql/gtid_executed.ibd             | innodb_file_per_table_18 | NULL       |             0 |
|      19 | ./mysql/server_cost.ibd               | innodb_file_per_table_19 | NULL       |             0 |
|      20 | ./mysql/engine_cost.ibd               | innodb_file_per_table_20 | NULL       |             0 |
|      21 | ./sys/sys_config.ibd                  | innodb_file_per_table_21 | NULL       |             0 |
|      25 | ./bbd/t1.ibd                          | innodb_file_per_table_25 | NULL       |             0 |
|      30 | ./bbd/t2.ibd                          | innodb_file_per_table_30 | NULL       |             0 |
|      45 | ./bbd/T4.ibd                          | innodb_file_per_table_45 | NULL       |             0 |
|      91 | ./bbd/t6.ibd                          | innodb_file_per_table_91 | NULL       |             0 |
|      96 | ./ibtmp1                              | innodb_temporary         | NULL       |            12 |
+---------+---------------------------------------+--------------------------+------------+---------------+
26 rows in set (0.01 sec)

fileid就是space id,系统表空间名是innodb_system,临时表空间名是innodb_temporary,独占表空间名是innodb_file_per_table加space id。