91.MySQL5.7升级到MySQL8.0.33升级方案

​​​​​一、升级建议 

参考文献如下:
https://www.modb.pro/doc/110172
https://www.modb.pro/db/135456
https://www.modb.pro/doc/6313
https://blog.csdn.net/qq961573863/article/details/133957715?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-133957715-blog-89511734.235^v38^pc_relevant_sort&spm=1001.2101.3001.4242.2&utm_relevant_index=4


支持从MySQL5.7升级到8.0,注意仅支持GA版本之间的升级:包名带glibc的安装包。同时包名称中glibc的版本必须相同,否则可能会出现很多依赖问题。不支持跨大版本的升级,如从5.6升级到8.0是不支持的。建议升级大版本前先升级到当前版本的最近小版本,如5.7先升级到5.7.35后再升级到8.0。在大版本内部GA的小版本可以直接升级,如从8.0.9直接升级到8.0.26。其他不同的安装包类型直接不支持直接升级。
某银行内部的数据库版本mysql5.7最低的版本是:mysql5.7.22.
经过多次测试发现mysql5.7.22 及以上版本可以直接升级到mysql8.0.33。

二、MySQL8.0的新特性

(1)数据字典

不同于之前的版本将字典数据存储在元数据文件和非事务系统表中,MySQL8.0将包含数据库对象的全局数据字典存储在事务表中。在使用上如果设置了innodb_read_only 参数会导致所有表的创建、删除、analyze、修改表引擎操作无法执行。CREATE TABLE dst_tbl LIKE src_tbl 要求src_tbl必须是base table。mysqldump 和 mysqlpump不会导出information_schema,不会导出mysql schema中数据字典表,需导出存储过程和事件需指定–routines 和 --events 选项,并且用户需要全局selet权限。

(2)认证插件 

MySQL8.0将默认身份验证插件从mysql_native_password变更为caching_sha2_password,客户端需要验证现有版本是否支持。

(3)配置改变

