该 mysql
模式是系统模式。它包含 MySQL 服务器在运行时所需的信息的表格。广泛地说,mysql
模式包含数据字典表,用于存储数据库对象元数据,以及用于其他操作目的的系统表格。以下讨论将系统表格进一步细分为较小的类别。
本节的其余部分将枚举每个类别的表格,并提供交叉引用以获取更多信息。数据字典表格和系统表格使用 InnoDB
存储引擎,除非另有说明。
mysql
系统表格和数据字典表格驻留在 MySQL 数据目录中的单个 InnoDB
表空间文件 mysql.ibd
中。以前,这些表格是在 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操作的日志。 -
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
...
目前,还没有INFORMATION_SCHEMA
表与mysql.indexes
完全对应,但INFORMATION_SCHEMA.STATISTICS
包含了大部分相同的信息。
目前,还没有INFORMATION_SCHEMA
表与mysql.foreign_keys
、mysql.foreign_key_column_usage
完全对应。标准 SQL 方式获取外键信息是使用INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
和KEY_COLUMN_USAGE
表;这些表现在是foreign_keys
、foreign_key_column_usage
等数据字典表的视图。
这些系统表包含用户账户和它们持有的权限信息。有关这些表的结构、内容和目的的更多信息,请见第 8.2.3 节,“授权表”。
MySQL 8.3 授权表是 InnoDB
(事务)表。账户管理语句是事务性的,或者对所有命名用户成功,或者回滚并且不产生任何效果,如果出现任何错误。
-
user
: 用户账户,全局权限和其他非权限列。 -
global_grants
: 分配给用户的动态全局权限;见 静态与动态权限。 -
db
: 数据库级权限。 -
tables_priv
: 表级权限。 -
columns_priv
: 列级权限。 -
procs_priv
: 存储过程和函数权限。 -
proxies_priv
: 代理用户权限。 -
default_roles
: 这个表列出了在用户连接和身份验证后激活的默认角色,或者执行SET ROLE DEFAULT
。 -
role_edges
: 这个表列出了角色子图的边缘。给定的
user
表行可能引用用户账户或角色。服务器可以通过咨询role_edges
表来确定行是否表示用户账户、角色或两者。 -
password_history
: 密码更改信息。
这些系统表包含关于组件、可加载函数和服务器插件的信息:
-
component
: 服务器组件注册表,使用INSTALL COMPONENT
安装。任何在这个表中的组件都将在服务器启动序列中由加载服务安装。见 第 7.5.1 节,“安装和卸载组件”。 -
func
: 可加载函数注册表,使用CREATE FUNCTION
安装。在正常启动序列中,服务器加载注册在这个表中的函数。如果服务器以--skip-grant-tables
选项启动,注册在表中的函数将不被加载且不可用。见 第 7.7.1 节,“安装和卸载可加载函数”。Note像
mysql.func
系统表一样,性能模式user_defined_functions
表列出了使用CREATE FUNCTION
安装的可加载函数。与mysql.func
表不同的是,user_defined_functions
表还列出了服务器组件或插件自动安装的函数。这使得user_defined_functions
表优于mysql.func
表,以检查哪些函数被安装。见 第 29.12.22.10 节,“The user_defined_functions 表”。 -
plugin
: 服务器插件注册表,使用INSTALL PLUGIN
安装。在正常启动序列中,服务器加载注册在这个表中的插件。如果服务器以--skip-grant-tables
选项启动,注册在表中的插件将不被加载且不可用。见 第 7.6.1 节,“安装和卸载插件”。
服务器使用这些系统表来支持复制:
-
gtid_executed
:用于存储 GTID 值的表。请参阅 mysql.gtid_executed 表。 -
ndb_binlog_index
:NDB 集群复制的二进制日志信息。只有在服务器带有NDBCLUSTER
支持时才创建该表。请参阅 第 25.7.4 节,“NDB 集群复制模式和表”。 -
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_membership
,firewall_users
,firewall_whitelist
:如果安装了 MySQL Enterprise Firewall,则这些表提供防火墙信息的持久存储。见 第 8.4.7 节,“MySQL Enterprise 防火墙”。 -
servers
:由FEDERATED
存储引擎使用。见 第 18.8.2.2 节,“使用 CREATE SERVER 创建 FEDERATED 表”。 -
innodb_dynamic_metadata
:由InnoDB
存储引擎用于存储快速变化的表元数据,如自动递增计数器值和索引树损坏标志。取代了InnoDB
系统表空间中的数据字典缓冲表。