无法为docker MariaDB容器备份持久性存储容器

时间:2014-07-21 17:21:50

标签: mysql docker mariadb

我使用了对此问题提供的答案的变体:How to deal with persistent storage (e.g. databases) in docker。特别是,我遇到了备份/恢复过程的问题。这是故事......

我创建了一个简单的图像用作容器。 Dockerfile看起来像这样:

FROM busybox

VOLUME /var/lib/mysql

CMD /bin/sh

我使用以下命令从此图像创建了一个容器:

docker build -t myimages/datastore .

docker run --name mysql_data myimages/datastore true

然后我构建了tutum/mariadb图像并创建了一个容器:

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/

我创建了一个新的MariaDB容器,用于从新数据容器中导入卷:

docker run -d -p 3308:3306 --volumes-from mysql_data2 tutum/mariadb

新的数据库容器启动得很好,我用mysql客户端连接到它,并检查了数据库。问题出现在哪里:我没有testdb数据库(如上所述),而是拥有var数据库;而不是在新数据库中有一个testtbl表,没有表。

谁能看到我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:2)

由于MySQL存储数据的方式,似乎以这种方式进行(通过将数据库文件复制出容器)根本不起作用。具体来说,InnoDB文件不能被复制 - this documentation表明

  如果您的数据库包含InnoDB表,则

表文件复制方法不起作用...因为InnoDB不一定将表内容存储在数据库目录中。此外,即使服务器没有主动更新数据,InnoDB仍然可能已将修改后的数据缓存在内存中而不会刷新到磁盘。

所以对这个问题的简短回答是"它不能以这种方式完成"。答案很长就是使用mysqldump或类似的工具来做到这一点。