使用Vagrant / VirtualBox预先存在的MySQL数据

时间:2014-04-01 20:38:09

标签: mysql virtualbox vagrant nfs

背景:我曾经使用MAMP进行开发,并且在几个月/几年内我积累了一个大型的mysql数据库(几个演出),我用它来开发我的不同项目。我终于使用Vagrant设置了一个虚拟机,除了我的数据库之外,我已经完成了一切设置并且运行良好。我在OSX主机上运行CentOS 6.5来宾框。

我的问题:我需要我的数据库完全持久化,所以我可以根据需要填充/销毁尽可能多的盒子,但是mysql仍然存在。

我的解决方案#1:我最初使用vboxsf安装了一个同步文件夹。这很好用,到目前为止似乎是我最好的选择,但性能非常糟糕。我的开发站点上的查询密集型页面需要1-3秒才能加载,而加载时通常需要不到一秒钟。

我的解决方案#2:然后我尝试使用nfs挂载同步文件夹,因为性能应该更好。这里的问题是mysql抱怨b / c,鉴于nfs的性质,它不能将数据目录chown到mysql:mysql用户。尝试启动mysqld服务时出现以下错误:

chown: changing ownership of '/www/mysql': Operation not permitted

chmod: changing permissions of '/www/mysql': Permission denied

Sooo,我的问题是:有没有更好的方法来完成我需要的东西?我觉得NFS是最好的解决方案,但我不知道如何通过Vagrant自动解决整个所有权/权限问题。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

首先,让我首先说这不是最佳做法。您可能知道自己这会导致问题,例如你的电脑空白,或者你想把一个项目交给另一个人进行开发。当然,特别是作为一个人的事业,有比测试数据导入器和东西更重要的东西:)所以,让我们寻找解决方案。

NFS权限

要正确获取NFS权限,您的用户需要在主机和来宾上拥有相同的UID和GUID。设置非常棘手,你不应该从客人那里改变它。也许您可以在主机上更改它以使其可写入mysql并使UID和GUID相同。当然,主持人改变这一切的时刻已经不复存在了。

rsync共享文件夹

Rsync在同步方面可能不是最快的,但如果你在rsync共享文件夹上创建只有MySQL正在编写并且同步回主机上的某个文件夹,这可能是一个解决方案。 "真实"项目仍然可以存在于虚拟机共享或nfs中,并且您不需要为正确的权限而烦恼。

可能还有其他一些解决方案:

制作备用/恢复策略

一种方法是在不同的点上将MySQL备份在你的流浪盒中,例如:每天。您也可以在关闭该框时运行备份,从而在销毁该框之前创建备份。将此备份放在共享文件夹中,即使您销毁了一个盒子,也可以获得最新数据。性能应该非常好,因为MySQL正在使用的数据不会出现在共享文件夹中。

在主机或其他流浪者框上运行MySQL

当然可以从你的流浪者盒子里连接你的主人或另一个运行MySQL的流浪者盒子。你的主机或这个盒子可能是长寿的,可以作为一个中心的“MySQL服务器”#34;为您的所有项目。

让MySQL从属设备在写入共享文件夹的同一台机器上运行

我相信使用MySQL可以实现主/从组合。在一台计算机上运行,​​主机(您在项目中使用)生活在您的虚拟机内,而不是将任何内容写入共享文件夹和从属设备,该设备写入您的共享文件夹并且是主设备的镜像。这意味着您在写入内容并将其写入共享文件夹之间具有高性能和几秒钟的延迟。当然,保持这个设置运行并确保它一直有效可能会很棘手。

答案 1 :(得分:2)

我对Mac上的本地开发人员有同样的问题或要求。我找到了一个只有MySQL的Vagrant盒子的解决方案,外部数据链接为folder_sync。但我猜它也会在Win上运行。 这是Vagrant框配置:https://github.com/ronnyhartenstein/vagrant-mysql-shared-folder

如果您了解德语,这里是我的博客文章,其中包含一些背景信息和测试(当然也没有):http://blog.rh-flow.de/2014/11/11/es-hat-sich-ausgemampft-vagrant-ist/

答案 2 :(得分:0)

您可以使用bindfs更改共享的用户/组。我实际上使用的是一个名为vagrant-bindfs的插件,让您重新安装具有不同所有权的共享。它可以工作,但我还没有尝试用mysql来看它是如何运作的。

我的Vagrantfile上的相关行:

unless Vagrant.has_plugin?("vagrant-bindfs")
  raise 'vagrant-bindfs is not installed! Please install with vagrant plugin install vagrant-bindfs'
end

config.vm.synced_folder "../", "/temp-nfs-mounts/sites-unbinded", type: :nfs
config.bindfs.bind_folder "/temp-nfs-mounts/sites-unbinded", "/sites", :force_user  => "vagrant", :force_group => "vagrant", :create_as_user => true