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-bin

Durch 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 -p

Geben 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:

\q

5. 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/dbname

Jetzt, 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]@slavehost

Als 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=1

In /etc/mysql/my.cnf auf dem Slave-Host:

[mysqld]  
server-id=100

7. 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 -p
UNLOCK TABLES;
\q

Starten Sie mysqld auf dem Master neu:

service mysql restart

Und starten Sie es auf dem Slave:

service mysql start

Sie können überprüfen, ob der neue server-id-Wert auf jedem Host wirksam geworden ist. Als Root:

mysqld --verbose --help | grep server-id

8. 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 -p

Fü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 -p

Erstellen Sie eine neue Datenbank:

CREATE DATABASE repltest;
USE repltest

Erstellen Sie eine Tabelle und fügen Sie einen Wert ein:

CREATE TABLE test (hello VARCHAR(10));
INSERT INTO test VALUES ('world');
\q

Jetzt geben Sie den MariaDB-Client auf dem Slave ein:

mysql -u root -p
USE repltest
SELECT * 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/dbname

11 ( c) . Auf dem Master, als normaler Benutzer:

rsync -avP mysql-master.tar.bz2 [benutzername]@slavehost2:~/.

11 ( d) . Auf dem Slave, als Root:

service mysql stop
tar 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=200

11 ( 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 restart

11 ( 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 -L

Sie 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 ACCEPT
Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.