7.3 MySQL 系统模式
MySQL 系统模式 mysql
是 MySQL 服务器运行时所需的信息存储表。可以将其分为两个大类:数据字典表和系统表。下面讨论将这些系统表进一步细分为更小的类别。
本节的其余部分将枚举每个类别中的表,并提供跨引用以获取更多信息。数据字典表和系统表使用 InnoDB
存储引擎,除非另有指定。
mysql
系统表和数据字典表位于一个名为 mysql.ibd
的 InnoDB
表空间文件中,位于 MySQL 数据目录中。之前,这些表是在 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
语句时。 -
表
: 数据库中的表信息。 -
表空间文件
: 表空间文件的信息。 -
表空间
: 活跃的表空间信息。 -
触发器
: 触发器信息。 -
视图使用情况
: 视图和存储函数之间的依赖关系信息。 -
视图表使用情况
: 视图和其基础表之间的依赖关系信息。
数据字典表是不可见的。它们不能使用SELECT
读取,不能出现在SHOW TABLES
的输出中,不列在INFORMATION_SCHEMA的TABLES表中等。然而,在大多数情况下,有相应的INFORMATION_SCHEMA表可以查询。例如,您不能直接从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和INFORMATION_SCHEMA.KEY_COLUMN_USAGE表来获取外键信息;这些表现在是foreign_keys、foreign_key_column_usage和其他数据字典表的视图。
授权系统表
这些系统表包含了用户帐户和他们拥有的权限的信息。关于这些表的结构、内容和用途的详细信息,请参阅Section 8.2.3, “授权表”。
MySQL 8.4 授权表是InnoDB (事务) 表。帐户管理语句是事务语句,或者对所有命名用户都生效,或者在发生错误时回滚并无效。
-
用户
: 用户帐户、全局权限和其他非权限列。 -
全局授权
: 将动态全局权限分配给用户;见静态 versus 动态权限。 -
db
: 数据库级别权限。 -
tables_priv
: 表级别权限。 -
columns_priv
: 列级别权限。 -
procs_priv
: 存储过程和函数权限。 -
proxies_priv
: 代理用户权限。 -
default_roles
: 这个表列出激活用户连接和身份验证后默认激活的角色,或者执行SET ROLE DEFAULT
语句。 -
role_edges
: 这个表列出角色子图的边。一个给定的
user
表行可能引用用户账户或角色。服务器可以通过consultingrole_edges
表来确定行是否表示用户账户、角色或两者。 -
password_history
: 密码变化信息。
对象信息系统表
这些系统表包含关于组件、可加载函数和服务器插件的信息:
-
component
: 服务器组件注册表,使用INSTALL COMPONENT
安装的组件。任何在这个表中列出的组件都是由加载器服务在服务器启动序列中安装的。见第7.5.1节,“安装和卸载组件”。 -
func
: 可加载函数注册表,使用CREATE FUNCTION
安装的函数。在正常启动序列中,服务器加载在这个表中注册的函数。如果服务器使用--skip-grant-tables
选项启动,注册在表中的函数将不可用。见第7.7.1节,“安装和卸载可加载函数”。Note像
mysql.func
系统表一样,性能_schemauser_defined_functions
表列出了使用CREATE FUNCTION
安装的可加载函数。与mysql.func
表不同的是,user_defined_functions
表还列出了由服务器组件或插件自动安装的函数。这使user_defined_functions
更适合于检查安装的函数。请参见第29.12.22.10节,“The user_defined_functions Table”。 -
plugin
: 服务器插件注册表,使用INSTALL PLUGIN
安装的插件。在正常启动序列中,服务器将加载注册在该表中的插件。如果服务器使用--skip-grant-tables
选项启动,注册在表中的插件将不会被加载,无法使用。请参见第7.6.1节,“Installing and Uninstalling Plugins”。
复制 System 表
服务器使用这些系统表来支持复制:
-
gtid_executed
: 存储GTID值的表。见mysql.gtid_executed 表。 -
ndb_binlog_index
: NDB集群复制的二进制日志信息。这个表只在服务器中创建,如果服务器是使用NDBCLUSTER
支持。见第25.7.4节,“NDB Cluster Replication Schema and Tables”。 -
slave_master_info
,slave_relay_log_info
,slave_worker_info
: 在副本服务器上存储复制信息。见第19.2.4节,“Relay Log and Replication Metadata Repositories”。
所有上述表都使用InnoDB
存储引擎。
优化器 System 表
这些系统表是优化器使用的:
-
innodb_index_stats
,innodb_table_stats
: 对于InnoDB
持久优化器统计信息。见第17.8.10.1节,“配置持久优化器统计参数”. -
server_cost
,engine_cost
: 优化器成本模型使用包含操作成本信息的表格。server_cost
包含服务器操作的优化器成本估算。engine_cost
包含特定存储引擎的操作估算。见第10.9.5节,“优化器成本模型”.
Miscellaneous System 表
其他系统表不适用前面的类别:
-
audit_log_filter
,audit_log_user
: 如果安装了MySQL Enterprise Audit,这些表提供了持久存储的审核日志过滤定义和用户帐户。见Audit Log Tables. -
firewall_group_allowlist
,firewall_groups
,firewall_memebership
,firewall_users
,firewall_whitelist
: 如果安装了MySQL Enterprise Firewall,这些表提供了持久存储的防火墙信息。见第8.4.7节,“MySQL Enterprise Firewall”. -
servers
: 由FEDERATED
存储引擎使用。见第18.8.2.2节,“使用CREATE SERVER创建FEDERATED表”. -
InnoDB
存储引擎使用innodb_dynamic_metadata
来存储快速变化的表元数据,如自增计数器值和索引树损坏标志。取代了在InnoDB
系统表空间中的数据字典缓冲区表。