Sicherung der Datenbanken

Die MySQL-Datenbanken stehen auf einem externen virtuellen Filesystem (/dev/sdb1), dass im Crashfall des MoUSe-Servers bei einer Re-Installation erhalten bleibt.
Zur Sicherung dieser Daten läuft täglich um 0:03 Uhr das Skript /usr/local/mouse/alle_backup . Es sichert alle Relationen der in nachstehender Tabelle genannten MySQL-Datenbanken in ASCII-Tabellen (fileencoding=latin1). Alle Backup-Daten stehen im Verzeichnis /afs/tu-chemnitz.de/admin/MoUSe/DATA/BACKUP.

gesicherte DatenbankUnterverzeichnisseSicherungsskript
localhost/urzurz_db_save*dienste_mgmt_back
localhost/dienste_mgmtadm_db_save*db_back
localhost/portalportal_db_save*portal_back
localhost/adrdbadrdb_save*adr_back
localhost/swdbswdb_save*swdb_back
localhost/verbrauchsmaterialverbr_db_save*verbr_back
localhost/voipvoip_save*voip_back

In "Backup-Daten-Verzeichnis" werden jeweils 10 Sicherungsgenerationen gehalten

Bei Bedarf kann das Skript /usr/local/mouse/alle_backup manuell gestartet werden. Es ruft nacheinander das jeweilige Sicherungsskript (usr/local/mouse/voip_back, /usr/local/mouse/portal_back, usw.) auf. Diese Scripte können bei Bedarf auch manuell einzeln gestartet werden.

     Die Datensicherung basiert auf folgendem MYSQL-Kommando:

      echo "SELECT * INTO OUTFILE 'filename' FIELDS TERMINATED BY '#' FROM tabelle;" |
           mysql --skip-column-names datenbankname -u dbuser -pdbpassword -h localhost


     Es kopiert alle Daten der Tabelle tabelle
     der Datenbank datenbankname ins File filename.
     (Die Angaben für dbuser und dbpasswort
     sind im Stahlschrank zu finden.)
     Das Spaltentrennzeichen ist das #
     filename muß ein vollständiger Pfandname sein.

In jedem Unterverzeichnis wird ausser dem aktuellen Datenbestand im File aktuelle_tabellen_struktur die zum Sicherungszeitpunkt gültige MySQL-Kommandofolge zum Erzeugen aller MySQL-Tabellen (create table ...) abgelegt.


Beachte: Diese Datensicherung führt letztlich der mysqld durch ---> deshalb braucht die AFS-Gruppe urz:dbserver im "Backup-Daten-Verzeichnis" Schreibrechte.

Alle die Datenbanken modifizierenden MySQL-Kommandos werden im File /var/log/mysql_log/update.999 gespeichert. Dieses File 'rotiert', d.h. die Files werden nummeriert, wobei immer die letzten drei Versionen aufbewahrt werden.
Gültig ist immer nur das letzte File.
Das Log-Rotating wird vom Skript /usr/local/mouse/alle_backup unmittelbar nach der Anfertigung der Backup's ausgeführt.

Das File mit den Update-Logs ist nur mit dem Kommando
/usr/bin/mysqlbinlog /var/log/mysql_log/update.999
lesbar (mehr dazu im Abschnitt "Restore der MYSQL-Datenbanken").


Die Verzeichnisse

werden werktags aller zwei Stunden (während der Arbeitszeit) auf die Festplattenpartition /data (Bestandteil des Images) kopiert. Die Kopien der letzen 24 Stunden werden gespeichert.

Restore der MYSQL-Datenbanken

