Docker系列 升级MYSQL数据库
本文最后更新于 517 天前,如有失效请评论区留言。

本博客由Faconhost大力赞助!如何更快地访问本站?有需要可加电报群获得更多帮助。本博客用什么VPS?创作不易,请支持苯苯!推荐购买本博客的VIP喔,10元/年即可畅享所有VIP专属内容!

前言

在《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_PASSWORDMYSQL_DATABASEMYSQL_USERMYSQL_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了。祝大家好运!

---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍

感谢Faconhost的友情赞助 (ฅ´ω`ฅ) 本博客基于m2w创作。版权声明:除特殊说明,博客文章均为Bensz原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。VIP内容严禁转载!由于可能会成为AI模型(如chatGPT)的训练样本,本博客禁止将AI自动生成内容作为文章上传(特别声明时除外)。如有需要,请至学习地图系统学习本博客的教程。加Telegram群可获得更多帮助喔! | 博客订阅:RSS | 广告招租请留言 | 博客VPS | 致谢渺软公益CDN |

评论

  1. 路克斯
    Linux Chrome 115.0.0.0
    1 年前
    2023-8-13 16:16:49

    补充,如果是用archlinux的话,archlinux官方是建议用MariaDB。

    • 博主
      路克斯
      Windows Edge 115.0.1901.203
      1 年前
      2023-8-13 16:17:30

      受教了 (ฅ´ω`ฅ)

  2. shule
    Windows Chrome 114.0.0.0
    1 年前
    2023-6-22 17:51:55

    学习了!

    • 博主
      shule
      Windows Edge 114.0.1823.51
      1 年前
      2023-6-22 19:32:51

      哪都有你呀,哈哈!

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