Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  MySQL Data Dictionary  /  Data Dictionary Usage Differences

16.7 数据字典使用差异

使用启用数据字典的 MySQL 服务器与不启用数据字典的服务器相比,存在一些操作差异:

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

    Note

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

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

  • INFORMATION_SCHEMA 表在 MySQL 8.3 中紧密地与数据字典相关,导致了几个使用差异:

    • 之前,INFORMATION_SCHEMA 查询表统计信息在 STATISTICSTABLES 表中直接从存储引擎中检索统计信息。从 MySQL 8.3 开始,默认情况下使用缓存的表统计信息。系统变量 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 表上的查询可能会以不同的字母大小写返回列名。应用程序应该以不区分大小写的方式测试结果集列名。如果这不可行,可以使用选择列表中的列别名来返回所需的列名。例如:

      SELECT TABLE_SCHEMA AS table_schema, TABLE_NAME AS table_name
      FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'users';
    • mysqldumpmysqlpump 不再转储 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.3 开始,这些标题将被大写;前面的查询生成一个结果集,标题为 TABLE_NAME。如果必要,可以使用列别名来实现不同的字母大小写。例如:

      SELECT table_name AS 'table_name' FROM INFORMATION_SCHEMA.TABLES;
  • 数据目录影响 mysqldumpmysqlpumpmysql 系统数据库中转储信息:

    • 之前,可以转储 mysql 系统数据库中的所有表。从 MySQL 8.3 开始,mysqldumpmysqlpump 只转储该数据库中的非数据字典表。

    • 之前,--routines--events 选项不需要包括存储过程和事件时使用 --all-databases 选项:转储包括 mysql 系统数据库,因此也包括 procevent 表,包含存储过程和事件定义。从 MySQL 8.3 开始,eventproc 表不再使用。相应对象的定义存储在数据字典表中,但这些表不被转储。要在使用 --all-databases 选项时包括存储过程和事件,请明确使用 --routines--events 选项。

    • 之前,--routines 选项需要 proc 表的 SELECT 权限。从 MySQL 8.3 开始,该表不再使用:--routines 需要全局 SELECT 权限。

    • 之前,可以通过转储procevent表来转储存储例程和事件定义,包括它们的创建和修改时间戳。从MySQL 8.3开始,这些表不再使用,因此无法转储时间戳。

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