本文测试了当前(2021年4月26日)mysql社区版本最新的8.0.24版本的升级过程,总体思路是,在一台主机上安装两套mysql数据库,采用逻辑导入导出的方式进行数据升级,好处是能保留老库,便于回退,这很关键。
本次升级先在windows下进行测试,下一篇文章在linux下进行升级测试,linux与windows操作大同小异。
一、查看当前版本
E:\mysql-8.0.18-winx64\bin>mysql -V
mysql Ver 8.0.18 for Win64 on x86_64 (MySQL Community Server - GPL)
二、下载mysql指定版本
https://dev.mysql.com/downloads/mysql/,我们下载最新的8.0.24版本
三、解压到一个新目录
旧目录:E:\mysql-8.0.18-winx64
新目录:D:\mysql-8.0.24-winx64
四、安装新版本数据库
(1)将旧库my.init文件拷贝到新目录下并修改配置
主要是设置basedir及datadir,要区别于老版本数据库,端口设置先设置为3308
basedir =D:\mysql-8.0.24-winx64
# 设置 mysql数据库的数据的存放目录
datadir =D:\mysql-8.0.24-winx64\data
# 设置3308端口
port = 3308
(2)初始化新版本数据库
mysqld --defaults-file=D:\mysql-8.0.24-winx64\my.ini --initialize --console
指定defaults-files很重要,否则无法初始化。
如果在运行是报错:
D:\mysql-8.0.24-winx64\bin>mysqld --defaults-file=D:\mysql-8.0.24-winx64\my.ini
--initialize --console
mysqld: [ERROR] Failed to open required defaults file: D:\mysql-8.0.24-winx64\bi
n\
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
Windows cmd以管理员身份运行,并且,在=后面,路径前不要有任何空格,我们常常将:
mysqld --defaults-file=D:\mysql-8.0.24-winx64\my.ini
--initialize --console
写成:
mysqld --defaults-file= D:\mysql-8.0.24-winx64\my.ini
--initialize --console
看上去没有任何区别?就是在=后面,D前面多了个空格,就无法导出数据,一定要注意。
正常初始化,会输出初始密码:
D:\mysql-8.0.24-winx64\bin>mysqld --defaults-file=D:\mysql-8.0.24-winx64\my.ini
--initialize --console
2021-04-26T02:44:40.826421Z 0 [System] [MY-013169] [Server] D:\mysql-8.0.24-winx
64\bin\mysqld.exe (mysqld 8.0.24) initializing of server in progress as process
12952
2021-04-26T02:44:40.860423Z 1 [System] [MY-013576] [InnoDB] InnoDB initializatio
n has started.
2021-04-26T02:44:42.189092Z 1 [System] [MY-013577] [InnoDB] InnoDB initializatio
n has ended.
2021-04-26T02:44:45.689506Z 6 [Note] [MY-010454] [Server] A temporary password i
s generated for root@localhost: Y;XkoL3iG(ma
注意看密码:Y;XkoL3iG(ma
(3)安装一个新MYSQL服务
mysqld install MySQL8024 --defaults-file=D:\mysql-8.0.24-winx64\my.ini
D:\mysql-8.0.24-winx64\bin>mysqld install MySQL8024 --defaults-file=D:\mysql-8.0
.24-winx64\my.ini
Service successfully installed.
在windows下看到一个新服务:

(4)启动服务
D:\mysql-8.0.24-winx64\bin>net start MySQL8024
发生系统错误 193。
*** 不是有效的 Win32 应用程序。
注意查看:
D:\mysql-8.0.24-winx64\bin下有一个mysqld的0字节文件,把该文件删除即可启动:
D:\mysql-8.0.24-winx64\bin>net start MySQL8024
MySQL8024 服务正在启动 .
MySQL8024 服务已经启动成功。
服务启动成功
(5)修改root密码
这样直接登录是不行的:
D:\mysql-8.0.24-winx64\bin>mysql -u root -p
Enter password: ************
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: Y
ES)
这样登录的是老库,默认是3306端口,采用如下命令:
D:\mysql-8.0.24-winx64\bin>mysql -P 3308 -u root -p
Enter password: ************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.24
Copyright (c) 2000, 2021, 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 '\h' for help. Type '\c' to clear the current input statement.
mysql>
修改密码登录:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxxxx';
Query OK, 0 rows affected (0.00 sec)
使用Navicat登录数据库:

五、数据导入导出
(1)导出老数据库
导一个库:
mysqldump -P3306 -uroot -ptxtp_2020 ftco> D:\ftco.sql
导出多个库:
mysqldump -P3306 -uroot -p --databases ftco lining> D:\ftco.sql
D:\mysql-8.0.24-winx64\bin>mysqldump -P3306 -uroot -p --databases ftco lining>
D:\ftco.sql
Enter password: *********
D:\mysql-8.0.24-winx64\bin>
注意:后面不要带分号,带分号无法导出:
(2)导入数据库
等等,导出了就要导入,着急了点,为什么,因为用户还没有,按照《六、处理用户及权限》,先按照原库建用户,否则导入会报错,用户需要先建上。
正常导入如下:
D:\mysql-8.0.24-winx64\bin>mysql -P3306 -u root -p < D:\ftco.sql
Enter password: *********
D:\mysql-8.0.24-winx64\bin>
六、处理用户及权限
Mysql数据库用户在数据库之上,与数据库是多对多关系。
在新库上创建SQL:
CREATE USER 'user'@'%' IDENTIFIED BY 'yourpasswd';
注意,这只是个示例,用户的作用域一定要定义好,否则导入数据时容易报错。
在老库上上将用户权限全部捞出:
SELECT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS query FROM mysql.user;
在老库执行对应用户的SHOW GRANTS FOR命令,获取详细权限,然后在新数据库赋权即可。
七、停止老库,新库修改端口为3306
进行完数据比对后,老库可以停止了。
(1) 停止老数据库
停止服务即可,且改为手动启动。

(2) 修改新数据库端口
将my.ini中的端口修改为3306,然后重启服务即可。
或者:
老库不停止,修改一个端口启动,便于回查,新老库在一台机器上并行一段时间后,再将老库彻底停止并删除:





