如何从Docker容器中恢复MySQL数据

6
我曾在Docker Windows Toolkit上运行Mariadb实例。我在Kitematic中更改了MariaDB容器中的环境变量。现在它已重新创建一个实例并且丢失了所有我的数据库。有没有办法从这种情况中恢复?
检查是否有悬挂卷,有一些。
``` docker volume ls -f dangling=true ```

1
除非卷被移除... - Mike Doe
我可以通过命令 > docker volume ls 看到有多个卷存在。 - Don Srinath
检查每一个。如果卷没有被移除,数据仍然存在。否则,为自己没有备份重要文件而感到后悔。 - Mike Doe
2个回答

5

通过使用悬挂卷恢复了数据。方法如下。

首先获取悬挂卷的列表。

$ docker volume ls -f dangling=true
DRIVER              VOLUME NAME
local               6f79b6329d98379495a284287e32a7a57605483dd7bf7fa19924fb2a98fb1d19
local               47bb077ef6f6df9f56bd30c35eeb45f35e62213d2c50db6f078bfdeeee6698ec

然后将其安装到Ubuntu容器中(这样您就可以进入目录并检查其中内容,因为在Windows上使用Docker工具箱时没有其他方法可行)。

$ docker run --name tempContainer1-UBUNTU -v 6f79b6329d98379495a284287e32a7a57605483dd7bf7fa19924fb2a98fb1d19:/var/lib/backup -t -i ubuntu /bin/bash

然后您将进入新创建的容器的bash。 转到新挂载的目录并检查内容。

$cd /var/lib/backup
$ls
$aria_log.00000001  aria_log_control  ib_buffer_pool  ib_logfile0  ib_logfile1  ibdata1  ibtmp1  multi-master.info  mysql  performance_schema
-- once you are sure directory data is what you require, make a zip file of the folder 
$apt-get update
$apt-get install zip
$cd ..
$zip -r backup.zip backup

在另一个终端中,从主机将容器备份文件backup.zip的内容复制到主机上

$docker cp tempContainer1-UBUNTU:/var/lib/backup.zip .

那么,请创建一个类似以下的Docker Compose文件,并将备份文件夹作为数据目录挂载。由于该挂载在Windows上的MySQL不会按预期工作,请在Linux主机上运行。

version: "3.2"
services:
  mysql:
    image: mariadb:10.4.12
    restart: always
    ports:
      - "3306:3306"      
    command: mysqld --innodb-flush-method=littlesync --innodb-use-native-aio=ON --log_bin=ON
    volumes:
            - ./backup_data_folder:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: somepassword
      TZ: Asia/Singapore
    networks:
      - frontend
    container_name: maria
networks:
  frontend:

开始

$docker-compose up

创建成功后,在另一个终端中进入新创建的容器

$docker exec -t -i maria /bin/bash
-- Take dump of all the DBS 
$mysqldump -u root -p --all-databases > alldb.sql

从主机的另一个终端复制转储内容到主机

$docker cp maria:/alldb.sql .

现在这个 SQL 文件是一个完整的转储,像往常一样在你的 MySQL 数据库或容器上恢复它。

mysql -u root -p < alldb.sql 

3

最近我也遇到了一个问题,WordPress容器丢失了,我按照Don的指示做。然而,由于有很多悬空的卷,我必须优化这个过程。我想出了一种更简单的方法,在同一个终端里完成整个过程,具体步骤如下:

docker volume ls -f dangling=true

DRIVER              VOLUME NAME
local               43277666c8bc3da0b585d90952c2303226c92c6c6a561007c0c7ee00b6da817e
local               4fde3ea412e54a1b8b42fce6dae5de5135b9fd12933b020b43bd482cd5fd2225
local               52074ccfd62fb83b8b40cff5f8024215b34f79ad09b630e067ec732f811f798c
...

接下来,对于每个容器执行以下指令,将 43277666c8bc3d... 替换为找到的每个VOLUME NAME。该指令将删除以前存在的 maria-restore 容器,创建一个新的容器并连接到它:

docker container ls -a -q --filter "name=maria-restore" && docker container rm -f maria-restore; docker run --name maria-restore -v 43277666c8bc3da0b585d90952c2303226c92c6c6a561007c0c7ee00b6da817e:/var/lib/mysql -d mariadb:10.4.12 mysqld --innodb-flush-method=littlesync --innodb-use-native-aio=ON --log_bin=ON && docker exec -it maria-restore bash

如果它不是mysql卷,它会立即失败并退出。 如果它是mysql卷,则您将进入mariadb容器。 数据库已经启动。 然后,您可以连接到数据库以查看它是否正确,并对其进行备份:

root@8b35c8e2c474:/# mysql -uadmin -p
root@8b35c8e2c474:/# mysqldump -uadmin -p --all-databases > alldb.sql
root@8b35c8e2c474:/# exit

复制备份的数据库:

docker cp mysql-restore:/alldb.sql .

最后,您需要清理maria-restore容器:

docker container ls -a -q --filter "name=maria-restore" && docker container rm -f maria-restore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接