MySQL Configuration · 4 min read · Nov 20, 2025

Installation d'un cluster Web, Email et MySQL sur Debian 8.4 Jessie avec ISPConfig 3.1 - Page 2

5. Réplication MySQL Maître-Maître

5.1 Préparer le Serveur1

Connectez-vous à MySQL et créez un compte spécifiquement pour la réplication dans MySQL. J’utilise un utilisateur séparé pour la réplication afin de minimiser la possibilité de compromission d’autres comptes (nom d’utilisateur et mot de passe sont stockés en texte clair dans le fichier ou la table d’informations du maître) :

CREATE USER 'slaveuser2'@'server2.example.tld' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser2'@'192.168.0.106' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser2'@'2001:db8::2' IDENTIFIED BY 'slave_user_password';

et accordez le privilège REPLICATION SLAVE :

GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'server2.example.tld';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'192.168.0.106';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'2001:db8::2';  
QUIT;

Apportez quelques modifications pour la réplication à votre configuration MySQL :

vi /etc/mysql/my.cnf

Recherchez la section qui commence par [mysqld], et mettez les options suivantes dedans (en commentant toutes les options conflictuelles existantes) :

[...]  
[mysqld]  
server-id                = 1  
replicate-same-server-id = 0  
auto-increment-increment = 2  
auto-increment-offset    = 1  
log_bin                  = mysql-bin.log  
expire_logs_days         = 10  
max_binlog_size          = 100M  
binlog_format            = mixed  
sync_binlog              = 1  
relay-log                = slave-relay.log  
relay-log-index          = slave-relay-log.index  
slave_skip_errors        = 1007,1008,1050, 1396  
bind-address             = ::

et redémarrez MySQL par la suite :

service mysql restart

Je passe simplement certains erreurs esclave. J’ai expliqué cela sur mon blog :

  • 1007 = Impossible de créer la base de données ‘%s’ ; la base de données existe
  • 1008 = Impossible de supprimer la base de données ‘%s’ ; la base de données n’existe pas
  • 1050 = La table ‘%s’ existe déjà
  • 1396 = L’opération %s a échoué pour %s - Impossible de créer l’utilisateur

vous pouvez trouver la liste des codes d’erreur MySQL ici : Codes d’erreur et messages du serveur

5.2 Préparer le Serveur2

Apportez quelques modifications pour la réplication à votre configuration MySQL :

vi /etc/mysql/my.cnf

Recherchez la section qui commence par [mysqld], et mettez les options suivantes dedans (en commentant toutes les options conflictuelles existantes) :

[...]  
[mysqld]  
server-id                = 2  
log_bin                  = mysql-bin.log  
expire_logs_days         = 10  
max_binlog_size          = 100M  
binlog_format            = mixed  
sync_binlog              = 1  
slave_skip_errors        = 1007,1008,1050, 1396

5.3 Créer un instantané des bases de données existantes sur le serveur1

Dump les bases de données sur serveur1 et entrez le mot de passe root MySQL :

mysqldump -p --all-databases --allow-keywords --master-data --events --single-transaction > /root/mysqldump.sql

Copiez le dump sur serveur2 :

scp /root/mysqldump.sql [email protected]:/root

5.4 Importer le dump sur serveur2

mysql -u root -p < /root/mysqldump.sql

Arrêtez mysql sur serveur2 :

service mysql stop

Copiez le fichier par défaut pour MySQL de serveur1 à serveur2. Passez à serveur1 et exécutez

scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnf

Démarrez MySQL sur serveur2 :

service mysql start

et connectez-vous à MySQL pour définir le serveur maître avec :

CHANGE MASTER TO MASTER_HOST="server1.example.tld", MASTER_USER="slaveuser2", MASTER_PASSWORD="slave_user_password";

Démarrez l’esclave :

START SLAVE;

et vérifiez l’état de l’esclave avec

SHOW SLAVE STATUS \G

Le résultat sera quelque chose comme

