在升级到MySQL 8.0之前,请回顾本节中描述的更改,以确定哪些更改适用于您当前的MySQL安装和应用程序。执行任何推荐的操作。
标记为不兼容的更改是与早期版本的MySQL不兼容的,在升级之前可能需要注意。我们的目标是避免这些更改,但有时它们是必要的,以纠正问题。如果适用于您的安装的升级问题涉及不兼容,请按照说明中给出的说明进行操作。
变化的内容主要涉及以下方面:
- 数据字典
- 身份验证插件caching_sha2_password
- 配置
- 服务端
- InnoDB
- Sql
数据字典
MySQL Server 8.0合并了一个全局数据字典,在事务性表中包含数据库对象的信息。在以前的MySQL系列中,字典数据存储在元数据文件和非事务性系统表中。因此,升级过程要求您通过检查特定的先决条件来验证安装的升级准备情况。有关更多信息,请参见第2.11.5节“为升级做好安装准备”。支持数据字典的服务器需要一些通用的操作差异;见14.7节“数据字典使用差异”。
身份验证插件caching_sha2_password
caching_sha2_password和sha256_password认证插件提供了比mysql_native_password插件更安全的密码加密,而且caching_sha2_password提供了比sha256_password更好的性能。由于caching_sha2_password具有这些优越的安全性和性能特征,因此它是MySQL 8.0首选的身份验证插件,也是默认的身份验证插件,而不是mysql_native_password。
配置
不兼容的变化:MySQL存储引擎现在负责提供自己的分区处理程序,MySQL服务器不再提供通用的分区支持。InnoDB和NDB是MySQL 8.0中唯一提供本地分区处理程序的存储引擎。使用任何其他存储引擎的分区表都必须在升级服务器之前进行修改——要么将其转换为InnoDB或NDB,要么删除它的分区,否则以后就不能使用它。
关于将MyISAM表转换为InnoDB的信息,请参见15.6.1.5节,“将表从MyISAM转换为InnoDB”。
在MySQL 8.0中,如果使用不支持分区表的存储引擎创建表,则会失败,并出现一个错误(er_check_not_implementation)。如果你从MySQL 5.7中创建一个转储文件导入数据库(或更早)使用mysqldump MySQL 8.0服务器,您必须确保任何语句创建分区表还不指定一个不受支持的存储引擎,通过移除任何分区的引用,或者通过指定作为InnoDB存储引擎或允许它被设定为默认InnoDB。
服务端
在MySQL 8.0.11中,一些与帐户管理相关的不受欢迎的特性已经被删除,例如使用GRANT语句修改用户帐户的非特权特征、NO_AUTO_CREATE_USER SQL模式、PASSWORD()函数和old_password系统变量。
将引用这些已删除特性的语句从MySQL 5.7复制到8.0可能会导致复制失败。使用任何已删除特性的应用程序应该进行修改,以避免使用它们,并在可能的情况下使用替代品,如在MySQL 8.0中已删除的特性中所述。
为了避免MySQL 8.0上的启动失败,从MySQL选项文件的sql_mode系统变量设置中删除NO_AUTO_CREATE_USER的任何实例。
将包含存储程序定义中的NO_AUTO_CREATE_USER SQL模式的转储文件加载到MySQL 8.0服务器中会导致失败。在MySQL 5.7.24和MySQL 8.0.13中,mysqldump从存储的程序定义中删除NO_AUTO_CREATE_USER。必须手动修改用早期版本的mysqldump创建的转储文件,以删除NO_AUTO_CREATE_USER的实例。
在MySQL 8.0.11中,这些过时的兼容性SQL模式被删除:DB2、MAXDB、MSSQL、MYSQL323、MYSQL40、ORACLE、POSTGRESQL、NO_FIELD_OPTIONS、NO_KEY_OPTIONS、NO_TABLE_OPTIONS。它们不能再分配给sql_mode系统变量,也不能用作mysqldump——compatible选项的允许值。
删除MAXDB意味着CREATE TABLE或ALTER TABLE的时间戳数据类型不再被视为DATETIME。
将引用已删除SQL模式的语句从MySQL 5.7复制到8.0可能会导致复制失败。这包括为存储程序(存储过程和函数、触发器和事件)复制CREATE语句,当当前sql_mode值包含任何已删除的模式时执行这些语句。使用任何已删除模式的应用程序都应该修改以避免它们。
InnoDB
基于InnoDB系统表的INFORMATION_SCHEMA视图被数据字典表的内部系统视图所取代。
SQL
不兼容的改变:从MySQL 8.0.13开始,GROUP BY子句的ASC或DESC限定符已经被删除。以前依赖分组排序的查询可能产生与以前MySQL版本不同的结果。要生成给定的排序顺序,需要提供order BY子句。
查询和存储的程序定义从MySQL 8.0.12或更低使用ASC或DESC限定符GROUP BY子句应该被修改。否则,升级到MySQL 8.0.13或更高版本可能会失败,因为可能会复制到MySQL 8.0.13或更高版本服务器。
MySQL 8.0中可能保留了一些在MySQL 5.7中没有保留的关键字。见第9.3节“关键词和保留词”。这可能导致以前用作标识符的单词变成非法的。若要修复受影响的语句,请使用标识符引号。参见9.2节“模式对象名称”。
升级之后,建议您测试应用程序代码中指定的优化器提示,以确保在实现所需的优化策略时仍然需要提示。优化器增强有时会使某些优化器提示变得不必要。在某些情况下,不必要的优化提示甚至可能适得其反。
不兼容的改变:在MySQL 5.7中,为InnoDB表指定一个外键定义而没有一个约束符号子句,或者指定一个约束关键字而没有符号,会导致InnoDB使用一个生成的约束名称。这种行为在MySQL 8.0中改变了,InnoDB使用外键index_name值代替生成的名称。由于约束名称在每个模式(数据库)中必须是唯一的,因此更改会导致错误,因为外键索引名称在每个模式中不是唯一的。为了避免这样的错误,MySQL 8.0.16恢复了新的约束命名行为,InnoDB再次使用一个生成的约束名称。
为了与InnoDB保持一致,基于MySQL 8.0.16或更高版本的NDB版本,如果约束符号子句没有指定,或者约束关键字没有指定符号,则使用生成的约束名称。基于MySQL 5.7的NDB版本和早期MySQL 8.0版本使用了外键index_name值。
上面描述的更改可能会为依赖前一个外键约束命名行为的应用程序引入不兼容性。