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

Don*_*Don 6 mysql mariadb docker docker-toolbox

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

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

docker volume ls -f dangling=true

Don*_*Don 5

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

首先获取悬空卷的列表。

$ docker volume ls -f dangling=true
DRIVER              VOLUME NAME
local               6f79b6329d98379495a284287e32a7a57605483dd7bf7fa19924fb2a98fb1d19
local               47bb077ef6f6df9f56bd30c35eeb45f35e62213d2c50db6f078bfdeeee6698ec
Run Code Online (Sandbox Code Playgroud)

然后将其安装到 Ubuntu 容器上(以便您可以进入目录并检查那里有什么,因为在 Windows 上使用 Docker 工具箱时没有其他方法可以做到这一点)

$ docker run --name tempContainer1-UBUNTU -v 6f79b6329d98379495a284287e32a7a57605483dd7bf7fa19924fb2a98fb1d19:/var/lib/backup -t -i ubuntu /bin/bash
Run Code Online (Sandbox Code Playgroud)

然后您将进入新创建的容器的 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
Run Code Online (Sandbox Code Playgroud)

在主机的另一个终端上,将容器 backup.zip 的内容复制到主机

$docker cp tempContainer1-UBUNTU:/var/lib/backup.zip .
Run Code Online (Sandbox Code Playgroud)

然后创建一个如下所示的 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:
Run Code Online (Sandbox Code Playgroud)

开始

$docker-compose up
Run Code Online (Sandbox Code Playgroud)

一旦启动,从另一个终端进入新创建的容器

$docker exec -t -i maria /bin/bash
-- Take dump of all the DBS 
$mysqldump -u root -p --all-databases > alldb.sql
Run Code Online (Sandbox Code Playgroud)

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

$docker cp maria:/alldb.sql .
Run Code Online (Sandbox Code Playgroud)

现在这个 sql 文件是一个完整的转储,像往常一样在你的 mysql DB 或 contianer 上恢复它。

mysql -u root -p < alldb.sql 
Run Code Online (Sandbox Code Playgroud)