当前位置: 首页 > 科技观察

新特性解读-MySQL5.7升级到MySQL8.0注意事项

时间:2023-03-17 14:28:20 科技观察

简介最近一个项目在测试MySQL5.7的升级。MySQL8.0初始化时,初始化命令秒完成,但是data目录是空的,执行初始化操作的shell窗口也没有报错信息。通过阅读官方手册,发现MySQL8.0.13中的sql_modeNO_AUTO_CREATE_USER已经被废弃,配置文件的sql_mode有这个配置项,最终导致实例初始化失败。为了减少升级过程中出现类似问题,对从MySQL5.7升级到8.0进行了部分梳理,主要包括:升级到MySQL版本的要求,升级做了什么,数据库做了什么步骤升级和注意事项。升级需要MySQL5.7升级到MySQL8.0,MySQL5.7的版本要求为MySQL5.7.9或更高版本。GA版本不支持跨版本升级。模式对象升级步骤是升级数据字典。该阶段主要升级MySQL库的数据字典表。数据字典的升级是在数据库服务启动过程中自动完成的。升级MySQL库的系统表(其余非字典表);升级性能模式、信息模式和系统模式;升级用户架构。MySQL8.0.16之前需要手动执行MySQL_upgrade来完成升级步骤。在MySQL8.0.16版本中,MySQLd完成升级步骤。升级说明caching_sha2_password认证插件提供了更多的密码加密方式,加密性能更好。目前MySQL8.0使用caching_sha2_password作为默认的认证插件,MySQL5.7的认证插件为MySQL_native_password。如果客户端版本过低,将无法识别MySQL8.0的加密认证方式,最终导致连接问题。MySQL存储引擎现在负责提供自己的分区处理程序,而MySQLServer不再提供一般分区支持,InnoDB和NDB是唯一提供MySQL8.0支持的本机分区处理程序的存储引擎。如果分区表使用了其他存储引擎,则需要修改存储引擎。要么将其转换为InnoDB或NDB,要么删除其分区。在将5.7通过MySQLdump得到的备份文件导入到8.0环境之前,需要保证createpartitiontable语句中指定的存储引擎必须支持分区,否则会报错。MySQL8.0默认的字符集是utf8mb4,可能会导致之前数据的字符集和新建对象的字符集不一致。为了避免新旧对象的字符集不一致,可以在配置文件中将字符集和校验规则设置为老版本的字符集和校验规则。MySQL8.0启动时使用的lower_case_table_names值必须和初始化时使用的值一致。使用不同的设置重新启动服务器会导致标识符的排序和比较方式不一致。https://dev.mysql.com/doc/refman/8.0/en/server-systemvariables.html#sysvar_lower_case_table_names为避免MySQL8.0启动失败,MySQL配置文件中的sql_mode系统变量不能包含NO_AUTO_CREATE_USER。从MySQL5.7.24和MySQL8.0.13开始,MySQLdump从存储过程定义中删除了NO_AUTO_CREATE_USER。使用早期版本的MySQLdump创建的转储文件必须手动修改以删除NO_AUTO_CREATE_USER。在MySQL8.0.11中,删除了这些已弃用的兼容SQL模式:DB2、MAXDB、MSSQL、MySQL323、MySQL40、ORACLE、POSTGRESQL、NO_FIELD_OPTIONS、NO_KEY_OPTIONS、NO_TABLE_OPTIONS。5.7到8.0的复制场景,如果语句使用过时的SQLMode,会出现复制异常。当执行到MySQL8.0.3或更高版本的就地升级时,BACKUP_ADMIN权限会自动授予具有RELOAD权限的用户。本文梳理了从MySQL5.7升级到MySQL8.0过程中可能出现的一些问题:升级MySQL版本的要求、升级做了什么、数据库升级做了哪些步骤、注意事项。希望对大家升级版本有所帮助。原作者:郭彬彬