## 14.1 数据字典架构

[](<>)

数据字典表受到保护，只能在 MySQL 的调试版本中访问。但是，MySQL 支持通过以下方式访问存储在数据字典表中的数据[`INFORMATION_SCHEMA`](information-schema.html)表和[`显示`](show.html)陈述。有关组成数据字典的表的概述，请参阅[数据字典表](system-schema.html#system-schema-data-dictionary-tables).

MySQL 系统表在 MySQL 8.0 中仍然存在，可以通过发出[`显示表格`](show-tables.html)关于声明`mysql`系统数据库。一般来说，MySQL数据字典表和系统表的区别在于，数据字典表包含执行SQL查询所需的元数据，而系统表包含时区、帮助信息等辅助数据。MySQL 系统表和数据字典表在升级方式上也有所不同。MySQL 服务器管理数据字典升级。SQL 服务器。看[数据字典如何升级](data-dictionary-schema.html#data-dictionary-upgrade).升级 MySQL 系统表需要运行完整的 MySQL 升级过程。看[第 2.11.3 节，“MySQL 升级过程升级了什么”](upgrading-what-is-upgraded.html).

### 数据字典如何升级

MySQL 的新版本可能包括对数据字典表定义的更改。此类更改存在于新安装的 MySQL 版本中，但在执行 MySQL 二进制文件的就地升级时，会在使用新二进制文件重新启动 MySQL 服务器时应用更改。在启动时，将服务器的数据字典版本与存储在数据字典中的版本信息进行比较，以确定是否应该升级数据字典表。如果需要并支持升级，服务器会创建具有更新定义的数据字典表，将持久化的元数据复制到新表中，用新表原子替换旧表，并重新初始化数据字典。如果不需要升级，则继续启动而不更新数据字典表。

数据字典表的升级是一个原子操作，这意味着所有的数据字典表都会根据需要进行升级，否则操作会失败。如果升级操作失败，服务器启动失败并出现错误。在这种情况下，旧的服务器二进制文件可以与旧的数据目录一起使用来启动服务器。当再次使用新的服务器二进制文件启动服务器时，将重新尝试数据字典升级。

通常，数据字典表升级成功后，无法使用旧的服务器二进制文件重新启动服务器。因此，升级数据字典表后，不支持将 MySQL 服务器二进制文件降级到以前的 MySQL 版本。

这[**mysqld**](mysqld.html) [`--no-dd-升级`](server-options.html#option_mysqld_no-dd-upgrade)选项可用于防止在启动时自动升级数据字典表。什么时候[`--no-dd-升级`](server-options.html#option_mysqld_no-dd-upgrade)指定，服务器发现服务器的数据字典版本与数据字典中存储的版本不同，启动失败，错误提示禁止数据字典升级。

### 使用 MySQL 的调试版本查看数据字典表

数据字典表默认受保护，但可以通过编译带有调试支持的 MySQL 来访问（使用`-DWITH_DEBUG=1` **制作**选项）并指定`+d,skip_dd_table_access_check` [`调试`](server-options.html#option_mysqld_debug)选项和修饰符。有关编译调试版本的信息，请参阅[第 5.9.1.1 节，“编译 MySQL 以进行调试”](compiling-for-debugging.html).

警告

不建议直接修改或写入数据字典表，这可能会导致您的 MySQL 实例无法运行。

使用调试支持编译 MySQL 后，使用这个[`放`](set.html)使数据字典表对[**mysql**](mysql.html)客户会话：

```
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.html)查看数据字典表定义。例如：

```
mysql> SHOW CREATE TABLE mysql.catalogs\G
```
