前言
在《Docker系列 WordPress系列 搭建WordPress个人博客》中,我使用的MYSQL版本是5.7。不过,MYSQL推出8.0也有不少时间了。与5.6版本相比,MYSQL 8.0在JSON支持、窗口函数、公共表达式、性能/可伸缩性/安全性、InnoDB存储引擎改进、地理信息系统功能等方面有较大优化,也许有某些小伙伴想要升级到8.0使用,让WordPress可以在更好的数据库系统中运行。升级MYSQL还有更重要的意义——因为随着时间的推荐,更新版本的MYSQL数据库总会比旧版本好。这就提出了一个问题,即如何将博客数据从旧版本MYSQL迁移至新版本中。
基本原则很简单,就是将旧MYSQL容器的数据备份至一个sql文件,然后再导入新的MYSQL容器中。因此,本教程的方法适用于任何使用Docker版MYSQL的小伙伴,不管你使用的是什么应用(chevereto、nextcloud均可)。
值得注意的是,我发现MYSQL的数据很容易迁移至MariaDB,但反过来则很困难。因此,我建议大家优先选用MYSQL,然后才是MariaDB。少数情况下,某些应用(比如wallabag)是只能用MariaDB而用不了MYSQL的,大家要多加注意。
备份旧MYSQL数据
以迁移WordPress的MYSQL数据库为例
假设wordpress的docker stack的根目录为~/docker/wordpress
。我们进入该目录:
work=~/docker/wordpress; cd $work
我们可以通过该命令查看wordpress相关容器:
docker ps --format '{{.Names}}'| grep wordpress
我的输出如下:
wordpress-app
wordpress-redis
wordpress-db
这里的wordpress-db
就是我的wordpress数据库的容器名。有些小伙伴是wordpress-app-1
或者wordpress_app_1
,这个自己注意就行。如果在docker-compose.yml中指定了container_name
,一般就是该参数的值。
假设该MYSQL的root用户密码为rootpassword
,数据库名为wordpress
,我们使用以下命令备份:
# 该命令前面加空格可以保证不会在history中留下痕迹
# docker exec <mysql容器名> mysqldump -u root -p<root密码> --databases <数据库名> > test.sql
docker exec wordpress-db mysqldump -u root -prootpassword --databases wordpress > ${work}/wordpress_db_backup.sql
这样wordpress数据库就会备份在${work}/wordpress_db_backup.sql
这个文件中。
对于我的wordpress而言,该文件还挺大的:
-rw-r--r-- 1 root root 52M May 4 07:43 wordpress_db_backup.sql
新MYSQL中恢复数据
这时,我们新建一个文件夹(比如~/docker/test_mysql8
)用来搭建新的MYSQL容器:
work2=~/docker/test_mysql8
mkdir -p ${work2} && cd ${work2}
建立下列docker-compose.yml文件:
version: '3.0'
services:
db:
image: mysql:8.0 # 使用新的mysql镜像
container_name: test_mysql8
restart: unless-stopped
command: --max-binlog-size=200M --expire-logs-days=2
environment:
MYSQL_ROOT_PASSWORD: rootpassword # 这里是上面的root密码
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: yourpassword # 这里是原来的密码
volumes:
- './db:/var/lib/mysql'
networks:
- default
networks:
default:
name: test_mysql8
其中,MYSQL_ROOT_PASSWORD
、MYSQL_DATABASE
、MYSQL_USER
和MYSQL_PASSWORD
等环境变量应该与旧的docker-compose.yml文件保持一致。
直接上线该stack:
docker-compose up -d
将备份复制到文件夹中:
cp -rp ${work}/wordpress_db_backup.sql ${work2}/db
在宿主机中,wordpress_db_backup.sql
文件的位置是${work2}/db/wordpress_db_backup.sql
;而在容器test_mysql8
内部,位置为/var/lib/mysql/wordpress_db_backup.sql
。
这样做的目的是:我们要进入新mysql容器内部恢复数据。我们进入新mysql容器的shell里面:
docker exec -it test_mysql8 /bin/bash
直接恢复数据:
# mysql -u wordpress -p<wordpress用户的密码> wordpress < /var/lib/mysql/wordpress_db_backup.sql
mysql -u wordpress -pyourpassword wordpress < /var/lib/mysql/wordpress_db_backup.sql
我们可以查看一下数据表。首先,进入数据库:
# 进入数据库
mysql -u wordpress -pyourpassword
使用SQL语句查看数据库中所有的表(一般命令是不区分大小写的):
show databases;
use wordpress;
select database();
show tables;
我的测试博客输出结果类似这样:
+-------------------------------------------------+
| Tables_in_wordpress |
+-------------------------------------------------+
| wp_actionscheduler_actions |
| wp_actionscheduler_claims |
| wp_actionscheduler_groups |
| wp_actionscheduler_logs |
| wp_add_new_users_queue |
| wp_checkins |
| wp_commentmeta |
| wp_comments |
| wp_e_events |
...
+-------------------------------------------------+
130 rows in set (0.01 sec)
由于这个数据库是刚刚新建的,本身并不带有任何自定义数据表。然而,我们却看到众多wp_
开头的数据表;它们只能属于刚刚备份过去的旧数据。
换句话说,我们已经大功告成了!
后续工作
我们可以先下线新mysql容器:
cd $work2; docker-compose down
然后备份一下旧数据库对应的文件夹:
mv $work/db $work/db_backup
将新的数据库复制到wordpress的根目录里:
cp -rp $work2/db $work
修改一下docker-compose.yml:
vim $work/docker-compose.yml
将数据库那部分的代码改为新数据库的代码即可。比如,将:
---
version: '3.0'
services:
db:
image: mysql:5.7 # arm架构的机器请将mysql:5.7改为mysql:oracle
# container_name: wordpress-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword # 按需修改
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: yourpassword # 按需修改
volumes:
- './db:/var/lib/mysql'
networks:
- default
app:
image: wordpress:latest
# container_name: wordpress-app
restart: unless-stopped
ports:
- 4145:80 # 按需修改。与防火墙开放端口一致。
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: yourpassword # 按需修改
volumes:
- './app:/var/www/html'
links:
- db:db
depends_on:
- redis
- db
networks:
- default
redis:
image: redis:alpine
# container_name: wordpress-redis
restart: unless-stopped
volumes:
- ./redis-data:/data
networks:
- default
networks:
default:
name: wordpress
改为:
---
version: '3.0'
services:
db:
image: mysql:8.0 # 使用新的mysql镜像
# container_name: wordpress-db
restart: unless-stopped
command: --max-binlog-size=200M --expire-logs-days=2
environment:
MYSQL_ROOT_PASSWORD: rootpassword # 这里是上面的root密码
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: yourpassword # 这里是原来的密码
volumes:
- './db:/var/lib/mysql'
networks:
- default
app:
image: wordpress:latest
# container_name: wordpress-app
restart: unless-stopped
ports:
- 4145:80 # 按需修改。与防火墙开放端口一致。
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: yourpassword # 按需修改
volumes:
- './app:/var/www/html'
links:
- db:db
depends_on:
- redis
- db
networks:
- default
redis:
image: redis:alpine
# container_name: wordpress-redis
restart: unless-stopped
volumes:
- ./redis-data:/data
networks:
- default
networks:
default:
name: wordpress
小结
本教程是以wordpress的数据库迁移为例,但其它数据库的迁移原理也是一样的。建议大家对linux和docker的运作有较好的理解和实践能力才这样操作,否则可能会导致旧数据的损坏和丢失。操作全程要注意做好备份,比如duplicati,这样万一折腾坏了还可以直接恢复。
我的WordPress博客(主力 & 测试)在2023年5月份的时候就已经成功迁移至mysql 8.0了。祝大家好运!
---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍
补充,如果是用archlinux的话,archlinux官方是建议用MariaDB。
受教了 (ฅ´ω`ฅ)
学习了!
哪都有你呀,哈哈!