Bei einem Crash ist zunächst ist zu prüfen, ob die o.g. MYSQL-Datenbanken sowie die Datenbank mysql (DB-Priv's) noch existieren, z.B.

Wenn lediglich die Daten einer Datenbank zu restaurieren sind (die Datenbank selbst aber noch in Ordnung ist), kann das entsprechende Restore-Skript sofort benutzt werden.

DatenbankArbeitsverzeichnisRestore-Skript
localhost/urz/afs/tu-chemnitz.de/admin/MoUSe/DATA/BACKUPrestore_db_mouse
localhost/dienste_mgmt/afs/tu-chemnitz.de/admin/MoUSe/DATA/BACKUPrestore_db_dienste_mgmt
localhost/adrdb/afs/tu-chemnitz.de/admin/MoUSe/DATA/BACKUPrestore_adrdb
localhost/swdb/afs/tu-chemnitz.de/admin/MoUSe/DATA/BACKUPrestore_swdb
localhost/verbrauchsmaterial/afs/tu-chemnitz.de/admin/MoUSe/DATA/BACKUPrestore_verbrauchsmaterial
localhost/portal/afs/tu-chemnitz.de/admin/MoUSe/DATA/BACKUPrestore_portal
localhost/voip/afs/tu-chemnitz.de/admin/MoUSe/DATA/BACKUPrestore_voip
   
paulus/urz/afs/tu-chemnitz.de/admin/MoUSe/EXT_TOOLS/RESTORErestore_paulus_mouse
paulus/dienste_mgmt/afs/tu-chemnitz.de/admin/MoUSe/EXT_TOOLS/RESTORErestore_paulus_dienste_mgmt
paulus/adrdb/afs/tu-chemnitz.de/admin/MoUSe/EXT_TOOLS/RESTORErestore_paulus_adrdb
paulus/swdb/afs/tu-chemnitz.de/admin/MoUSe/EXT_TOOLS/RESTORErestore_paulus_swdb
paulus/verbrauchsmaterial/afs/tu-chemnitz.de/admin/MoUSe/EXT_TOOLS/RESTORErestore_paulus_verbrauchsmaterial
paulus/portal/afs/tu-chemnitz.de/admin/MoUSe/EXT_TOOLS/RESTORErestore_paulus_portal
paulus/voip/afs/tu-chemnitz.de/admin/MoUSe/EXT_TOOLS/RESTORErestore_paulus_voip

Für den Fall, dass die Datenbanken neu erzeugt werden müssen und die MYSQL-Zugriffbefugnisse zu setzen sind, muss so vorgegangen werden:

Das Restore-Skript stellt nun einzelne oder alle Tabellen einer Datenbank zurück. Host- (im Normalfall: localhost) und Tabellenname werden abgefragt. Alle existierenden Sicherungen werden zur Auswahl angeboten.

Das Skript löscht in der Datenbank zunächst die rückzustellende Tabelle (bzw. alle Tabellen, die im Backup vorhanden sind) und legt diese neu an.

(Die Skripts zum Rückstellen der Datenbanken auf dem paulus fragen nichts ab!
Sie laufen nur auf paulus.hrz.tu-chemnitz.de!
Damit werden täglich früh ab 5:00 Uhr die aktuellen Datenbank-Backups per Cron auf der Entwicklungsmaschine eingelesen. Damit wird geprüft, ob die nächtliche Datensicherung erfolgreich war und
zum Restore benutzt werden kann.
Ausserdem kann so auf der Entwicklungsmaschine ständig mit realistischen Daten(mengen) getestet werden.
)

   Alle Restore-Skripts benutzen dieses MYSQL-Kommando:

   echo "LOAD DATA INFILE 'filename' INTO TABLE tabelle FIELDS TERMINATED by \"#\";" |
       mysql --skip-column-names datenbankname -u dbuser -pdbpassword -h localhost

  Es übernimmt die im File filename (vollst. Pfad) enthaltenen Daten
   in die Tabelle tabelle der Datenbank datenbankname.

   Deshalb benötigt der mysqld-Prozess Lesezugriff zu filename.
   filename befindet sich im AFS.
   Über die Gruppe urz:dbserver der alle Server, die mit MoUSe zu tun haben, angehören,
   wird der Zugang gewährt.


Die vom mysqld für jede Datenbank mitprotokollierten MySQL-Schreibkommandos können benutzt werden um den topaktuellen Datenbankzustand wieder herzustellen. Das File /var/log/mysql_log/update.999 enthält diese MySQL-Schreibkommandos in einen komprimierten Format.
Das Kommando

/usr/bin/mysqlbinlog /var/log/mysql_log/update.999

erstellt in Stdout eine MySQL-Kommando-Sequenz, die in einer Pipe nach "mysql" geschickt werden kann.
Die Änderungen an allen Datenbanken stehen in dieser MySQL-Kommando-Sequenz.

Werden nur die Updates für eine Datenbank benötigt, kann so verfahren werden:


Kopieren einer Datenbank mit UNIX-Mitteln (nur zur Info)

Prinzipiell kann das Kopieren einer Datenbank auf dem selben Rechner so vorgenommen werden: Über Rechnergrenzen hinweg ist beim Kopieren Vorsicht geboten! Nur wenn auf den beteiligten Systemen die gleiche MySQL-Version installiert ist, sollten keine Probleme auftreten.

Dietmar Grunewald
Februar 2009