Mysql数据库主从同步小版本升级方案

如果下文中有任何问题敬请更新指证。

1.升级方式说明

MySQL升级的两种方式:

  • in-place upgrade:

适合小版本的升级。
即:关闭当前的MySQL,替换当前的二进制文件或包,在现有的数据目录上重启MySQL,并运行mysql_upgrade.
特点:不改变数据文件,升级速度快;但不可以跨操作系统,不可以跨大版本(5.5—>5.7就不行)。

  • logical upgrade:

适合不同操作系统的MySQL升级,大版本之间的升级。
即:使用mysqldump 或 mydumper 导出导入数据,实现版本的升级。
特点:可以跨操作系统,跨大版本;但升级速度慢,容易出现乱码等问题。
本次升级版本为:

现有版本

升级版本

Mysql 5.7.23

Mysql 5.7.36

Mysql 8.0.20

Mysql 8.0.27

本次升级版本为小版本范围内的升级,因此采用“in-place upgrade”的升级方式进行升级。

2.升级步骤

从库

2.1 预校验

5.7小版本升级,参数的变动列表可以参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/added-deprecated-removed.html

经过对比基于Mysql 5.7.23升级到Mysql5.7.36没有参数Removed和Deprecated。
5.7版本通过mysql_upgrade进行数据校验和修复。

以前在升级MySQL5.6、5.7的时候,通常我们会查阅官方文档,看看新老版本之间有什么变化,比如参数的变动,然后根据变动我们调整对应的参数,现在我们有了新的选择 MySQL Shell, 它让升级检查更加简单,容易,方便,快捷。如果系统未安装Mysql Shell需准备好相关安装包并进行安装。

#本地测试例子:
[root@localhost bin]# ./mysqlsh -- util checkForServerUpgrade  root@localhost:3306 --target-version=8.0.27 --output-format=JSON --config-path=/etc/my.cnf
{
    "serverAddress": "localhost:3306",
    "serverVersion": "8.0.20 - MySQL Community Server - GPL",
    "targetVersion": "8.0.27",
    "errorCount": 0,
    "warningCount": 0,
    "noticeCount": 0,
    "summary": "No known compatibility errors or issues were found.",
    "checksPerformed": [
        {
            "id": "checkTableOutput",
            "title": "Issues reported by 'check table x for upgrade' command",
            "status": "OK",
            "detectedProblems": []
        }
    ],
    "manualChecks": []
}

运行后即可直接看结果,按照输出的提示信息进行升级前各项的检查工作。

2.2新版本mysql环境准备

  1. 解压mysql 8.0.27
tar -zxvf mysql-commercial-8.0.27-el7-x86_64.tar.gz -C /software/
  1. 替换软链接/替换mysql程序二进制文件
    没有软连接的话,将原mysql跨库更新 mysql跨版本升级_databasedataDir数据目录在/usr/local/mysql目录下请保留$dataDir数据目录。
[root@hhdb software]# unlink mysql
[root@hhdb software]# ln -s mysql-commercial-8.0.27-el7-x86_64 /usr/local/mysql
  1. 修改目录权限
chown -R mysql.mysql mysql-commercial-8.0.27-el7-x86_64

2.3停从库流量和实例并备份数据

1.检查表是否损坏

mysql> select * from information_schema.tables where TABLE_COMMENT like '%repair%';
Empty set (0.06 sec)

2.检查从库主从是否正常及有无延迟

mysql> show slave status \G

3.停从库流量及io_thread

mysql> stop slave io_thread;
Query OK, 0 rows affected (0.03 sec)

4.数据全部落盘
待slave sql_thread完全应用后全部落盘

mysql> set global innodb_fast_shutdown=0;
Query OK, 0 rows affected (0.00 sec)

5.停从库

mysql> shutdown;
Query OK, 0 rows affected (0.01 sec)

6.备份数据

通过 cp datadir 目录的方式来备份
cp –r  /oradata/data /backup/

2.4启动新版本MySQL

1.检查my.cnf配置文件
1.1 检查basedir指向位置是否正确
1.2 super_read_only 如果开启的话需要临时关闭,后期升级数据字典时候需要写入数据

2.检查启动脚本basedir指向是否正确,检查环境变量路劲配置是否正确。

3.启动mysql
service mysqld start

4.查看升级后的版本(8.0.16后版本到此升级成功)
mysql> select version();
±------------------+
| version() |
±------------------+
| 8.0.27-commercial |
±------------------+
1 row in set (0.00 sec)

2.5运行 mysql_upgrade 升级数据字典(MySQL 8.0.16之前的版本需要执行该步骤)

1.运行 mysql_upgrade
出现Upgrade process completed successfully字样表示成功
如果中间出现错误打断,需要再次运行

mysql_upgrade -uroot -S /tmp/mysql.sock

2.6升级后操作

1.检查主从状态及延迟情况

mysql> show slave status \G

主库

3.1.停主库流量

3.2.待主从数据一致后进行主从切换

3.3.原主库重复上述(2.1~2.5)步骤升级