不知道是不是历史原因,我居然还在用MySQL 5.7,为了得到更好的性能和安全性提升(可能),决定升级到MySQL 8
由于是个人应用,本文的停机时间是无限制……
停止应用
首先停止其他连接到这个DB的应用,以确保数据一致性
从MySQL 5.7备份数据
使用mysqldump从5.7的数据库备份数据,由于我是用docker,所以指令如下:
docker exec -it mysql mysqldump -u root -p数据库密码 -R --databases 数据库名称 > mysql5.sqle.g.
docker exec -it mysql mysqldump -u root -p123456 -R --databases halo wordpress > mysql5.sql如果不是在docker,从mysqldump开始即可
(可选) 替换还在用utf8而不是utf8mb4的数据库和表,以下方法有点暴力,请结合实际情况
sed -i 's#utf8 #utf8mb4 #g' mysql5.sql启动MySQL 8 Server
下载MySQL 8
docker pull mysql:8
启动MySQL 8 Server
前提和假设
假设你的所有资料存放在/root/docker/mysql
在pw.secret文件中设定你MySQL的root密码
有一个data8的空目录用于存放数据库资料
有一个mysql.cnf文件存放MySQL配置:
[mysql]
default-character-set = utf8mb4
[mysql.server]
default-character-set = utf8mb4
[mysqld_safe]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
[mysqld]
character_set_server = utf8mb4有一个名字是local的docker网络
启动MySQL Server
docker run --name mysql8 \
-e MYSQL_ROOT_PASSWORD_FILE=/pw.secrets \
-e LANG=en_US.utf-8 \
-v /root/docker/mysql/data8:/var/lib/mysql \
-v /root/docker/mysql/pw.secrets:/pw.secrets \
-v /root/docker/mysql/mysql.cnf:/etc/mysql/mysql.conf.d/mysql.cnf \
--network local \
--restart always \
-p 3306:3306 \
-d \
mysql:8 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci还原数据到MySQL 8
将备份文件复制到MySQL8容器内部,或放在资料目录中
cp mysql5.sql data8/通过mysql连入MySQL 8服务器
docker exec -it mysql8 mysql -uroot -p执行还原(注意要是容器内的文件位置)
mysql> source /var/lib/mysql/mysql5.sql;设定应用系统
可以将应用系统的DB连线切换到MySQL 8测试是否有问题