Über den Author / Programme / MySQL Datenbank Replikation

MySQL Datenbank Replikation

~3 Min. Lesezeit

Eine Datenbank Replikation braucht man eigentlich selten, doch für sehr wichtige Applikationen wo möglichst kein Downtime auftreten soll bei Hardware Fehlern, eignet sich eine Datenbank Replikation.

Eine Replikation ist jedoch kein Backup, da beide Datenbanken ohne Verzögerungen den gleichen Stand haben. Wenn Daten aus der Master DB gelöscht werden, so sind diese zeitgleich auf der Slave DB gelöscht.

Diese Tutorial ist für Debian Lenny geschrieben, sollte aber für alle Linux Versionen sehr ähnlich ablaufen. Unsere Datenbank heisst exampledb.

Als Erstes nehmen wir die Konfiguration am Master vor. Wir müssen zulassen, das der Slave Server auf die Datenbank kommt und passen dazu die /etc/mysql/my.cnf an (existierende Zeilen bitte anpassen, restliche hinzufügen):

#skip-networking
#bind-address = 127.0.0.1

log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db=exampledb
server-id=1

Anschliessend, restarten wir den MySQL Dienst:

/etc/init.d/mysql restart

Anschliessend müssen wir ein USer erstellen, welcher die Replication Rechte hat, dazu müssen wir uns am MySQL Server einloggen:

mysql -u root -p

NAch dem richtigen Password, können wir folgende Befehle absetzen:

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

Weiterhin müssen wir nun gewisse Informationen haben und geben den Befehl

USE exampledb;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Was Euch dann folgende Ausgabe ergibt:
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_do_db | Binlog_ignore_db |
+---------------+----------+--------------+------------------+
mysql-bin.004 | 261      | exampledb    |                  |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Schreibt euch die rot markierte Information auf für später.

Nun kann man die MySQL Verbindung schliessen mit

quit;

Es gibt nun 2 Möglichkeiten wie man den initialen Load vom Master in den Slave bekommt. Die erste Möglichkeit ist ein Backup vom der MAster DB zu machen und in dem Slaveserver einzuspielen, die 2te ist mit einem Befehl wo man auf dem Slave startet.
Startet man die Replikation mit einem Befehl und hat viele Daten in der Master DB, dann wird dies einige Zeit in Anspruch nehmen und solange wird die Applikation nicht funktionieren, dafür hat man selber sehr wenig zu tun. Grundsätzlich sollte man aber die erste Replikation zu Randzeiten starten und nicht inmitten des Tages, daher spielt dies keine Rolle.

Ich werde beide Arten beschreiben.

Variante 1: Backup
Will man es per Backup machen (1te Möglichkeit), kann man auf der Shell folgenden Befehl absetzen:

mysqldump -u root -ppassword –opt exampledb > exampledb.sql

Bitte beachtet dabei unbedingt, das zwischen -p und eurem Password kein Leerzeichen ist!

Nun müssen wir uns nochmals mit der MySQL verbinden und die Tablesperre aufheben:

mysql -u root -p
Enter password:
UNLOCK TABLES;
quit;

Nun können wir uns dem Slaveserver widmen.
Als Erstes müssen wir nun eine Datenbank erstellen, welche den gleichen Namen wie auf dem Masterserver hat. Dazu verbinden wir uns mit der MySQL:

mysql -u root -p
CREATE DATABASE exampledb;
quit;

Variante 1: Backup
Nun muss man das Backup vom Masterserver auf den Slave kopieren und dann in die soeben erstellte Datenbank kopieren mit folgendem Befehl:

mysql -u root -ppassword exampledb < /pfad/zu/exampledb.sql

Bitte beachtet dabei unbedingt, das zwischen -p und eurem Password kein Leerzeichen ist!

Als Nächstes müssen wir dem Slave sagen, wo die Master Datebank zu finden ist und fügen dazu die folgende Konfiguration in /etc/mysql/my.cnf ein:

server-id=2
master-host=IP Adresse vom Master Server
master-user=slave_user
master-password=password
master-connect-retry=60
replicate-do-db=exampledb

Danach restarten wir den MySQL Dienst:

/etc/init.d/mysql restart

Variante 2: Befehl
Nun müssen wir den Befehl für den ersten Inload noch manuell absetzen:

mysql -u root -p
LOAD DATA FROM MASTER;
quit;

Damit am Ende alles funktioniert müssen wir nun noch den Slave stoppen:

mysql -u root -p
SLAVE STOP;

Die beim Master notierte Ausgabe muss nun hier eingefüllt werden. Anschliessend senden wir den Befehl auf der MySQL Konsole ab.

CHANGE MASTER TO MASTER_HOST='IP Adresse vom Master Server', MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.004', MASTER_LOG_POS='261';

Mit dem Befehl:

START SLAVE;
quit;

Starten wir den Slave wieder und verlassen die MySQL Konsole. Die Replikation ist nun eingerichtet.

PS: Eine zeitverzögerte MySQL Replikation ist von Haus auf nicht möglich. Wer dennoch Interesse daran hat, sollte sich das Maatkit mal genauer anschauen.

About Stefan

avatar
Ein männlicher IT Nerd, durchstöbert das Web nach speziellen Gadgets, unentbehrlicher Software und Alles was man im IT Sektor nicht verpassen darf.Immer hilfsbereit wenn Probleme zu lösen sind oder das Unmögliche umgesetzt werden sollte.

Weitere interessante Artikel

User Profile migrieren oder backuppen

~0 Min. LesezeitFirmen synchronisieren User Profile über die Domain. Privatpersonen verlieren oft das User Profil, …

Firefox 43 – Platzsparender Hack

~0 Min. LesezeitMan sieht wie schnell die Zeit vergeht, wenn man wiedermal den Platzsparenden Hack …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.