实时迁移 低版本迁移至MySQL 8.0,应该注意哪些问题 MySQL 8.0较MySQL 5.7增加了一些新的特性,并在性能表现上存在差异。迁移前,需要做兼容性分析并给出解决方案。可以从兼容性、系统变量等方面考虑。 兼容性分析: 针对MySQL8.0社区版与MySQL5.7社区版进行分析,包括以下两方面: a. 不影响迁移,但使用方法出现差异。 兼容性 检查项 作用 状态 解决方案 数据类型或函数 ENCODE()函数 加密 移除 AESENCRYPT()函数代替 DECODE()函数 解密 移除 AESDECRYPT()函数代替 ENCRYPT()函数 加密 移除 SHA2()函数代替 DESENCRYPT()函数 加密 移除 AESENCRYPT()函数代替 DESDECRYPT()函数 解密 移除 AESDECRYPT()函数代替 JSONAPPEND()函数 增加json元素 移除 JSONARRAYAPPEND()函数代替 PASSWORD()函数 修改用户密码 移除 ALTER USER user IDENTIFIED BY 'authstring'; JSONMERGE()函数 将多个json合并为一个 废弃 JSONMERGEPERSERVE()函数代替 SQL MODE NOAUTOCREATEUSER、DB2, MAXDB, MSSQL, MYSQL323, MYSQL40, ORACLE, POSTGRESQL, NOFIELDOPTIONS, NOKEYOPTIONS, NOTABLEOPTIONS 移除 外键约束长度 外键约束名称不能超过64个字符 SELECT TABLESCHEMA, TABLENAME FROM INFORMATIONSCHEMA.TABLES WHERE TABLENAME IN (SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1), INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'ibfk')1) FROM INFORMATIONSCHEMA.INNODBSYSFOREIGN WHERE LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64);使用ALTER TABLE调整长度 features GRANT创建用户 移除 CREATE USER GRANT修改用户信息 移除 ALTER USER IDENTIFIED BY PASSWORD 'authstring' 设置密码 移除 IDENTIFIED WITH authplugin AS 'authstring' SQL语句中的N NULL 移除 NULL代替 PROCEDURE ANALYSE()语法 对MySQL字段值进行统计分析后给出建议的字段类型 移除 空间函数 mysqlinstalldb 初始化 移除 mysqld initialize或initializeinsecure b. 影响迁移,需要提前做检查。 兼容性 检查项 作用 状态 解决方案 原始用法 保留关键字 cumedist、denserank、empty、except、firstvalue、grouping、groups、jsontable、lag、lastvalue、lateral、lead、nthvalue、ntile、of、over、percentrank、rank、recursive、rownumber、system、window 新增 SET sqlmode 'ANSIQUOTES' 名称:数据库、表、索引、列、alias、view、存储过程、分区、表空间 字符集 UTF8MB3 废弃 使用UTF8MB4代替 分区表 不得出现不支持本地分区的存储引擎的分区表 移除 SELECT TABLESCHEMA, TABLENAME FROM INFORMATIONSCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATEOPTIONS LIKE '%partitioned%';可按照下述两种方式解决:(1)ALTER TABLE tablename ENGINEINNODB;(2)ALTER TABLE tablename REMOVE PARTITIONING; 不支持MyISAM 语法 group by … asc/desc 升序/降序 移除 使用order by子句代替 view、function等 名称长度 view的列名称不能超过64个字符 alter处理 最多255个字符 enum或set元素的总长度不能超过255个字符 用户处理 最大64K 大小写 lowercasetablenames MySQL设置字母大小写是否敏感 升级过程中,如果设置该参数为1,则必须确保schema和table名称必须是小写的SELECT TABLENAME FROM INFORMATIONSCHEMA.TABLES WHERE TABLENAME ! LOWER(TABLENAME) AND TABLETYPE 'BASE TABLE';SELECT SCHEMANAME FROM INFORMATIONSCHEMA.SCHEMATA WHERE SCHEMANAME ! LOWER(SCHEMANAME); 触发器 是否有空定义或者无效的创建上下文 show triggers查看,检测charactersetclient、 collationconnection、Database Collation属性 系统变量默认值变更 针对社区版MySQL5.7与8.0版本的默认值作对比,默认值不影响迁移,但对迁移后的业务会产生影响。 序号 parameter/option community 作用 备注 原默认值 新默认值 Server 1 charactersetserver latin1 utf8mb4 2 collationserver latin1swedishci utf8mb40900aici 3 explicitdefaultsfortimestamp OFF ON 更新某一行时是否更新timestamp列 4 optimizertracemaxmemsize 16KB 1MB 5 validatepasswordcheckusername OFF ON 6 backlog 1 (autosize) changed from : backlog 50 + (maxconnections / 5) 1 (autosize) changed to : backlog maxconnections 在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。 7 maxallowedpacket 4194304 (4MB) 67108864 (64MB) 限制Server接受的数据包大小 8 maxerrorcount 64 1024 控制显示告警的个数 9 eventscheduler OFF ON 10 tableopencache 2000 4000 11 logerrorverbosity 3 (Notes) 2 (Warning) INNODB 1 innodbundotablespaces 0 2 2 innodbundologtruncate OFF ON 3 innodbflushmethod NULL fsync (Unix),unbuffered (Windows) 控制innodb数据文件及redo log的打开、刷写模式 4 innodbautoinclockmode 1 (consecutive) 2 (interleaved) 控制着在向有autoincrement 列的表插入数据时,相关锁的行为; 5 innodbflushneighbors 1 (enable) 0 (disable) 从缓冲池刷新页面是否也刷新相同范围内的其他脏页。 6 innodbmaxdirtypagespctlwm 0 (%) 10 (%) 影响innodb刷新脏页行为 7 innodbmaxdirtypagespct 75 (%) 90 (%) 影响innodb刷新脏页行为 PERFORMANCE SCHEMA 整体是不是开的 REPLICATION 1 logbin OFF ON 2 serverid 0 1 3 logslaveupdates OFF ON 4 expirelogdays 0 30 5 masterinforepository FILE TABLE 6 relayloginforepository FILE TABLE 7 transactionwritesetextraction OFF XXHASH64 8 slaverowssearchalgorithms INDEXSCAN, TABLESCAN INDEXSCAN, HASHSCAN 移除系统变量 针对社区版MySQL 5.7与8.0进行分析,移除系统变量不影响迁移。 移除变量 innodblocksunsafeforbinlog logbuiltinasidentifiedbypassword oldpasswords querycachelimit querycacheminresunit querycachesize querycachetype querycachewlockinvalidate ndbcachechecktime ignoredbdirs txisolation txreadonly syncfrm secureauth multirangecount logerrorverbosity sqllogbin metadatalockscachesize metadatalockshashinstances dateformat datetimeformat timeformat maxtmptables ignorebuiltininnodb innodbsupportxa innodbundologs innodbundotablespaces internaltmpdiskstorageengine