与没有数据字典的服务器相比,使用支持数据字典的MySQL服务器需要一些操作上的差异:
以前,启用
innodb_read_only
控件的系统变量阻止创建和删除表InnoDB
存储引擎。从MySQL 8.0开始启用innodb_read_only
禁止所有存储引擎执行上述操作。中数据字典表的创建和删除操作mysql
系统数据库,但那些表使用InnoDB
存储引擎,不能修改时innodb_read_only
启用。同样的原则也适用于需要修改数据字典表的其他表操作。例子:分析表
失败,因为它更新了存储在数据字典中的表统计信息。ALTER TABLE
失败,因为它更新存储引擎名称,该名称存储在数据字典中。tbl_name
引擎=engine_name
请注意启用
innodb_read_only
类中的非数据字典表也具有重要的含义mysql
系统数据库。具体操作请参见章节的描述innodb_read_only
在章节15.14“InnoDB启动选项和系统变量”以前,表中的
mysql
系统数据库对DML和DDL语句可见。从MySQL 8.0开始,数据字典表是不可见的,不能直接修改或查询。然而,在大多数情况下有相应的INFORMATION_SCHEMA
可以查询的表。这使得底层数据字典表可以随着服务器开发的进行而更改,同时保持稳定的INFORMATION_SCHEMA
应用程序使用的接口。INFORMATION_SCHEMA
MySQL 8.0中的表与数据字典紧密相连,导致了一些使用差异:在此之前,
INFORMATION_SCHEMA
控件中的表统计信息统计数据
而且表
表直接从存储引擎检索统计信息。从MySQL 8.0开始,默认使用缓存的表统计信息。的information_schema_stats_expiry
系统变量定义了缓存表统计信息过期前的时间段。缺省值是86400秒(24小时)。(要随时更新给定表的缓存值,请使用分析表
)。如果没有缓存的统计信息或统计信息已过期,则在查询表统计信息列时从存储引擎检索统计信息。若要始终直接从存储引擎检索最新统计信息,请设置information_schema_stats_expiry
来0
.有关更多信息,请参见章节8.2.3,“优化INFORMATION_SCHEMA查询”.几个
INFORMATION_SCHEMA
表是数据字典表上的视图,这使优化器能够在这些基础表上使用索引。因此,根据优化器的选择,结果的行顺序INFORMATION_SCHEMA
查询可能与以前的结果不同。如果查询结果必须具有特定的行排序特征,请包含命令
条款。查询
INFORMATION_SCHEMA
table返回的列名可能与之前的MySQL系列不同。应用程序应该以不区分大小写的方式测试结果集列名。如果这是不可行的,一种变通方法是在选择列表中使用列别名,返回所需字母大小写的列名。例如:从INFORMATION_SCHEMA中选择TABLE_SCHEMA作为TABLE_SCHEMA, TABLE_NAME作为TABLE_NAME。table WHERE TABLE_NAME = 'users';
, mysqldump而且mysqlpump不再倾倒
INFORMATION_SCHEMA
数据库,即使在命令行上显式地命名。创建表
要求dst_tbl
就像src_tbl
src_tbl
是基表,如果是基表则失败INFORMATION_SCHEMA
表,它是数据字典表的视图。以前,从中选择的列的结果集标题
INFORMATION_SCHEMA
表使用查询中指定的大写。此查询产生一个报头为的结果集table_name
:SELECT table_name FROM INFORMATION_SCHEMA.TABLES;
从MySQL 8.0开始,这些头是大写的;上面的查询产生一个报头为的结果集
TABLE_NAME
.如果需要,可以使用列别名来实现不同的字母大小写。例如:SELECT table_name AS 'table_name' FROM INFORMATION_SCHEMA.TABLES;
数据目录影响如何操作, mysqldump而且mysqlpump从
mysql
系统数据库:类中的所有表都可以转储
mysql
系统数据库。从MySQL 8.0开始,, mysqldump而且mysqlpump仅转储该数据库中的非数据字典表。在此之前,
——例程
而且——事件
类时,选项不需要包含存储的例程和事件——所有数据库
选项:转储包含mysql
系统数据库,因此也proc
而且事件
包含存储例程和事件定义的表。从MySQL 8.0开始,事件
而且proc
不使用表。对应对象的定义存储在数据字典表中,但这些表不会被转储。将存储的例程和事件包含在使用——所有数据库
,使用——例程
而且——事件
明确的选择。以前,可以转储存储的例程和事件定义以及它们的创建和修改时间戳
proc
而且事件
表。从MySQL 8.0开始,这些表没有被使用,因此不可能转储时间戳。
以前,创建包含非法字符的存储例程会产生警告。从MySQL 8.0开始,这是一个错误。