************************* 1. row ***********************  
               Slave_IO_State: En attente que le maître envoie un événement  
                  Master_Host: server1.example.tld  
                  Master_User: slaveuser2  
                  Master_Port: 3306  
                Connect_Retry: 60  
              Master_Log_File: mysql-bin.000001  
          Read_Master_Log_Pos: 109989  
               Relay_Log_File: mysqld-relay-bin.000002  
                Relay_Log_Pos: 110276  
        Relay_Master_Log_File: mysql-bin.000001  
             Slave_IO_Running: Oui  
            Slave_SQL_Running: Oui  
             Replicate_Do_DB:  
          Replicate_Ignore_DB:  
           Replicate_Do_Table:  
       Replicate_Ignore_Table:  
      Replicate_Wild_Do_Table:  
  Replicate_Wild_Ignore_Table:  
                   Last_Errno: 0  
                   Last_Error:  
                   Skip_Counter: 0  
          Exec_Master_Log_Pos: 109989  
              Relay_Log_Space: 110574  
              Until_Condition: Aucun  
               Until_Log_File:  
                Until_Log_Pos: 0  
           Master_SSL_Allowed: Non  
           Master_SSL_CA_File:  
           Master_SSL_CA_Path:  
              Master_SSL_Cert:  
            Master_SSL_Cipher:  
               Master_SSL_Key:  
        Seconds_Behind_Master: 0  
Master_SSL_Verify_Server_Cert: Non  
                Last_IO_Errno: 0  
                Last_IO_Error:  
               Last_SQL_Errno: 0  
               Last_SQL_Error:  
  Replicate_Ignore_Server_Ids:  
             Master_Server_Id: 1  
               Master_SSL_Crl:  
           Master_SSL_Crlpath:  
                   Using_Gtid: Non  
                  Gtid_IO_Pos:

Si “Seconds Behind Master” n’est pas 0, attendez que l’esclave ait lu toutes les données du maître (répétez simplement la commande pour obtenir la valeur actuelle). Assurez-vous que serveur2 utilise le bon journal maître et la bonne position de journal.

Sur serveur1, exécutez dans MySQL :

SHOW MASTER STATUS \G
*********************** 1. row *************************  
            File: mysql-bin.000991  
        Position: 69185362  
    Binlog_Do_DB:  
Binlog_Ignore_DB:  
1 row in set (0.00 sec)

Et comparez les coordonnées du journal binaire de réplication maître.

Nous exécutons une réplication MySQL Maître-Esclave où serveur1 est le maître et serveur2 l’esclave.

5.5 Réplication MySQL Maître-Maître

Créez l’utilisateur MySQL pour la réplication et accordez le privilège dans MySQL :

CREATE USER 'slaveuser1'@'server1.example.tld' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser1'@'192.168.0.105' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser1'@'2001:db8::1' IDENTIFIED BY 'slave_user_password';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'server1.example.tld';   
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'192.168.0.105';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'2001:db8::1';  
QUIT;

Apportez quelques modifications pour la réplication à votre configuration MySQL sur serveur2 :

vi /etc/mysql/my.cnf

Recherchez la section qui commence par [mysqld], et mettez les options suivantes dedans (en commentant toutes les options conflictuelles existantes) :

[...]  
[mysqld]  
[...]  
replicate-same-server-id = 0  
auto-increment-increment = 2  
auto-increment-offset    = 2  
relay-log                = slave-relay.log  
relay-log-index          = slave-relay-log.inde

et redémarrez MySQL :

service mysql restart

Connectez-vous à MySQL et obtenez les coordonnées du journal binaire maître :

SHOW MASTER STATUS \G
************************* 1. row *************************  
            File: mysql-bin.000002  
        Position: 326  
    Binlog_Do_DB:  
Binlog_Ignore_DB:  
1 row in set (0.00 sec)

Connectez-vous à MySQL sur serveur1 et définissez le serveur maître avec

CHANGE MASTER TO MASTER_HOST="server2.example.tld", MASTER_USER="slaveuser1", MASTER_PASSWORD="slave_user_password", MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=326;

Démarrez l’esclave :

START SLAVE;

et vérifiez l’état de l’esclave avec

SHOW SLAVE STATUS \G

Vérifiez que l’esclave fonctionne :

Slave_IO_Running: Oui
Slave_SQL_Running: Oui

Si votre réplication cesse de fonctionner, vous pouvez trouver des informations supplémentaires ici :

  • Comment ignorer certaines erreurs dans la réplication MySQL
  • redémarrer la réplication maître-maître mysql
  • mysql-réplication – Impossible d’analyser l’entrée du journal de relais
Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.