MySQL 8.4 参考手册  /  MySQL 数据字典  /  数据字典使用差异

16.7 数据字典使用差异

与没有数据字典的服务器相比,使用启用数据字典的 MySQL 服务器在操作上有一些差异

  • 以前,启用 innodb_read_only 系统变量仅阻止为 InnoDB 存储引擎创建和删除表。从 MySQL 8.4 开始,启用 innodb_read_only 会阻止所有存储引擎的这些操作。任何存储引擎的表创建和删除操作都会修改 mysql 系统数据库中的数据字典表,但这些表使用 InnoDB 存储引擎,并且在启用 innodb_read_only 时无法修改。同样的原则也适用于需要修改数据字典表的其他表操作。例如:

    注意

    启用 innodb_read_only 也会对 mysql 系统数据库中的非数据字典表产生重要影响。有关详细信息,请参阅 第 17.14 节“InnoDB 启动选项和系统变量” 中对 innodb_read_only 的描述

  • 以前,mysql 系统数据库中的表对 DML 和 DDL 语句可见。从 MySQL 8.4 开始,数据字典表不可见,并且不能直接修改或查询。但是,在大多数情况下,可以使用相应的 INFORMATION_SCHEMA 表来代替查询。这使得底层数据字典表可以随着服务器开发的进行而更改,同时保持稳定的 INFORMATION_SCHEMA 接口供应用程序使用。

  • MySQL 8.4 中的 INFORMATION_SCHEMA 表与数据字典紧密相连,导致在使用上有一些差异

    • 以前,在 STATISTICSTABLES 表中对表统计信息进行的 INFORMATION_SCHEMA 查询直接从存储引擎检索统计信息。从 MySQL 8.4 开始,默认情况下使用缓存的表统计信息。information_schema_stats_expiry 系统变量定义了缓存的表统计信息过期前的持续时间。默认值为 86400 秒(24 小时)。(要随时更新给定表的缓存值,请使用 ANALYZE TABLE。)如果没有缓存的统计信息或统计信息已过期,则在查询表统计信息列时,会从存储引擎检索统计信息。要始终直接从存储引擎检索最新的统计信息,请将 information_schema_stats_expiry 设置为 0。有关详细信息,请参阅 第 10.2.3 节“优化 INFORMATION_SCHEMA 查询”

    • 一些 INFORMATION_SCHEMA 表是数据字典表上的视图,这使得优化器可以使用这些底层表上的索引。因此,根据优化器的选择,INFORMATION_SCHEMA 查询的结果行顺序可能与以前的结果不同。如果查询结果必须具有特定的行排序特征,请包含 ORDER BY 子句。

    • INFORMATION_SCHEMA 表上的查询返回的列名的大小写可能与早期 MySQL 系列中的不同。应用程序应以不区分大小写的方式测试结果集列名。如果不可行,一种解决方法是在选择列表中使用列别名,以所需的字母大小写返回列名。例如:

      SELECT TABLE_SCHEMA AS table_schema, TABLE_NAME AS table_name
      FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'users';
    • mysqldump 不再转储 INFORMATION_SCHEMA 数据库,即使在命令行中显式命名也是如此。

    • CREATE TABLE dst_tbl LIKE src_tbl 要求 src_tbl 是一个基表,如果它是一个数据字典表上的 INFORMATION_SCHEMA 视图,则会失败。

    • 以前,从 INFORMATION_SCHEMA 表中选择的列的结果集标头使用查询中指定的大小写。此查询生成一个标头为 table_name 的结果集

      SELECT table_name FROM INFORMATION_SCHEMA.TABLES;

      从 MySQL 8.4 开始,这些标头使用大写;前面的查询生成一个标头为 TABLE_NAME 的结果集。如有必要,可以使用列别名来实现不同的字母大小写。例如:

      SELECT table_name AS 'table_name' FROM INFORMATION_SCHEMA.TABLES;
  • 数据目录会影响 mysqldump 如何从 mysql 系统数据库转储信息

    • mysqldump 仅转储该数据库中的非数据字典表,而以前可以转储 mysql 系统数据库中的所有表。

    • 以前,在使用 --all-databases 选项时,不需要 --routines--events 选项来包含存储例程和事件:转储包含 mysql 系统数据库,因此也包含包含存储例程和事件定义的 procevent 表。从 MySQL 8.4 开始,不再使用 eventproc 表。相应对象的定义存储在数据字典表中,但这些表不会被转储。要将存储例程和事件包含在使用 --all-databases 创建的转储中,请显式使用 --routines--events 选项。

    • 以前,--routines 选项需要对 proc 表具有 SELECT 权限。从 MySQL 8.4 开始,不再使用该表;--routines 需要全局 SELECT 权限。

    • 以前,可以通过转储 procevent 表,将存储例程和事件定义与其创建时间和修改时间戳一起转储。从 MySQL 8.4 开始,不再使用这些表,因此无法转储时间戳。

  • 以前,创建一个包含非法字符的存储例程会产生警告。从 MySQL 8.4 开始,这是一个错误。