重启或销毁后在Vagrant中丢失数据

时间:2014-02-10 10:58:55

标签: mysql database vagrant

我是Vagrant的新手并且有几个问题。

有时当我重新启动计算机或破坏我的流浪汉时,整个Mysql数据库都会被清除掉。 我试图在stackoverflow上找到一些关于此的答案,但到目前为止没有任何运气。

所以我的问题是:

1)数据存储在哪里?

2)为什么我有时会丢失数据?

3)如果是这样,如何在重启destroy后保留数据?

4 个答案:

答案 0 :(得分:8)

在我看来,您的问题的答案取决于您如何设置项目。在我的设置上工作的项目是以下(简化):

  • 数据库服务器(云托管)
  • 原始服务器(云托管)
  • 本地开发的流浪者盒
  • git repository
  • ...

vagrant init上,每个开发人员都会获得一个ubuntu服务器环境的副本。所有应用程序代码(网站)都从本地文件系统安装到虚拟机中。我们将此应用程序保留在git存储库中。然后我们在vagrant机器中保留一些脚本,用于从生产(或演示服务器)同步数据库 - 基本上它下载数据库转储文件并将其放入虚拟机。

在这种情况下,如果执行vagrant destroy然后vagrant init,则需要运行数据库同步脚本以获取数据库。我们的开发人员(大多数)不会更改数据库的内容,因此我们不需要保留本地更改。

我希望这会有所帮助。

答案 1 :(得分:2)

最佳答案非常好,我只是想补充你的第三个问题。

要保留更改,您应该将数据库保留在主机上,并让vagrant连接到它以使用它。这样您就不会丢失 vagrant destroy 上的数据库。

您可能已经在使用NFS将文件夹与代码同步,因此这只是朝着类似方向迈出的一步。

答案 2 :(得分:0)

我最近使用的问题3的另一个解决方案是安装vagrant-triggers插件:

vagrant plugin install vagrant-triggers

然后向Vagrantfile添加一些代码,以便在haltdestroy上运行脚本:

config.trigger.before :halt do
  info "Backing up databases"
  run_remote  "bash /vagrant/backup_databases.sh"
end

config.trigger.before :destroy do
  info "Backing up databases"
  run_remote  "bash /vagrant/backup_databases.sh"
end

然后创建backup_databases.sh脚本:

#!/usr/bin/env bash

BACKUP_DIR="/vagrant/database_backups"

mysqldump -u root databasename > "$BACKUP_DIR/$(date +%Y-%m-%d_%H:%M).databasename.sql"
mysqldump -u root databasename2 > "$BACKUP_DIR/$(date +%Y-%m-%d_%H:%M).databasename2.sql"

# remove all but the 10 most recent backups
cd $BACKUP_DIR
ls -t | sed -e '1,10d' | xargs -r -d '\n' rm

我的database_backups文件夹未进行版本化,如果我的流浪盒被销毁,则不会消失。这个设置允许我在我的本地环境中拥有最近的备份,我可以随时恢复。

但是,在使用大型数据库时,这不太有用。在那些情况下,我更喜欢Nick Zinger的答案,即将数据库保存在主机上并从流浪者中连接到它。

答案 3 :(得分:0)

Homestead 已经添加了数据库备份功能,如果您有 Vagrant 2.1.0 或更高版本,那么您只需将其添加到 Homestead.yaml

backup: true

配置完成后,Homestead 会在执行 vagrant destroy 命令时将您的数据库导出到 mysql_backup 和 postgres_backup 目录。 Readmore