MySQL-replikation

Forleden sad jeg og læste i et ældre Linux Magazine i frokostpausen. Min interesse blev fanget af en artikel om MySQL-replikation – kunne det bruges til noget? Det er i hvert fald forholdvis simpelt at sætte op og veldokumenteret i “MySQL 5.0 Reference Manual”, kapitel 6. Det sværeste er faktisk at få lavet et “snapshot” af databasen – først i 3. eller 4. forsøg lykkedes det for mig.

Metoden jeg brugte var følgende:

mysql> FLUSH TABLES WITH READ LOCK;

Skift til en anden shell og dump databasen med

mysqldump -A --master-data

Herefter kan sql-filen kopieres over på slave-serveren. Der er et par informationer man lige skal fiske ud af sql-filen, nemlig værdierne for MASTER_LOG_FILE og MASTER_LOG_POS, der begge står forholdvis i starten af filen. De skal bruges lidt senere….

På slave-serveren udføres følgende:

shell> mysql -u root -p < dump_file.sql

mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='aflæst_fra_dump_file.sql',
-> MASTER_LOG_POS=aflæst_fra_dump_file.sql;

mysql> START SLAVE;

Vær opmærksom på, at du også har kopieret mysql-databasen med over og dit root password er derfor ændret til samme som på masteren.

I første omgang skal replikationen hjælpe mig, således at databasen på min nye server er synkroniseret med den gamle, når jeg flytter min mail- og webserver over på den. Men der er flere muligheder….

Min hjemmecomputer har en 320GB disk og kører Windows XP – men den kan faktisk godt gøre nytte alligevel. For MySQL fås også til Windows, hvor det kører som en service der starter op, når maskinen startes. Ved at gentage ovenstående, men denne gang med XP’en som slave, har jeg fået mig en effektiv backup-løsning. Når min Windows-maskine starter op, vil dens MySQL opdage, at den er bagud i replikation, iforhold til masteren, og straks indhente det forsømte – uanset om den har været slukket i 24 timer eller 14 dage. Når min nye server bliver master, vil jeg altså stadig have en MySQL-slave, nu blot på Windows XP.

Tilbage er blot at huske på, at replikation ikke beskytter imod data-korruption!

Opdatering: En kørende database er altid problematisk at tage backup af. En af styrkerne ved master/slave-opsætningen er, at man kan stoppe slaven og derefter tage en binær backup af database-mapperne. Bemærk også, at ovennævnte metode til at lave et snapshot, ikke garanterer en konsistent kopi af InnoDB-tabeller – det kan kun opnås ved at have masteren stoppet, mens snapshottet tages. Ifølge MySQL-manualen burde det ikke give problemer – “but this is not a cause for concern, because InnoDB resolves this at startup and delivers a consistent result”. Mit binære snapshot gav problemer med enkelte tabeller, som jeg måtte migrere manuelt enkeltvist, mens ovennævnte mysqldump-metode var problemløs. YMMV.