## 5.3 mysql 系统架构

这`mysql`架构是系统架构。它包含存储 MySQL 服务器运行时所需信息的表。一个广泛的分类是`mysql`schema 包含存储数据库对象元数据的数据字典表，以及用于其他操作目的的系统表。以下讨论进一步将系统表集细分为更小的类别。

-   [数据字典表](system-schema.html#system-schema-data-dictionary-tables)

-   [授予系统表](system-schema.html#system-schema-grant-tables)

-   [对象信息系统表](system-schema.html#system-schema-object-tables)

-   [记录系统表](system-schema.html#system-schema-log-tables)

-   [服务器端帮助系统表](system-schema.html#system-schema-help-tables)

-   [时区系统表](system-schema.html#system-schema-time-zone-tables)

-   [复制系统表](system-schema.html#system-schema-replication-tables)

-   [优化器系统表](system-schema.html#system-schema-optimizer-tables)

-   [杂项系统表](system-schema.html#system-schema-miscellaneous-tables)

    本节的其余部分列举了每个类别中的表格，并带有交叉引用以获取更多信息。数据字典表和系统表使用`InnoDB`除非另有说明，否则存储引擎。

`mysql`系统表和数据字典表位于一个单一的`InnoDB`表空间文件名为`mysql.ibd`在 MySQL 数据目录中。以前，这些表是在单独的表空间文件中创建的`mysql`数据库目录。

可以启用静态数据加密`mysql`系统模式表空间。有关详细信息，请参阅[第 15.13 节，“InnoDB 静态数据加密”](innodb-data-encryption.html).

### 数据字典表

这些表包含数据字典，其中包含有关数据库对象的元数据。有关其他信息，请参阅[第 14 章，*MySQL 数据字典*](data-dictionary.html).

重要的

数据字典在 MySQL 8.0 中是新的。与以前的 MySQL 版本相比，启用数据字典的服务器需要一些一般的操作差异。有关详细信息，请参阅[第 14.7 节，“数据字典使用差异”](data-dictionary-usage-differences.html).此外，对于从 MySQL 5.7 升级到 MySQL 8.0，升级过程与以前的 MySQL 版本有些不同，并且需要您通过检查特定的先决条件来验证安装的升级准备情况。有关详细信息，请参阅[第 2.11 节，“升级 MySQL”](upgrading.html)， 特别[第 2.11.5 节，“准备升级安装”](upgrade-prerequisites.html).

-   `目录`: 目录信息。

    [](<>)[](<>)

-   `字符集`：有关可用字符集的信息。

    [](<>)[](<>)

-   `check_constraints`： 相关信息`查看`在表上定义的约束。看[第 13.1.20.6 节，“检查约束”](create-table-check-constraints.html).

    [](<>)[](<>)

-   `校对`：有关每个字符集的排序规则的信息。

    [](<>)[](<>)

-   [](<>) [](<>) `column_statistics`：列值的直方图统计。看[第 8.9.6 节，“优化器统计”](optimizer-statistics.html).

-   `列类型元素`：有关列使用的类型的信息。

    [](<>)[](<>)

-   `列`：有关表中列的信息。

    [](<>)[](<>)

-   `dd_properties`：标识数据字典属性的表，例如其版本。服务器使用它来确定数据字典是否必须升级到较新的版本。

    [](<>)[](<>)

-   `事件`：有关事件调度​​程序事件的信息。看[第 25.4 节，“使用事件调度程序”](event-scheduler.html).如果服务器以[`--skip-grant-tables`](server-options.html#option_mysqld_skip-grant-tables)选项，事件调度程序被禁用，并且在表中注册的事件不会运行。看[第 25.4.2 节，“事件调度程序配置”](events-configuration.html).

    [](<>)[](<>)

-   `外键`,`foreign_key_column_usage`: 关于外键的信息。

    [](<>)[](<>)[](<>)[](<>)

-   `index_column_usage`：有关索引使用的列的信息。

    [](<>)[](<>)

-   `索引分区`：有关索引使用的分区的信息。

    [](<>)[](<>)

-   `index_stats`: 用于存储动态索引统计时产生的[`分析表`](analyze-table.html)被执行。

    [](<>)[](<>)

-   `索引`：有关表索引的信息。

    [](<>)[](<>)

-   `innodb_ddl_log`：存储 DDL 日志以进行崩溃安全的 DDL 操作。

    [](<>)[](<>)

-   `参数类型元素`：有关存储过程和函数参数的信息，以及有关存储函数的返回值的信息。

    [](<>)[](<>)

-   `参数`: 有关存储过程和函数的信息。看[第 25.2 节，“使用存储的例程”](stored-routines.html).

    [](<>)[](<>)

-   `资源组`: 有关资源组的信息。看[第 5.1.16 节，“资源组”](resource-groups.html).

    [](<>)[](<>)

-   `例行公事`: 有关存储过程和函数的信息。看[第 25.2 节，“使用存储的例程”](stored-routines.html).

    [](<>)[](<>)

-   `图式`：关于模式的信息。在 MySQL 中，模式是数据库，因此该表提供有关数据库的信息。

    [](<>)[](<>)

-   `st_spatial_reference_systems`：有关空间数据的可用空间参考系统的信息。

    [](<>)[](<>)

-   `表分区值`：有关表分区使用的值的信息。

    [](<>)[](<>)

-   `表分区`：有关表使用的分区的信息。

    [](<>)[](<>)

-   `table_stats`: 动态表统计信息[`分析表`](analyze-table.html)被执行。

    [](<>)[](<>)

-   `表`：有关数据库中表的信息。

    [](<>)[](<>)

-   `表空间文件`：有关表空间使用的文件的信息。

    [](<>)[](<>)

-   `表空间`：有关活动表空间的信息。

    [](<>)[](<>)

-   `触发器`: 关于触发器的信息。

    [](<>)[](<>)

-   `view_routine_usage`：关于视图之间的依赖关系和它们使用的存储函数的信息。

    [](<>)[](<>)

-   `view_table_usage`：用于跟踪视图及其基础表之间的依赖关系。

     [](<>)[](<>)

    数据字典表是不可见的。他们不能被阅读[`选择`](select.html)，不要出现在输出中[`显示表格`](show-tables.html), 未列入`INFORMATION_SCHEMA.TABLES`表等。但是，在大多数情况下，有相应的`INFORMATION_SCHEMA`可以查询的表。从概念上讲，`INFORMATION_SCHEMA`提供一个视图，通过该视图 MySQL 公开数据字典元数据。例如，您不能从`mysql.schema`直接表：


```
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: utf8
    DEFAULT_COLLATION_NAME: utf8_general_ci
                  SQL_PATH: NULL
        DEFAULT_ENCRYPTION: NO
...
```

没有`INFORMATION_SCHEMA`完全对应的表`mysql.indexes`， 但[`INFORMATION_SCHEMA.STATISTICS`](information-schema-statistics-table.html)包含许多相同的信息。

到目前为止，还没有`INFORMATION_SCHEMA`完全对应的表`mysql.foreign_keys`,`mysql.foreign_key_column_usage`.获取外键信息的标准 SQL 方法是使用`INFORMATION_SCHEMA` [`REFERENTIAL_CONSTRAINTS`](information-schema-referential-constraints-table.html)和[`KEY_COLUMN_USAGE`](information-schema-key-column-usage-table.html)表格；这些表现在作为视图实现`外键`,`foreign_key_column_usage`, 和其他数据字典表。

MySQL 8.0 之前的一些系统表已被数据字典表替换，不再存在于`mysql`系统架构：

-   这`事件`数据字典表取代`事件`MySQL 8.0 之前的表。

-   这`参数`和`例行公事`数据字典表一起取代`过程`MySQL 8.0 之前的表。

### 授予系统表

这些系统表包含有关用户帐户及其所拥有权限的授权信息。有关这些表格的结构、内容和用途的更多信息，请参阅[第 6.2.3 节，“授权表”](grant-tables.html).

从 MySQL 8.0 开始，授权表是`InnoDB`（事务）表。以前，这些是`MyISAM`（非事务性）表。授权表存储引擎的变化是 MySQL 8.0 中伴随账户管理语句行为变化的基础，例如[`创建用户`](create-user.html)和[`授予`](grant.html).以前，命名多个用户的帐户管理语句可能对某些用户成功而对其他用户失败。这些语句现在是事务性的，并且对于所有命名用户都成功或回滚并且如果发生任何错误则无效。

笔记

如果 MySQL 从旧版本升级，但授权表尚未从旧版本升级`MyISAM`到`InnoDB`，服务器认为它们是只读的，并且帐户管理语句会产生错误。有关升级说明，请参阅[第 2.11 节，“升级 MySQL”](upgrading.html).

-   `用户`：用户帐户、全局权限和其他非权限列。

    [](<>)[](<>)[](<>)

-   `global_grants`：为用户分配动态全局权限；看[静态与动态特权](privileges-provided.html#static-dynamic-privileges).

    [](<>)[](<>)[](<>)

-   `D b`: 数据库级权限。

    [](<>)[](<>)[](<>)

-   `table_priv`：表级权限。

    [](<>)[](<>)[](<>)

-   `columns_priv`：列级权限。

    [](<>)[](<>)[](<>)

-   `procs_priv`: 存储过程和函数权限。

    [](<>)[](<>)[](<>)

-   `proxies_priv`: 代理用户权限。

    [](<>)[](<>)[](<>)

-   `默认角色`：此表列出了用户连接并验证或执行后要激活的默认角色[`设置角色默认值`](set-role.html).

    [](<>)[](<>)[](<>)

-   `角色边缘`：此表列出了角色子图的边。

    给定的`用户`表行可能引用用户帐户或角色。服务器可以通过查询`角色边缘`有关身份验证 ID 之间关系的信息的表。

    [](<>)[](<>)[](<>)

-   `密码历史`：有关密码更改的信息。

    [](<>)[](<>)[](<>)

### 对象信息系统表

这些系统表包含有关组件、可加载函数和服务器端插件的信息：

-   `零件`：使用安装的服务器组件的注册表[`安装组件`](install-component.html).此表中列出的任何组件都由加载程序服务在服务器启动序列期间安装。看[第 5.5.1 节，“安装和卸载组件”](component-loading.html).

    [](<>)[](<>)

-   `功能`：使用安装的可加载功能的注册表[`创建函数`](create-function-loadable.html).在正常启动序列期间，服务器会加载此表中注册的函数。如果服务器以[`--skip-grant-tables`](server-options.html#option_mysqld_skip-grant-tables)选项，表中注册的函数未加载且不可用。看[第 5.7.1 节，“安装和卸载可加载函数”](function-loading.html).

    [](<>)[](<>)

    笔记

    如`mysql.func`系统表，性能模式[`用户定义函数`](performance-schema-user-defined-functions-table.html)表列出了使用安装的可加载函数[`创建函数`](create-function-loadable.html).不像`mysql.func`表[`用户定义函数`](performance-schema-user-defined-functions-table.html)表还列出了服务器组件或插件自动安装的功能。这种差异使[`用户定义函数`](performance-schema-user-defined-functions-table.html)比`mysql.func`用于检查安装了哪些功能。看[第 27.12.21.8 节，“用户\_定义\_功能表”](performance-schema-user-defined-functions-table.html).

-   `插入`：使用安装的服务器端插件的注册表[`安装插件`](install-plugin.html).在正常启动过程中，服务器会加载在此表中注册的插件。如果服务器以[`--skip-grant-tables`](server-options.html#option_mysqld_skip-grant-tables)选项，表中注册的插件未加载且不可用。看[第 5.6.1 节，“安装和卸载插件”](plugin-loading.html).

    [](<>)[](<>)

### 记录系统表

服务器使用这些系统表进行日志记录：

-   [](<>) [](<>) `通用日志`：一般查询日志表。

-   [](<>) [](<>) `慢日志`：慢查询日志表。

    日志表使用`CSV`存储引擎。

    有关详细信息，请参阅[第 5.4 节，“MySQL 服务器日志”](server-logs.html).

### 服务器端帮助系统表

[](<>)[](<>)

这些系统表包含服务器端帮助信息：

-   [](<>) [](<>) `帮助类别`：有关帮助类别的信息。

-   [](<>) [](<>) `help_keyword`：与帮助主题相关的关键字。

-   [](<>) [](<>) `帮助关系`：帮助关键字和主题之间的映射。

-   [](<>) [](<>) `帮助主题`: 帮助主题内容。

    有关详细信息，请参阅[第 5.1.17 节，“服务器端帮助支持”](server-side-help-support.html).

### 时区系统表

[](<>)[](<>)

这些系统表包含时区信息：

-   [](<>) [](<>) `时区`: 时区 ID 以及它们是否使用闰秒。

-   [](<>) [](<>) `time_zone_leap_second`: 当闰秒发生时。

-   [](<>) [](<>) `时区名称`: 时区 ID 和名称之间的映射。

-   [](<>) [](<>) [](<>) [](<>) `time_zone_transition`, `time_zone_transition_type`：时区说明。

    有关详细信息，请参阅[第 5.1.15 节，“MySQL 服务器时区支持”](time-zone-support.html).

### 复制系统表

服务器使用这些系统表来支持复制：

-   [](<>) [](<>) `gtid_executed`：用于存储 GTID 值的表。看[mysql.gtid\_执行表](replication-gtids-concepts.html#replication-gtids-gtid-executed-table).

-   [](<>) [](<>) `ndb_binlog_index`：NDB Cluster 复制的二进制日志信息。此表仅在服务器构建时创建[`NDBCLUSTER`](mysql-cluster.html)支持。看[第 23.7.4 节，“NDB 集群复制模式和表”](mysql-cluster-replication-schema.html).

-   [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) `slave_master_info`,`slave_relay_log_info`,`slave_worker_info`：用于在副本服务器上存储复制信息。看[第 17.2.4 节，“中继日志和复制元数据存储库”](replica-logs.html).

    刚刚列出的所有表格都使用[`InnoDB`](innodb-storage-engine.html)存储引擎。

### 优化器系统表

这些系统表供优化器使用：

-   [](<>) [](<>) [](<>) [](<>) `innodb_index_stats`,`innodb_table_stats`： 用于`InnoDB`持久的优化器统计信息。看[第 15.8.10.1 节，“配置持久优化器统计参数”](innodb-persistent-stats.html).

-   [](<>) [](<>) [](<>) [](<>) `server_cost`,`引擎成本`：优化器成本模型使用包含有关在查询执行期间发生的操作的成本估计信息的表。`server_cost`包含一般服务器操作的优化器成本估算。`引擎成本`包含特定于特定存储引擎的操作的估计。看[第 8.9.5 节，“优化器成本模型”](cost-model.html).

### 杂项系统表

其他系统表不符合上述类别：

-   [](<>) [](<>) [](<>) [](<>) `审计日志过滤器`,`审计日志用户`：如果安装了 MySQL Enterprise Audit，这些表提供了审计日志过滤器定义和用户帐户的持久存储。看[审核日志表](audit-log-reference.html#audit-log-tables).

-   [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) `firewall_group_allowlist`,`防火墙组`,`firewall_memebership`,`防火墙_用户`,`防火墙白名单`：如果安装了 MySQL Enterprise Firewall，这些表为防火墙使用的信息提供持久存储。看[第 6.4.7 节，“MySQL 企业防火墙”](firewall.html).

-   [](<>) [](<>) `服务器`: 被使用`联邦`存储引擎。看[第 16.8.2.2 节，“使用 CREATE SERVER 创建 FEDERATED 表”](federated-create-server.html).

-   [](<>) [](<>) `innodb_dynamic_metadata`: 被使用`InnoDB`存储引擎来存储快速变化的表元数据，例如自动增量计数器值和索引树损坏标志。替换驻留在`InnoDB`系统表空间。
