【问题标题】:How to recover MySQL data from Docker container如何从 Docker 容器中恢复 MySQL 数据
【发布时间】:2020-10-15 18:08:46
【问题描述】:

我在 docker windows 工具包上运行 mariadb 实例。我使用 kitematic 对 mariaDB 容器进行了环境变量更改。现在它重新创建了一个丢失我所有数据库的实例。有没有办法从中恢复?

检查是否有 threre 悬空卷,并且很少

docker 卷 ls -f dangling=true

【问题讨论】:

  • 除非卷被删除...
  • 我可以看到那里有多个 vloumes > docker volume ls
  • 检查每个。如果未删除该卷,则数据将在那里。否则会因为没有备份重要资料而对自己大喊大叫。

标签: mysql docker mariadb docker-toolbox


【解决方案1】:

使用悬空卷恢复了数据。 方法如下。

首先获取悬空卷列表。

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

然后将它安装到一个 Ubuntu 容器上(这样你就可以进入目录并检查那里有什么,因为在 Windows 上使用 Docker Tool Box 时没有其他方法可以做到这一点)

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

然后您将进入新创建的 contianer 的 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 文件,如下所示,并将备份文件夹挂载为数据目录。在 linux 主机上运行它,因为这种挂载对于 windows 上的 mysql 将无法正常工作。

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 DB 或 contianer 上恢复它。

mysql -u root -p < alldb.sql 

【讨论】:

    【解决方案2】:

    最近,由于丢失的 wordpress 容器,我不得不面对同样的问题,我已按照 Don 的指示进行操作。然而,由于有很多悬空卷,我不得不优化这个过程。我已经设法在同一个终端中更简单地完成它,导致以下步骤:

    docker volume ls -f dangling=true
    
    DRIVER              VOLUME NAME
    local               43277666c8bc3da0b585d90952c2303226c92c6c6a561007c0c7ee00b6da817e
    local               4fde3ea412e54a1b8b42fce6dae5de5135b9fd12933b020b43bd482cd5fd2225
    local               52074ccfd62fb83b8b40cff5f8024215b34f79ad09b630e067ec732f811f798c
    ...
    

    然后,对于每个容器执行以下指令,用找到的每个 VOLUME NAME 替换 43277666c8bc3d...。此指令将删除以前存在的 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
    

    【讨论】:

      猜你喜欢
      • 2021-06-02
      • 1970-01-01
      • 2021-08-21
      • 2021-02-26
      • 2018-03-16
      • 1970-01-01
      • 2020-03-15
      • 2016-01-14
      相关资源
      最近更新 更多