1. 引言
本篇内容主要讲述MySQL升级的事项
MySQL的版本更新很快,新版本中往往包含了很多新功能,并且解决了很多旧版本中的BUG,因此在很多情况下用户需要对数据库进行升级
使用MySQL最大的好处之一是在国内市场使用率特别广泛,可以在许多人使用MySQL的经验中避免一些不易发现的bug
,如果升级到一个比较新的版本,可能会在不知不觉中在你的环境中引入bug或引起性能问题,如果版本过旧,又会有一些旧版本中的BUG
总之:升级MySQL升级需要在稳定性
和功能
之间进行权衡,选择升级前需要仔细考虑
1.1. 升级的出发点
常见原因有:
- 安全漏洞
- 已知的bug
- 新功能、新特性
- 支持的生命周期终止EOL
1.2. 升级的项目流程
数据库升级不是DBA一个人的事情
,但又是DBA需要负责牵头发起的事情
一旦确定了需要做数据库版本升级,首先DBA需要完成版本选择,请提前阅读官网上的版本发行说明,同时下列个人观点也建议参考一下
- 建议选择开源的社区版的稳定版LTS版本,LTS 版本有 8+ 年 支持,适用于生产用途,一般开源软件建议选择双数版本
- 建议选择时间为6-12月之前发布的版本
- 作为内部开发测试数据库环境,跑大概3-6个月的时间之后的版本
之后建议拟定具体执行计划,如人员的协调开发
、业务
、测试
、变更时间
、操作步骤
、应急方案
,尤其是大规模升级
1.3. 升级的方法
- An in-place upgrade: 原地替换MySQL Server软件包.
- logical upgrade: 利用逻辑备份恢复的方式,将旧的数据导入到新的实例.
- replication topology upgrade: 主从架构中,先升级从库,主从切换后再升级原主库.
不管哪种升级方式,都应该先做了备份; 相比之下in-place升级是比较基础的动作
2. in-place升级过程
2.1 上传介质
software_dir="/tmp/rpm"
将mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz安装包解压至此目录
mkdir $software_dir
2.2 执行升级前检查
$software_dir/mysql-shell-8.0.31-linux-glibc2.12-x86-64bit/mysqlsh user:passwd@127.0.0.1:3306 -e "util.checkForServerUpgrade()"
mysql-shell工具,8.0以后,可以调用这个命令,升级之前的预检查。(mysql shell要下载对应的版本)
2.3 升级
上述检查通过之后,可以进行升级
业务停止后检查连接
检查连接 show processlist;
无连接数之后数据库执行
set global innodb_fast_shutdown=0;
观察error日志-2-3分钟,确保无错误日志
tail -f /data/3306/logs/mysql.log
关闭数据库,数据库内执行
shutdown;
使用CP方法冷备数据
cp -rp /data/3306 /data/3306.bak1110
执行命令升级
$software_dir/mysql-8.0.31-linux-glibc2.12-x86_64/bin/mysqld_safe --defaults-file=/data/3306/my.cnf --user=mysql --skip-grant-tables --skip-networking &
5.6、5.7版本需要执行
例:/usr/local/mysql57/bin/mysql_upgrade -S /tmp/mysql3306.sock --force
8.0版本直接用新版本启动就可以
例:/usr/local/mysql80/bin/mysqld --defaults-file=/data/3306/my.cnf --user=mysql &
观察数据库日志,显示下列内容则表示完升级完成
2022-11-10T10:06:43.432988Z 4 [System] [MY-013381] [Server] Server upgrade from '80020' to '80031' started.
2022-11-10T10:07:05.775773Z 4 [System] [MY-013381] [Server] Server upgrade from '80020' to '80031' completed.
2022-11-10T10:07:07.628521Z 0 [Warning] [MY-013829] [Server] Missing data directory for ICU regular expressions: /usr/local/mysql/lib/private/.
2022-11-10T10:07:17.490214Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2022-11-10T10:07:17.490352Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2022-11-10T10:07:17.533705Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /tmp/mysqlx.sock
2022-11-10T10:07:17.533841Z 0 [System] [MY-010931] [Server] /tmp/rpm/mysql-8.0.31-linux-glibc2.12-x86_64/bin/mysqld: ready for connections. Version: '8.0.31' socket: '/data/3306/tmp/3306.sock' port: 0 MySQL Community Server - GPL.
登录检查版本
select @@version;
重新正常启动
mv /usr/local/mysql /usr/local/mysql.bak1110
mv /tmp/rpm/mysql-8.0.31-linux-glibc2.12-x86_64 /usr/local/mysql
/usr/local/mysql/bin/mysql -S /data/3306/tmp/3306.sock -e "shutdown;"
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf --user=mysql &
至此数据库升级完成
3. 升级中的一些注意事项以及经验
- 定要在测试环境测好之后再做升级操作
- 升级前一定要备份,否则无法回退
- 5.6升级到5.7时,Sql_mode需要改,要么升级之前调整好,要么在5.7关掉sql_mode
- 主从GTID:如果5.7想用GTID,那么5.6再升级之前必须开启GTID
- 提前测试好使用到的56版本、57版本、80版本一些函数是否支持
- 8.0版本时不支持回退到5.7版本的,只能依靠备份来回退
- 仅可在GA版本之间升级
- 5.6–> 5.7 ,先将5.6升级至最新版,再升级到5.7
- 5.5 —> 5.7 ,先将5.5 升级至最新,再5.5—> 5.6最新,再5.6—>5.7 最新
官网参考:之一事项说明
Upgrade is only supported between General Availability(GA) releases.
Upgrade from MySQL 5.6 to 5.7 is supported. Upgrading to the latest release is recommended before upgrading to the next version. For example, upgrade to the latest MySQL 5.6 release before upgrading to MySQL 5.7.
Upgrade that skips versions is not supported. For example,upgrading directly from MySQL 5.5 to 5.7 is not supported.
Upgrade within a release series is supported. For example,upgrading from MySQL 5.7.x to 5.7.y is supported.
Skipping a release is also supported. For example, upgrading from MySQL 5.7.x to 5.7.z is supported.