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

13

我对Vagrant不太熟悉,有几个问题:

有时候当我重启计算机或销毁Vagrant时,整个MySQL数据库会被清除。我试图在stackoverflow上找到一些解决方案,但是目前还没有运气。

所以我的问题是:

1)数据存储在哪里?

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

3)如果有的话,如何在重启或销毁后保留数据?


destroy 从相应的提供程序中删除虚拟机的所有痕迹。这并不令人惊讶,因为它包括您的数据。如果您想关闭虚拟机而不丢失数据,请使用haltsuspend - Jon
2
对我来说,不明白为什么它也会删除数据库。我知道它会删除所有的vagrant痕迹,但为什么会删除数据库?这个数据库存储在哪里?为什么有时重启时会清除数据库,而有时又不会? - Raymond the Developer
将数据库托管在 Vagrant 之外。 - zonabi
4个回答

8
在我看来,你的问题的答案取决于你如何设置项目。我们正在处理的项目的设置如下(简化):
  • 数据库服务器(云托管)
  • 源服务器(云托管)
  • 用于本地开发的vagrant box
  • git存储库
  • ...
每个开发人员在vagrant init时都会得到一个环境的副本,它是一个Ubuntu服务器。所有应用程序代码(网站)都会从本地文件系统挂载到虚拟机中。我们将此应用程序保存在git存储库中。然后我们在vagrant机器内保留了一些脚本,以同步来自生产(或演示服务器)的数据库 - 基本上它会下载数据库转储文件并将其放入您的虚拟机中。
在这种情况下,如果你执行 vagrant destroy 然后 vagrant init 你需要运行数据库同步脚本来重新获取数据库。 我们的开发人员(大多数时间)不更改数据库内容,因此我们不需要保留本地更改。
希望这能有所帮助。

1
谢谢你的回答。与Vagrant中的本地数据库相比,使用在线数据库是否是最佳实践?此外,数据库文件存储在哪里? - Raymond the Developer
我认为你可能想在虚拟机中拥有一个本地数据库。上面的描述来自一个使用集中式数据库的Web应用程序项目。Vagrant提供了该数据库的本地副本,以便开发人员可以在沙盒环境中工作。如果您正在使用数据库开发桌面软件,则可能不需要在线数据库。但这将取决于要求。看起来您在虚拟机内运行数据库服务器,因此路径会有所不同,具体取决于系统是什么。例如,在Ubuntu上的MySQL数据库可能位于/var/lib/mysql/。 - user2073253
这个链接可能会解释MySQL安装文件的位置,如果这是你所问的。 - user2073253
谢谢,我会查阅这个。非常感谢您提供给我的信息! - Raymond the Developer

2

顶级答案已经很好了,我只想在第三个问题上添加一些内容。

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

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


1
你能提供相关链接吗? - alayli
1
@alayli 我没有链接,因为我最终自己解决了问题。但基本上你需要做的是让 Vagrant 中的代码连接到主机上的数据库。为此,您将需要从 Vagrant 中了解主机的 IP 地址,并且您可能需要调整主机上的数据库以允许来自 Vagrant IP 的远程连接。 - Nick Zinger

1

Homestead已经添加了数据库备份功能。如果您的Vagrant版本为2.1.0或更高,则只需将以下内容添加到Homestead.yaml文件中即可:

backup: true

一旦配置完成,Homestead 将在执行 vagrant destroy 命令时将您的数据库导出到 mysql_backup 和 postgres_backup 目录中。 阅读更多

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文件夹没有版本控制,如果我的vagrant box被销毁,它不会消失。这个设置允许我在本地环境中拥有最近的备份,我可以随时恢复。

然而,在处理大型数据库时,这种方法就不那么有用了。在这种情况下,我更喜欢Nick Zinger的答案,即将数据库保留在主机上,并从vagrant内部连接到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接