无法备份docker MariaDB容器的持久存储容器
我正在使用提供给这个问题的答案的一个变种: 如何处理docker中的永久存储(例如数据库) 。 特别是,我遇到了备份/恢复程序的问题。 这是故事
我创build了一个简单的图像用作容器。 Dockerfile看起来像这样:
FROM busybox VOLUME /var/lib/mysql CMD /bin/sh
我使用以下命令从该映像创build了一个容器:
docker build -t myimages/datastore . docker run --name mysql_data myimages/datastore true
然后,我build立了tutum / mariadb图像并创build了一个容器:
docker run -d -p 3306:3306 --volumes-from mysql_data tutum/mariadb
一切工作正常。 我可以使用mysql
客户端连接到数据库并执行数据库操作。 具体来说,我这样做: create database testdb;
并create table testtbl select 1 as 'id', 'hello' as 'word';
。
接下来,我试图备份我的容器。 在回答上面的问题之后(做了一些修改),我做了这个:
docker run --rm --volumes-from mysql_data -v $(pwd):/backup busybox \ tar cvf /backup/backup.tar /var/lib/mysql
瞧 ! 我在主机的备份文件夹中有一个backup.tar
文件。
所以,作为最后一步,我试图用以下一系列命令恢复备份:
docker run --name mysql_data2 myimages/datastore true docker run --rm --volumes-from mysql_data2 -v $(pwd):/backup busybox \ tar xvf /backup/backup.tar -C /var/lib/mysql/
我创build了一个新的从新数据容器导入卷的MariaDB容器:
docker run -d -p 3308:3306 --volumes-from mysql_data2 tutum/mariadb
新的数据库容器启动正常,我用mysql
客户端连接到它,并检查数据库。 这里是问题出现的地方:而不是有一个testdb
数据库(如上所述),我有一个var
数据库; 而不是在新的数据库中有一个testtbl
表,没有表。
任何人都可以看到我做错了什么? 谢谢!
由于MySQL存储数据的方式,这样(通过将数据库文件复制到容器外)进行处理似乎不起作用。 具体来说,InnoDB文件不能被复制 – 这个文档说明
如果数据库包含InnoDB表,表格文件复制方法不起作用…因为InnoDB不一定在数据库目录中存储表内容。 另外,即使服务器没有主动更新数据,InnoDB仍然可能修改了caching在内存中的数据,而不是刷新到磁盘。
所以这个问题的简短答案是“不能这样做”。 长的答案是使用mysqldump
或类似的工具来做到这一点。