MySQL升级方法概述总结
概述
升级方法
1、从MySQL 8.0.16开始,做好备份,然后安装新软件,最后直接启动即可。
2、低于 MySQL 8.0.16
的版本,需要执行 mysql_upgrade
,以升级系统库
为什么升级MySQL
基于安全考虑
基于性能和稳定性考虑:mgr复制 ,并行复制writeset 等功能,性能提升
新的功能:Hash join ,窗口函数,DDL即时,json 支持
原始环境中版本太多,统一版本
8.0版本基本已到稳定期,可以大量投入生产环境中
升级前注意事项
注意字符集设置。为了避免新旧对象字符集不一致的情况,可以在配置文件将字符集和校验规则设置为旧版本的字符集和比较规则。
密码认证插件变更。为了避免连接问题,可以仍采用5.7的mysql_native_password认证插件。
sql_mode支持问题。8.0版本sql_mode不支持NO_AUTO_CREATE_USER,要避免配置的sql_mode中带有NO_AUTO_CREATE_USER。
是否需要手动升级系统表。在MySQL 8.0.16版本之前,需要手动的执行mysql_upgrade来完成该步骤的升级,在MySQL 8.0.16版本及之后是由mysqld来完成该步骤的升级。
高可用架构下 需要先升级从库,再逐步升级主库。
升级路径
- 仅支持 GA 版本之间的升级
- MySQL 5.7 GA 版本链接: https://dev.mysql.com/downloads/mysql/5.7.html
- MySQL 8.0 GA 版本链接:https://dev.mysql.com/downloads/mysql/8.0.html
MySQL 5.7
->MySQL 8.0
,建议升级至5.7
最新版,再升级8.0
。MySQL 5.6
->MySQL 5.7
->MySQL 8.0
,不支持跨大版本升级。MySQL 8.0.x
->MySQL 8.0.z
,支持跨小版本升级。
MySQL Shell 升级检查
可通过 MySQL Shell 工具进行版本升级检查,以验证是否满足升级条件。该工具适用于 MySQL5.7 和 MySQL 8.0 的所有 GA 版本。
官方文档链接:https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-upgrade.html
MySQL Shell 安装
MySQL Shell 下载链接:https://dev.mysql.com/downloads/shell/
- 安装 MySQL Shell
1 2 3 4 5 6 7 8 | sudo wget https://cdn.mysql.com//Downloads/MySQL-Shell/mysql-shell-8.0.30-linux-glibc2.12-x86-64bit.tar.gz sudo tar -xzvf mysql-shell-8.0.30-linux-glibc2.12-x86-64bit.tar.gz sudo mv mysql-shell-8.0.30-linux-glibc2.12-x86-64bit /usr/local/ sudo ln -s /usr/local/mysql-shell-8.0.30-linux-glibc2.12-x86-64bit /usr/local/mysql-shell sudo chown -R /usr/local/mysql-shell* cat ~/.bash_profile export PATH=$PATH:/usr/local/mysql-shell/bin |
- 运行 MySQL Shell
可直接执行 mysqlsh,进入 cli 交互模式,在执行升级检查时,指定 用户名/密码
。
1 2 3 4 5 6 7 8 9 | [mysql@localhost ~]$ mysqlsh MySQL Shell 8.0.30 Copyright (c) 2016, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type '\help' or '\?' for help; '\quit' to exit. MySQL JS > |
也可在执行 mysqlsh 时,通过参数选项-u
与-p
直接指定 用户名/密码
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | [mysql@localhost ~]$ mysqlsh -uroot -P5306 -p Please provide the password for 'root@localhost:5306': <输入 root 密码> MySQL localhost:5306 JS > \status MySQL Shell version 8.0.30 Connection Id: 10 Current schema: Current user: root@127.0.0.1 SSL: Not in use. Using delimiter: ; Server version: 5.7.22-log MySQL Community Server (GPL) Protocol version: Classic 10 Client library: 8.0.30 Connection: localhost via TCP/IP TCP port: 5306 Server characterset: utf8mb4 Schema characterset: utf8mb4 Client characterset: utf8mb4 Conn. characterset: utf8mb4 Result characterset: utf8mb4 Compression: Disabled Uptime: 11 hours 49 min 17.0000 sec Threads: 1 Questions: 371 Slow queries: 0 Opens: 616 Flush tables: 4 Open tables: 31 Queries per second avg: 0.008 |
以上信息显示,当前 MySQL 服务器版本为 MySQL 5.7.22 社区版
。
升级检查
假设数据库 192.168.3.227
版本为 5.7.22
,欲升级 8.0.30
。则可通过如下几种方式检查升级。
【注意】
通过configPath
指定配置文件my.cnf
,可以检查新、旧版本冲突的配置项。
- 以交互模式,执行升级检查。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [mysql@localhost ~]$ mysqlsh MySQL Shell 8.0.30 Copyright (c) 2016, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type '\help' or '\?' for help; '\quit' to exit. MySQL JS > # 方式1: 检查 URI root@192.168.3.227:5306 处的 MySQL 服务器以升级到 MySQL 服务器版本 8.0.30。用户密码和配置文件路径作为选项字典的一部分提供 MySQL JS > util.checkForServerUpgrade('root@192.168.3.227:5306', {"password":"root", "targetVersion":"8.0.30", "configPath":"/etc/my.cnf"}) # 方式2: 检查 URI root@192.168.3.227:5306 处的 MySQL 服务器是否升级到与当前 MySQL Shell 版本号(默认)匹配的 MySQL 服务器版本号,并返回 JSON 输出以供进一步处理: MySQL JS > util.checkForServerUpgrade('root@192.168.3.227:5306', {"password":"root", "outputFormat":"JSON", "configPath":"/etc/my.cnf"}) |
- 以命令模式,执行升级检查。
1 2 3 4 5 6 7 8 | # 方式1: 指定服务器的 my.cnf 配置文件,检查 MySQL 服务器 root@192.168.3.227:5306 是否升级到版本 8.0.30,并返回 JSON 输出: [mysql@localhost ~]$ mysqlsh -- util checkForServerUpgrade root@192.168.3.227:5306 --target-version=8.0.30 --output-format=JSON --config-path=/etc/my.cnf # 方式2:将连接信息用大括号括起来,作为 mysqlsh 的连接选项,检查 MySQL 服务器是否升级到版本 8.0.30,并返回 JSON 输出 [mysql@localhost ~]$ mysqlsh -- util check-for-server-upgrade { --user=root --host=192.168.3.227 --port=5306 } --target-version=8.0.30 --output-format=JSON --config-path=/etc/my.cnf # 方式3:使用套接字连接 MySQL 5.7 服务器,检查其是否能升级到与 MySQL Shell 匹配的 MySQL 服务器版本。 [mysql@localhost ~]$ mysqlsh --socket=/mysql/socket/mysql.sock --user=root -e "util.checkForServerUpgrade()" |
- 关于升级检查工具的帮助
1 | mysqlsh> util.help("checkForServerUpgrade") |
【权限需求】
版本号低于
MySQL Shell 8.0.20
时,用于运行升级检查器实用程序的用户帐户必须具有 ALL 权限。从MySQL Shell 8.0.21
开始,用户帐户需要RELOAD
、PROCESS
和SELECT
权限。
调整冲突项
根据升级检查结果,手动纠正影响升级的配置项,其中可能需要关注的注意事项如下:
- MySQL 5.7 的默认身份验证插件为
mysql_native_password
,而 MySQL 8.0 的默认身份验证插件变更为cache_sha2_password
。即 MySQL 全局系统变量default_authentication_plugin
的默认值从mysql_native_password
变为caching_sha2_password
。该变化仅影响升级后的新建用户,不影响存量用户。
若启用新的验证插件,则需要通过如下命令修改用户密码。
1 | ALTER USER <用户名> IDENTIFIED WITH caching_sha2_password BY '<密码>'; |
- 如想继续保持适用
mysql_native_password
身份验证插件,可为 MySQL 服务器的配置文件(Linux 系统默认位置为/etc/my.cnf
)中增加如下参数。
1 2 | [mysqld] default_authentication_plugin=mysql_native_password |
【注意】
在 MySQL 8.0 版本中,用户验证方式配置项default_authentication_plugin
已废弃。替换为authentication_policy
- 需将分区表的存储引擎调整为 InnoDB
若数据库中存在存储引擎不是 InnoDB 的分区表,需将这些分区表的存储引擎调整为 InnoDB。命令语法如下:
1 | ALTER TABLE <表名> ENGINE=InnoDB; |
- 默认字符集已从
latin1
更改为utf8mb4
。将影响如下系统变量:character_set_server
和character_set_database
系统变量的默认值已从latin1
更改为utf8mb4
。collation_server
和collation_database
系统变量的默认值已从latin1_swedish_ci
更改为utf8mb4_0900_ai_ci
。
- 从 MySQL 8.0.11 开始,禁止使用与服务器初始化时使用的设置不同的
lower_case_table_names
设置来启动服务器。
更多需注意的事项,参考链接:https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html
5.5.62升级到5.7.30示例
1、set global innodb_fast_shutdown=0;
2、关闭MySQL
3、修改my.cnf参数文件,例如basedir参数
4、使用新版本mysqld_safe启动MySQL,观察错误日志
5、若新版本小于8.0.16,那么需要使用 mysql_upgrade -uroot -p123456,观察错误日志