MySQL Replikation · 4 min read · Nov 20, 2025

Installation eines Web-, E-Mail- und MySQL-Datenbankclusters auf Debian 8.4 Jessie mit ISPConfig 3.1 - Seite 2

5. MySQL Master-Master-Replikation

5.1 Server1 vorbereiten

Melden Sie sich bei MySQL an und erstellen Sie ein Konto speziell für die Replikation in MySQL. Ich verwende einen separaten Benutzer für die Replikation, um die Möglichkeit einer Kompromittierung anderer Konten zu minimieren (Benutzername und Passwort werden im Klartext in der Master-Info-Repository-Datei oder -Tabelle gespeichert):

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';

und gewähren Sie das REPLICATION SLAVE-Recht:

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;

Nehmen Sie einige Änderungen für die Replikation in Ihrer MySQL-Konfiguration vor:

vi /etc/mysql/my.cnf

Suchen Sie nach dem Abschnitt, der mit [mysqld] beginnt, und fügen Sie die folgenden Optionen hinzu (kommentieren Sie alle vorhandenen konfliktierenden Optionen aus):

[...]  
[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             = ::

und starten Sie MySQL anschließend neu:

service mysql restart

Ich überspringe einfach einige Slave-Fehler. Ich habe dies auf meinem Blog erklärt:

  • 1007 = Datenbank ‘%s’ kann nicht erstellt werden; Datenbank existiert
  • 1008 = Datenbank ‘%s’ kann nicht gelöscht werden; Datenbank existiert nicht
  • 1050 = Tabelle ‘%s’ existiert bereits
  • 1396 = Operation %s für %s fehlgeschlagen - Benutzer kann nicht erstellt werden

Sie finden die Liste der MySQL-Fehlercodes hier: Serverfehlercodes und -nachrichten

5.2 Server2 vorbereiten

Nehmen Sie einige Änderungen für die Replikation in Ihrer MySQL-Konfiguration vor:

vi /etc/mysql/my.cnf

Suchen Sie nach dem Abschnitt, der mit [mysqld] beginnt, und fügen Sie die folgenden Optionen hinzu (kommentieren Sie alle vorhandenen konfliktierenden Optionen aus):

[...]  
[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 Erstellen Sie einen Snapshot der vorhandenen Datenbanken auf Server1

Dumpen Sie die Datenbanken auf server1 und geben Sie das MySQL-Root-Passwort ein:

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

Kopieren Sie den Dump nach Server2:

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

5.4 Importieren Sie den Dump auf Server2

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

Fahren Sie MySQL auf server2 herunter:

service mysql stop

Kopieren Sie die Standarddatei für MySQL von Server1 nach Server2. Wechseln Sie zu server1 und führen Sie aus:

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

Starten Sie MySQL auf server2:

service mysql start

und melden Sie sich bei MySQL an, um den Master-Server mit:

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

Starten Sie den Slave:

START SLAVE;

und überprüfen Sie den Slave-Status mit

SHOW SLAVE STATUS \G

Das Ergebnis wird etwa so aussehen:

************************* 1. row ***********************  
               Slave_IO_State: Waiting for master to send event  
                  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: Yes  
            Slave_SQL_Running: Yes  
             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: None  
               Until_Log_File:  
                Until_Log_Pos: 0  
           Master_SSL_Allowed: No  
           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: No  
                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: No  
                    Gtid_IO_Pos:

Wenn “Seconds Behind Master” nicht 0 ist, warten Sie, bis der Slave alle Daten vom Master gelesen hat (wiederholen Sie einfach den Befehl, um den aktuellen Wert zu erhalten). Stellen Sie sicher, dass Server2 das richtige Master-Log und die Log-Position verwendet.

Führen Sie auf server1 in MySQL aus:

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)

Und vergleichen Sie die Replikations-Master-Binärprotokoll-Koordinaten.

Wir führen eine MySQL Master-Slave-Replikation durch, bei der Server1 der Master und Server2 der Slave ist.

5.5 MySQL Master-Master-Replikation

Erstellen Sie den MySQL-Benutzer für die Replikation und gewähren Sie die Berechtigung in 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;

Nehmen Sie einige Änderungen für die Replikation in Ihrer MySQL-Konfiguration auf server2 vor:

vi /etc/mysql/my.cnf

Suchen Sie nach dem Abschnitt, der mit [mysqld] beginnt, und fügen Sie die folgenden Optionen hinzu (kommentieren Sie alle vorhandenen konfliktierenden Optionen aus):

[...]  
[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

und starten Sie MySQL neu:

service mysql restart

Melden Sie sich bei MySQL an und holen Sie sich die Master-Binärprotokoll-Koordinaten:

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)

Melden Sie sich bei MySQL auf server1 an und setzen Sie den Master-Server mit

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;

Starten Sie den Slave:

START SLAVE;

und überprüfen Sie den Slave-Status mit

SHOW SLAVE STATUS \G

Überprüfen Sie, ob der Slave läuft:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Wenn Ihre Replikation nicht mehr funktioniert, finden Sie möglicherweise zusätzliche Informationen hier:

  • So überspringen Sie bestimmte Fehler in der MySQL-Replikation
  • MySQL Master-Master-Replikation neu starten
  • MySQL-Replikation – Konnte den Relay-Log-Ereigniseintrag nicht analysieren
Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.