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):
[code][mysqld]
server-id=1
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db=Replikationsdatenbank[/code]
MySQL neustarten
[code]sudo service mysql restart[/code]
Als nächstes loggt man sich in den MySQL Server ein und gibt dem User Slave_Benutzer die Replikationsrechte (Replication Slave):
[code lang=“sql“]mysql -p -u root;
GRANT REPLICATION SLAVE ON *.* TO ‚Slave_Benutzer’@’%‘ IDENTIFIED BY ‚password‘;
FLUSH PRIVILEGES;[/code]
Um nun den aktuellen Stand der MySQL Datenbank zu erfassen, wählt man die Replikationsdatenbank und setzt sie kurz unter leseschutz:
[code lang=“sql“]USE Replikationsdatenbank;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;[/code]
Die angezeigte Position sollte inkl. Filename notiert werden.
Noch schnell einen Dump (Backup) der MySQL Datenbank Replikationsdatenbank erstellen:
[code]mysqldump -u root -ppassword –opt Replikationsdatenbank > Replikationsdatenbank.sql[/code]
Der Read Lock der Datenbank kann nun wieder entfernt werden
[code lang=“sql“]UNLOCK TABLES;[/code]
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:
[code][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[/code]
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
[code]mysql -u root -ppassword Replikationsdatenbank > /Pfad/Zum/Speicherort/Replikationsdatenbank.sql[/code] in die Slave DB migriert werden.
Anschließend noch den Slave MySQL Server neu starten
[code]sudo service mysql restart[/code]
Noch folgende SQL Befehle absetzen und schlussendlich den SQL Server wieder starten. Achtung: Den Befehl auf die oben ausgegebene Position, Filename usw. abändern .
[code lang=“sql“]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;[/code]
Ab jetzt sollte die Replikation funktionieren.