Gérer plusieurs instances de MySQL

2009-06-19
Thomas Martin


Voici un résumé de la mise en oeuvre de multiples instances MySQL sur un serveur Debian, à l'aide de l'outil mysqld_multi. Cette solution permet par exemple d'offrir un accès complet à MySQL dans le cadre d'un hébergement mutualisé (l'utilisateur peut alors créer ses propres bases, gèrer ses utilisateurs, etc). Cela peut être aussi utilisé pour cloisonner totalement les bases de données de différentes applications, et ainsi d'ajuster finement des paramètres tels que max_connections pour chacune d'elles.

Voici les étapes :

Ajouter une ou plusieurs sections [mysqldN] dans /etc/mysql/my.cnf, où N correspond au numéro d'instance, et <instance> à son nom :

[mysqldN]
mysqld = /usr/bin/mysqld_safe
user = mysql-<instance>
port = 3307
socket = /var/run/mysqld-<instance>/mysqld.sock
pid-file = /var/run/mysqld-<instance>/mysqld.pid
datadir = /home/mysql/<instance>

Si vous utilisez les options --log, --log-bin ou --log-error, il est nécessaire de les redéfinir dans chaque configuration d'instances (voir Running Multiple MySQL Servers on the Same Machine).

Note : pour faire tourner l'instance avec un utilisateur différent (comme dans cette exemple) il est à priori nécessaire de commenter le paramètre user = mysql dans la section [mysqld] du my.cnf, sinon mysqld_multi retourne une erreur :

Ignoring user change to 'mysql-<instance>' because the user was set to 'mysql' earlier on the command line

Décommenter ce paramètre ne gène pas le lancement de l'instance initiale.

Créer le compte système qui fera tourner l'instance :

useradd -r mysql-<instance>

Créer le répertoire de données de l'instance, et les répertoires annexes :

mysql_install_db --datadir=/home/mysql/<instance>
chown -R mysql-<instance> /home/mysql/<instance>
mkdir /var/run/mysqld-<instance>
chown mysql-<instance> /var/run/mysqld-<instance>

Démarrage de l'instance :

mysqld_multi --verbose --no-log start N

Où N fait référence au numéro de l'instance.

Il est maintenant possible de s'y connecter en utilisant le numéro de port TCP/IP spécifié plus haut, et en saisissant un mot de passe vide :

mysql -h 127.0.0.1 --port=3307 -u root -p

Si vous choisissez d'utiliser un mot de passe root commun à toutes vos instances, vous trouverez pratique d'ajouter la section suivante à votre fichier .my.cnf :

[mysqld_multi]
user = root
password = "<password>"

Enfin, voici un exemple de script d'init permettant de démarrer et d'arrêter proprement toutes vos instances :

#!/bin/sh

case "$1" in
        start)
                mysqld_multi start
                ;;
        stop)
                mysqld_multi stop
                ;;
  *)
        echo "Usage: $0 {start|stop}"
        exit 1
esac

exit 0