MySQL从5.0开始,提供了一个新的数据库,information_schema,用来记录MySQL中的元数据信息。
什么是元数据呢?元数据(Metadata),又称中介数据、中继数据,是描述数据的数据(data about data)。对于数据库来说,就是表名、列明、列类型、索引等各种结构定义。
这个库比较特殊,它是一个虚拟数据库,物理上并不存在,库里供我们查阅信息的各种表也并不是实际存在的物理表,而是视图。
在MySQL 5.7中,information_schema库里包含了61张视图,我们调比较常用的一起来看看。
root@database-one 00:12: [(none)]> use information_schema
Database changed
root@database-one 00:12: [information_schema]> select version();
+------------+
| version() |
+------------+
| 5.7.16-log |
+------------+
1 row in set (0.01 sec)
root@database-one 00:12: [information_schema]> show tables;
+---------------------------------------+
| Tables_in_information_schema |
+---------------------------------------+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES |
| ENGINES |
| EVENTS |
| FILES |
| GLOBAL_STATUS |
| GLOBAL_VARIABLES |
| KEY_COLUMN_USAGE |
| OPTIMIZER_TRACE |
| PARAMETERS |
| PARTITIONS |
| PLUGINS |
| PROCESSLIST |
| PROFILING |
| REFERENTIAL_CONSTRAINTS |
| ROUTINES |
| SCHEMATA |
| SCHEMA_PRIVILEGES |
| SESSION_STATUS |
| SESSION_VARIABLES |
| STATISTICS |
| TABLES |
| TABLESPACES |
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TRIGGERS |
| USER_PRIVILEGES |
| VIEWS |
| INNODB_LOCKS |
| INNODB_TRX |
| INNODB_SYS_DATAFILES |
| INNODB_FT_CONFIG |
| INNODB_SYS_VIRTUAL |
| INNODB_CMP |
| INNODB_FT_BEING_DELETED |
| INNODB_CMP_RESET |
| INNODB_CMP_PER_INDEX |
| INNODB_CMPMEM_RESET |
| INNODB_FT_DELETED |
| INNODB_BUFFER_PAGE_LRU |
| INNODB_LOCK_WAITS |
| INNODB_TEMP_TABLE_INFO |
| INNODB_SYS_INDEXES |
| INNODB_SYS_TABLES |
| INNODB_SYS_FIELDS |
| INNODB_CMP_PER_INDEX_RESET |
| INNODB_BUFFER_PAGE |
| INNODB_FT_DEFAULT_STOPWORD |
| INNODB_FT_INDEX_TABLE |
| INNODB_FT_INDEX_CACHE |
| INNODB_SYS_TABLESPACES |
| INNODB_METRICS |
| INNODB_SYS_FOREIGN_COLS |
| INNODB_CMPMEM |
| INNODB_BUFFER_POOL_STATS |
| INNODB_SYS_COLUMNS |
| INNODB_SYS_FOREIGN |
| INNODB_SYS_TABLESTATS |
+---------------------------------------+
61 rows in set (0.03 sec)
复制
SCHEMATA,提供当前MySQL实例中所有数据库的信息,show databases的结果就是从这里取的。
root@database-one 00:14: [information_schema]> select * from SCHEMATA;
+--------------+----------------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+----------------------+----------------------------+------------------------+----------+
| def | information_schema | utf8 | utf8_general_ci | NULL |
| def | atuotest_case | utf8 | utf8_general_ci | NULL |
| def | export_test | utf8 | utf8_bin | NULL |
| def | gftest | utf8 | utf8_general_ci | NULL |
| def | installmentdb | latin1 | latin1_swedish_ci | NULL |
......
复制
TABLES,提供数据库中表的信息,包含表名、类型、引擎、创建时间等各种信息,show tables from schemaname的结果就是从这里取的。
root@database-one 00:18: [information_schema]> select * from tables;
+---------------+----------------------+------------------------------------------------------+-------------+--------------------+---------+------------+------------+----------------+-------------+--------------------+--------------+-------------+----------------+---------------------+---------------------+---------------------+--------------------+------------+-------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT |
+---------------+----------------------+------------------------------------------------------+-------------+--------------------+---------+------------+------------+----------------+-------------+--------------------+--------------+-------------+----------------+---------------------+---------------------+---------------------+--------------------+------------+-------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
| def | information_schema | CHARACTER_SETS | SYSTEM VIEW | MEMORY | 10 | Fixed | NULL | 384 | 0 | 98608896 | 0 | 0 | NULL | 2020-02-16 00:22:47 | NULL | NULL | utf8_general_ci | NULL | max_rows=262144 | |
| def | information_schema | COLLATIONS | SYSTEM VIEW | MEMORY | 10 | Fixed | NULL | 231 | 0 | 100229283 | 0 | 0 | NULL | 2020-02-16 00:22:47 | NULL | NULL | utf8_general_ci | NULL | max_rows=435771 | |
| def | information_schema | COLLATION_CHARACTER_SET_APPLICABILITY | SYSTEM VIEW | MEMORY | 10 | Fixed | NULL | 195 | 0 | 98146620 | 0 | 0 | NULL | 2020-02-16 00:22:47 | NULL | NULL | utf8_general_ci | NULL | max_rows=516222 | |
......
复制
TABLE_CONSTRAINTS,提供表的约束信息。
root@database-one 00:24: [information_schema]> select * from TABLE_CONSTRAINTS;
+--------------------+----------------------+--------------------------------+----------------------+------------------------------------------------+-----------------+
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | TABLE_SCHEMA | TABLE_NAME | CONSTRAINT_TYPE |
+--------------------+----------------------+--------------------------------+----------------------+------------------------------------------------+-----------------+
| def | gftest | PRIMARY | gftest | emp_copy | PRIMARY KEY |
| def | installmentdb | PRIMARY | installmentdb | t_install_order | PRIMARY KEY |
| def | installmentdb | uidx_inst_no | installmentdb | t_install_order | UNIQUE |
| def | installmentdb | uidx_req_seq | installmentdb | t_install_order | UNIQUE |
| def | installmentdb | PRIMARY | installmentdb | t_install_pay_order | PRIMARY KEY |
| def | installmentdb | uidx_inst_no | installmentdb | t_install_pay_order | UNIQUE |
| def | installmentdb | uidx_pay_no | installmentdb | t_install_pay_order | UNIQUE |
| def | installmentdb | PRIMARY | installmentdb | t_install_refund_order | PRIMARY KEY |
| def | installmentdb | uidx_refund_no | installmentdb | t_install_refund_order | UNIQUE |
| def | installmentdb | uidx_req_seq | installmentdb | t_install_refund_order | UNIQUE |
| def | jiradb | PRIMARY | jiradb | ao_21d670_whitelist_rules | PRIMARY KEY |
| def | jiradb | PRIMARY | jiradb | ao_21f425_message_ao | PRIMARY KEY |
......
复制
PARTITIONS,提供表的分区信息。
root@database-one 00:27: [information_schema]> select * from PARTITIONS;
+---------------+----------------------+------------------------------------------------------+----------------+-------------------+----------------------------+-------------------------------+------------------+---------------------+---------------------------+-------------------------+-----------------------+------------+----------------+-------------+--------------------+--------------+-----------+---------------------+---------------------+---------------------+------------+-------------------+-----------+-----------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | PARTITION_NAME | SUBPARTITION_NAME | PARTITION_ORDINAL_POSITION | SUBPARTITION_ORDINAL_POSITION | PARTITION_METHOD | SUBPARTITION_METHOD | PARTITION_EXPRESSION | SUBPARTITION_EXPRESSION | PARTITION_DESCRIPTION | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | CREATE_TIME | UPDATE_TIME | CHECK_TIME | CHECKSUM | PARTITION_COMMENT | NODEGROUP | TABLESPACE_NAME |
+---------------+----------------------+------------------------------------------------------+----------------+-------------------+----------------------------+-------------------------------+------------------+---------------------+---------------------------+-------------------------+-----------------------+------------+----------------+-------------+--------------------+--------------+-----------+---------------------+---------------------+---------------------+------------+-------------------+-----------+-----------------+
| def | information_schema | CHARACTER_SETS | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 0 | 384 | 0 | 98608896 | 0 | 0 | 2020-02-16 00:29:22 | NULL | NULL | NULL | | | NULL |
| def | information_schema | COLLATIONS | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 0 | 231 | 0 | 100229283 | 0 | 0 | 2020-02-16 00:29:22 | NULL | NULL | NULL | | | NULL |
......
复制
partition相关的字段为null时,代表这个表是非分区表。
COLUMNS,提供表中的列信息,show columns from schemaname.tablename的结果就是从这里取的。
root@database-one 00:35: [information_schema]> select * from COLUMNS where table_schema='gftest' and table_name='emp';
+---------------+--------------+------------+-------------+------------------+----------------+-------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+-----------------+---------------+------------+-------+---------------------------------+----------------+-----------------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | ORDINAL_POSITION | COLUMN_DEFAULT | IS_NULLABLE | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | NUMERIC_PRECISION | NUMERIC_SCALE | DATETIME_PRECISION | CHARACTER_SET_NAME | COLLATION_NAME | COLUMN_TYPE | COLUMN_KEY | EXTRA | PRIVILEGES | COLUMN_COMMENT | GENERATION_EXPRESSION |
+---------------+--------------+------------+-------------+------------------+----------------+-------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+-----------------+---------------+------------+-------+---------------------------------+----------------+-----------------------+
| def | gftest | emp | ename | 1 | NULL | YES | varchar | 10 | 30 | NULL | NULL | NULL | utf8 | utf8_general_ci | varchar(10) | | | select,insert,update,references | | |
| def | gftest | emp | age | 2 | NULL | YES | int | NULL | NULL | 10 | 0 | NULL | NULL | NULL | int(11) | | | select,insert,update,references | | |
| def | gftest | emp | sal | 3 | NULL | YES | decimal | NULL | NULL | 10 | 2 | NULL | NULL | NULL | decimal(10,2) | | | select,insert,update,references | | |
| def | gftest | emp | hiredate | 4 | NULL | YES | date | NULL | NULL | NULL | NULL | NULL | NULL | NULL | date | | | select,insert,update,references | | |
| def | gftest | emp | deptno | 5 | NULL | YES | int | NULL | NULL | 10 | 0 | NULL | NULL | NULL | int(2) | | | select,insert,update,references | | |
+---------------+--------------+------------+-------------+------------------+----------------+-------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+-----------------+---------------+------------+-------+---------------------------------+----------------+-----------------------+
5 rows in set (0.01 sec)
复制
VIEWS,提供视图信息。需要有show views权限,否则无法查看。
root@database-one 00:37: [information_schema]> select * from VIEWS where table_schema='test';
+---------------+--------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | VIEW_DEFINITION | CHECK_OPTION | IS_UPDATABLE | DEFINER | SECURITY_TYPE | CHARACTER_SET_CLIENT | COLLATION_CONNECTION |
+---------------+--------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+
| def | test | customerorders | select `c`.`id` AS `id`,`p`.`hiredate` AS `hiredate` from (`test`.`range_timestamp` `c` join `test`.`hash_datetime` `p` on((`p`.`id` = `c`.`id`))) group by `c`.`id` order by `p`.`hiredate` desc | NONE | NO | root@% | DEFINER | latin1 | latin1_swedish_ci |
| def | test | customerorders1 | select `c`.`id` AS `id` from (`test`.`range_timestamp` `c` join `test`.`hash_datetime` `p` on((`p`.`id` = `c`.`id`))) group by `c`.`id` order by `p`.`id` desc | NONE | NO | root@% | DEFINER | latin1 | latin1_swedish_ci |
| def | test | customerorders2 | select `c`.`id` AS `id`,`p`.`hiredate` AS `hiredate` from (`test`.`range_timestamp` `c` join `test`.`hash_datetime` `p` on((`p`.`id` = `c`.`id`))) where (`c`.`hiredate` >= '2015-12-11') group by `c`.`id` order by `p`.`hiredate` desc | NONE | NO | root@% | DEFINER | latin1 | latin1_swedish_ci |
+---------------+--------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+--------------+---------+---------------+----------------------+----------------------+
3 rows in set (0.22 sec)
复制
STATISTICS,提供索引的信息,show index from schemaname.tablename的结果就是从这里取的。
root@database-one 00:37: [information_schema]> select * from STATISTICS where table_schema='gftest';
+---------------+--------------+------------+------------+--------------+------------+--------------+-------------+-----------+-------------+----------+--------+----------+------------+---------+---------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | NON_UNIQUE | INDEX_SCHEMA | INDEX_NAME | SEQ_IN_INDEX | COLUMN_NAME | COLLATION | CARDINALITY | SUB_PART | PACKED | NULLABLE | INDEX_TYPE | COMMENT | INDEX_COMMENT |
+---------------+--------------+------------+------------+--------------+------------+--------------+-------------+-----------+-------------+----------+--------+----------+------------+---------+---------------+
| def | gftest | emp_copy | 0 | gftest | PRIMARY | 1 | eno | A | 40 | NULL | NULL | | BTREE | | |
+---------------+--------------+------------+------------+--------------+------------+--------------+-------------+-----------+-------------+----------+--------+----------+------------+---------+---------------+
1 row in set (0.08 sec)
复制
TRIGGERS,提供触发器信息,必须有super权限才能查看。
root@database-one 00:40: [information_schema]> select * from TRIGGERS;
+-----------------+----------------+----------------------------+--------------------+----------------------+---------------------+--------------------+--------------+------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------+---------------+----------------------------+----------------------------+--------------------------+--------------------------+------------------------+-----------------------+---------------------+----------------------+----------------------+--------------------+
| TRIGGER_CATALOG | TRIGGER_SCHEMA | TRIGGER_NAME | EVENT_MANIPULATION | EVENT_OBJECT_CATALOG | EVENT_OBJECT_SCHEMA | EVENT_OBJECT_TABLE | ACTION_ORDER | ACTION_CONDITION | ACTION_STATEMENT | ACTION_ORIENTATION | ACTION_TIMING | ACTION_REFERENCE_OLD_TABLE | ACTION_REFERENCE_NEW_TABLE | ACTION_REFERENCE_OLD_ROW | ACTION_REFERENCE_NEW_ROW | CREATED | SQL_MODE | DEFINER | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | DATABASE_COLLATION |
+-----------------+----------------+----------------------------+--------------------+----------------------+---------------------+--------------------+--------------+------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------+---------------+----------------------------+----------------------------+--------------------------+--------------------------+------------------------+-----------------------+---------------------+----------------------+----------------------+--------------------+
| def | sakila | customer_create_date | INSERT | def | sakila | customer | 1 | NULL | SET NEW.create_date = NOW() | ROW | BEFORE | NULL | NULL | OLD | NEW | 2019-05-31 18:15:34.97 | NO_AUTO_VALUE_ON_ZERO | myzone@% | utf8 | utf8_general_ci | latin1_swedish_ci |
......
复制
USER_PRIVILEGES,提供用户权限信息,信息是从 mysql.user表中加载的。
root@database-one 00:43: [information_schema]> select * from USER_PRIVILEGES;
+-------------------------+---------------+-------------------------+--------------+
| GRANTEE | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE |
+-------------------------+---------------+-------------------------+--------------+
| 'mysql.sys'@'localhost' | def | USAGE | NO |
| 'root'@'%' | def | SELECT | YES |
| 'root'@'%' | def | INSERT | YES |
| 'root'@'%' | def | UPDATE | YES |
......
复制
SCHEMA_PRIVILEGES,提供数据库权限信息,信息是从mysql.db中加载的。
root@database-one 00:45: [information_schema]> select * from SCHEMA_PRIVILEGES;
+-------------------------+---------------+--------------+-------------------------+--------------+
| GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | PRIVILEGE_TYPE | IS_GRANTABLE |
+-------------------------+---------------+--------------+-------------------------+--------------+
| 'mysql.sys'@'localhost' | def | sys | TRIGGER | NO |
| 'zeus'@'%' | def | mysql | SELECT | NO |
| 'zeus'@'%' | def | mysql | INSERT | NO |
| 'zeus'@'%' | def | mysql | UPDATE | NO |
......
复制
TABLE_PRIVILEGES,提供表权限信息,是从 mysql.tables_priv表中加载的。
root@database-one 00:48: [information_schema]> select * from TABLE_PRIVILEGES;
+-------------------------+---------------+--------------+------------+----------------+--------------+
| GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | PRIVILEGE_TYPE | IS_GRANTABLE |
+-------------------------+---------------+--------------+------------+----------------+--------------+
| 'mysql.sys'@'localhost' | def | sys | sys_config | SELECT | NO |
+-------------------------+---------------+--------------+------------+----------------+--------------+
1 row in set (0.01 sec)
复制
COLUMN_PRIVILEGES,提供列权限信息。信息是从mysql.columns_priv表中加载的。
root@database-one 00:48: [information_schema]> select * from COLUMN_PRIVILEGES;
Empty set (0.01 sec)
复制
通过上面几个跟权限相关的表,我们可以清晰地看到MySQL授权的层次,SCHEMA,TABLE,COLUMN级别,当然这些都是基于用户来授予的。总的来说MySQL的授权也是相当的精细的,可以具体到列。我的测试数据库中因为没有分配过列级别的权限,所以COLUMN_PRIVILEGES查询结果为空。