MySQL之Inplace Upgrade升级原理与实践

MySQL之Inplace Upgrade升级原理与实践

第一章 MySQL-INPLACE就地升级原理过程

INPLACE就地升级MySQL过程原理:

  • 关闭原数据库(业务挂维护页)
  • 备份原数据库数据
  • 安装新版本软件
  • 使用新版本软件旧版本数据启动
  • 升级系统表
  • 正常重启数据库
  • 验证各项功能是否正常
  • 恢复业务

MySQL官方升级指导
注意:MySQL升级只是升级系统表,升级时间和数据量无关。另外需要说明一点,数据库升级尽量使用Mergeing迁移升级(主从迁移、备份迁移),就地升级的风险较大,必须想好回退方案,且回退过程及其繁琐麻烦,生产中不推荐这种方式升级!

第二章 MySQL升级注意事项

  • 升级之前,先备份,备份,备份(热冷备份都可以)
  • 仅支持GA版本之间升级
  • 回退方案制定好,每升级一个版本进行备份一次,特别是升级到8.0(5.7升级到8.0无法就地回退)
  • 升级过程中尽量降低业务影响时间
  • 业务低谷期进行升级

注意: 以上均是指MySQLGA版本,从非GA版本GA版本的升级并不支持,譬如5.6.9到5.6.10,因为前者并不是一个GA版本

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.

第三章 实战演练环境准备

1.虚拟机环境

$ hostname -I 
  10.0.1.51
$ hostname
  db01
$ cat /etc/redhat-release 
  CentOS Linux release 7.7.1908 (Core)

2.虚拟机优化

参考:https://www.pingface.com/2020/04/mysqlmulti.html

3.实战演练需求说明

  • 将MySQL5.6.46升级到MySQL5.7.28
  • 将MySQL5.7.28升级到MySQL8.0.18

本实验最终目的是将MySQL5.6.46升级到MySQL8.0.18。

注意: GA版本之间的升级流程

  • 5.7 ---> 8.0
    先将MySQL5.7升级到最新版本,再将5.7的最新版本升级到MySQL8.0的最新版本。
  • 5.6 ---> 5.7
    先将MySQL5.6升级至最新版,再升级到5.7指定版,一般是最新。
  • 5.5 ---> 5.7
    先将MySQL5.5升级至最新版本,再升级到5.6最新版本,最后将5.6最新版本升级5.7最新版本。

4.一台机器部署MySQL5.6、5.7和8.0三个实例

本实验需要在同一台机器上同事部署MySQL5.6、5.7以及8.0三个实例。
部署过程请参考:https://www.pingface.com/2020/04/mysqlmulti.html

第四章 实战预演MySQL-INPALCE就地升级5.6到5.7

1.停机备份MySQL5.6

  • 优雅停库
$ echo "innodb_fast_shutdown=0 " >>/data/3316/my.cnf
$ systemctl stop mysqld3316
  • 备份数据目录
$ cp -r /data/3316/data /data/3316/data.56

2.安装MySQL5.7和8.0

安装部署过程参考上述博客。

3.使用MySQL5.7挂5.6的数据目录并启动

  • 修改MySQL5.6配置basedir指向MySQL5.7
# **指定basedir为MySQL5.7软件安装目录**
$ cat >/data/3316/my.cnf<<EOF 
[mysqld]
user=mysql
basedir=/data/app/mysql5728
datadir=/data/3316/data
socket=/data/socket/mysql3316.sock
port=3316
server_id=16
innodb_fast_shutdown=0
EOF
  • 安全模式启动MySQL5.7
$ --defaults-file=/data/3316/my.cnf --skip-grant-tables --skip-networking &
$ ps aux|grep mysql5728

4.升级系统表

$ /data/app/mysql5728/bin/mysql_upgrade -S /data/socket/mysql3316.sock --force 
# 屏幕输出一列OK,最后两行有Upgrade process completed successfully表示升级系统表成功!

5.重启数据库到正常状态

  • 停止MySQL5.7
$ /data/app/mysql5728/bin/mysqladmin -S /data/socket/mysql3316.sock shutdown
  • 修改systemd启动脚本的启动目录
