MySQL Master / Slave Replikation

Eine Datenbankreplikation ist für den Hausgebrauch sicher wenig sinnvoll – Zumal es wohl kaum als Backup Lösung zu gebrauchen ist, da eine zerstörerische Query, die auf der Master DB ausgeführt wird innerhalb derselben Sekunde den Slave erreicht.

Viel mehr kann mit einem solchen redundanten Datenbankystem Pferderstärken auf dem Master DB Server gespart werden. Beispielsweise können komplexe Queries dann auf dem Slave ausgeführt werden.

Dieses Tutorial ist für Ubuntu Lucid Lynx (10.04) geschrieben, sollte sich aber auf anderen Debian System (auch SUSE) übertragen lassen

Master Server

Zuerst sollte der Master Server konfiguriert werden. Wichtig hierbei ist, dass der Server Buch führt (sog. Log) über seine Aktivitäten.
In der /etc/mysql/my.cnf sind daher folgende Änderungen notwendig (für die DB Replikationsdatenbank):

[mysqld]
server-id=1
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db=Replikationsdatenbank

MySQL neustarten

sudo service mysql restart

Als nächstes loggt man sich in den MySQL Server ein und gibt dem User Slave_Benutzer die Replikationsrechte (Replication Slave):

mysql -p -u root;
GRANT REPLICATION SLAVE ON *.* TO 'Slave_Benutzer'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

Um nun den aktuellen Stand der MySQL Datenbank zu erfassen, wählt man die Replikationsdatenbank und setzt sie kurz unter leseschutz:

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

Die angezeigte Position sollte inkl. Filename notiert werden.

Noch schnell einen Dump (Backup) der MySQL Datenbank Replikationsdatenbank erstellen:

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

Der Read Lock der Datenbank kann nun wieder entfernt werden

UNLOCK TABLES;

Slave Server

Der Slave Server sollte nun bescheid bekommen, welchen Master Server er untergeordnet ist.
Deshalb fügt man folgendes unter /etc/mysql/my.cnf ein:

[mysqld]
server-id=2
master-host = [IP Adresse des Master Servers]
master-user = Slave_Benutzer
master-password = password
master-connect-retry = 60
replicate-do-db = Replikationsdatenbank
 
#Optionale Angaben
 
#DB die nicht importiert werden sollen
replicate-ignore-db = Datenbank
 
#Nur folgende Tabellen replizieren
replicate-do-table = Datenbank.tabelle
 
#Folgende Tabelle nicht replizieren
replicate-ignore-table = Datenbank.tabelle

Sollten mehrere Tabellen von der Replizierung ausgenommen werden muss für jede Tabelle eine Zeile replicate-ignore-table verwendet werden.

Die per MySQL Dump archivierte DB sollte auf dem Slave Server kopiert werden und mittels

mysql -u root -ppassword Replikationsdatenbank > /Pfad/Zum/Speicherort/Replikationsdatenbank.sql

in die Slave DB migriert werden.

Anschließend noch den Slave MySQL Server neu starten

sudo service mysql restart

Noch folgende SQL Befehle absetzen und schlussendlich den SQL Server wieder starten. Achtung: Den Befehl auf die oben ausgegebene Position, Filename usw. abändern .

CHANGE MASTER TO MASTER_HOST='IP vom Master Server', MASTER_USER='Slave_Benutzer', MASTER_PASSWORD='password', 
MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=960153707;
START SLAVE;

Ab jetzt sollte die Replikation funktionieren.

Dieser Beitrag wurde unter Linux / Unix abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

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