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.cnfSuchen 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 restartIch ü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.cnfSuchen 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, 13965.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.sqlKopieren Sie den Dump nach Server2:
scp /root/mysqldump.sql [email protected]:/root5.4 Importieren Sie den Dump auf Server2
mysql -u root -p < /root/mysqldump.sqlFahren Sie MySQL auf server2 herunter:
service mysql stopKopieren 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.cnfStarten Sie MySQL auf server2:
service mysql startund 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.cnfSuchen 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.indeund starten Sie MySQL neu:
service mysql restartMelden 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
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.