$ cat >/etc/systemd/system/mysqld3316.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/data/app/mysql5728/bin/mysqld --defaults-file=/data/3316/my.cnf
LimitNOFILE = 5000
EOF
  • systemd启动MySQL5.7
$ systemctl start mysqld3316.service
$ netstat -lntup|grep mysql
  tcp6   0    0   :::3316   :::*      LISTEN      2218/mysqld 

6.连接并查看

  • 登录查看数据库
$ /data/app/mysql5728/bin/mysql -S /data/socket/mysql3316.sock
# 登录提示:Server version: 5.7.28 MySQL Community Server (GPL)
# 查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
# sys库存在则表示升级完成,mysql-5.6没有sys库

至此,MySQL5.6.46升级到MySQL5.7.28完成。

第五章 实战预演MySQL-INPALCE就地升级5.7到8.0

在上一章我们完成了MySQL5.6.46升级到5.7.28,下面将这个MySQL5.7升级到8.0,。具体步骤和上述差不多,只不过8.0启动之后就会自动升级系统表,因此不需要mysql_upgade这一步了。

1.停库备份

$ systemctl stop mysqld3316.service 
$ ps aux|grep mysql
$ cp -r /data/3316/data /data/3316/data.57

2.修改配置

# 指定basedir为MySQL8.0软件安装目录
$ cat >/data/3316/my.cnf<<EOF
[mysqld]
user=mysql
basedir=/data/app/mysql8018
datadir=/data/3316/data
socket=/data/socket/mysql3316.sock
port=3316
server_id=16
innodb_fast_shutdown=0
EOF

3.安全模式启动MySQL8.18

$ /data/app/mysql8018/bin/mysqld_safe --defaults-file=/data/3316/my.cnf --skip-grant-tables --skip-networking &
$ ps aux|grep mysql8018

4.正常重启MySQL8.0

$ /data/app/mysql8018/bin/mysqladmin -S /data/socket/mysql3316.sock shutdown
$ cat >/etc/systemd/system/mysqld3316.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/data/app/mysql8018/bin/mysqld --defaults-file=/data/3316/my.cnf
LimitNOFILE = 5000
EOF
$ systemctl start mysqld3316.service 
$ netstat -lntup|grep 3316
  tcp6   0    0   :::3316      :::*       LISTEN      2664/mysqld

5.登录并验证

$ /data/app/mysql8018/bin/mysql -S /data/socket/mysql3316.sock
# 登录提示:Server version: 8.0.18 MySQL Community Server - GPL

# 查看数据目录,如果有如下文件则表示数据库升级成功。
$ ll /data/3316/data
-rw-rw---- 1 mysql mysql  76M 2020-04-25 01:00:05 ibdata1
-rw-r----- 1 mysql mysql  48M 2020-04-25 01:00:05 ib_logfile0
-rw-r----- 1 mysql mysql  48M 2020-04-25 00:57:01 ib_logfile1
-rw-r----- 1 mysql mysql  28M 2020-04-25 01:00:05 mysql.ibd
-rw-r----- 1 mysql mysql  12M 2020-04-25 01:00:05 undo_001
-rw-r----- 1 mysql mysql  12M 2020-04-25 01:00:05 undo_002

至此,完成MySQL5.6.46升级到最新版本的MySQL8.0.18。

第六章 MySQL5.7升级到MySQL8.0预检查

1.下载与MySQL8.0对应版本的软件

MySQL-Shell官方下载地址

$ ll mysql-shell-8.0.18-1.el7.x86_64.rpm
-rw-r--r-- 1 root root 28M 2020-04-26 18:54:14 mysql-shell-8.0.18-1.el7.x86_64.rpm

2.安装mysql-shell

$ yum -y install mysql-shell-8.0.18-1.el7.x86_64.rpm

3.授权远程用户

mysql> grant all on *.* to root@'10.0.1.%' identified by '123';

4.执行预检查

$ mysqlsh root:123@10.0.1.51:3306 -e "util.checkForServerUpgrade()"
......
Errors:   0
Warnings: 1
Notices:  0

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为0表示可以升级。