Die beiden Hauptmethoden zum Sichern der Datenbank bestehen darin, das Programm mysqldump zu verwenden oder die Datenbankdatei direkt zu kopieren (z. B. mit cp, cpio oder tar usw.). In diesem Artikel wird der Datenbanksicherungsplan für die MySQL-Plattform detailliert beschrieben. Für den Fall, dass eine Datenbanktabelle verloren geht oder beschädigt wird, ist es wichtig, Ihre Datenbank zu sichern. Wenn es zu einem Systemabsturz kommt, möchten Sie auf jeden Fall in der Lage sein, Ihre Tabellen in dem Zustand wiederherzustellen, in dem sie sich zum Zeitpunkt des Absturzes befanden, und zwar mit möglichst geringem Datenverlust. Manchmal ist es der MySQL-Administrator, der Chaos verursacht. Der Administrator weiß bereits, dass die Tabellen beschädigt sind und der Versuch, sie direkt mit einem Editor wie vi oder Emacs zu bearbeiten, ist definitiv nicht gut für die Tabellen.
Die beiden Hauptmethoden zum Sichern der Datenbank bestehen darin, das Programm mysqldump zu verwenden oder die Datenbankdatei direkt zu kopieren (z. B. mit cp, cpio oder tar usw.). Jede Methode hat ihre Vor- und Nachteile:
mysqldump funktioniert mit dem MySQL-Server. Die direkte Kopiermethode wird außerhalb des Servers ausgeführt und Sie müssen Maßnahmen ergreifen, um sicherzustellen, dass kein Client die Tabelle ändert, die Sie kopieren. Wenn Sie die Dateisystemsicherung zum Sichern der Datenbank verwenden möchten, tritt das gleiche Problem auf: Wenn die Datenbanktabelle während des Dateisystemsicherungsvorgangs geändert wird, ist der Betreff der gesicherten Tabellendatei inkonsistent und die Tabelle auch für die zukünftige Genesung bedeutungslos. Der Unterschied zwischen einer Dateisystemsicherung und einer direkten Kopie der Datei besteht darin, dass Sie bei letzterer die vollständige Kontrolle über den Sicherungsvorgang haben und Maßnahmen ergreifen können, um sicherzustellen, dass der Server die Tabelle ungestört verlässt.
mysqldump ist langsamer als das direkte Kopieren.
mysqldump generiert Textdateien, die auf andere Maschinen portierbar sind, auch auf solche mit unterschiedlichen Hardwarearchitekturen. Direkt kopierte Dateien können nicht auf andere Computer portiert werden, es sei denn, die Tabelle, die Sie kopieren, verwendet das MyISAM-Speicherformat. ISAM-Tabellen können nur auf Maschinen mit ähnlichen Hardwarestrukturen kopiert werden. Das in MySQL 3.23 eingeführte MyISAM-Tabellenspeicherformat löst dieses Problem, da das Format maschinenunabhängig ist, sodass die Datei durch direktes Kopieren auf Maschinen mit unterschiedlichen Hardwarestrukturen übertragen werden kann. Solange zwei Bedingungen erfüllt sind: Auf dem anderen Computer muss ebenfalls MySQL 3.23 oder höher ausgeführt werden, und die Datei muss im MyISAM-Format und nicht im ISAM-Format dargestellt werden.
Ganz gleich, welche Sicherungsmethode Sie verwenden: Wenn Sie Ihre Datenbank wiederherstellen müssen, sollten mehrere Grundsätze befolgt werden, um die besten Ergebnisse zu erzielen:
Führen Sie regelmäßige Backups durch. Erstellen Sie einen Plan und halten Sie sich daran.
Lassen Sie den Server die Aktualisierungsprotokollierung durchführen. Das Changelog hilft Ihnen, wenn Sie nach einem Absturz Daten wiederherstellen müssen. Nachdem Sie die Sicherungsdatei verwendet haben, um die Daten in dem Zustand wiederherzustellen, in dem sie sich zum Zeitpunkt der Sicherung befanden, können Sie die nach der Sicherung vorgenommenen Änderungen erneut anwenden, indem Sie eine Abfrage im Aktualisierungsprotokoll ausführen, wodurch die Tabellen in der Datenbank wiederhergestellt werden der Zustand, in dem sie sich zum Zeitpunkt des Absturzes befanden.
Im Hinblick auf Dateisystemsicherungen stellt die Datenbanksicherungsdatei einen vollständigen Speicherauszug dar, während das Aktualisierungsprotokoll einen inkrementellen Speicherauszug darstellt.
Verwenden Sie ein einheitliches und verständliches Benennungsschema für Sicherungsdateien. Dinge wie Backup1, Buckup2 usw. sind nicht besonders aussagekräftig. Wenn Sie Ihre Wiederherstellung durchführen, verschwenden Sie Zeit damit, herauszufinden, was in den Dateien enthalten ist. Es kann hilfreich sein, den Namen und das Datum der Datenbank zu verwenden, um den Namen der Sicherungsdatei zu bilden. Zum Beispiel:
%mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02
%mysqldump menagerie >/usr/archives/mysql/menagerie.1999-10-02
Möglicherweise möchten Sie die Backups nach der Erstellung komprimieren. Backups sind in der Regel groß! Sie müssen auch Ihre Backup-Dateien ablaufen lassen, um zu vermeiden, dass sie Ihre Festplatte füllen, genau wie Sie Ihre Protokolldateien ablaufen lassen.
Sichern Sie Ihre Sicherungsdateien mit einer Dateisystemsicherung. Wenn Sie einen kompletten Absturz erleben, der nicht nur Ihr Datenverzeichnis, sondern auch das Laufwerk mit Ihren Datenbanksicherungen löscht, werden Sie in echte Schwierigkeiten geraten.
Sichern Sie auch Ihr Änderungsprotokoll.
Platzieren Sie Ihre Sicherungsdateien in einem anderen Dateisystem als dem, das für Ihre Datenbank verwendet wird. Dadurch wird die Möglichkeit verringert, dass das Dateisystem, das das Datenverzeichnis enthält, durch die Erstellung der Sicherung überfüllt wird.
Die zum Erstellen von Backups verwendeten Techniken sind auch beim Kopieren einer Datenbank auf einen anderen Computer nützlich. Am häufigsten wird eine Datenbank auf einen Server verschoben, der auf einem anderen Host ausgeführt wird. Sie können die Daten jedoch auch auf einen anderen Server auf demselben Host verschieben.
1 Verwenden Sie mysqldump, um die Datenbank zu sichern und zu kopieren
Wenn Sie das Programm mysqldumo zum Generieren einer Datenbanksicherungsdatei verwenden, enthält der Dateiinhalt standardmäßig die CREATE-Anweisung, die die zu sichernde Tabelle erstellt, und die INSERT-Anweisung, die die Zeilendaten in der Tabelle enthält. Mit anderen Worten: Die von mysqldump erzeugte Ausgabe kann später als Eingabe für MySQL verwendet werden, um die Datenbank neu zu erstellen.
Sie können die gesamte Datenbank wie folgt in einer einzigen Textdatei speichern:
%mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02
Der Anfang der Ausgabedatei sieht folgendermaßen aus:
# MySQL Dump 6.0# # Host: localhost Datenbank: samp_db
#------------#
Serverversion 3.23.2-alpha-log## Tabellenstruktur für Tabellenabwesenheit
#CREATE TABLE Abwesenheit( student_id int(10) unsigned DEFAULT 0 NOT NULL, date date DEFAULT 0000-00-00 NOT NUL L,
PRIMARY KEY (student_id,date));## Daten für Tabellenabwesenheit ausgeben #INSERT INTO Abwesenheit VALUES (3,1999-09-03);INSERT INTO Abwesenheit VALUE S (5,1999-09-03);INSERT INTO Abwesenheit VALUES (10.08.1999);......
Der Rest der Datei besteht aus weiteren INSERT- und CREATE TABLE-Anweisungen. Wenn Sie das Backup komprimieren möchten, verwenden Sie einen Befehl ähnlich dem folgenden:
%mysqldump samp_db |. gzip >/usr/archives/mysql/samp_db.1999-10-02.gz
Wenn Sie über eine große Datenbank verfügen, sind auch die Ausgabedateien groß und möglicherweise schwierig zu verwalten. Wenn Sie möchten, können Sie die einzelnen Tabellennamen nach dem Datenbanknamen in der mysqldump-Befehlszeile auflisten, um deren Inhalt zu sichern, wodurch die Speicherauszugsdatei in kleinere, besser verwaltbare Dateien aufgeteilt wird. Das folgende Beispiel zeigt, wie einige Tabellen aus der Datenbank samp_db in separate Dateien gesichert werden:
%mysqldump samp_db Schüler-Score-Ereignis-Abwesenheit >grapbook.sql
%mysqldump samp_db-Mitgliedspräsident >hist-league.sql
Wenn Sie Sicherungsdateien generieren, die zur regelmäßigen Aktualisierung des Inhalts einer anderen Datenbank verwendet werden sollen, können Sie die Option --add-drop-table verwenden. Dadurch wird der Server angewiesen, die DROP TABLE IF EXISTS-Anweisung in die Sicherungsdatei zu schreiben. Wenn Sie dann die Sicherungsdatei nehmen und in die zweite Datenbank laden, erhalten Sie keine Fehlermeldung, wenn die Tabelle bereits vorhanden ist.
Wenn Sie eine Datenbank sichern, damit Sie sie auf einen anderen Server verschieben können, müssen Sie nicht einmal eine Sicherungsdatei erstellen. Stellen Sie sicher, dass die Datenbank auf einem anderen Host vorhanden ist, und verwenden Sie dann eine Pipe, um die Datenbank zu sichern, damit MySQL die Ausgabe von MySQLdump direkt lesen kann. Beispiel: Sie möchten die Datenbank samp_db vom Host pit-viper.snake.net nach boa.snake.net kopieren. Das geht ganz einfach so:
%mysqladmin -h boa.snake.net erstellt samp_db
%mysqldump samp_db |. mysql -h boa.snake.net samp_db
Wenn Sie in Zukunft die Datenbank auf boa.snake.net erneut aktualisieren möchten, überspringen Sie den Befehl mysqladmin, fügen Sie jedoch --add-drop-table zu mysqldump hinzu, um zu vermeiden, dass die Tabelle bereits existiert. Fehler: %mysqldump --add- drop-table samp_db |. mysql -h boa.snake.net samp_db
Zu den weiteren nützlichen mysqldump-Optionen gehören: Die Kombination von --flush-logs und --lock-tables ist hilfreich für das Checkpointing Ihrer Datenbank. --lock-tables sperrt alle Tabellen, die Sie sichern, und --flush-logs schließt die Aktualisierungsprotokolldatei und öffnet sie erneut. Das neue Aktualisierungsprotokoll enthält nur Abfragen, die die Datenbank vom Sicherungspunkt aus geändert haben. Dadurch wird die Sicherungszeit für den Prüfpunkt Ihres Update-Protokolls festgelegt. (Wenn Sie jedoch Clients haben, die ein Update durchführen müssen, ist das Sperren aller Tabellen für den Clientzugriff während der Sicherung keine gute Idee.)
Wenn Sie --flush-logs zum Checkpoint in ein Backup verwenden, ist es wahrscheinlich am besten, die gesamte Datenbank zu sichern.
Wenn Sie separate Dateien sichern, ist es schwieriger, die Prüfpunkte des Aktualisierungsprotokolls mit den Sicherungsdateien zu synchronisieren. Während der Wiederherstellung extrahieren Sie normalerweise den Inhalt des Aktualisierungsprotokolls pro Datenbank. Es gibt keine Möglichkeit, Aktualisierungen für einzelne Tabellen zu extrahieren, Sie müssen sie also selbst extrahieren.
Standardmäßig liest mysqldump den gesamten Inhalt einer Tabelle vor dem Schreiben in den Speicher. Dies ist normalerweise wirklich unnötig und bei einem großen Tisch sogar fast ein Fehlschlag. Sie können die Option --quick verwenden, um mysqldump anzuweisen, jede Zeile auszuschreiben, wenn eine Zeile abgerufen wird. Um den Gießvorgang weiter zu optimieren, verwenden Sie --opt anstelle von --quick. Die Option --opt aktiviert zusätzliche Optionen, um das Speichern und Zurücklesen von Daten zu beschleunigen.
Aufgrund des Geschwindigkeitsvorteils von Backups ist die Implementierung von Backups mit --opt wahrscheinlich die häufigste Methode. Seien Sie jedoch gewarnt, die Option --opt ist mit Kosten verbunden. --opt optimiert Ihren Backup-Prozess, nicht den Zugriff anderer Clients auf die Datenbank. Die Option --opt verhindert, dass irgendjemand eine von Ihnen gelöschte Tabelle aktualisiert, indem sie alle Tabellen gleichzeitig sperrt. Sie können die Auswirkung auf den allgemeinen Datenbankzugriff leicht erkennen. Wenn Ihre Datenbank generell sehr häufig genutzt wird, passen Sie die Sicherung einfach einmal täglich an.
Eine Option, die den gegenteiligen Effekt von --opt hat, ist --dedayed. Diese Option bewirkt, dass mysqldump INSERT DELAYED-Anweisungen anstelle von INSERT-Anweisungen schreibt. --delayed ist hilfreich, wenn Sie eine Datendatei in eine andere Datenbank laden und möchten, dass dieser Vorgang nur minimale Auswirkungen auf Abfragen hat, die möglicherweise in dieser Datenbank angezeigt werden.
Die Option --compress ist hilfreich, wenn Sie die Datenbank auf einen anderen Computer kopieren, da sie die Anzahl der über das Netzwerk übertragenen Bytes reduziert. Hier ist ein Beispiel. Beachten Sie, dass --compress für Programme angegeben wird, die mit einem Server auf einem Remote-Host kommunizieren, nicht für Programme, die eine Verbindung zum lokalen Host herstellen:
%mysqldump --opt samp_db |. mysql --compress -h boa.snake.net samp_db
mysqldump bietet viele Optionen. Weitere Informationen finden Sie im „MySQL-Referenzhandbuch“.
2 Sicherungs- und Kopiermethode mit Direktkopie-Datenbank
Eine andere Möglichkeit, die Datenbank und Tabellen zu sichern, die ohne mysqldump auskommt, besteht darin, die Tabellendateien der Datenbank direkt zu kopieren. Normalerweise erfolgt dies mithilfe von Dienstprogrammen wie cp, tar oder cpio. Die Beispiele in diesem Artikel verwenden cp.
Wenn Sie eine direkte Sicherungsmethode verwenden, müssen Sie sicherstellen, dass die Tabelle nicht mehr verwendet wird. Wenn der Server eine Tabelle ändert, während Sie sie kopieren, ist die Kopie bedeutungslos.
Der beste Weg, die Integrität Ihrer Kopie sicherzustellen, besteht darin, den Server herunterzufahren, die Dateien zu kopieren und den Server dann neu zu starten. Wenn Sie den Server nicht herunterfahren möchten, sperren Sie ihn, während Sie die Tabellenprüfung durchführen. Wenn der Server läuft, gelten dieselben Einschränkungen für das Kopieren von Dateien, und Sie sollten dasselbe Sperrprotokoll verwenden, um den Server „ruhig“ zu machen.
Unter der Annahme, dass der Server ausgefallen ist oder Sie die zu kopierende Tabelle gesperrt haben, wird im Folgenden gezeigt, wie Sie die gesamte Datenbank „samp_db“ in einem Sicherungsverzeichnis sichern (DATADIR stellt das Datenverzeichnis des Servers dar): %cd DATADIR%cp -r samp_db /usr /archive/mysql
Eine einzelne Tabelle kann wie folgt gesichert werden:
%cd DATADIR/samp_db%cp member.* /usr/archive/mysql/samp_db%cp score.* /usr/archive/mysql/samp_db ....
Wenn Sie die Sicherung abgeschlossen haben, können Sie den Server neu starten (wenn Sie ihn heruntergefahren haben) oder die auf der Tabelle gesetzten Sperren aufheben (wenn Sie den Server laufen lassen).
Um eine Datenbank mithilfe direkter Kopierdateien von einem Computer auf einen anderen zu kopieren, kopieren Sie die Dateien einfach in das entsprechende Datenverzeichnis auf dem anderen Serverhost. Stellen Sie sicher, dass die Datei im MyIASM-Format vorliegt oder beide Computer über die gleiche Hardwarestruktur verfügen, da Ihre Datenbank sonst auf dem anderen Computer seltsame Inhalte aufweist. Sie sollten außerdem sicherstellen, dass der Server auf einem anderen Computer während der Installation nicht auf die Datenbanktabellen zugreift.
3 Replizierende Datenbank
Die Replikation ähnelt dem Kopieren einer Datenbank auf einen anderen Server, ihre genaue Bedeutung besteht jedoch darin, sicherzustellen, dass die beiden Datenbanken vollständig in Echtzeit synchronisiert werden. Diese Funktion wird in Version 3.23 erscheinen und ist noch nicht sehr ausgereift, daher wird sie in diesem Artikel nicht im Detail vorgestellt.
4 Stellen Sie die Daten aus der Sicherung wieder her
Eine Datenbankbeschädigung kann aus vielen Gründen und in unterschiedlichem Ausmaß auftreten. Wenn Sie Glück haben, beschädigen Sie möglicherweise nur eine oder zwei Tabellen (wie bei einem Stromausfall). Wenn Sie Pech haben, müssen Sie möglicherweise das gesamte Datenverzeichnis ersetzen (wie bei einer Festplattenbeschädigung). In bestimmten Situationen ist auch eine Wiederherstellung erforderlich, beispielsweise wenn ein Benutzer versehentlich eine Datenbank oder Tabelle löscht. Unabhängig von der Ursache dieser unglücklichen Ereignisse müssen Sie eine Art Wiederherstellung durchführen.
Wenn die Tabellen beschädigt sind, aber nicht verloren gehen, versuchen Sie, sie mit myisamchk oder isamchk zu reparieren. Wenn solche Schäden durch ein Reparaturprogramm repariert werden können, müssen Sie die Sicherungsdatei möglicherweise überhaupt nicht verwenden. Informationen zum Vorgang der Tabellenreparatur finden Sie unter „Datenbankwartung und -reparatur“.
Der Wiederherstellungsprozess umfasst zwei Informationsquellen: Ihre Sicherungsdateien und Ihre Änderungsprotokolle. Die Sicherungsdatei stellt die Tabelle in dem Zustand wieder her, in dem sie sich befand, als die Sicherung durchgeführt wurde. In der Regel wurde die Tabelle jedoch in der Zeit zwischen der Sicherung und dem Problem geändert, und das Aktualisierungsprotokoll enthält die zur Durchführung dieser Änderungen verwendeten Abfragen. Sie können Protokolldateien als Eingabe für MySQL verwenden, um Abfragen zu wiederholen. Aus diesem Grund sollten Sie das Änderungsprotokoll aktivieren.
Der Wiederherstellungsprozess variiert je nachdem, wie viele Informationen Sie wiederherstellen müssen. Tatsächlich ist es einfacher, die gesamte Datenbank wiederherzustellen als eine einzelne Tabelle, da es einfacher ist, das Aktualisierungsprotokoll auf die Datenbank anzuwenden als auf eine einzelne Tabelle.
4.1 Stellen Sie die gesamte Datenbank wieder her
Wenn es sich bei der Datenbank, die Sie wiederherstellen möchten, um eine MySQL-Datenbank handelt, die eine Grant-Tabelle enthält, müssen Sie zunächst den Server mit der Option --skip-grant-table ausführen. Andernfalls wird beanstandet, dass die Autorisierungstabelle nicht gefunden werden kann. Nachdem Sie die Tabelle wiederhergestellt haben, führen Sie mysqladmin flush-privileges aus, um den Server anzuweisen, die Autorisierungstoken zu laden und zu verwenden.
Kopieren Sie den Inhalt des Datenbankverzeichnisses an einen anderen Ort, wenn Sie ihn später benötigen.
Installieren Sie die Datenbank mit der neuesten Sicherungsdatei neu. Wenn Sie die von mysqldump generierte Datei verwenden, verwenden Sie sie als Eingabe für MySQL. Wenn Sie direkt aus der Datenbank kopierte Dateien verwenden, kopieren Sie diese direkt zurück in das Datenbankverzeichnis. In diesem Fall müssen Sie jedoch die Datenbank schließen und dann neu starten, bevor Sie die Dateien kopieren.
Verwenden Sie das Aktualisierungsprotokoll, um Abfragen zu wiederholen, die Datenbanktabellen nach der Sicherung ändern. Übergeben Sie alle anwendbaren Änderungsprotokolle als Eingabe an MySQL. Durch Angabe der Option --one-database führt MySQL Abfragen nur für die Datenbank aus, die Sie wiederherstellen möchten. Wenn Sie wissen, dass Sie alle Update-Protokolldateien anwenden müssen, können Sie diesen Befehl in dem Verzeichnis verwenden, das die Protokolle enthält:
% ls -t -r -1 update.[0-9]* |. xargs cat |
Der Befehl ls generiert eine einspaltige Liste von Update-Protokolldateien, sortiert nach der Reihenfolge, in der der Server sie generiert hat (Idee: Wenn Sie eine der Dateien ändern, ändern Sie die Sortierreihenfolge, wodurch das Update-Protokoll angezeigt wird in der falschen Reihenfolge verwendet.)
Höchstwahrscheinlich werden Sie bestimmte Änderungsprotokolle verwenden. Wenn die seit Ihrer Sicherung generierten Update-Protokolle beispielsweise „update.392“, „update.393“ usw. heißen, können Sie sie wie folgt erneut ausführen:
%mysql --one-database db_name < update.392
%mysql --one-database db_name < update.393
.....
Wenn Sie eine Wiederherstellung durchführen und das Aktualisierungsprotokoll verwenden, um Informationen wiederherzustellen, die aufgrund einer falsch empfohlenen DROP DATABASE-, DROP TABLE- oder DELETE-Anweisung verloren gegangen sind, löschen Sie diese Anweisungen unbedingt aus dem Aktualisierungsprotokoll, bevor Sie sie verwenden.
4.2 Wiederherstellen einer einzelnen Tabelle
Das Wiederherstellen einer einzelnen Tabelle ist komplexer. Wenn Sie eine von mysqldump generierte Sicherungsdatei verwenden und diese keine Daten für die Tabellen enthält, an denen Sie interessiert sind, müssen Sie diese aus den relevanten Zeilen extrahieren und als Eingabe für MySQL verwenden. Das ist der einfache Teil. Der schwierige Teil besteht darin, das Fragment aus dem Aktualisierungsprotokoll abzurufen, das nur für diese Tabelle gilt. Möglicherweise ist hierfür das Dienstprogramm mysql_find_rows hilfreich, das mehrzeilige Abfragen aus dem Änderungsprotokoll extrahiert.
Eine andere Möglichkeit besteht darin, die gesamte Datenbank über einen anderen Server wiederherzustellen und anschließend die gewünschten Tabellendateien in die Originaldatenbank zu kopieren. Das könnte ganz einfach sein! Wenn Sie die Dateien zurück in das Datenbankverzeichnis kopieren, stellen Sie sicher, dass der ursprüngliche Datenbankserver heruntergefahren ist.