mysql
模式是系统模式。它包含存储 MySQL 服务器运行所需信息的表。mysql
模式大致包含存储数据库对象元数据的数据库字典表,以及用于其他操作目的的系统表。以下讨论进一步将系统表集细分为更小的类别。
本节的其余部分列出了每个类别中的表,并提供了交叉引用以获取更多信息。除非另有说明,否则数据字典表和系统表使用 InnoDB
存储引擎。
mysql
系统表和数据字典表位于 MySQL 数据目录中名为 mysql.ibd
的单个 InnoDB
表空间文件中。以前,这些表是在 mysql
数据库目录中的单个表空间文件中创建的。
可以为 mysql
系统模式表空间启用静态数据加密。有关更多信息,请参阅 第 17.13 节 “InnoDB 静态数据加密”。
这些表构成了数据字典,其中包含有关数据库对象的元数据。有关更多信息,请参阅 第 16 章 “MySQL 数据字典”。
catalogs
:目录信息。character_sets
:有关可用字符集的信息。check_constraints
:有关在表上定义的CHECK
约束的信息。请参阅 第 15.1.20.6 节 “CHECK 约束”。collations
:有关每个字符集的排序规则的信息。column_statistics
:列值的直方图统计信息。请参阅 第 10.9.6 节 “优化器统计信息”。column_type_elements
:有关列使用的类型的信息。columns
:有关表中列的信息。dd_properties
:一个标识数据字典属性的表,例如其版本。服务器使用它来确定是否必须将数据字典升级到较新版本。events
:有关事件计划程序事件的信息。请参阅 第 27.4 节 “使用事件计划程序”。如果使用--skip-grant-tables
选项启动服务器,则事件计划程序将被禁用,并且表中注册的事件将不会运行。请参阅 第 27.4.2 节 “事件计划程序配置”。foreign_keys
、foreign_key_column_usage
:有关外键的信息。index_column_usage
:有关索引使用的列的信息。index_partitions
:有关索引使用的分区的信息。index_stats
:用于存储执行ANALYZE TABLE
时生成的动态索引统计信息。indexes
:有关表索引的信息。innodb_ddl_log
:存储用于崩溃安全 DDL 操作的 DDL 日志。parameter_type_elements
:有关存储过程和函数参数的信息,以及有关存储函数返回值的信息。parameters
:有关存储过程和函数的信息。请参阅 第 27.2 节 “使用存储例程”。resource_groups
:有关资源组的信息。请参阅 第 7.1.16 节 “资源组”。routines
:有关存储过程和函数的信息。请参阅 第 27.2 节 “使用存储例程”。schemata
:有关模式的信息。在 MySQL 中,模式是一个数据库,因此此表提供有关数据库的信息。st_spatial_reference_systems
:有关空间数据的可用空间参考系的信息。table_partition_values
:有关表分区使用的值的信息。table_partitions
:有关表使用的分区的信息。table_stats
:有关执行ANALYZE TABLE
时生成的动态表统计信息的信息。tables
:有关数据库中表的信息。tablespace_files
:有关表空间使用的文件的信息。tablespaces
:有关活动表空间的信息。triggers
:有关触发器的信息。view_routine_usage
:有关视图与其使用的存储函数之间的依赖关系的信息。view_table_usage
:用于跟踪视图与其底层表之间的依赖关系。
数据字典表是不可见的。它们无法使用 SELECT
读取,不会出现在 SHOW TABLES
的输出中,也不会列在 INFORMATION_SCHEMA.TABLES
表中,等等。但是,在大多数情况下,都有相应的 INFORMATION_SCHEMA
表可以查询。从概念上讲,INFORMATION_SCHEMA
提供了一个视图,MySQL 通过该视图公开数据字典元数据。例如,您不能直接从 mysql.schemata
表中选择数据
mysql> SELECT * FROM mysql.schemata;
ERROR 3554 (HY000): Access to data dictionary table 'mysql.schemata' is rejected.
而是从相应的 INFORMATION_SCHEMA
表中选择该信息
mysql> SELECT * FROM INFORMATION_SCHEMA.SCHEMATA\G
*************************** 1. row ***************************
CATALOG_NAME: def
SCHEMA_NAME: mysql
DEFAULT_CHARACTER_SET_NAME: utf8mb4
DEFAULT_COLLATION_NAME: utf8mb4_0900_ai_ci
SQL_PATH: NULL
DEFAULT_ENCRYPTION: NO
*************************** 2. row ***************************
CATALOG_NAME: def
SCHEMA_NAME: information_schema
DEFAULT_CHARACTER_SET_NAME: utf8mb3
DEFAULT_COLLATION_NAME: utf8mb3_general_ci
SQL_PATH: NULL
DEFAULT_ENCRYPTION: NO
*************************** 3. row ***************************
CATALOG_NAME: def
SCHEMA_NAME: performance_schema
DEFAULT_CHARACTER_SET_NAME: utf8mb4
DEFAULT_COLLATION_NAME: utf8mb4_0900_ai_ci
SQL_PATH: NULL
DEFAULT_ENCRYPTION: NO
...
没有与 mysql.indexes
完全对应的 Information Schema 表,但 INFORMATION_SCHEMA.STATISTICS
包含许多相同的信息。
到目前为止,还没有与 mysql.foreign_keys
、mysql.foreign_key_column_usage
完全对应的 INFORMATION_SCHEMA
表。获取外键信息的标准 SQL 方法是使用 INFORMATION_SCHEMA
REFERENTIAL_CONSTRAINTS
和 KEY_COLUMN_USAGE
表;这些表现在实现为 foreign_keys
、foreign_key_column_usage
和其他数据字典表上的视图。
这些系统表包含有关用户帐户及其拥有的权限的授权信息。有关这些表的结构、内容和用途的更多信息,请参阅 第 8.2.3 节“授权表”。
MySQL 8.4 授权表是 InnoDB
(事务性)表。帐户管理语句是事务性的,要么对所有指定的用户名都成功,要么在发生任何错误时回滚并且不起作用。
user
:用户帐户、全局权限和其他非权限列。global_grants
:将动态全局权限分配给用户;请参阅 静态权限与动态权限。db
:数据库级权限。tables_priv
:表级权限。columns_priv
:列级权限。procs_priv
:存储过程和函数权限。proxies_priv
:代理用户权限。default_roles
:此表列出了在用户连接并进行身份验证或执行SET ROLE DEFAULT
后要激活的默认角色。role_edges
:此表列出了角色子图的边。给定的
user
表行可能引用用户帐户或角色。服务器可以通过查阅role_edges
表以获取有关身份验证 ID 之间关系的信息,从而区分一行表示用户帐户、角色还是两者兼而有之。password_history
:有关密码更改的信息。
这些系统表包含有关组件、可加载函数和服务器端插件的信息
component
:使用INSTALL COMPONENT
安装的服务器组件的注册表。此表中列出的任何组件都由加载程序服务在服务器启动序列期间安装。请参阅 第 7.5.1 节“安装和卸载组件”。func
:使用CREATE FUNCTION
安装的可加载函数的注册表。在正常启动序列期间,服务器会加载此表中注册的函数。如果使用--skip-grant-tables
选项启动服务器,则不会加载表中注册的函数,并且这些函数将不可用。请参阅 第 7.7.1 节“安装和卸载可加载函数”。注意与
mysql.func
系统表类似,Performance Schemauser_defined_functions
表列出了使用CREATE FUNCTION
安装的可加载函数。与mysql.func
表不同,user_defined_functions
表还列出了由服务器组件或插件自动安装的函数。这种差异使得user_defined_functions
比mysql.func
更适合用于检查安装了哪些函数。请参阅 第 29.12.22.10 节“user_defined_functions 表”。plugin
:使用INSTALL PLUGIN
安装的服务器端插件的注册表。在正常启动序列期间,服务器会加载此表中注册的插件。如果使用--skip-grant-tables
选项启动服务器,则不会加载表中注册的插件,并且这些插件将不可用。请参阅 第 7.6.1 节“安装和卸载插件”。
服务器使用这些系统表来支持复制
gtid_executed
:用于存储 GTID 值的表。请参阅 mysql.gtid_executed 表。ndb_binlog_index
:用于 NDB Cluster 复制的二进制日志信息。仅当使用NDBCLUSTER
支持构建服务器时,才会创建此表。请参阅 第 25.7.4 节“NDB Cluster 复制架构和表”。slave_master_info
、slave_relay_log_info
、slave_worker_info
:用于在副本服务器上存储复制信息。请参阅 第 19.2.4 节“中继日志和复制元数据存储库”。
上面列出的所有表都使用 InnoDB
存储引擎。
这些系统表供优化器使用
innodb_index_stats
、innodb_table_stats
:用于InnoDB
持久优化器统计信息。请参阅 第 17.8.10.1 节“配置持久优化器统计信息参数”。server_cost
、engine_cost
:优化器成本模型使用包含有关查询执行期间发生的的操作的成本估算信息的表。server_cost
包含常规服务器操作的优化器成本估算。engine_cost
包含特定于特定存储引擎的操作的估算。请参阅 第 10.9.5 节“优化器成本模型”。
其他系统表不属于上述类别
audit_log_filter
、audit_log_user
:如果安装了 MySQL Enterprise Audit,则这些表会提供审计日志筛选器定义和用户帐户的持久存储。请参阅 审计日志表。firewall_group_allowlist
、firewall_groups
、firewall_memebership
、firewall_users
、firewall_whitelist
:如果安装了 MySQL 企业防火墙,这些表将为防火墙使用的信息提供持久存储。请参阅“第 8.4.7 节 “MySQL 企业防火墙””。servers
:由FEDERATED
存储引擎使用。请参阅“第 18.8.2.2 节 “使用 CREATE SERVER 创建 FEDERATED 表””。innodb_dynamic_metadata
:由InnoDB
存储引擎用于存储快速变化的表元数据,例如自动递增计数器值和索引树损坏标志。替换驻留在InnoDB
系统表空间中的数据字典缓冲区表。