我曾在Docker Windows Toolkit上运行Mariadb实例。我在Kitematic中更改了MariaDB容器中的环境变量。现在它已重新创建一个实例并且丢失了所有我的数据库。有没有办法从这种情况中恢复?
检查是否有悬挂卷,有一些。
``` docker volume ls -f dangling=true ```
检查是否有悬挂卷,有一些。
``` docker volume ls -f dangling=true ```
通过使用悬挂卷恢复了数据。方法如下。
首先获取悬挂卷的列表。
$ 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
最近我也遇到了一个问题,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