MySQL : installation multi-instances

Dans le cas ou vous gérez plusieurs serveurs MySQL (distants ou sur différents VLAN), il peut être utile de déporter tout traitement long sur un seul serveur SQL dédié pour peu de regrouper l’ensemble des bases de données.
En attendant MariaDB 10 qui permettra la réplication multi-master, il est nécessaire de mettre en place plusieurs instances MySQL sur la même machine. Une réplication pourra ensuite être lancée sur chaque instance vers chaque serveur SQL source, configuré évidemment en master.
Voici donc un guide rapide de mise en place d’instances multiples MySQL (l’ancienne méthode tout à la main n’est plus nécessaire et c’est tant mieux).
Installation
root@sqlbackend:~# apt-get install mysql-server-5.5
Configuration
Je vais créer ici trois nouvelles instances mysql1, mysql2 et mysql3 ; chacune aura donc sa directive serveur. A noter que je ne supprime pas l’instance principale pour ne pas me ramasser à la prochaine mise à jour OS. Il faut cependant commenter l’option user sinon les instances supplémentaires ne se lanceront pas.
root@sqlbackend:~# vim /etc/mysql/my.cnf
[mysqld]
#user = mysql
[mysqld1]
user = mysql1
pid-file = /var/run/mysqld1/mysqld.pid
socket = /var/run/mysqld1/mysqld.sock
port = 33061
basedir = /usr
datadir = /var/lib/mysql1
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address = 127.0.0.1
general_log_file = /var/log/mysql1/mysql.log
general_log = 1
[mysqld2]
user = mysql2
pid-file = /var/run/mysqld2/mysqld.pid
socket = /var/run/mysqld2/mysqld.sock
port = 33062
basedir = /usr
datadir = /var/lib/mysql2
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address = 127.0.0.1
general_log_file = /var/log/mysql2/mysql.log
general_log = 1
[mysqld3]
user = mysql3
pid-file = /var/run/mysqld3/mysqld.pid
socket = /var/run/mysqld3/mysqld.sock
port = 33063
basedir = /usr
datadir = /var/lib/mysql3
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address = 127.0.0.1
general_log_file = /var/log/mysql3/mysql.log
general_log = 1
Chaque instance s’exécute sous un utilisateur dédié :
root@sqlbackend:~# useradd -r mysql1
root@sqlbackend:~# useradd -r mysql2
root@sqlbackend:~# useradd -r mysql3
Les répertoires de chaque instance sont à créer de cette manière :
root@sqlbackend:~# mkdir /var/lib/mysql{1,2,3}
root@sqlbackend:~# mkdir /var/log/mysql{1,2,3}
root@sqlbackend:~# chown mysql1:adm /var/log/mysql1
root@sqlbackend:~# chown mysql2:adm /var/log/mysql2
root@sqlbackend:~# chown mysql3:adm /var/log/mysql3
root@sqlbackend:~# mkdir /var/run/mysqld{1,2,3}
root@sqlbackend:~# chown mysql1 /var/run/mysqld1
root@sqlbackend:~# chown mysql2 /var/run/mysqld2
root@sqlbackend:~# chown mysql3 /var/run/mysqld3
Il reste à initialiser les datastores :
root@sqlbackend:~# mysql_install_db --datadir=/var/lib/mysql1 --user=mysql1
root@sqlbackend:~# mysql_install_db --datadir=/var/lib/mysql2 --user=mysql2
root@sqlbackend:~# mysql_install_db --datadir=/var/lib/mysql3 --user=mysql3
L’exécution de chaque instance est désormais possible :
root@sqlbackend:~# mysqld_multi --verbose --no-log start 1
root@sqlbackend:~# mysqld_multi --verbose --no-log start 2
root@sqlbackend:~# mysqld_multi --verbose --no-log start 3