Datenbank Replikation · 8 min read · Jan 29, 2026
Replikation einer Master-Datenbank mit MariaDB 10 auf Debian 8
Die Replikation von Datenbanken schafft Redundanz, die vor Datenverlust schützen kann, und ermöglicht eine optimierte Leistung für Anwendungen. Dieses Tutorial behandelt die Grundlagen der Replikation einer bestehenden MariaDB 10.0-Master-Datenbank auf einen oder mehrere Slaves. In den folgenden Beispielen ist das Betriebssystem Debian 8.
Diese Anweisungen können auf andere Betriebssysteme angewendet werden, aber beachten Sie, dass mehrere Befehle und Standarddateispeicherorte unterschiedlich sein werden. Insbesondere sollten Sie die Pfade von /etc/mysql/my.cnf, /var/lib/mysql, den Standardnamen und Pfad Ihrer Binärprotokolldatei sowie die Befehle zum Starten, Stoppen und Neustarten von mysqld gemäß den Spezifikationen Ihres Systems ersetzen.
1. Überprüfen der Konnektivität
Bevor Sie fortfahren, stellen Sie sicher, dass der Master und der Slave sich im Netzwerk erreichen können und dass jeder einen Eintrag für den anderen in seinen jeweiligen /etc/hosts-Dateien hat. Jeder Host sollte in der Lage sein, den anderen zu pingen, und Sie sollten in der Lage sein, von jedem zum anderen als normaler Benutzer ssh zu verwenden.
2. Aktivieren des mysqld-Binärprotokolls auf dem Master
Überprüfen Sie auf dem Master-Host, ob das binäre Protokollieren aktiviert ist. Das Aufrufen von mysqld mit den Schaltern –verbose –help zeigt die Betriebswerte für den MariaDB-Daemon an. Als Root:
mysqld --verbose --help | grep log-bin...
log-bin (Kein Standardwert)
...Der Wert des Eintrags log-bin definiert die Namenskonvention der Binärprotokolldateien. Unter Debian befinden sich diese Dateien in /var/lib. Wenn der Wert von log-bin (Kein Standardwert) ist, müssen Sie das Protokollieren aktivieren, indem Sie die Konfigurationsdatei my.cnf ändern. Unter Debian befindet sich my.cnf im Verzeichnis /etc/mysql.
Öffnen Sie /etc/mysql/my.cnf in einem Texteditor und suchen Sie die Gruppe [mysqld]. Wenn sie nicht existiert, erstellen Sie sie und geben Sie eine Zeile ein, die einfach log-bin lautet.
[mysqld]
log-binDurch das Hinzufügen dieses Eintrags wird das binäre Protokollieren aktiviert, wenn mysqld neu gestartet wird.
Sie können auch einen Wert für log-bin festlegen, z.B. log-bin= dateiname, um einen benutzerdefinierten Namen für die Binärprotokolldatei zu definieren. In diesem Tutorial werden wir keinen Wert festlegen, und die Standardprotokolldateinamen werden verwendet.
Starten Sie mysqld neu:
service mysql restartÜberprüfen Sie, ob die Änderung wirksam geworden ist:
mysqld --verbose --help | grep log-bin...
log-bin mysqld-bin
...Wie hier gezeigt, beginnt der Standardname der Binärprotokolldatei unter Debian mit mysqld-bin, z.B. mysqld-bin. nnnnnn.
3. Berechtigungen für einen Replikationsbenutzer gewähren
Es ist bewährte Praxis, alle Replikationsaufgaben von einem dedizierten Replikationsbenutzer durchführen zu lassen. In diesen Beispielen nennen wir den Benutzer repluser und setzen das Passwort dieses Benutzers auf die Zeichenfolge replpass.
Gewähren Sie diesem Benutzer die globalen Berechtigungen SUPER, RELOAD und REPLICATION SLAVE. Diese ermöglichen es dem Replikationsbenutzer, Superbenutzerbefehle auszuführen, Datenbank-Cache zu leeren und Updates vom Master-Server abzurufen.
Geben Sie den MariaDB-Client als Datenbank-Root ein:
mysql -u root -pGeben Sie an der MariaDB-Eingabeaufforderung den Befehl ein:
GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';Hier ermöglicht das Hostnamen-Wildcard ‘%‘ dem Replikationsbenutzer, sich von jedem Host zu verbinden.
Überprüfen Sie, ob die Berechtigungen gewährt wurden:
SHOW GRANTS FOR 'repluser'4. Datenbank-Caches leeren und Tabellen auf schreibgeschützt setzen
Zur Vorbereitung auf die Erstellung eines Snapshots der Datenbanken leeren Sie alle Tabellen und setzen Sie sie auf READ LOCK. Dies sollte schnell, während der Nebenzeiten oder einer Systemwartungsperiode erfolgen.
Auf dem Master:
FLUSH TABLES WITH READ LOCK;Jetzt, da die Tabellen gesperrt sind, überprüfen Sie den Master-Status:
SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| Datei | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000005 | 995 | | |
+-------------------+----------+--------------+------------------+Ihre Informationen werden unterschiedlich sein, aber notieren Sie sich die Werte von Datei und Position. Sie werden diese Informationen in Schritt 7 verwenden.
Verlassen Sie den MariaDB-Client:
\q5. Snapshot-Datenbanken für den Slave-Host
Erstellen Sie ein Archiv der Datenbank oder der Datenbanken, die auf dem Master existieren und die Sie replizieren möchten. Jede dieser Datenbanken hat ihr eigenes Verzeichnis in /var/lib/mysql. In diesem Beispiel werden wir eine einzelne Datenbank archivieren, die sich unter dem Pfad /var/lib/mysql/dbname befindet.
Dieser Befehl archiviert eine einzelne Datenbank. Wenn Sie zusätzliche Datenbanken archivieren, hängen Sie deren vollständige Pfade an den Befehl an, z.B. /var/lib/mysql/dbname1 /var/lib/mysql/dbname2…
tar cjvf /home/[benutzername]/mysql-master.tar.bz2 /var/lib/mysql/dbnameJetzt, als normaler Benutzer benutzername, übertragen Sie diese Datei auf ein normales Benutzerkonto auf dem Slave-Host:
rsync -avP mysql-master.tar.bz2 [benutzername]@slavehost:~/.oder, mit scp:
scp mysql-master.tar.bz2 [benutzername]@slavehost:~/.Dann, SSH zum Slave-Host:
ssh [benutzername]@slavehostAls Root stoppen Sie mysqld auf dem Slave:
service mysql stop…und extrahieren Sie das Archiv:
tar xjvf /home/[benutzername]/mysql-master.tar.bz2 -C /.6. Server-IDs für Master und Slave konfigurieren
Ändern Sie /etc/mysql/my.cnf auf dem Master, indem Sie den Eintrag server-id= n in der Gruppe [mysqld] hinzufügen, wobei n eine eindeutige Ganzzahl ist, die den Server identifiziert. Üblicherweise ist n =1 für den Master-Server, aber n kann jede eindeutige Ganzzahl im Bereich [ 1, 2^32-1 ] sein. Wir setzen unseren Master auf server-id=1 und unseren Slave auf server-id=100.
(Wenn my.cnf auf dem Slave nicht existiert, erstellen Sie es. Wenn es existiert, suchen Sie nach einem vorhandenen server-id-Eintrag und kommentieren Sie diese Zeile aus oder bearbeiten Sie sie).
In /etc/mysql/my.cnf auf dem Master-Host:
[mysqld]
server-id=1In /etc/mysql/my.cnf auf dem Slave-Host:
[mysqld]
server-id=1007. Tabellen entsperren und mysqld auf Master und Slave starten/neustarten
Auf dem Master-Server, im MariaDB-Client als Datenbank-Root, entsperren Sie die Tabellen:
mysql -u root -pUNLOCK TABLES;\qStarten Sie mysqld auf dem Master neu:
service mysql restartUnd starten Sie es auf dem Slave:
service mysql startSie können überprüfen, ob der neue server-id-Wert auf jedem Host wirksam geworden ist. Als Root:
mysqld --verbose --help | grep server-id8. Identität des Masters auf dem Slave konfigurieren
Konfigurieren Sie auf dem Slave die Identität des Master-Servers. Geben Sie den MariaDB-Client ein:
mysql -u root -pFühren Sie den folgenden Befehl aus, wobei Sie die Werte von MASTER_LOG_FILE und MASTER_LOG_POS durch die Binärprotokoll-Datei und Position ersetzen, die Sie in Schritt 4 aufgezeichnet haben, und die Werte von MASTER_HOST, MASTER_USER und MASTER_PASSWORD durch Ihre eigenen Werte ersetzen.
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;9. Slave aktivieren
Aktivieren Sie auf dem Slave im MariaDB-Client als Datenbank-Root:
START SLAVE;Sie können jetzt den Status des Slaves überprüfen:
SHOW SLAVE STATUS \G;************************* 1. Zeile *************************
Slave_IO_State: Warten auf Master, um Ereignis zu senden
Master_Host: masterhost
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000009
Read_Master_Log_Pos: 1330
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 1618
Relay_Master_Log_File: mysqld-bin.000009
Slave_IO_Running: Ja
Slave_SQL_Running: Ja
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: 1330
Relay_Log_Space: 2204
Until_Condition: Keine
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Nein
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: Nein
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: Nein
Gtid_IO_Pos:Wenn es Fehler im Replikationsprozess gibt, werden diese hier aufgelistet.
10. Änderungen am Master vornehmen und Replikation auf dem Slave überprüfen
Sie können überprüfen, ob die Replikation erfolgt, indem Sie eine neue Datenbank auf dem Master erstellen und die Änderungen auf dem Slave sehen.
mysql -u root -pErstellen Sie eine neue Datenbank:
CREATE DATABASE repltest;USE repltestErstellen Sie eine Tabelle und fügen Sie einen Wert ein:
CREATE TABLE test (hello VARCHAR(10));INSERT INTO test VALUES ('world');\qJetzt geben Sie den MariaDB-Client auf dem Slave ein:
mysql -u root -pUSE repltestSELECT * FROM test;+-------+
| hello |
+-------+
| world |
+-------+
1 Zeile im Set (0.00 sec)11. Prozess für zusätzliche Slaves wiederholen
Sie können diesen Prozess für jeden zusätzlichen Slave wiederholen. Insbesondere führen Sie diese Schritte aus:
11 ( a) . Auf dem Master, im MariaDB-Client als Datenbank-Root, leeren und sperren Sie die Tabellen:
FLUSH TABLES WITH READ LOCK;Nach dem Sperren zeigen Sie den Master-Status an:
**SHOW MASTER STATUS;Notieren Sie sich die Werte Datei und Position.
11 ( b) . Auf dem Master, als Root:
tar cjvf /home/[benutzername]/mysql-master.tar.bz2 /var/lib/mysql/dbname11 ( c) . Auf dem Master, als normaler Benutzer:
rsync -avP mysql-master.tar.bz2 [benutzername]@slavehost2:~/.11 ( d) . Auf dem Slave, als Root:
service mysql stoptar xjvf /home/[benutzername]/mysql-master.tar.bz2 -C /.11 ( e) . In /etc/mysql/my.cnf auf dem Slave-Host fügen Sie die Zeile server-id= in der Gruppe [mysqld] hinzu oder bearbeiten Sie sie, wobei der Wert von server-id neu und einzigartig ist:
[mysqld]
server-id=20011 ( f) . Auf dem Master, im MariaDB-Client als Datenbank-Root, entsperren Sie die Tabellen:
UNLOCK TABLES;11 ( g) . Auf dem Master, als Root, starten Sie mysqld neu:
service mysql restart11 ( h) . Auf dem Slave, als Root, starten Sie mysqld:
**service mysql start
11 ( i) . Auf dem Slave, im MariaDB-Client als Datenbank-Root, konfigurieren Sie die Master-Identität und die Binärprotokolldatei und Position aus Schritt 10(a):
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;11 ( j) . Auf dem Slave, im MariaDB-Client als Datenbank-Root, aktivieren Sie die Replikation:
START SLAVE;12. Fehlersuche: Slave kann sich nicht mit dem Master verbinden
Überprüfen Sie /var/mysql/my.cnf auf dem Master auf einen bind-address-Eintrag. Wenn bind-address auf 127.0.0.1 gesetzt ist, akzeptiert der Server nur Verbindungen von localhost. Kommentieren Sie diese Zeile aus oder setzen Sie den Wert auf * um Verbindungen von allen IPv4- und IPv6-Adressen zuzulassen. Wenn Sie my.cnf ändern, vergessen Sie nicht, mysqld neu zu starten.
Wenn die Verbindungen immer noch nicht funktionieren, stellen Sie sicher, dass Ihr Server Verbindungen über den Port 3306 zulässt. Auf dem Master listen Sie die Kernel-Firewall-Tabellen auf:
iptables -LSie können eine Erlaubnis für Verbindungen über Port 3306 mit dem folgenden Befehl erstellen, wobei Sie den Namen Ihres Netzwerk-Schnittstellengeräts nach Bedarf für eth0 ersetzen:
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPTErhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.