MySql--从Mysql5.7升级到Mysql8
摘要
-
MySql知识点介绍:从Mysql5.7升级到Mysql8
-
本文基于
mysql-8.0.30
,https://dev.mysql.com/doc/refman/8.0/en/ -
2024-04-30,mysql-8.4.0 LTS版本发布,本文在将mysql从5.7.44升级到8.0.30的基础上,升级到8.4.0 LTS版本。mysql-8.4.0 LTS官方文档
从Mysql5.7升级到Mysql8
升级前,请先备份数据库,防止升级失败
mysqlsh
-
在mysql8以前,升级mysql还是比较麻烦的,除了要处理不兼容的参数和语法外,而且不支持跨版本的升级,比如5.5必须先升级到5.6,然后再升级到5.7。
-
mysqlsh
是mysql官方提供的一个命令行工具,是MySQL的高级客户端和代码编辑器。其不仅可以像使用mysql
命令一样执行sql,而且还支持js脚本、python脚本,等等,具体可以查看官网。 -
mysqlsh
的众多功能之一就是可以检测当前版本是否可以升级到与当前mysqlsh
相同的版本。 -
如果你当前的版本是5.6,你甚至都不需要先将数据库升级到5.7就可以直接升级到8.0,因为mysql8.0支持mysql5.5到mysql8.0的升级。
安装mysqlsh
-
选择需要的版本进行下载,我这里选择下载的版本是linux的8.0.30版本
-
下载后解压即可
检查是否可以升级
1 | # mysqlsh8.4以前可以使用如下方法,因为其默认就是执行js代码 |
检查输出信息说明
1 | WARNING: Using a password on the command line interface can be insecure. |
-
可以看到,其检查的数据库版本是5.7.44,其检查是否可以升级到8.0.30
-
检测项共有21个,其中警告有98个,错误有0个,注意,如果有错误,则不能直接升级,需要解决错误问题,否则升级会失败。至于警告暂时可以不处理。
-
警告集中体现在字符集上,5.7.44的字符集是utf8(实际就是utf8mb3),而mysql8以后的默认字符集是utf8mb4,这个警告不影响升级,可以忽略。如果需要修改字符集到utf8mb4,需要注意原来的字段字符串长度是否符合要求,因为utf8mb4是4字节,而utf8mb3是3字节。另外如果使用了存储过程也要注意参数的长度是否符合要求。
-
这里说一下
default_authentication_plugin
,mysql8.0.13开始,默认的认证插件是caching_sha2_password
,而之前是mysql_native_password
,这个警告虽然可以忽略,但是升级后建议尽快将认证插件修改为caching_sha2_password
,因为mysql_native_password
的认证方式存在安全漏洞,可以参考官方文档。另外,从mysql8.4.0开始,不再支持default_authentication_plugin
,若要使其支持mysql_native_password
插件,8.4.0开始为我们增加了一个新的配置项mysql-native-password
,在[mysqld]中配置mysql-native-password=ON
即可开启支持,默认为OFF
。 -
另外还要注意
关键词
和保留词
的问题,mysql8.0以后,又增加了很多个关键词
和保留词
,如果检查到则需要修改一下,不然升级会失败。即便表和字段里没有使用这些保留字,也要检查一下业务代码中是否有使用。关于关键词
和保留词
可以查看官网Keywords and Reserved Words,相比于MySQL 5.7,增加了大约130个,同时也减少了6个。这里建议设置表名称和字段名称时,可以为其设置前缀,比如:表名称为:t_user、字段名称为:f_user_id
-
还有一点需要注意,Mysql8修改了很多参数的默认值,具体可以查看官方网站的说明,如果你不希望使用默认值,则需要将其配置到配置文件中,这里强调一下,重点关注
character_set_server
和collation_server
这两个参数。所有的参数配置参考官方文档
关于字符集还想多说两句
- mysql8的
character_set_server
默认是utf8mb4
,collation_server
默认是utf8mb4_0900_ai_ci
- 如果创建数据库或者表的时候没有指定字符集,则默认使用
character_set_server
和collation_server
的默认值 - 此时新创建的表就有可能与旧表字符集不一致,关联查询时就有可能导致错误或因为需要进行字符集转换导致查询性能下降。
- 最好的方式是创建数据库或表时明确指定字符集,或者在
my.cnf
配置文件中配置character_set_server
和collation_server
的值。
升级数据库的过程
-
因为我们要升级到mysql8.0.30,所以需要先下载并安装mysql8.0.30
-
关闭mysql5.7的数据库
-
备份数据目录(一定要做好备份,升级后不能降级的)
-
根据检查提示修改
my.cnf
配置文件中的配置(主要是不兼容的配置,如果检查提示没有则不需要修改) -
非常重要的一步,就是修改
my.cnf
配置文件中的basedir
,将其指向mysql8.0.30的安装目录 -
直接使用mysql8.0.30的命令启动数据库,启动过程中就会完成数据库的升级,可以通过mysql的日志文件(log-error)查看升级情况
-
升级完成后尽快使用新的密码认证插件修改密码,注意要修改所有用户的密码,包括root用户
1 | mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '123456'; |
小贴士
- mysql8.4.0相比于之前的版本变化比较大,具体可以查看官网文档
- mysql5.7不要直接升级到8.4.0及以后的版本,可以先升级到8.0.30,然后再升级到8.4.0
- 升级到8.4.0前依旧要先使用
mysqlsh
检查是否可以升级,注意要下载对应的mysqlsh
版本 - 升级前要先检查是否所有用户的密码插件都是
caching_sha2_password
,如果没有则需要修改 - 升级前要先检查
my.cnf
中是否配置了default_authentication_plugin,如果有则删除,如果必须要配置mysql_native_password
认证插件,则需要配置mysql-native-password=ON
- 修改
my.cnf
中的basedir
使其指向8.4.0的安装目录 - 使用8.4.0的命令启动mysql,检查日志是否有错误。
mysql5.7.44升级到8.0.30,再升级到8.4.0的完整过程
-
准备好各个版本的mysql和mysqlsh
1 | # 目录结构 |
-
mysql5/my.cnf
配置
1 | [mysql] |
5.7.44升级到8.0.30
-
升级检查
1 | # 升级检查 |
-
看到没有error,开始升级
1 | # 关闭数据库 |
-
查看启动日志,没有错误说明升级成功
1 | 2024-05-09T06:48:50.524705Z 0 [Warning] [MY-011068] [Server] The syntax 'expire-logs-days' is deprecated and will be removed in a future release. Please use binlog_expire_logs_seconds instead. |
根据日志提示我们应该修改两个配置参数,未来将不可用了,不过这里暂且先不去管它,等检查通不过了再进行处理就可以。
1 | 1.The syntax 'expire-logs-days' is deprecated and will be removed in a future release. Please use binlog_expire_logs_seconds instead. |
-
修改密码插件,这个步骤很重要
1 | # 登录 |
8.0.30升级到8.4.0
-
同样先用8.4.0的mysqlsh检查一下
1 | # 升级检查 |
-
看到了两处错误,就是我们上面说的那两个参数需要修改,修改
./mysql8.0.30/my.cnf
1 | # binlog日志过期时间,单位秒,过期的binlog日志会被删除,保证磁盘空间,这里设置为10天,mysql8以前的版本这个参数是expire-logs-days,单位是天 |
-
修改后要重启数据库
1 | # 关闭数据库 |
-
再次进程升级检查
1 | # 升级检查 |
-
此时看到通过检查,关闭数据库直接升级吧
1 | # 关闭数据库 |
-
查看日志,依旧是没有错误,升级很顺利
1 | 2024-05-09T07:21:55.325669Z 0 [System] [MY-015015] [Server] MySQL Server - start. |
从日志看到’binlog_format’也要不支持了,不过先不用管,等到不支持了再处理吧。
如果升级到8.4之前忘记修改密码插件了,则升级之后就不能正常登录了,此时怎么办呢?
-
升级到8.4之前忘记修改密码插件了,则升级之后登录数据库会报告如下错误
1 | ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded |
-
解决方案
在mysql的配置文件中增加mysql-native-password=ON
,然后重启数据库即可,但还是建议尽快修改用户的认证插件为caching_sha2_password
吧,毕竟这个认证方式存在安全漏洞。
小贴士
笔者之前没有注意到8.4.0新增的mysql-native-password=ON
这个配置,所以采用了如下重置密码的方式进行插件修改,留个纪念吧。
1 | # kill掉mysql服务 |