Moving MySQL data files to a VirtualBox Shared Folder

Edited by Vacilando. Last updated 25. July, 2015.

Out of virtual space?

Running out of MySQL storage space in VirtualBox? I was. And not once. I did some heavy Googling and excruciatingly long tests with results oscillating between disaster and epiphany (how glad was I to be able to restore the previous snapshot after each of the disasters!)

OK, so I run Ubuntu 12.04 LTS in latest VirtualBox on a Windows 8 machine. Recently I've been working with pretty heavy databases, and soon there was no more room in /var/lib/mysql ("datadir") for the database files.

Putting the data files to another partition was not an option because the total size of the virtual machine represented a limit as well. And expanding VirtualBox virtual machine seemed too daunting.

Thinking out of the box

My solution was to move the datadir to what VirtualBox calls a Shared Folder. Basically it's a folder on your host machine, in my case Windows, which is accessible from within the virtual Linux. Once the data folder is out of the virtual machine, it can grow much more freely on the host operating system.

All of the steps in this tutorial are from pieces strewn around the Internet, but all of them had funny hitches or imprecisions or missing stuff, so I've decided to write my own recipe.

So in practice...

First of all, make sure you take a snapshot of your virtual machine. Go to the Virtual Box main screen and click the Snapshots button. It only takes a second.

It is assumed you already use a Shared Folder and its Linux path is e.g. /media/sf_myfolder

It's easier if you are root.
sudo su -

It's crucial to stop MySQL before going any further. Moving database files while MySQL is running damages the internal data structure — the errors you'd see would make you scramble to revert to a previous snapshot in no time :-)
service mysql stop

Now let's move the default MySQL data folder from /var/lib/mysql to the shared folder and call it mysql_ext.
mv /var/lib/mysql /media/sf_myfolder
cd /media/sf_myfolder
mv mysql mysql_ext

Edit your my.cnf file. If it's in the default location, do the following.
nano /etc/mysql/conf.d/vacilando.cnf
and change the datadir path to:
datadir = /media/sf_myfolder/mysql_ext

Now we need to tell apparmor security system to tolerate the new location.
nano /etc/apparmor.d/usr.sbin.mysqld
There are 2 lines like:
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,

Do not remove them, just add the same but with the new datadir:
/media/sf_myfolder/mysql_ext/ r,
/media/sf_myfolder/mysql_ext/** rwk,

Restart apparmor.
/etc/init.d/apparmor restart

The final catch

At this point I tried to start MySQL again but the process was failing. The error log contained things like: Can't find file: './mysql/plugin.frm' ... The error means mysqld does not have the access rights to the directory.

And that was not easy to figure out. Articles I found recommended chmod -R mysql:mysql /datadir but that would not work because it's not possible for Linux to set the permissions of the external folder!

At last I found the solution: let's add the mysql user to the vboxsf group.
sudo gpasswd -a mysql vboxsf

Thereafter, you can easily start mysql
service mysql start
... and go to do some more exciting things :-)


   
30. May 2014 ~ 31. May 2014, Sint-Agatha-Berchem, Belgium

 VirtualBox Linux Windows Ubuntu MySQL datadir

Return to the article list.