iaun
iaun
发布于 2025-05-01 / 173 阅读
17
0

Docker MySQL 5.7升级到8

不知道是不是历史原因,我居然还在用MySQL 5.7,为了得到更好的性能和安全性提升(可能),决定升级到MySQL 8

由于是个人应用,本文的停机时间是无限制……

停止应用

首先停止其他连接到这个DB的应用,以确保数据一致性

从MySQL 5.7备份数据

使用mysqldump从5.7的数据库备份数据,由于我是用docker,所以指令如下:

docker exec -it mysql mysqldump -u root -p数据库密码 -R --databases 数据库名称 > mysql5.sql

e.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

125b145004615e3999bdba6d864c029.png

启动MySQL 8 Server

前提和假设

  1. 假设你的所有资料存放在/root/docker/mysql

  2. 在pw.secret文件中设定你MySQL的root密码

  3. 有一个data8的空目录用于存放数据库资料

  4. 有一个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
  1. 有一个名字是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

  1. 将备份文件复制到MySQL8容器内部,或放在资料目录中

cp mysql5.sql data8/
  1. 通过mysql连入MySQL 8服务器

docker exec -it mysql8 mysql -uroot -p
  1. 执行还原(注意要是容器内的文件位置)

mysql> source /var/lib/mysql/mysql5.sql;

设定应用系统

可以将应用系统的DB连线切换到MySQL 8测试是否有问题


评论