MySQL Backup und schneller Restore

"Niemand will Backup, alle wollen Restore" ist ein geflügeltes Wort. Backups sind hier also auf "Wiederherstellbarkeit" optimiert: Auch nach kompletten Wechsel der Plattform sollen die Daten weitgehend wieder herstellbar sein. Aber manchmal muß es nur schnell gehen.

Theorie

Bei einer Installation waren Innodb-Einstellungen nicht so glücklich gewählt und es sollte auf InnoDB pro Tabelle umgestellt werden. Dies bedeutet:

  • Backup erstellen. (Sowohl mit mysqldump als auch per cp -a mysql mysql.OLD)
  • Alle Datenbanken löschen (die, die innodb benutzen).
  • MySQL-Server anhalten.
  • my.conf umstellen auf innodb_file_per_table = 1 und innodb_data_file_path verkleinern.
  • Existierende ibdata und ib_log Dateien löschen.
  • Server neu starten, er legt dabei die fehlenden Dateien neu an.
  • Backup wieder einspielen, dabei werden die Datenen in die neuen innodb Dateien verteilt.

Praxis

Die Wiederherstellung des Backups dauert und dauert und dauert.

Zeile für Zeile wird ein Insert bearbeitet.

Die Platte stirb einen Heldentod.

Der Kunde wartet und wartet.

Also Abbruch und Rückkehr zum alten Stand (mv mysql.OLD mysql).

Lösung

Ein paar Tips vom Guru später ein weiterer Versuch:

  • Zuerst einmal ist ein Turbo-Backup zu erstellen "mysqldump -A --opt --single-transaction": Die Inserts werden nun massiv zusammengefaßt, es sind nun nur noch 1% der unspünglichen Zeilenanzahl. Unsere normalen Backups sind auf "diff" optimiert, wir wollen inkrementelle Backups machen können.
  • Alle Datenbanken löschen (die, die innodb benutzen).
  • MySQL-Server anhalten.
  • my.conf umstellen auf innodb_file_per_table = 1 und innodb_data_file_path verkleinern.
  • Als nächstes wird für das Einspielen des Backups zeitweilig die my.conf um innodb_flush_log_at_trx_commit = 0 erweitert: Dies verhindert den massiven I/O-Load der ACID Funktionalität. Wenn's schief geht, muß man das mysql Verzeichnis wegschmeißen und neu anfangen.
  • Existierende ibdata und ib_log Dateien löschen.
  • Server neu starten, er legt dabei die fehlenden Dateien neu an.
  • Backup wieder einspielen, dabei werden die Datenen in die neuen innodb Dateien verteilt.
  • Nach dem Einspielen des Backups wird der MySQL-Server wieder heruntergefahren und mit normalen Schreibverhalten neu gestartet.

Nun ist der gesamte Prozeß binnen zwei Minuten durchgelaufen.

Danke Kristian.

Avatar
nico 05.03.2014 13:25
@Rainer S. --single-transaction macht eigentich nur bei InnoDB richtig Sinn, siehe mysqldump(1)
Avatar
Rainer S. 04.03.2014 20:52
"--single-transaction" - ich dachte, das würde man nur bei MyIsam benötigen?
Sofern nur Innodb verwendet wird, sichere ich ich mit "mysqldump --all-databases --skip-comments --events --routines --triggers" - allerdings bin ich auch noch nie in die Verlegenheit eines Restore gekommen ;-)

2 Kommentare

Post a comment

Verwandter Inhalt