Datenbankreplikation mit mysql
Weil ich gerade mit Datenbankreplikation kämpfe, hier ein paar Erfahrungen:
So geht's
Originaldoku: http://dev.mysql.com/doc/refman/4.1/en/replication.html
Verständlichere Doku: http://howtoforge.com/mysql_database_replication
Probleme mit denen ich gekämpft habe:
Berechtigung
Mit mysql_fix_privilege_tables kann man das Berechtigungssystem up-to-date bekommen. Das ist notwendig, wenn man die Datenbank von älteren Releases upgegraded hat.
Wenn dieser Fehler auftaucht:
ERROR 2002 (HY000): Can't connect to local MySQL? server through socket '/var/run/...'
- Socket finden: netstat -ln | grep mysql
- mysql_fix_privilege_tables mit --socket=... aufrufen
Zusätzlich zur Beschreibung in howtoforge muss man dem "slave_user" SUPER, RELOAD, and SELECT privilege granten.
Netzwerkverbindung
Wenn die Netzwerkverbindung nicht zu klappen scheint. Prüfen, ob
bind-address = 127.0.0.1
noch drinsteht. Wenn ja, auskommentieren.
LOAD DATA FROM MASTER
Ich wollte das gemäß Beschreibung in howtoforge machen und bekam diesen Fehler:
ERROR 1189 (08S01): Net error reading from master
... leider geht die Methode nur mit MyISAM? Tabellen.
http://dev.mysql.com/doc/refman/4.1/en/load-data-from-master.html
logrotate
.. dumm auch, wenn logrotate die binären logs zu schnell weglöscht.
Bei meiner debian Installation ist das in /etc/mysql/debian-log-rotate.conf geregelt:
- da sollte eine genügend hohe Zahl stehen, damit der SLAVE die log files zum synchronisieren noch findet...
KEEP_BINARY_LOGS=10
Fehler ignorieren
in der my.cnf kann festlegen, dass der Replikationsprozess Fehler ignoriert:
slave-skip-errors=all
Replikation bei pauker.at
Die Replikation verwende ich, um die down-time möglichst gering zu halten.
Ich plane das backup nur noch vom Slave zu machen, dann haben alle Brasilianer ihr Deutsch-Portugiesisch Wörterbuch auch zur backup-Zeit zur Verfügung.
Problem
Das größte Problem bleibt die Initialisierung eines mysql slaves.
Die erste Kopie mit mysqldump und der Start des binary logs müssen zeitlich übereinstimmen, sonst bekommt man Probleme mit auto_increment Tabellen.
Den pauker einfach mal 2 Stunden abschalten - das will ich nicht machen.
Auch finde ich es nicht gut, dass Kommandos wie insert .. createdon=now() einfach so übertragen werden. Dadurch kann die Slave-DB ja nie den gleichen Stand haben.
Fazit
Mysql bietet nicht genügend Möglichkeiten meine Datenbank sauber zu replizieren.
|