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.5 节,“使用事件调度程序”。如果服务器使用--skip-grant-tables选项启动,则事件调度程序将被禁用,并且在表中注册的事件将不会运行。请参见 第 27.5.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 表。使用 INFORMATION_SCHEMA REFERENTIAL_CONSTRAINTS 和 KEY_COLUMN_USAGE 表是获取外键信息的标准 SQL 方法;这些表现在被实现为 foreign_keys、foreign_key_column_usage 和其他数据字典表的视图。
这些系统表包含有关用户帐户及其拥有的权限的授权信息。有关这些表的结构、内容和用途的更多信息,请参见 第 8.2.3 节“授权表”。
MySQL 9.0 授权表是 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系统表一样,性能模式user_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 Enterprise Firewall,这些表将为防火墙使用的信息提供持久存储。参见 第 8.4.7 节,“MySQL Enterprise Firewall”。servers: 由FEDERATED存储引擎使用。参见 第 18.8.2.2 节,“使用 CREATE SERVER 创建 FEDERATED 表”。innodb_dynamic_metadata: 由InnoDB存储引擎使用来存储快速变化的表元数据,例如自动递增计数器值和索引树损坏标志。取代了位于InnoDB系统表空间中的数据字典缓冲表。