What is the 'Debian way' of installing multiple MySQL instances on a single server?

Do you know any 'Debian way' of setting up multiple MySQL instances on a single server? The server would receive data replicated from multiple remote databases.

I could use scripts like mysqlsandbox but I prefer to stick to Debian packages and would like to be able to upgrade the setup without much complications in the future. Another solution is mysqlmanager - it works with MySQL 5.1 but it's deprecated and not released anymore with 5.5.

So what's the 'best practice' of running multiple MySQL instances on a single Debian server?


I believe it's as simple as running mysqld_multi and setting up your my.cnf correctly. mysqld_multi is a part of the mysql distribution - not a packaged frill.

There is a patch to make /usr/share/mysql/mysqld_multi.server appropriate for use in /etc/init.d and another patch to make mysqld_multi use files in /etc/mysql/conf.d.

You can initialize MySQL data directories for new instances with the mysql_install_db command like this:

mysql_install_db --datadir=/var/lib/mysql2

Don't forget to change the root password of the newly created instance:

mysqladmin --port 3307 --user=root password 'new-password'

On Debian 8, you can use Systemd mechanism: no more need of mysqld_multi.

NOTE: I use MariaDB version! Not sure if it works with 'classic' MySQL package.

From /lib/systemd/system/[email protected]:

Multi instance version of mariadb. For if you run mutiple verions at once. Also used for mariadb@bootstrap to bootstrap Galera.

create config file /etc/mysql/conf.d/my{instancename}.cnf

start as systemctl start mariadb@{instancename}.server

So, create a file /etc/mysql/conf.d/myserver2.cnf, and specify in it new pid/socket/datadir files and network port:

[mysqld]
user        = mysql
pid-file    = /var/run/mysqld/mysqld-server2.pid
socket      = /var/run/mysqld/mysqld-server2.sock
port        = 3307
basedir     = /usr
datadir     = /var/lib/mysql-server2
tmpdir      = /tmp

EDIT: be carefull that first MySQL instance do not read this config file, with !includedir /etc/mysql/conf.d/* at the bottom of /etc/mysql/my.cnf. If it is the case, replace the !includedir with a !include of each config file OTHER THAN myserver2.cnf:

#!includedir /etc/mysql/conf.d/*
!include /etc/mysql/conf.d/conf1.cnf
!include /etc/mysql/conf.d/confX.cnf

The MySQL official doc indicate you have to name [mysqld] as [mysqld@server2] (https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html#systemd-multiple-mysql-instances) but this does not work with MariaDB. So just let [mysqld].

Before starting the new daemon, don't forget to create the datadir and needed files :

mkdir /var/lib/mysql-server2
chown mysql:mysql /var/lib/mysql-server2
mysql_install_db --datadir=/var/lib/mysql-server2

Also reload systemd daemon config:

systemctl daemon-reload

And if you want to start this daemon at boot:

systemctl enable mariadb@server2

To start it:

service mariadb@server2 start