起因

前几天想配置一下mysql容器的载挂目录,查了下资料后也照着做了,删除容器,运行容器,一切就这么自然而然,唯独没有备份数据。直到两天后我登不上图床那一刻我才发现数据库没了!

补救

先看看issues有没有类似情况的,哦没有

找一下掘金上的文章,和我的情况大抵相同,也是删除了容器,尝试了下,找到了被我的删除的数据卷:

1
2
cd /var/lib/docker/volumes
du -sh *

volumes数据卷.png

寻找和删除时间相似且大小比较大的数据卷:

寻找有价值的数据.png

最后锁定了af5开头的,后面照着操作新建一个目录,创建一个容器并载挂新建目录上,再将sf5开头的数据卷复制到新建目录上:

1
cp -r /var/lib/docker/volumes/af50bb0f2381c8051c125b0510f78a34fe2d60fa3d5a1e718f400a213c31a66b/_data/* ./

复制的时候一直提示覆盖,需要临时禁用别名:

1
unalias cp

最后用docker exec -it xxx /bin/bash命令进到容器,连接mysql后能找到lsky数据库,就是show tables;的时候提示没有权限。

权限不足.png

用命令chown -R mysql:mysql /var/lin/mysql加了权限后,查询数据时提示说表不存在:

恢复失败.png

后来我想到是不是应该将数据卷的拥有者和组一起复制进新建目录的,毕竟网上说改成mysql可能过时了,我也是兜兜转转了好久才明白权限的问题:

1
cp -rp /var/lib/docker/volumes/af50bb0f2381c8051c125b0510f78a34fe2d60fa3d5a1e718f400a213c31a66b/_data/* ./

-p选项是除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。

最后查询数据成功:

查询数据成功.png

用navicat导出了表结构和数据,重新导入了最新创建的mysql,登录图床成功:

登录成功.png

总结

删除容器前请再好好想想,有没有较为重要的数据没有备份好,特别是数据库方面的,一定要做好备份,毕竟数据无价。