16.7 数据字典使用差异
启用数据字典支持的 MySQL 服务器相比不支持数据字典的服务器存在一些操作性差异:
-
之前,启用
innodb_read_only
系统变量只能防止创建和删除InnoDB
存储引擎的表。从 MySQL 8.4 开始,启用innodb_read_only
防止所有存储引擎的这些操作。任何存储引擎的表创建和删除操作都将修改数据字典表在mysql
系统数据库中,但是这些表使用InnoDB
存储引擎且不能被启用innodb_read_only
时修改。同样原则也适用于需要修改数据字典表的其他表操作。示例:-
ANALYZE TABLE
失败,因为它更新了表统计信息,这些信息存储在数据字典中。 -
ALTER TABLE
失败,因为它更新了存储引擎的指定,这个指定存储在数据字典中。tbl_name
ENGINE=engine_name
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
对表统计信息的查询在STATISTICS
和TABLES
表中直接从存储引擎中获取。自 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列表中的别名将列名转换为所需的大小写。例如: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
LIKEsrc_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;
-
-
数据目录影响mysqldump从
mysql
系统数据库中dump信息:-
mysqldump只dump该数据库中的非数据字典表,而之前可以dump
mysql
系统数据库中的所有表。 -
之前,使用
--all-databases
选项时,不需要指定--routines
和--events
选项:备份包括了mysql
系统数据库,因此也包含了存储的routines和event定义表。从MySQL 8.4开始,event
和proc
表不再使用。对应对象的定义存储在数据字典表中,但这些表不被备份。要在使用--all-databases
选项时包括存储的routines和events,需要显式指定--routines
和--events
选项。 -
之前,使用
--routines
选项需要proc
表的SELECT
权限。从MySQL 8.4开始,--routines
选项要求全局SELECT
权限。 -
之前,可以将存储的routine和event定义,及其创建和修改时间戳一起dump出来,通过dump
proc
和event
表。从MySQL 8.4开始,这些表不再使用,所以不能dump时间戳。
-
-
之前,创建包含非法字符的存储routine会产生警告。从MySQL 8.4开始,这是错误。