MySQL Server Master/Slave Konfiguration

Diese super Anleitung habe ich in einem Forum gefunden und ich möchte nicht das sie wieder verloren geht. Daher habe ich die Anleitung hier rein kopiert und etwas angepasst.
Der Originalbeitrag ist unter http://www.homepage-community.de/mysql_master_slave_replikation-t57.0.html zu finden.
Diese Anleitung beschreibt wie man einen MySQL-Server permanent dupliziert. D.h. es gibt einen Rootserver der als Masterserver arbeitet und einen Slave der als Backup dient. Bei mir sind das ein 1und1 Rootserver (Master) und ein lokaler Debianserver, (Slave) der bei mir zu Hause steht.
MySQL Replikation als Master / Slave Lösung um Lese und Schreibzugriffe auf verschiedene Server zu verteilen oder aber um ein 1:1 Live Backup seiner MySQL Datenbank vorzuhalten das im Fehlerfall als aktuelles Backup dient.Die Master Save Replikation ist unter MySQL sehr einfach zu realisieren und lässt sich auch auf einem bereits laufenden Datenbankserver Problemlos umsetzen.

1. Einen Slave User mit Replikationsrechten auf dem Master anlegen
Hierzu loggen wir uns über die Shell auf die MySQL Konsole ein und führen folgendes Kommando aus:

GRANT REPLICATION SLAVE ON *.* TO ‚<slaveuser>’@’%‘ IDENTIFIED BY ‚<passwd>‘;


2. my.cnf auf dem Master anpassen

wir bearbeiten mit unserem Texteditor der Wahl die Datei /etc/mysql/my.cnf und setzen folgende Werte:

server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
#bind-address = 127.0.0.1

Das ganze gefolgt von einem:

/etc/init.d/mysql restart

Hier haben wir dem Master mitgeteilt das er alle SQL Anfragen Binär loggen soll.

3. Vorbereitung –
Datenbanken kopieren
Wir loggen uns wieder auf der MySQL Konsole ein und sperren alle Schreibzugriffe auf die Datenbank mit folgendem Kommando:

FLUSH TABLES WITH READ LOCK;

Nun ist es von besonderer Wichtigkeit, das wir uns die aktuelle Postion und das aktuelle Logfile vom Master notieren:

SHOW MASTER STATUS;

4. Datenbanken kopieren
Eine weitere Shell öffnen und den unteren Befehl ausführen. Bitte die offene Shell mit dem LOCK nicht schließen.

mysqldump -uroot -p<PASSWORT> –add-drop-table –all-databases | gzip -9 > /tmp/backup.mysql.sql.tgz


5. Die Tabellen auf dem Master wieder freigeben

UNLOCK TABLES;

6. Die aktuellen Datenbanken vom Master auf den Slave kopieren
Zum Slave wechseln, die Datenbank kopieren und anschließend einspielen.

scp -P <SSH-PORT> root@<IP-SERVER>:/tmp/backup.mysql.sql.tgz /tmp/
gunzip < /tmp/backup.mysql.sql.tgz | mysql –user=root –pass=<PASSWORT> –host=localhost

7. Die my.cnf auf dem Slave anpassen
joe /etc/mysql/my.cnf

server-id = 2
#log_bin = /var/log/mysql/mysql-bin.log
#expire_logs_days = 10
#max_binlog_size = 100M
slave-skip-errors = 1062

Der rote Parameter muß neu eingefügt werden. Er behebt Fehler, die bei einem bereits bestehenden Datensatz entstehen.
Eine typische Fehlermeldung zu dem Thema lautet

error 'Duplicate entry '272547452258258' for key .......' on query ' INSERT INTO .........

8. Den MySQL Slave neustarten

/etc/init.d/mysql restart

Wenn hier eine Fehlermeldung bezüglich des Users debian-sys-maint kommen sollte, dann die letzten beiden Punkte dieses Artikels durchgehen.

9. Dem Slave mitteilen wer der Master ist und die Replikation anfahren
Auf dem Slave die MySSQL Konsole starten und folgende Kommando absetzen:

CHANGE MASTER TO MASTER_HOST='<host>‘, MASTER_USER='<slaveuser>‘, MASTER_PASSWORD='<passwd>‘, MASTER_LOG_FILE=’mysql-bin.<Hier die aktuelle Datei vom Master aus Schritt 3>‘, MASTER_LOG_POS=<Die Position vom Master aus Schritt 3>;
START SLAVE;

Und das wars auch schon, wenn alles funktioniert hat, werden nun alle Anweisung die auf dem Master gemacht werden, auch auf dem SLAVE ausgeführt, so das wir jederzeit eine 1:1 Kopie der MySQL Datenbanken vom Master vorliegen haben. Nicht vergessen den Firewallport 3306 eingehend freizuschalten.
Wenn jetzt der Backupserver eingeschaltet wird, holt er sich alle Änderungen seit der letzten Synchronisation.