MySQL8.0开始只有innodb和NDB引擎支持分区表,升级前需确保不存在非innodb引擎的分区表.
部分error code被启用,详见https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals
默认字符集从latin1变更为utf8mb4,默认排序规则为utf8mb4_0900_ai_ci。
注意这可能会导致新旧数据库对象的字符集不一致,造成隐式类型转换的问题。
8.0.11版本开始,如使用与初始化配置不同的 lower_case_table_names 值启动数据库时会报错
[ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('0') and data dictionary ('1').
[ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
[ERROR] [MY-010119] [Server] Aborting

(4)服务器端的变化

8.0部分账户管理功能被删除,如Grant命令修改用户非权限特性,NO_AUTO_CREATE_USER模式,PASSWORD() 函数和 old_passwords 系统变量。8.0删除了部分兼容 SQL 模式:DB2、MAXDB、MSSQL、MYSQL323、MYSQL40,ORACLE,POSTGRESQL,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS。
空间数据类型允许 SRID 属性,以明确指示存储在列中的值的空间参考系统 (SRS)。并删除了部分非ST_前缀的空间函数。详见https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals
在线切换binlog format增加了更多限制。

(5)INNODB存储引擎方面的变化

information_Schema中,innodb_sys_% 改名为 innodb_%
zlib库版本从1.2.3升级到1.2.11
只读变量innodb_directories应该包含file-per-table 和绝对路径创建的通用表空间文件的路径。
undo日志从系统表空间移出。默认会在innodb_undo_directory指定位置(未指定则在data dir)创建两个undo表空间。从5.7升级到8.0时innodb-fast-shutdown需设置成0.
8.0.17开始在创建表空间时,路径不允许含 circular directory reference(/../);升级前可以查询INFORMATION_SCHEMA.INNODB_DATAFILES 表检查表空间路径
mysql> CREATE TABLESPACE ts11 ADD DATAFILE  '/data/mysql/log/test/../ts11.ibd';    
ERROR 3121 (HY000): The ADD DATAFILE filepath cannot contain circular directory references.
mysql> CREATE TABLESPACE ts11 ADD DATAFILE  '/data/mysql/log/ts11.ibd';        
Query OK, 0 rows affected (10.02 sec)

(6)SQL方面的变化

group by 不再支持DESC和ASC,GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
保留字变更https://dev.mysql.com/doc/refman/8.0/en/keywords.html
升级后建议测试 optimizer hints,在8.0中部分hint可能不再适用

(7)隐藏索引 

隐藏索引的特性对于性能调试非常有用。在 8.0 中,索引可以被“隐藏”和“显示”。当一个索引隐藏时,它不会被查询优化器所使用。也就是说,我们可以隐藏一个索引,然后观察对数据库的影响。	如果数据库性能有所下降,就说明这个索引是有用的,于是将其“恢复显示”即可;	如果数据库性能看不出变化,说明这个索引是多余的,可以删掉了。隐藏一个索引的语法是:
	ALTER TABLE t ALTER INDEX i INVISIBLE;
	恢复显示该索引的语法是:
	ALTER TABLE t ALTER INDEX i VISIBLE;
当一个索引被隐藏时,我们可以从 show index 命令的输出中看到,该索引的 Visible 属性值为 NO。注意:当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的,这个特性本身是专门为优化调试使用。如果你长期隐藏一个索引,那还不如干脆删掉,因为毕竟索引的存在会影响插入、更新和删除的性能。

(8)设置持久化

MySQL 的设置可以在运行时通过 SET GLOBAL 命令来更改,但是这种更改只会临时生效,到下次启动时数据库又会从配置文件中读取。
MySQL 8 新增了 SET PERSIST 命令,例如:
SET PERSIST max_connections = 500;
MySQL 会将该命令的配置保存到数据目录下的 mysqld-auto.cnf 文件中,下次启动时会读取该文件,用其中的配置来覆盖缺省的配置文件

(9)通用表达式 

复杂的查询会使用嵌入式表,例如:
	SELECT t1.*, t2.* FROM (SELECT col1 FROM table1) t1,(SELECT col2 FROM table2) t2;
	而有了 CTE,我们可以这样写:
	WITH t1 AS (SELECT col1 FROM table1),
		t2 AS (SELECT col2 FROM table2)
	SELECT t1.*, t2.* 
	FROM t1, t2;
这样看上去层次和区域都更加分明,改起来也更清晰的知道要改哪一部分。

(10)窗口函数

MySQL 被吐槽最多的特性之一就是缺少 rank() 函数,当需要在查询当中实现排名时,必须手写 @ 变量。但是从 8.0 开始,MySQL 新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。窗口函数有点像是 SUM()、COUNT() 那样的集合函数,但它并不会将多行查询结果合并为一行,	而是将结果放回多行当中。也就是说,窗口函数是不需要 GROUP BY 的。

(11)新的数据类型

其中一个重要的新数据类型是GEOMETRY,用于处理地理空间数据。这个数据类型使得存储和查询地理信息变得更加容易。还有一个新的数据类型是UUID,用于存储全局唯一标识符。这对于需要在多个系统之间唯一标识数据的应用程序非常有用。这些新的数据类型扩展了MySQL的功能,使其更适合不同类型的应用程序和用例。

(12)性能改进

性能一直是数据库管理的重要关注点。MySQL 8带来了一系列性能改进,以提高数据库的响应能力。首先,MySQL 8改进了查询优化器。新的查询优化器使用了一种新的执行计划生成器,可以更好地处理复杂查询。这意味着查询在执行时更加高效,可以提供更快的响应时间。此外,MySQL 8引入了新的多线程复制机制。这一机制可以提高数据复制的速度,从而减少了主从复制之间的延迟。对于那些需要处理大量事务的应用程序,这是一个重要的性能改进。

(13)INNODB存储引擎的改进 

InnoDB存储引擎一直是MySQL的默认存储引擎,而MySQL 8进一步改进了它的性能和稳定性。首先,MySQL 8引入了新的InnoDB事务日志格式,称为"redo log"。这个新的事务日志格式提高了并发性和可伸缩性,从而允许更多的并发操作。此外,InnoDB现在支持全文本搜索。这意味着开发人员可以在使用InnoDB存储引擎的应用程序中进行全文本搜索,而不必依赖于其他存储引擎。

(14)变更汇总

默认字符集由latin1变为utf8mb4。
MyISAM系统表全部换成InnoDB表。
JSON特性增强。
支持不可见索引,支持直方图。
sql_mode参数默认值变化。
默认密码策略变更。
新增角色管理。
支持窗口函数,支持Hash join
普通的MyISAM引擎表修改INNODB

(15)测试发现的过期参数

'query_cache_type=1' --不支持注释。
'query_cache_size=1M' --不支持 
'innodb_undo_logs=128' --不支持 
innodb_large_prefix--不支持 
show_compatibility_56=on--不支持 
innodb_log_file_size --不支持 
innodb_log_files_in_group--不支持 

测试发现,这些参数mysql5.7支持,MySQL8.0过期或不支持,可以从参数文件中移除。
SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown
或者:
SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown


 innodb_fast_shutdown这个参数升级前不能设置为2;否则升级后,无法启动数据库。

三、mysql5.7.22升级到MySQL8.0.33升级步骤 

(1)备份数据 

备份永远是重中之重,无论是物理备份还是逻辑备份,至少需要有一个有效的备份。先备份再升级。以防备份出错。
升级前innodb_fast_shutdown不能等于2;
SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown
SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown
同时需要确认没有加密表空间,如果有加密表空间执行如下。
ALTER INSTANCE ROTATE INNODB MASTER KEY;
https://dev.mysql.com/doc/refman/8.0/en/upgrade-binary-package.html

(2)升级前检查

注意:升级前GTID编号=3

(3)停止mysql5.7.22

(14)mysql8.0.33安装目录启动 

旧的mysql5.7.22的目录mysql 替换为:mysql7 ,新目录mysql8.0.33的mysql8修改为mysql

(5)mysql8.0.33升级 

对于mysql8.0.16之后的版本升级,启动即升级。

可以看到使用MySQL8.0.33的安装包启动后,启动过程自动升级。
我们开启了BINLOG,GTID,升级过程未发生事务的变化,GTID的编号升级前后都是3。所以如果给从库,升级不会造成主/从库的GTID的变化,所以升级后,从库开启主从同步,可以继续同步。当然,我们升级的是主库,主从升级步骤一致,不同的是从库需要停止同步,升级结束后再开启同步。
数据检查:

四、其他低版本MySQL升级方案说明 

其他低版本的MySQL 升级到高版本MySQL,建议采用 备份恢复+主从同步 的方式实现升级。同时,尽量使用带glibc的安装包,这类安装包,可以自定义程序安装目录,方便升级。同时也是MySQL推荐的稳定版本。不建议安装rpm安装包,这类安装包,好安装,但是不好升级。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值