我对Vagrant不太熟悉,有几个问题:
有时候当我重启计算机或销毁Vagrant时,整个MySQL数据库会被清除。我试图在stackoverflow上找到一些解决方案,但是目前还没有运气。
所以我的问题是:
1)数据存储在哪里?
2)为什么有时会丢失数据?
3)如果有的话,如何在重启或销毁后保留数据?
vagrant init
时都会得到一个环境的副本,它是一个Ubuntu服务器。所有应用程序代码(网站)都会从本地文件系统挂载到虚拟机中。我们将此应用程序保存在git存储库中。然后我们在vagrant机器内保留了一些脚本,以同步来自生产(或演示服务器)的数据库 - 基本上它会下载数据库转储文件并将其放入您的虚拟机中。vagrant destroy
然后 vagrant init
你需要运行数据库同步脚本来重新获取数据库。 我们的开发人员(大多数时间)不更改数据库内容,因此我们不需要保留本地更改。顶级答案已经很好了,我只想在第三个问题上添加一些内容。
为了保留更改,您应该将数据库保留在主机上,并让vagrant连接到它以使用它。这样,当vagrant destroy时,您不会丢失数据库。
您可能已经在使用NFS来同步代码文件夹,所以这只是朝着类似方向迈出的一步。
Homestead已经添加了数据库备份功能。如果您的Vagrant版本为2.1.0或更高,则只需将以下内容添加到Homestead.yaml
文件中即可:
backup: true
最近我用于解决问题3的另一种方法是安装vagrant-triggers插件:
vagrant plugin install vagrant-triggers
然后在Vagrantfile
中添加一些代码,在halt
和destroy
时运行脚本:
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内部连接到它。
destroy
从相应的提供程序中删除虚拟机的所有痕迹。这并不令人惊讶,因为它包括您的数据。如果您想关闭虚拟机而不丢失数据,请使用halt
或suspend
。 - Jon