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

16.7 数据字典使用差异

启用数据字典支持的 MySQL 服务器相比不支持数据字典的服务器存在一些操作性差异:

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

    Note

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

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

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

    • 之前,INFORMATION_SCHEMA 对表统计信息的查询在STATISTICSTABLES 表中直接从存储引擎中获取。自 MySQL 8.4 起,默认使用缓存表统计信息。系统变量information_schema_stats_expiry 定义了缓存表统计信息的失效期限。默认值为 86400 秒(24 小时)。(要在任何时候更新给定表的缓存值,使用ANALYZE TABLE。)如果没有缓存统计信息或统计信息已过期,查询表统计信息列时将从存储引擎中获取。如果总是想从存储引擎中直接获取最新的统计信息,设置information_schema_stats_expiry0。更多信息,请参见第 10.2.3 节,“INFORMATION_SCHEMA 查询优化”

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

    • INFORMATION_SCHEMA表进行查询可能返回列名的大小写与早期MySQL系列不同。应用程序应该以不区分大小写的方式测试结果集列名。如果这不可行,可以使用select列表中的别名将列名转换为所需的大小写。例如:

      SELECT TABLE_SCHEMA AS table_schema, TABLE_NAME AS table_name
      FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'users';
    • mysqldump 不再将INFORMATION_SCHEMA数据库dump到文件中,即使在命令行中明确指定了该名称。

    • CREATE TABLE dst_tbl LIKE src_tbl 需要src_tbl 是一个基本表,并且如果它是一个数据字典表的视图将失败。

    • 之前,选择从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;
  • 数据目录影响mysqldumpmysql系统数据库中dump信息:

    • mysqldump只dump该数据库中的非数据字典表,而之前可以dumpmysql系统数据库中的所有表。

    • 之前,使用--all-databases选项时,不需要指定--routines--events选项:备份包括了mysql系统数据库,因此也包含了存储的routines和event定义表。从MySQL 8.4开始,eventproc表不再使用。对应对象的定义存储在数据字典表中,但这些表不被备份。要在使用--all-databases选项时包括存储的routines和events,需要显式指定--routines--events选项。

    • 之前,使用--routines选项需要proc表的SELECT权限。从MySQL 8.4开始,--routines选项要求全局SELECT权限。

    • 之前,可以将存储的routine和event定义,及其创建和修改时间戳一起dump出来,通过dump procevent 表。从MySQL 8.4开始,这些表不再使用,所以不能dump时间戳。

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