第 1 步:查找并验证卷
通过docker volume ls,您可以找到卷的名称。假设它是<abcdef>。
然后,通过docker run -it --rm -v <abcdef>:/var/lib/mysql busybox ls -l /var/lib/mysql 确保您看到文件并且文件的日期与您最近对丢失的数据库所做的更改相匹配。 (感谢this answer)
或者,您可以通过this method从此卷创建备份。
第 2 步:创建一个新容器,并将此卷挂载到
无论您已经在使用什么docker run 命令来启动 MySQL 容器,请将-v <abcdef>:/var/lib/mysql_old 添加到它。它应该为您提供一个全新的 MySQL 容器并运行,没有任何问题。 您的数据还没有加载到那里,只有文件可以访问。
第 3 步:复制并覆盖 MySQL 数据
现在,进入该容器的外壳(例如docker exec -it <CONTAINER_NAME> bash)并执行ls /var/lib/mysql_old 以确保您的卷中的文件在那里。
然后,执行cp -R /var/lib/mysql_old/. /var/lib/mysql(或sudo cp ...,具体取决于您使用的用户),然后执行chown -R mysql:mysql /var/lib/mysql。 (感谢this tutorial)
第四步:重启容器
退出容器并执行docker stop <CONTAINER_NAME> 以停止容器。然后通过docker start <CONTAINER_NAME> 再次启动它。瞧!它现在应该是一个包含所有数据的数据库。
或者,如果您想从非黑客容器开始,您可以使用docker exec <CONTAINER_NAME> sh -c 'exec mysqldump -uroot -p --databases <DATABASE_NAME>' > dump.sql 从中获取 mysqldump,然后通过 docker exec -i <CONTAINER_NAME> sh -c 'exec mysql ' < dump.sql 将 dump.sql 导入到新容器中。