一. MySQL 在 Linux 中的升级
开始之前,我们需要了解 MySQL 的升级方式,在官方文档中我们可以看到 MySQL 基于二进制的升级,分为 In-Place Upgrade (就地升级) 和 Logical Upgrade (逻辑升级) 两种方式。本文主要讨论 In-Place Upgrade 升级方式(适合主从环境)。
首先,这里列出使用 In-Place Upgrade 进行版本升级的一些注意事项:
① 支持 GA 版本之间的升级(GA 版本,即 General Availability,正式发布版)
② 升级时,MySQL 5.6 → MySQL 5.7,建议先将 MySQL 5.6 升级至小版本的最新版本,再升级到 MySQL 5.7
③ 升级时,MySQL 5.5 → MySQL 5.7,建议先将 MySQL 5.5 升级至小版本的最新版本,再 MySQL 5.5 → MySQL 5.6 最新版本,最后 MySQL 5.6 → MySQL 5.7
④ 回退方案需要提前进行准备,注意备份(特别是跨大版本升级 → 8.0 版本)
⑤ 在合适的时间进行升级,降低业务停机时间
其次,In-Place Upgrade 的升级原理(过程)也是我们需要掌握的。首先,需要备份原库的数据 → 部署新版本的数据库软件 → 关闭原数据库(业务停机、提前做好用户通知) → 更改配置文件,以安全方式(--skip-grant-tables、--skip-networking)启动新版本数据库,挂低版本数据库数据 → 开始升级(仅会更新一些系统表,升级时间与数据量无关) → 正常重启数据库 → 测试业务功能 → 恢复业务 → 升级完成。
MySQL 5.x 升级到 MySQL 5,y 与 MySQL 5.x 升级到 MySQL 8.y 的过程是不同的,因为在升级到 MySQL 8.0 之前,我们有了新的工具(mysqlsh),可以在升级前进行预检查来提升升级的可靠性。 下面,对两种不同版本的升级过程进行详细的过程演示(仅为测试环境简单演示,生产环境需要考虑的问题很多,需要依据实际情况进行升级)。
二. MySQL 5.x → MySQL 5.y 的升级过程
官方文档看这里:dev.mysql.com/doc/refman/… 。
本文以 MySQL 5.6.51 升级到 MySQL 5.7.35 为例。首先,你需要确保自己的系统中已经部署好了MySQL 5.6.51 的数据库,添加一些测试数据来测试升级过程的数据完整性。
[root@cool ~]$ mysql -V
mysql Ver 14.14 Distrib 5.6.51, for linux-glibc2.12 (x86_64) using EditLine wrapper
[root@cool ~]$ service mysqld start
Starting MySQL. SUCCESS!
[root@cool ~]$ mysql
Server version: 5.6.51 MySQL Community Server (GPL)
mysql> create database inplace_test;
mysql> create table inplace_test.test(name varchar(10));
mysql> insert into inplace_test.test(name) values ('linus'),('zeus');
mysql> select * from inplace_test.test;
+-------+
| name |
+-------+
| linus |
| zeus |
+-------+
复制代码
这里我们简单创建两个记录便于测试,备份的过程此处省略,直接从新版本数据库的部署开始。
# 1. 部署 MySQL 5.7.35 数据库软件
[root@cool ~]$ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz
[root@cool ~]$ tar xf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz -C /mysql/
[root@cool ~]$ ln -s /mysql/mysql-5.7.35-linux-glibc2.12-x86_64/ /usr/local/mysql57
# 2. 平滑关闭 MySQL 5.6.51 数据库
[root@cool ~]$ mysql
mysql> set global innodb_fast_shutdown=0;
[root@cool ~]$ mysqladmin -uroot shutdown
[root@cool ~]$ netstat -lntup | grep 3306
# 3. 更改配置文件(basedir),已安全方式启动新版本数据库,挂低版本数据库数据
[root@cool ~]$ vim /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql57
datadir=/data/3306/mysql
socket=/tmp/mysql.sock
port=3306
[mysql]
socket=/tmp/mysql.sock
[root@cool ~]$ /usr/local/mysql57/bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking &
[root@cool ~]$ ll /tmp/mysql.sock
srwxrwxrwx 1 mysql mysql 0 Nov 3 15:02 /tmp/mysql.sock
# 4. 升级
[root@cool ~]$ /usr/local/mysql57/bin/mysql_upgrade -S /tmp/mysql.sock --force
Checking server version.
...
Upgrade process completed successfully.
Checking if update is needed.
# 5. 正常重启数据库
[root@cool ~]$ /usr/local/mysql57/bin/mysqladmin -S /tmp/mysql.sock shutdown
[root@cool ~]$ /usr/local/mysql57/support-files/mysql.server start
Starting MySQL. SUCCESS!
# 6. 验证
[root@cool ~]$ /usr/local/mysql57/bin/mysql
Server version: 5.7.35 MySQL Community Server (GPL)
mysql> select * from inplace_test.test;
+-------+
| name |
+-------+
| linus |
| zeus |
+-------+
# 7. 修改环境变量配置(之前的为 MySQL 5.6.51 的配置),方便服务的启停
[root@cool ~]$ vim /etc/profile
export PATH=$PATH:/usr/local/mysql57/bin
[root@cool ~]$ . /etc/profile
[root@cool ~]$ rm -rf /etc/init.d/mysqld
[root@cool ~]$ systemctl daemon-reload
[root@cool ~]$ cp /usr/local/mysql57/support-files/mysql.server /etc/init.d/mysqld
[root@cool ~]$ service mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
[root@cool ~]$ mysql
Server version: 5.7.35 MySQL Community Server (GPL)
复制代码
三. MySQL 5.x → MySQL 8.y 的升级过程
老规矩,官方文档在此: dev.mysql.com/doc/refman/… 。
本文以 MySQL 5.7.35 升级到 MySQL 8.0.26 为例。首先,你需要确保自己的系统中已经部署好了MySQL 5.7.35 的数据库,添加一些测试数据来测试升级过程的数据完整性(本文中使用上文升级后的 .7 数据库,测试数据同上)。备份的过程此处省略,直接从新版本数据库的部署开始。
# 1. 升级前预检查
# ① 安装 mysqlsh 工具 → 需要与升级版本对应
[root@cool ~]$ wget https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz
[root@cool ~]$ tar xf mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz -C /mysql/
[root@cool ~]$ ln -s /mysql/mysql-shell-8.0.26-linux-glibc2.12-x86-64bit/ /usr/local/mysqlsh
[root@cool ~]$ vim /etc/profile
export PATH=$PATH:/usr/local/mysqlsh/bin
[root@cool ~]$ . /etc/profile
[root@cool ~]$ mysqlsh -V
mysqlsh Ver 8.0.26 for Linux on x86_64 - for MySQL 8.0.26 (MySQL Community Server (GPL))
# ② 低版本数据库中新建测试用户
[root@cool ~]$ mysql
Server version: 5.7.35 MySQL Community Server (GPL)
mysql> create user upgrade_user@'%' identified by '12345';
mysql> grant all on *.* to upgrade_user@'%';
# ③ 进行升级前预检查(ip为你的数据库主机ip)
[root@cool ~]$ mysqlsh upgrade_user:12345@'ip:3306' -e "util.checkForServerUpgrade()" >>/tmp/upgrade-test.log
WARNING: Using a password on the command line interface can be insecure.
[root@cool ~]$ tail -5 /tmp/upgrade-test.log
Errors: 0
Warnings: 1
Notices: 1
No fatal errors were found that would prevent an upgrade, but some potential issues were detected. Please ensure that the reported issues are not significant before upgrading.
# 没有 errors 即可,一般会有一条 warning ,即密码插件的不兼容问题
# 2. 部署 MySQL 8.0.26 数据库软件
[root@cool ~]$ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
[root@cool ~]$ tar xf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz -C /mysql/
[root@cool ~]$ ln -s /mysql/mysql-8.0.26-linux-glibc2.12-x86_64/ /usr/local/mysql8
# 3. 平滑关闭 MySQL 5.7.35 数据库
mysql> set global innodb_fast_shutdown=0 ;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@innodb_fast_shutdown;
+-------------------------------------+
| @@innodb_fast_shutdown |
+-------------------------------------+
| 0 |
+-------------------------------------+
mysql> shutdown;
[root@cool ~]$ netstat -lntup | grep 3306
# 4. 更改配置文件(basedir、默认密码插件),已安全方式启动新版本数据库,挂低版本数据库数据,启动过程自动升级
[mysqld]
user=mysql
basedir=/usr/local/mysql8
datadir=/data/3306/mysql
socket=/tmp/mysql.sock
port=3306
default_authentication_plugin=mysql_native_password
[mysql]
socket=/tmp/mysql.sock
[root@cool ~]$ /usr/local/mysql8/bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking &
[root@cool ~]$ ll /tmp/mysql.sock
srwxrwxrwx 1 mysql mysql 0 Nov 3 16:24 /tmp/mysql.sock
# 5. 正常重启数据库
[root@cool ~]$ /usr/local/mysql8/bin/mysqladmin -S /tmp/mysql.sock shutdown
[root@cool ~]$ /usr/local/mysql8/support-files/mysql.server start
Starting MySQL. SUCCESS!
# 6. 验证
[root@cool ~]$ /usr/local/mysql8/bin/mysql
Server version: 8.0.26 MySQL Community Server - GPL
mysql> select * from inplace_test.test;
+-------+
| name |
+-------+
| linus |
| zeus |
+-------+
# 7. 修改环境变量配置(之前的为 MySQL 5.7.35 的配置),方便服务的启停
[root@cool ~]$ vim /etc/profile
export PATH=$PATH:/usr/local/mysql8/bin
[root@cool ~]$ . /etc/profile
[root@cool ~]$ rm -rf /etc/init.d/mysqld
[root@cool ~]$ systemctl daemon-reload
[root@cool ~]$ cp /usr/local/mysql8/support-files/mysql.server /etc/init.d/mysqld
[root@cool ~]$ service mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
[root@cool ~]$ mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.26 MySQL Community Server - GPL
复制代码
mysqlsh 工具
至此,MySQL 的升级完成。
关于密码插件的说明:8.0 版本之前,MySQL 的加密插件默认使用的是 mysql_native_password。8.0 及其之后的版本,加密插件默认使用的是caching_sha2_password。新插件可能造成某些低版本的网站连接不到数据库,为了兼容网站可以修改其加密插件为 mysql_native_password,例如:
alter user linus@'localhost' identified with mysql_native_password by 'linus';
复制代码




近期评论