数据字典表是受保护的,仅在 MySQL 的调试版本中可以访问。然而,MySQL 通过 INFORMATION_SCHEMA
表和 SHOW
语句支持访问数据字典表中的数据。有关数据字典表的概述,请参阅 数据字典表。
MySQL 系统表仍然存在于 MySQL 8.3 中,可以通过在 mysql
系统数据库中发出 SHOW TABLES
语句来查看。一般来说,数据字典表和系统表的区别在于数据字典表包含执行 SQL 查询所需的元数据,而系统表包含辅助数据,如时区和帮助信息。 MySQL 系统表和数据字典表也在升级方式上有所不同。 MySQL 服务器管理数据字典升级。请参阅 如何升级数据字典。升级 MySQL 系统表需要运行完整的 MySQL 升级过程。请参阅 第 3.4 节,“MySQL 升级过程升级的内容”。
新的 MySQL 版本可能包括数据字典表定义的更改。这些更改将出现在新安装的 MySQL 版本中,但是在执行就地升级 MySQL 二进制文件时,将在 MySQL 服务器重新启动时应用这些更改。启动时,服务器将比较服务器的数据字典版本与数据字典中存储的版本信息,以确定是否需要升级数据字典表。如果需要升级并且支持升级,服务器将创建具有更新定义的数据字典表,复制持久元数据到新表中,原子地替换旧表,并重新初始化数据字典。如果不需要升级,启动将继续不更新数据字典表。
数据字典表的升级是一个原子操作,这意味着所有数据字典表都将被升级到最新版本,否则操作将失败。如果升级操作失败,服务器启动将失败并显示错误。在这种情况下,旧的服务器二进制文件可以与旧的数据目录一起使用来启动服务器。当新的服务器二进制文件再次用于启动服务器时,数据字典升级将被重新尝试。
一般来说,在数据字典表升级成功后,无法使用旧的服务器二进制文件来重新启动服务器。因此,不支持将 MySQL 服务器二进制文件降级到之前的版本,除非数据字典表未升级。
可以使用 mysqld 的 --no-dd-upgrade
选项来防止数据字典表的自动升级。在指定 --no-dd-upgrade
时,如果服务器发现数据字典版本与存储在数据字典中的版本不同,启动将失败,并显示错误信息,指出数据字典升级被禁止。
数据字典表默认是受保护的,但可以通过编译 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