MySQL5.7升级到8.0
1.1 升级说明
MySQL升级:MySQL中不存在打补丁的说法,MySQL的所谓的补丁就是升级到一个新版本,然后把原始数据拉起来进行升级。
1.2 升级方式
1.2.1 inplace就地升级
在一台服务器上,进行原版本升级到新版本,风险较大。如果是主从环境可以先就地升级从库,然后再升级主库,滚动方式升级。
1.2.2 逻辑迁移升级
准备新的服务器,然后将数据从源库中逻辑导出,然后再导入到新的数据库中,数据量大的时候,会很慢。例如:
如果是一主一从(主->从1),在有条件的情况下,可以新准备一台服务器,采用物理备份的方式将数据备份恢复到新的服务中,然后构建从库的从库(主->从1->从2),最后将从2进行inplace方式升级,然后进行业务验证,验证完成后构建主->从2。升级从1,将(主->从1)的从1断开,从1升级完成后,构建(主->从1,主->从2),此时可以升级主库,主库停止写业务,主从关系变更为(从1->从2)原从1承担写库,待主库完成升级后重新加入主从即可。
1.2.3 前提建议
1.不管哪种方式升级,都先冷备全量数据,包括日志,便于回退。
2.升级之前一定要充分的测试验证,包含业务验证。
1.2.4 升级注意事项
1.支持GA版本之间的升级,不支持跨版本升级。
2.5.6升级到5.7时,先将5.6升级到最新版本,然后再升级到5.7
3.5.6升级5.7时,先将5.5升级到最新版本,然后从5.5的最新版本升级到5.6最新版本,最后从5.6最新版本升级到5.7最新版本
4.回退方案提前准备好,做好充足的演练;墙裂建议做好备份,尤其是升级到8.0最新版本时
5.降低停机时间,在业务不繁忙的月黑风高的后半夜升级。
6.升级过程中需要重启节点,
1.3 inplace升级过程(生产思路)
1.部署新版本的数据库软件
2. 设置参数:innodb_fast_shutdown=1,然后关闭数据库。 #表示不干净的关闭数据库,建议设置0,表示干净的关闭,该落盘的数据都落盘
3.冷备份数据库数据
4.使用新版本数据库,拉起旧版本的数据进行启动,参数(--skip-grant-tables --skip-networking
)
5.启动完成后,验证业务功能
6.恢复业务,升级完成。
1.4 5.7inplace升级到8.0
5.7.32升级到8.0.24。
注意:注意备份,冷备!
1.4.1 准备工作
1.预检查,8.0新特性:mysql8.0有检查工具:mysql-shell,升级前通过该工具检查当前版本是否具备条件升级到8.0,下载:https://downloads.mysql.com/archives/shell/
也可以yum安装:
yum install -y mysql-shell-8.0.24-1.el7.x86_64.rpm
注意:要升级到8.0的哪个版本,建议下载哪个版本的mysql-shell
2.部署mysql-shell
[root@localhost local]# tar -xf mysql-shell-8.0.24-linux-glibc2.12-x86-64bit.tar.gz
[root@localhost local]# ln -s /usr/local/mysql-shell-8.0.24-linux-glibc2.12-x86-64bit /usr/local/mysqlsh
配置环境变量:
[root@localhost local]# vim /etc/profile
export PATH=/usr/local/mysqlsh/bin:$PATH
3.检查
命令:
mysqlsh root:123@10.0.0.51:3307 -e "util.checkForServerUpgrade()"
或
mysqlsh -uroot -p123 -S /tmp/mysql.sock -e "util.checkForServerUpgrade()"
例如:
[root@localhost ~]# mysqlsh -uroot -p123 -S /tmp/mysql.sock -e "util.checkForServerUpgrade()"
输出信息省略
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.
[root@localhost ~]#
1.4.2 部署新版本的MySQL(8.0)
[root@localhost local]# tar -xf mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz
[root@localhost local]# ln -s /usr/local/mysql-8.0.24-linux-glibc2.12-x86_64/ mysql8
1.4.3 停服务
设置:
mysql> select @@innodb_fast_shutdown;
+------------------------+
| @@innodb_fast_shutdown |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.00 sec)
mysql> set global innodb_fast_shutdown=0;
Query OK, 0 rows affected (0.05 sec)
停服务:
[root@localhost ~]# /usr/local/mysql57/bin/mysqladmin -uroot -p123 -S /tmp/mysql.sock shutdown
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 14827/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 6526/master
tcp6 0 0 :::22 :::* LISTEN 14827/sshd
tcp6 0 0 ::1:25 :::* LISTEN 6526/master
[root@localhost ~]#
[root@localhost ~]# ps -ef|grep mysql
root 19027 14789 0 18:15 pts/2 00:00:00 grep --color=auto mysql
[root@localhost ~]#
1.4.4 备份数据
1.冷备份
如果数据和日志都需要备份
[root@localhost data]# cp -r 3306 3306_bak # 生产环境中建议把数据单独其他盘
1.4.5 升级
1.使用8.0版本软件挂5.7版本数据启动
命令:
/usr/local/mysql8/bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking &
例如:
[root@localhost ~]# /usr/local/mysql8/bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking &
[1] 19270
[root@localhost ~]# 2022-01-03T10:19:13.979712Z mysqld_safe Logging to '/data/3306/data/localhost.localdomain.err'.
2022-01-03T10:19:14.032070Z mysqld_safe Starting mysqld daemon with databases from /data/3306/data
[root@localhost ~]# mysql # 连接测试
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 8.0.24 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
1.4.6 重启服务
1.升级完成后,还处理安全模式,因为在拉起数据的库的时候加了参数“--skip-grant-tables --skip-networking”,此时需要重启数据库,且配置文件中的basedir可以调整成新版本的
修改配置:
[root@localhost ~]# cat /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql8 # 由之前的57版本改成8
datadir=/data/3306/data
server_id=56
port=3306
socket=/tmp/mysql.sock
default_authentication_plugin=mysql_native_password
[root@localhost ~]#
2.重启服务
[root@localhost ~]# /usr/local/mysql8/bin/mysqladmin -uroot -p123 -S /tmp/mysql.sock shutdown # 关闭服务
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# 2022-01-03T10:28:45.204366Z mysqld_safe mysqld from pid file /data/3306/data/localhost.localdomain.pid ended
[1]+ Done /usr/local/mysql8/bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking
[root@localhost ~]#
[root@localhost ~]# /etc/init.d/mysqld start # 启动
Starting MySQL. SUCCESS!
[root@localhost ~]# netstat -lntup # 8.0中MySQL的服务端口已监听
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 14827/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 6526/master
tcp6 0 0 :::3306 :::* LISTEN 19772/mysqld
tcp6 0 0 :::22 :::* LISTEN 14827/sshd
tcp6 0 0 ::1:25 :::* LISTEN 6526/master
tcp6 0 0 :::33060 :::* LISTEN 19772/mysqld
[root@localhost ~]# ps -ef|grep mysql
root 19592 1 0 18:29 pts/0 00:00:00 /bin/sh /usr/local/mysql8/bin/mysqld_safe --datadir=/data/3306/data --pid-file=/data/3306/data/localhost.localdomain.pid
mysql 19772 19592 5 18:29 pts/0 00:00:00 /usr/local/mysql8/bin/mysqld --basedir=/usr/local/mysql8 --datadir=/data/3306/data --plugin-dir=/usr/local/mysql8/lib/plugin --user=mysql --log-error=localhost.localdomain.err --pid-file=/data/3306/data/localhost.localdomain.pid --socket=/tmp/mysql.sock --port=3306
root 19818 14763 0 18:29 pts/0 00:00:00 grep --color=auto mysql
[root@localhost ~]#
1.4.7 验证
[root@localhost ~]# mysql -uroot -p123 # 登录连接
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.24 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use sysbenchdb57
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from sbtest1 limit 3; # 查询验证
+----+------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+
| id | k | c | pad |
+----+------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+
| 1 | 125 | 50739423477-59896895752-91121550334-25071371310-03454727381-25307272676-12883025003-48844794346-97662793974-67443907837 | 10824941535-62754685647-36430831520-45812593797-70371571680 |
| 2 | 4909 | 49539573485-04290970034-07007898786-76235712409-63549516919-38567537726-61464371934-73041702018-68090018268-15038237444 | 46626061119-67478129051-74112140298-15060467792-43446447884 |
| 3 | 4641 | 89102349959-12177005240-27388430679-87816169622-26709772977-24906799335-28199650567-01171976601-99969718852-51664004083 | 14337533566-48142312521-67057187519-35890983782-75782102604 |
+----+------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+
3 rows in set (0.00 sec)
1.4.8 小结
1.升级到8.0不需要手动执行mysql_upgrade命令
2.升级前一定得备份,尤其是升级到8.0,因为无法回退
3.8.0中的数据文件有undo_001/2这两个文件及mysql.ibd文件。如:
[root@localhost data]# ls -ltr undo_00*
-rw-r----- 1 mysql mysql 16777216 Jan 3 18:31 undo_002
-rw-r----- 1 mysql mysql 16777216 Jan 3 18:31 undo_001
[root@localhost data]# ls -ltr mysql.i*
-rw-r----- 1 mysql mysql 29360128 Jan 3 18:29 mysql.ibd
[root@localhost data]#
- 如果有如下报错:
[root@localhost ~]# mysql
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/local/mysql/lib/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
[root@localhost ~]#
在配置文件/etc/my.cnf中添加:
[mysqld]
default_authentication_plugin=mysql_native_password
- 升级到8.0时,注意默认密码加密方式由原来的mysql_native_password变成caching_sha2_passord,在升级前一定要进行充分的测
- 8.0有很多新特性,慢慢体验吧