MySQL: speed up unit tests by moving data to memory (Ubuntu)
There are several ways to speed up slow unit tests which interact with the database:
- Refactor code and tests and do not interact with db in unit tests
- Use sqlite db in memory instead of MySQL
- Use MySQL MEMORY engine
- Move MySQL data to memory
It is better to try other listed approaches and I think of the last method as a quick temporary hack, but here it is:
- stop mysql
- move
/var/lib/mysqlto/dev/shm/mysql - link
/var/lib/mysqlto/dev/shm/mysql - start mysql
In Ubuntu there is also a problem with apparmor which will not allow mysql to read from /dev/shm.
To fix this it is recommended to add the following to the /etc/apparmor.d/usr.sbin.mysqld:
/dev/shm/mysql/ r, /dev/shm/mysql/** rwk,
But it doesn't work for me and I disabled apparmor for mysql (not recommended):
sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable
Below are shell scripts to move MySQL data to /dev/shm and back, restore backed up data and check db state.
Move db to memory script
#!/bin/sh
#Check if run as root
if [ `whoami` != root ]
then
echo "You must be root to do that!"
exit 1
fi
service mysql stop
if [ ! -s /var/lib/mysql.backup ]
then
cp -pRL /var/lib/mysql /var/lib/mysql.backup
fi
mv /var/lib/mysql /dev/shm/mysql
chown -R mysql:mysql /dev/shm/mysql
ln -s /dev/shm/mysql /var/lib/mysql
chown -h mysql:mysql /var/lib/mysql
service mysql start
Move db to disk script
#!/bin/sh
#Check if run as root
if [ `whoami` != root ]
then
echo "You must be root to do that!"
exit 1
fi
service mysql stop
rm /var/lib/mysql
if [ ! -s /dev/shm/mysql ]
then
cp -pRL /var/lib/mysql.backup /var/lib/mysql
else
mv /dev/shm/mysql /var/lib/mysql
fi
service mysql start
Restore db backup script
#!/bin/sh
#Check if run as root
if [ `whoami` != root ]
then
echo "You must be root to do that!"
exit 1
fi
service mysql stop
if [ ! -s /var/lib/mysql.backup ]
then
exit -1
fi
rm /var/lib/mysql
cp -pRL /var/lib/mysql.backup /var/lib/mysql
rm -rf /dev/shm/mysql
service mysql start
Check db state script
#!/bin/sh
#Check if run as root
if [ `whoami` != root ]
then
echo "You must be root to do that!"
exit 1
fi
if [ -L /var/lib/mysql ]
then
echo "Mem db"
exit 0
else
echo "File db"
exit 1
fi