MySQL 5.7升级8.0过程(详解)
记一次MySQL 5.7升级8.0的详细过程,聊聊我的思路,希望可以帮助大家。
以一个例子为切入点
一、升级背景
为什么要升级到MySQL8.0?大概多久进行一次?
大家可以参考下图记录的各个版本的发布时间,来确认各个版本的最终补丁日期:
从上图来看,当前处在官方支持生命周期的版本是MySQL 8.0, 其中MySQL 5.7处在Extended Support也就意味着只会做安全方面的更新,其它的方面不在处理,MGR的很多特性就没在往5.7中合并。所以当前最佳的方式是升级到MySQL 8.0。
升级大概可以分成三种情况:
a.、依据产品形态定位升级时间;
b.、依据服务的性能指标及成本做决定;
c.、依据于使用到的MySQL特性做决定。
以上三点,如果从升级的必要性角度看,可以反过来看。如果从业务角度出发可以正着看。
作为DBA最关注的就是MySQL的新特性,8.0解决了一些之前版本没有解决的问题,比如:
1、解决低版本没有彻底解决的BUG。
2、快速加列。目前使用PT工具变更百G以上大表风险极高,不仅时间很长而且变更期间占用大量磁盘IO,并且容易导致业务报错,比如大量出现锁等待和死锁等,对于核心业务还是很难接受,严重甚至会导致MySQL主从切换。
3、支持自增值持久化,解决MySQL 8.0之前版本重启后可能会导致依赖自增值的业务或者归档数据可能报错等问题。
4、JSON功能增强,如果之前有使用json数据类型的话,可以体验到更丰富的函数和同步性能提升等。
5、更好的MGR使用体验。
等等
二、升级准备及注意事项
1、了解8.0的一些功能。
参考:
https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html
2、注意事项:
- 验证插件
- sql_mode
- MySQL 8.0 Group by默认不排序,切换后可能会导致业务返回的结果不对。
- Datetime类型字段的值,不能等于空字符串,否则直接报错。
- 不建议直接使用MySQL 8.0二进制文件替换的方式进行直接升级。
- 做好数据同步校验。
- 在测试环境先做好兼容性测试,避免业务存在使用了一些MySQL 8.0移除的函数、关键字或者语法等。
- ETL流程要做好兼容MySQL 8.0。
- 程序驱动不兼容部分已经移除或者改名的变量,需升级驱动。
- my.cnf配置信息调整
- 最少停机时间,同样生产数据恢复到环境,进行模拟升级,评估时间
- 考虑回滚方案
- 数据库备份
3、检查工具。
参考:
https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-upgrade.htm
三、升级过程
1、官网下载对应的升级包
参考
https://downloads.mysql.com/archives/community/
下面是单机升级,高可用架构下需要先升级从库,在逐步升级主库。
执行mysql_upgrade命令,会提示如下:
#/mysql8.0.19/bin/mysql_upgrade -uroot -p
在MySQL 8中mysql_upgrade客户端现已弃用。升级客户端执行的操作现在由服务器完成。要升级,请使用较旧的数据目录启动新的 MySQL 二进制文件。自动修复用户表。升级后不需要重新启动。
所以必须在测试环境模拟准备对应SQL语句
2、操作步骤:
登录服务器进行正常关闭:innodb_fast_shutdown是默认是1,常常认为是安全关闭
mysql> show variables like 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_fast_shutdown | 1 |
+----------------------+-------+
1 row in set (0.00 sec)
mysql> set global innodb_fast_shutdown=0;
Query OK, 0 rows affected (0.01 sec)
mysql> shutdown;
Query OK, 0 rows affected (0.00 sec)
备份。
启动mysql服务
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.19 |
+-----------+
1 row in set (0.01 sec)
验证业务是否正常。