MySQL für Dummies (7)

Mein Freund Heinz ist Vertriebler, und manchmal sagen Vertriebler überraschend schlaue Dinge. Heinz zum Beispiel sagt sehr gerne “Niemand will Backup. Alle wollen Restore!” Er meint damit, daß ein Backup nicht nur ein lästiges Costcenter in der IT ist, sondern daß es außerdem keinen Mehrwert “an sich” darstellt. Der Mehrwert liegt nicht in der Datensicherung, sondern in der Wiederherstellung der Daten.
Es ist sehr wichtig, dies im Kopf zu behalten, wenn man sein Backup plant: Es geht nicht wirklich um Datensicherung, sondern es geht um einen Plan für die Recovery von verlorenen Daten. Das beinhaltet nicht nur Überlegungen wie man welche Daten wiederherstellt, sondern auch, wie lange die Betriebsunterbrechung denn wohl dauern wird und ob das akzeptabel ist. Überlegungen zum Restore enden nämlich (im Gegensatz zu Überlegungen zum Backup) oft auch in HA-Konzepten oder organisatorischen und personellen Problemstellungen.
Ein guter Plan
Zwei Überlegungen gehen jeder Backup – Entschuldigung! – Recoveryplanung voran. Der erste Gedanke ist: Was brauche ich wirklich um für den Kunden “operational” auszusehen? Wir bezeichnen diese Daten und die Systeme, die sie halten, als “P-Daten” und “P-Systeme” (“P” steht für “Production”). Diese Daten müssen organisatorisch und technisch eine Einheit sein in der Form, daß sie möglichst schnell wieder verfügbar sind. Es handelt sich dabei meistens um OLTP-Daten (Online Transaction Processing) aktueller Natur.
In einem Webshop sind diese Daten zum Beispiel der Katalog und Bestand, die notwendig sind, damit der Kunde auswählen kann, und die noch nicht bearbeiteten Orders und unbezahlte Rechnungen, die für den Versand und das Inkasso notwendig sind.
In einem Monitoring-System sind dies die aktuellen Zustände aller Systeme, und die offenen Tickets und Probleme.
Historische Daten, die nicht für die Produktion notwendig sind, sondern lediglich produktionsunterstützend verwendet werden, brauchen nicht so schnell wieder online zu sein. Meist handelt es sich um historische Daten, aus denen Statistiken für den Vertrieb, den Endkunden oder andere Nutzer generiert werden. Dies sind “PS-Daten” und “PS-Systeme” (Production Support).
In einem Webshop sind dies die Orderlogs mit erfüllten Ordern und alten Rechnungen, und die daraus generierten (und regenerierbaren) Statistikdaten.
In einem Monitoring-System wären dies die historischen Daten über Systemzustände und Performance.
Diese Daten sind wichtig, aber nicht essenziell für das Funktionieren des Kerngeschäftes.
Indem man diese Daten sinnvoll trennt, kann man Prozeduren entwickeln, die es einem erlauben, die Kerndaten von den “Nice to have”-Daten zu trennen und so bei großen Datenbeständen relativ schnell wieder zu recovern.
Konfiguration mitsichern
MySQL speichert seine Daten alle im Datadir. Legt man dort (oder eine Ebene höher) auch seine Konfiguration ab, kann man durch ein Sichern von Datadir (bzw. der Ebene höher) einen Komplettabzug aller seiner logischen Datenbankschemata bekommen.
Damit meine Datenbank auch mit der my.cnf
in meinem Datadir startet und NUR mit dieser Konfiguration läuft, verwende ich ein Startscript wie dieses hier:
linux:/export/data/rootforum # cat start
#! /bin/bash --
MYSQL_CMD_DIR=/usr/local/mysql-max-5.0.18-linux-i686-glibc23
MYSQL_DIR=/export/data/rootforum
MYSQL_UNIX_PORT=$MYSQL_DIR/mysql.sock
MYSQL_TCP_PORT=3340
export MYSQL_UNIX_PORT MYSQL_TCP_PORT MYSQL_DIR
cd $MYSQL_CMD_DIR
$MYSQL_CMD_DIR/bin/mysqld_safe --defaults-file=$MYSQL_DIR/my.cnf --datadir=$MYSQL_DIR/data &
Dieses Script startet den mysql_safe mit dem gegebenen Datadir und erzwingt dabei die Benutzung des korrekten Konfigurationsfiles. Es erzwingt auch die Verwendung eines alternativen Ports und Unix Domain Sockets, da ich auf meinem System eine ganze Reihe von MySQL-Instanzen laufen habe.
Das Stopscript dazu findet einfach das PID-File in $MYSQL_DIR/data/*pid, und sendet ein “kill -TERM” an diesen Prozess. MySQL schreibt dann seine Puffer geordnet auf Disk und beendet sich. Man kann verifizieren, ob MySQL sich beendet hat, indem man wartet bis das PID-File verschwunden ist.
#! /bin/bash --
MYSQL_DIR=/export/data/rootforum
MYSQL_PID=$MYSQL_DIR/data/\*pid
# No Pid, no process - we are done
[ ! -f $MYSQL_PID ] && exit 0
# No Pid in file, no process, we are done
pid=$(cat $MYSQL_DIR/data/\*pid)
if [ -z "$pid" ]
then
rm $MYSQL_PID
exit 0
fi
# Stop server
kill -TERM $pid
# Wait for server stop
while [ -f $MYSQL_PID ]
do
sleep 1
done
Das Binlog
In Datadir befinden sich normalerweise die Unterverzeichnisse, die die logischen Datenbanken enthalten, die eigentlichen Daten, die von den einzelnen Storage-Engines in Dateien abgelegt werden, die Engine-spezifisch sind und die verschiedenen Logfiles.
Für eine Datensicherung ist es vor allen Dingen wichtig, daß das Binlog angeschaltet ist.
Das ist am einfachsten zu erreichen, indem man in seiner my.cnf
-Datei einen Eintrag für das Binlog macht.
Trägt man nur einen Schalter log-bin
ein, wird das Binlog mit <hostname>-bin.xxxxxx
erzeugt, wobei xxxxxx
eine laufende Nummer ist.
Es ist besser, dem Binlog gleich einen festen Namen zu geben, der sich nicht ändert, wenn sich der Hostname der Maschine ändert.
Außerdem kann man die Option sync_binlog=1
setzen, die bewirkt, daß das Binlog nach jedem Kommando bzw. jeder Transaktion auch auf Disk geschrieben wird.
Das erzeugt ein wenig mehr Disk-Aktivität beim Schreiben des Binlog, stellt aber sicher, daß keine Kommandos am Ende des Binlogs fehlen, wenn man einen Crash erlebt.
[mysqld]
log-bin=linux-bin
sync_binlog=1
Nachdem man dies konfiguriert und den Server einmal angehalten und neu gestartet hat, um die Konfiguration zu aktivieren, bekommt man eine Reihe von Binlog-Dateien und eine Indexdatei, die ein Verzeichnis dieser Dateien ist.
linux:/export/data/rootforum/data # ls -l linux-bin*
-rw-rw---- 1 mysql mysql 1034 Feb 13 23:07 linux-bin.000001
-rw-rw---- 1 mysql mysql 421 Feb 14 09:06 linux-bin.000002
-rw-rw---- 1 mysql mysql 1940 Feb 14 12:28 linux-bin.000003
-rw-rw---- 1 mysql mysql 117 Feb 14 14:13 linux-bin.000004
-rw-rw---- 1 mysql mysql 9666 Feb 20 13:40 linux-bin.000005
-rw-rw---- 1 mysql mysql 650 Feb 20 15:29 linux-bin.000006
-rw-rw---- 1 mysql mysql 98 Mar 1 10:33 linux-bin.000007
-rw-rw---- 1 mysql mysql 133 Mar 1 10:33 linux-bin.index
linux:/export/data/rootforum/data # cat linux-bin.index
./linux-bin.000001
./linux-bin.000002
./linux-bin.000003
./linux-bin.000004
./linux-bin.000005
./linux-bin.000006
./linux-bin.000007
Die Binlog-Dateien enthalten alle Anweisungen, die Daten in Datadir verändern können in der richtigen Reihenfolge.
Mit dem Programm mysqlbinlog
kann man sie sich ansehen.
Neben den eigentlichen Queries findet man dann auch noch weitere Anweisungen, die das Umfeld für diese Queries vorbereiten und einige Kommentare, die es einem erlauben, Queries desselben Threads zu identifizieren und zu isolieren.
Außerdem finden sich im Binlog die Resultcodes und Ausführungszeiten für diese Statements als Kommentar.
Ein Beispiel:
linux:/export/data/rootforum # cat mysqlbinlog-3340
#! /bin/bash --
MYSQL_CMD_DIR=/usr/local/mysql-max-5.0.18-linux-i686-glibc23
MYSQL_DIR=/export/data/rootforum
$MYSQL_CMD_DIR/bin/mysqlbinlog --defaults-file=$MYSQL_DIR/my.cnf $@
linux:/export/data/rootforum # ./mysqlbinlog-3340 data/linux-bin.000006
/\*!40019 SET @@session.max_insert_delayed_threads=0\*/;
/\*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0\*/;
# at 4
#060220 15:10:37 server id 3340 end_log_pos 98 Start: binlog v 4, server v 5.0.18-max-log created 060220 15:10:37 at startup
ROLLBACK;
# at 98
#060220 15:11:43 server id 3340 end_log_pos 179 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1140444703;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
SET @@session.sql_mode=0;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33;
drop database boom;
Das Script mysqlbinlog-3340
ist mein Wrapper für mysqlbinlog, das einen Zeiger auf die passende Konfigurationsdatei und das zu verwendende Binary enthält.
Auf diese Weise spare ich etwas Tipparbeit.
Der Aufruf mysqlbinlog <name der Binlogdatei>
gibt dann den Inhalt dieser Datei als SQL-Source aus.
Man kann diese Ausgabe in ein mysql -u root -p
umleiten und so die Anweisungen erneut ausführen lassen.
Das eigentliche SQL sieht ein wenig komisch aus, ist aber gültig.
Kommentare der Form /*! */
schließen dabei Statements ein, die nur ab einer bestimmten Version von MySQL verstanden werden sollen.
Die Versionsnummer wird dabei als xyyzz
gegeben, etwa mit x=4
, yy=00
und zz=19
.
Das erste Kommando wird also nur dann gelesen, wenn der Dump von einem MySQL 4.0.19 oder neuer verarbeitet wird.
Eine Operation wird immer von einem Kommentar eingeleitet, der die Binlog-Position (“at 98”) des Eintrags nennt, und besteht aus einer Reihe von vorbereitenden Kommandos und dann dem eigentlichen Kommando.
Die vorbereitenden Kommandos sind immer use <datenbankname>
, wenn notwendig und eine Reihe von SET
-Statements, darunter auch SET TIMESTAMP
, der die Ausführungszeit des Kommandos als Unix-Timestamp enthält.
SET TIMESTAMP
bewirkt, daß Funktionen wie NOW()
bei der Ausführung aus dem Binlog nicht mehr die aktuelle Zeit zurückliefern, sondern die mit SET TIMESTAMP
gesetzte Zeit.
Dabei besteht zurzeit ein wesentliches Problem mit MySQL 5.0 und der Funktion SYSDATE() - man sollte sich in MySQL 5.0 besser auf NOW() verlassen.
root@localhost [(none)]> SET TIMESTAMP=1;
Query OK, 0 rows affected (0.00 sec)
root@localhost [(none)]> SELECT NOW(), SYSDATE();
+---------------------+---------------------+
| NOW() | SYSDATE() |
+---------------------+---------------------+
| 1970-01-01 01:00:01 | 2006-03-01 10:55:44 |
+---------------------+---------------------+
1 row in set (0.33 sec)
Point in Time Recovery mit dem Binlog
Man kann das Binlog nutzen, um nach einem Crash eine Point-in-Time Recovery zu fahren.
Zu diesem Zweck benötigt man ein Vollbackup, und alle Binlogs, die seit diesem Zeitpunkt angefallen sind.
Damit die Binlogs eine bessere Überlebenschance haben, wenn das System hard crashen sollte, legt man sie meistens auf einem anderen Dateisystem ab als das eigentliche Datadir.
Angenommen, man installiert seine Datenbanken alle nach /export
, dann würde man seine Partitionierung so haben wollen:
linux:/export/data/rootforum # df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/system-root
reiserfs 8.0G 6.2G 1.9G 77% /
tmpfs tmpfs 506M 0 506M 0% /dev/shm
/dev/sda5 ext2 99M 8.9M 85M 10% /boot
/dev/mapper/system-home
reiserfs 8.1G 6.6G 1.6G 81% /home
/dev/mapper/system-data
reiserfs 600G 520G 83G 87% /export/data
/dev/mapper/system-log
reiserfs 600G 5.2G 594G 99% /export/log
linux:/export/data/rootforum # grep log-bin my.cnf
log-bin=/export/log/rootforum/linux-bin
Angenommen man macht eine Vollsicherung von /export/data/rootforum
am Montag, und sichert dann jeden Tag die Inhalte von /export/log/rootforum
als inkrementelles Backup weg, dann kann man die Datenbank wie folgt rekonstruieren:
Falls nur /export/data
verloren ist, rekonstruiert man /export/data
vom Montag aus der Vollsicherung und spielt dann die Binlogs von Montag bis Freitag mit mysqlbinlog
wieder ab, indem man sie in einen mysql
-Commandline-Client reinpiped.
Da das Binlog kontinuierlich aufgezeichnet wird, kann man so bis zum Zeitpunkt des Crashes voran rollen.
Natürlich muss man das Binlog genau ab dem Zeitpunkt abspielen, an dem das Vollbackup endet. Daher ist es wichtig, daß das Vollbackup als Snapshot erzeugt wird, also genau einen Point in der Zeit des Datenbankservers darstellt. Man muss außerdem wissen, welchen Namen dieser Punkt als Binlog-Position ausgedrückt hat. Es gibt verschiedene Möglichkeiten, dies zu erreichen, die weiter unten im Einzelnen diskutiert werden.
Falls /export/data
und /export/log
verloren sind, muss man beide Verzeichnisse wieder herstellen und kann nur bis zum Zeitpunkt des letzten inkrementellen Backups wieder voran rollen.
Daher wäre es schön, wenn man das Binlog nicht nur auf einer lokalen Platte sichern könnte, sondern auch noch einen Mechanismus hätte, der das Binlog “live” absaugt und woanders abspeichert.
Dieser Mechanismus ist genau ein Replication Slave. Einen Slave setzt man auf, indem man ein Vollbackup des Masters auf einem anderen Rechner einspielt, und als Datenbankserver startet. Auf dem Master erlaubt man dem Slave jetzt das Login mit dem Recht das Binlog abzusaugen:
root@master [rootforum]> CREATE USER "slave" IDENTIFIED BY "pukcab";
root@master [rootforum]> GRANT REPLICATION SLAVE ON \*.\* TO "slave";
Dem Slave teilt man mit, wo sich der Master befindet und wie man sich dort einloggen kann. Außerdem muss der Slave natürlich wissen, auf welchem Stand er gerade ist.
root@slave [rootforum]> CHANGE MASTER TO MASTER_HOST="master",
-> MASTER_PORT=3306,
-> MASTER_USER="slave",
-> MASTER_PASSWORD="pukcab";
root@slave [rootforum]> CHANGE MASTER TO MASTER_LOG="linux-bin.000001",
-> MASTER_POS=98;
Die Binlogs ab File 1, Position 98 müssen auf dem Master nun noch bereitstehen.
Der Slave wird sich nach einem START SLAVE IO_THREAD
auf dem Master einloggen und damit beginnen, diese Files zu sich runterzuladen und sie im Slave abzuspeichern.
Nach einem START SLAVE SQL_THREAD
wird er außerdem damit beginnen, sie auszuführen.
Mit SHOW SLAVE STATUS\G
kann man den Slave dabei beobachten, wie er die Binlogs vom Master absaugt und lokal abspielt.
Mit dem Slave hat man also nicht nur einen Binlog-Sauger gebaut, sondern der Slave spielt die Binlogs auch gleich ab, sodass man zur Recovery einfach nur das Datadir vom Slave nehmen und auf den Master transportieren muss. Das ist die schnellste und bequemste Methode der Recovery.
Physikalisches Vollbackup erstellen
Ein binäres Vollbackup ist einfach ein Abzug von Datadir, in unserem Beispiel also /export/data/rootforum
.
Dabei muss lediglich sichergestellt sein, daß die Datenbank ihre Finger aus dem Datadir fernhält während das Backup läuft.
Am einfachsten kann man das erreichen, indem man die Datenbank vor dem Backup runterfährt und nach dem Backup wieder startet.
Nur so kann man sicher erreichen, daß auch alle Daten auf der Platte und konsistent sind, während das Backup gemacht wird.
Wird lediglich MyISAM verwendet und kommt InnoDB nicht zum Einsatz, kann man statt des Runterfahrens auch FLUSH TABLES WITH READ LOCK
machen - die Verbindung mit diesem Kommando muss aber während des ganzen Backup stehen bleiben, denn das “UNLOCK TABLES” wird automatisch durchgeführt, wenn die Verbindung des FLUSH TABLES WITH READ LOCK
-Prozesses beendet wird.
“FLUSH TABLES” wirkt aber nicht auf InnoDB, sodass man bei Verwendung von InnoDB sowieso die Datenbank runterfahren muss.
Damit die Downtime der Datenbank möglichst klein ist, verwendet man am besten einen Volume Manager mit Snapshots. Das Backup kann dann so ausgeführt werden:
! /bin/sh --
SNAPSIZE=4G
pass=geheim
cd /export/data/rootforum
# Optional: Neues Binlog anfangen
./mysql-3340 -u root -p$pass 'flush logs'
# Snap database
./stop
name=$(tail -1 /export/log/rootforum/linux-bin.index)
size=$(stat -c '%s' $name)
echo "binlog position $name $size" > /export/data/rootforum/data/restore.info
lvcreate -s -L $SNAPSIZE -n snap /dev/system/data
./start
# Backup snapshot
mount /dev/system/snap /export/snap
dobackup /export/snap/rootforum
umount /export/snap
lvchange -a n /dev/system/snap
lvremove /dev/system/snap
# Optional: Binlog kürzen
./mysql-3340 -u root -p$pass -e "purge master logs to '$name'"
Das Script hält erzeugt erst einmal ein neues Binlog, indem es ein “FLUSH LOGS”-Kommando absetzt.
Danach hält es die Datenbank mit dem Stopscript kurz an. Sobald das der Fall ist, kann die zum Backup gehörende Binlog-Position bestimmt werden und im Backup abgespeichert werden. Die zum Backup passende Binlog-Position bestimmt man dabei am einfachsten, indem man den Namen und die Größe der letzten im Index stehenden Binlog-Datei aufzeichnet. Das Binlog ist gerade neu erzeugt worden, wird also relativ klein sein.
Mithilfe von Linux LVM wird nun ein Snapshot des Dateisystems erzeugt. Das geht sehr schnell, und braucht fast keine Zeit. Die Datenbank kann dann neu gestartet werden und ist weiter operabel.
Das eigentliche Backup wird dann erzeugt, indem der Snapshot gemountet wird, und das eigentliche Backupscript dobackup aufgerufen wird, um das Backup auf Band zu schreiben. Danach wird der Snapshot abgemeldet und zerstört.
Sobald dies alles durch ist, ist sichergestellt, daß wir ein neues Vollbackup haben und alle Binlogs, die älter sind als das Backup können mit einem PURGE MASTER LOGS
-Kommando weggeworfen werden.
Logisches Vollbackup erstellen
Manche Leute bevorzugen statt eines physikalischen Vollbackups der Datenbankdateien ein logisches Backup, also das Backup von SQL-Statements, die den Inhalt der Datenbank neu erzeugen können.
Auch das ist mit MySQL möglich, und zwar, indem man mysqldump
verwendet.
Mit der Option --master-data
wird dabei ein CHANGE MASTER
Statement erzeugt, das die Binlog-Position aufzeichnet, die zum Backup passt.
Setzt man --master-data=2
wird dasselbe Statement auch generiert, aber als Kommentar.
linux:/export/data/rootforum # ./mysqldump-3340 --master-data rootforum | head -24
-- MySQL dump 10.10
--
-- Host: localhost Database: rootforum
-- ------------------------------------------------------
-- Server version 5.0.18-max-log
/\*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT \*/;
/\*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS \*/;
/\*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION \*/;
/\*!40101 SET NAMES utf8 \*/;
/\*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE \*/;
/\*!40103 SET TIME_ZONE='+00:00' \*/;
/\*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 \*/;
/\*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 \*/;
/\*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' \*/;
/\*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 \*/;
--
-- Position to start replication or point-in-time recovery from
--
CHANGE MASTER TO MASTER_LOG_FILE='linux-bin.000007', MASTER_LOG_POS=879;
...
Damit das Backup konsistent ist, müssen außerdem die Optionen --single-transaction
(wenn ausschließlich InnoDB verwendet wird) oder --lock-all-tables
(geht für alle Tabellentypen, blockiert aber die Datenbank für die Dauer des Dumps) verwendet werden.
Die beiden Optionen schließen sich gegenseitig aus.
Die Option --all-databases
sichert dann alle Datenbanken.
Damit Trigger und Stored Functions/Stored Procedures auch mit gesichert werden, müssen außerdem die Optionen --triggers
und --routines
mit angegeben werden.
Verwendet man --lock-all-tables
, kann man außerdem zusätzlich noch --flush-logs
und --delete-master-logs
mitgeben, um vor dem Backup ein FLUSH LOGS
-Kommando laufen zu lassen und nach dem Backup die Binlogs, die älter als das Backup sind, zu löschen.
Das komplette Kommando kann also so aussehen:
linux:/export/data/rootforum # cat ./mysqldump-3340
#! /bin/bash --
MYSQL_CMD_DIR=/usr/local/mysql-max-5.0.18-linux-i686-glibc23
MYSQL_DIR=/export/data/rootforum
$MYSQL_CMD_DIR/bin/mysqldump --defaults-file=$MYSQL_DIR/my.cnf "$@"
linux:/export/data/rootforum # ./mysqldump-3340 -u root --master-data --lock-all-tables --triggers --routines --all-databases --flush-logs --delete-master-logs | gzip -9 > /export/backups/backup.sql.gz
Inkrementelle Backups erstellen
Eine inkrementelle Sicherung besteht dann lediglich in einer Sicherung der Binlogs im Logdir.
Insbesondere wenn sync_binlogs
eingeschaltet sind, ist es also ausreichend, einfach /export/logs/rootforum
auf Tape zu ziehen - auch bei laufender Datenbank.
Man muss sich überlegen, wie oft man Vollbackups ziehen will. Vollbackups mit dieser Methode blockieren die Datenbank oder erfordern ein kurzes Herunterfahren des Datenbankservers. Inkrementelle Backups können bei laufendem Server gezogen werden. Mit einem Vollbackup kann man jedoch schnell recovern, sind außerdem noch Binlogs abzuspielen, kann die Recovery je nach Menge der Binlogs länger dauern. Je nach Änderungsrate kann es also notwendig werden, öfter Vollbackups zu ziehen.
Backup und Replikation
Eine andere Möglichkeit besteht darin, wie oben angesprochen einen Replication Slave aufzusetzen und die Sicherung des Master-Servers gar nicht mehr durchzuführen. Das Backup auf Tape erfolgt dann durch Runterfahren des Slave, und gemütlicher Sicherung des Slave auf Band. Startet man den Slave neu, zieht er sich die Binlogs vom Master, die während der Downtime angefallen sind, nachträglich runter und fängt an, diese abzuarbeiten. Der Master wird von dieser Aktion niemals in seiner Arbeit unterbrochen oder seiner Leistung beeinträchtigt.
Recovery besteht darin, den Slave runterzufahren und das Datadir des Slave auf den Master zu schieben.
Dort muss man dann noch die master.info
-Datei des Slave löschen und man hat einen neuen Master.
Die Pflege des Masters besteht darin, per Cron alle Binlogs zu löschen, die so alt sind, daß der Slave sie garantiert nicht mehr braucht.
Man kann im Cron also ein PURGE MASTER LOGS BEFORE NOW() - INTERVAL 7 DAY
oder so per Script einmal pro Tag abfahren.
Backup mit Replikation ist also bequemer, unterbrechungsfrei und die Recovery ist schneller.