MySQL - Sicherung und Wiederherstellung auf Debian Squeeze
Die MySQL Konfigurationsdatei my.cnf befindet sich im Verzeichnis /etc/mysql. Mit dem Parameter datadir in my.cnf wird der Speicherort der Datenbanken festgelegt, standardmässig:
datadir = /var/lib/mysql
Datenbanken können zum einen durch Kopieren und zum anderen durch Dumps gesichert werden. Zum Kopieren der MySQL Datenbanken ist es erforderlich, den MySQL Server herunterzufahren:
/etc/init.d/mysql stop
Sobald der Server heruntergefahren ist, können die Datenbanken kopiert werden:
resync
od.
cp -vax
Der MySQL-Server legt im Datenverzeichnis für jede Datenbank ein Unterverzeichnis an. In diesem Unterverzeichnis liegen alle Tabellen, Indizes, Daten etc. (Dateien .frm, .MYD, .MYI). In der Datei db.opt befinden sich Information wie Kollation etc..
Folgende Dateirechte sind zu beachten:
Besitzer und Gruppe: mysql:mysql
chown mysql:mysql /datadir/datenbankdir -R
Folgende Zugriffsrechte bestehen:
1. auf das verzeichnis datenbankdir: 700
2. auf die Datenbankdateien: 660
chmod 700 /datadir/datenbankdir
cd /datadir/datenbankdir/
chmod 660 *.*
Ein einfacher Kopiervorgang mit anschließender Übertragung der Datenbank liefe also folgendermaßen ab:
auf dem Quellserver:
/etc/init.d/mysql stop
cd /datadir/
cp -vax datenbankdir/ /mnt/backup -R
/etc/init.d/mysql start
auf dem Zielserver:
/etc/init.d/mysql stop
cd /mnt/backup/
cp -vax datenbankdir/ /datadir -R
cd /datadir/
chmod 700 /datadir/datenbankdir
cd /datadir/datenbankdir/
chmod 660 *.*
/etc/init.d/mysql start
Diese Methode der Datenbanksicherung ist sehr einfach und alle Umlaute und Sonderzeichen werden zuverlässig übertragen. Es empfielt sich jedoch unbedingt syslog zu beobachten:
cat /var/log/syslog | grep mysqld
cat /var/log/syslog | grep 110730
Datenbanksicherung mit mysqldump
Datenbanksicherungen mit mysqldump können im laufenden Betrieb durchgeführt werden, ein Herunterfahren des MySQL Servers ist nicht notwendig. Myldump erzeugt Textdateien, in denen jede Zeile einen mysql-Befehl enthält, mit dem Veränderungen an einer Datenbank vorgenommen werden. Diese Befehle sind in einer genauen Syntax, die keine Fehlertoleranz zulässt, verfasst. Enthält eine zu sichernde Datenbank Daten, die von mysql als Befehl interpretiert werden können, dann ist ein Zurücksichern der Daten mittels mysqldump ohne Datenverlust nicht möglich.
Bei der Programmierung einer MySQL Applikation ist peinlichst genau darauf zu achten, dass im laufenden Betrieb keine Daten erzeugt werden, die vom Dump-Prozessor falsch interpretiert werden können (Beispiele: Namen wie O'Brien oder französiche Sonderzeichen etc. etc.)
1. Sichern aller Datenbanken mit drop-table:
mysqldump --user=XX --password=XX --add-drop-table --host=XX --all-database > datenbanken.sql"
2. Sichern einer Datenbank mit drop-table:
mysqldump -e -l --add-drop-table --host=XX --user=XX --password=XX datenbank > datenbank.sql
3. Zurücksichern einer Datenbanken unter Berücksichtigung von Umlauten und Sonderzeichen:
mysql --character-sets-dir=utf8 --default-character-set=utf8 --host=XX --user=XX --password=XX datenbank < datenbank.sql
Perlskript zur automatisierten MySQL-Datenbanksicherung mit Sicherungsrotation
Datenbanken.pl:
#!/usr/bin/perl
#Datenbankensichern
###########################################
#Anzahl Sicherungen
$ANZSICHERUNG=13;
# Zielverzeichnis
$DEST="/backup/Datenbanken-b";
# Name Sicherung
$SICHERUNGSDATEI="Datenbanken.sql";
#Falls Zielverzeichnis nicht existiert, anlegen
if (not -d "$DEST") {
system("mkdir $DEST");
}
# letze Sicherung loeschen, falls vorhanden
if (-f "$DEST/$SICHERUNGSDATEI.$ANZSICHERUNG") {
system("rm $DEST/$SICHERUNGSDATEI.$ANZSICHERUNG");
}
#Sicherungen rotieren
for(my $i = $ANZSICHERUNG; $i >= 1; $i--) {
$b=$i-1;
if (-f "$DEST/${SICHERUNGSDATEI}.$b") {
system("mv $DEST/${SICHERUNGSDATEI}.$b $DEST/${SICHERUNGSDATEI}.$i");
}
}
#Aktuelle Sicherung anlegen
system("mysqldump --user=XX --password=XX --add-drop-table --host=XX --all-database > $DEST/$SICHERUNGSDATEI.0");
Das Skript legt ein Sicherungsverzeichnis an, in dem 14 Sicherungen rotiert werden. Name der aktuellen Sicherung: Datenbanken.sql.0. Einzubinden in crontab mit:
0 1 * * * root perl /verzeichnis/Datenbanken.pl > /dev/nul 2>&1
(täglich um 01:00 Uhr)
|