Running multiple instances of MySQL on the same machine

By | 11/11/2012

There are various methods to run multiple instances of mysql (on different ports) on the same machine. We can either compile the mysql binary with different defaults and paths, use mysqld_multi or the MySQL Sandbox project. Still the simplest solution I’ve  used in the past for such situations is to use the same binary and use a separate configuration file (with separate port, pid, socket and data directory). This post will explain this method.

1. Create separate data and log directories

We need to create new directories for our datadir and log folder (if used). Also we need to assign proper permissions on those folders:
mkdir /var/lib/mysql2
chown -R mysql.mysql /var/lib/mysql2/
mkdir /var/log/mysql2
chown -R mysql.mysql /var/log/mysql2

2. Create a new mysql configuration file

Next we need a separate configuration file. We can start by copying the existing one and changing the needed values. This example was taken on a debian machine that holds the mysql configurations under /etc/mysql/my.cnf. We just copy this folder and modify it from there:
cp -R /etc/mysql/ /etc/mysql2
if you use a redhat variant package then your configuration file is under /etc/my.cnf by default and you can just copy it directly:
cp /etc/my.cnf /etc/my2.cnf
(or change the path appropriately for your configuration file is in a different place).

Next, we need to edit our new configuration file and at least update the mysql port (default to 3306), the pid and socket to be different than the default ones, and also point the data and log folders to the ones created before. On my debian machine this can be done with something like this:
cd /etc/mysql2/
sed -i 's/3306/3307/g' my.cnf
sed -i 's/mysqld.sock/mysqld2.sock/g' my.cnf
sed -i 's/' my.cnf
sed -i 's/var\/lib\/mysql/var\/lib\/mysql2/g' my.cnf
sed -i 's/var\/log\/mysql/var\/log\/mysql2/g' my.cnf

3. Initializing and starting

Finally we need to initialize the default dbs:
mysql_install_db --user=mysql --datadir=/var/lib/mysql2/
Alternatively we can copy the existing /var/lib/mysql if this is needed (shut down mysql prior to do this).

Finally we can start our new mysql instance with:
mysqld_safe --defaults-file=/etc/mysql2/my.cnf &
We can connect to our new instance using:
mysql -S /var/run/mysqld/mysqld2.sockor
mysql -h -P 3307
and if we no longer need it, stop it with:
mysqladmin -S /var/run/mysqld/mysqld2.sock shutdown

Here is a script we have used to create many instances that we needed for testing. Feel free to use or change it to suit your needs (it is for debian machines), and you run it with <ID>

#!/bin/bash i=$1 port=$[3306+$i] mkdir /var/lib/mysql$i chown -R mysql.mysql /var/lib/mysql$i/ mkdir /var/log/mysql$i chown -R mysql.mysql /var/log/mysql$i cp -R /etc/mysql/ /etc/mysql$i cd /etc/mysql$i/ sed -i "s/3306/$port/g" my.cnf sed -i "s/mysqld.sock/mysqld$i.sock/g" my.cnf sed -i "s/$" my.cnf sed -i "s/var\/lib\/mysql/var\/lib\/mysql$i/g" my.cnf sed -i "s/var\/log\/mysql/var\/log\/mysql$i/g" my.cnf mysql_install_db --user=mysql --datadir=/var/lib/mysql$i/ mysqld_safe --defaults-file=/etc/mysql$i/my.cnf &