数据字典表是受保护的,只能在 MySQL 的调试版本中访问。 但是,MySQL 支持通过 INFORMATION_SCHEMA
表和 SHOW
语句访问存储在数据字典表中的数据。 有关构成数据字典的表的概述,请参阅 数据字典表。
MySQL 系统表在 MySQL 8.4 中仍然存在,可以通过在 mysql
系统数据库上发出 SHOW TABLES
语句来查看。 通常,MySQL 数据字典表和系统表之间的区别在于,数据字典表包含执行 SQL 查询所需的元数据,而系统表包含时区和帮助信息等辅助数据。 MySQL 系统表和数据字典表在升级方式上也不同。 MySQL 服务器管理数据字典升级。 请参阅 数据字典的升级方式。 升级 MySQL 系统表需要运行完整的 MySQL 升级过程。 请参阅 第 3.4 节 “MySQL 升级过程升级的内容”。
新版本的 MySQL 可能包含对数据字典表定义的更改。 此类更改存在于新安装的 MySQL 版本中,但在执行 MySQL 二进制文件的就地升级时,使用新的二进制文件重新启动 MySQL 服务器时会应用更改。 在启动时,将服务器的数据字典版本与存储在数据字典中的版本信息进行比较,以确定是否应升级数据字典表。 如果需要且支持升级,则服务器会创建具有更新定义的数据字典表,将持久化元数据复制到新表,用新表原子地替换旧表,并重新初始化数据字典。 如果不需要升级,则启动会继续,而不会更新数据字典表。
数据字典表的升级是一个原子操作,这意味着所有数据字典表都根据需要升级,或者操作失败。 如果升级操作失败,则服务器启动失败并显示错误。 在这种情况下,可以使用旧服务器二进制文件和旧数据目录来启动服务器。 再次使用新的服务器二进制文件启动服务器时,将重新尝试数据字典升级。
通常,在成功升级数据字典表后,无法使用旧服务器二进制文件重新启动服务器。 因此,在升级数据字典表后,不支持将 MySQL 服务器二进制文件降级到以前的 MySQL 版本。
数据字典表默认情况下受保护,但可以通过使用调试支持编译 MySQL(使用 -DWITH_DEBUG=1
CMake 选项)并指定 +d,skip_dd_table_access_check
debug
选项和修饰符来访问。 有关编译调试版本的信息,请参阅 第 7.9.1.1 节 “编译 MySQL 以进行调试”。
不建议直接修改或写入数据字典表,这可能会导致 MySQL 实例无法运行。
使用调试支持编译 MySQL 后,使用此 SET
语句使数据字典表对 mysql 客户端会话可见
mysql> SET SESSION debug='+d,skip_dd_table_access_check';
使用此查询检索数据字典表列表
mysql> SELECT name, schema_id, hidden, type FROM mysql.tables where schema_id=1 AND hidden='System';
使用 SHOW CREATE TABLE
查看数据字典表定义。 例如
mysql> SHOW CREATE TABLE mysql.catalogs\G