Bewährte Methoden zum Sichern einer MySQL-Datenbank

23

Ich habe kürzlich festgestellt, dass unsere Produktions-Webserver, auf denen MySQL ausgeführt wird, nicht regelmäßig (oder überhaupt nicht) gesichert werden. Ich bin es gewohnt, SQL Server-DBs zu sichern, habe aber nicht viel Erfahrung mit MySQL-DBs. Best Practices für die Verwendung von "mysqldump" oder anderen DB-Backup-Tools?

Ich werde wahrscheinlich den Zeitplan so anpassen, dass er jede Nacht durchgeführt wird und dann die Dateien mit meinem Backup-System sichern.

Vielen Dank.

Valien
quelle

Antworten:

29

Bewährte Methoden für die Sicherung von MySQL-Servern:

MySQL-Replikation

Richten Sie die Replikation in MySQL ein. Sie müssen Master- und Slave-Server einrichten. Alle Schreib- / Lesezugriffe auf die DB können auf Ihren Slave-Server gehen. Der Vorteil von Replication ist, dass Sie ein Backup von Ihrem Slave-Server erstellen können, ohne den Master-Server zu unterbrechen. Ihre Anwendung wird weiterhin ohne Ausfallzeiten auf dem Master arbeiten.

Verwenden von MySQL Dump

Wenn Ihre Datenmenge klein ist (mir ist klar, dass "klein" ein relativer Begriff ist), dann wird mysqldump wahrscheinlich großartig funktionieren. Es ist einfach, online und sehr flexibel. Nur ein paar Dinge, die mysqldump tun kann: Sichern Sie alles oder nur bestimmte Datenbanken oder Tabellen. Sichern Sie nur die DDL. Optimieren Sie den Dump für eine schnellere Wiederherstellung.

Die wichtigsten Optionen hängen jedoch mit der Konsistenz Ihrer Sicherung zusammen. Meine bevorzugten Optionen sind: --single-transaction: Diese Option bietet eine konsistente Sicherung, wenn (und nur wenn) die Tabellen die InnoDB-Speicher-Engine verwenden. Wenn Sie keine schreibgeschützten MyISAM-Tabellen haben, verwenden Sie diese Option nicht, wenn Sie sie sichern. --master-data = 2: Diese Option stellt sicher, dass Ihr Dump konsistent ist (indem Sie eine Sperre für alle Tabellen durchführen, sofern Sie nicht die Option --single-transaction hinzugefügt haben). Die Option --master-data zeichnet auch die Position des Binärprotokolls in der resultierenden Speicherauszugsdatei auf (= 2 bewirkt, dass diese Zeile ein Kommentar in der Speicherauszugsdatei ist).

Abschließender Hinweis zu mysqldump: Beachten Sie, dass die Wiederherstellungszeit möglicherweise erheblich länger ist als die Sicherungszeit. Es hängt von mehreren Faktoren ab, zum Beispiel wie viele Indizes Sie haben.

LVM-Snapshot

Für diejenigen, die größere Datenmengen haben, ist eine physische Sicherung der richtige Weg. Während Sie eine Kaltstartsicherung durchführen könnten (dh den MySQL-Dienst herunterfahren, das Datenverzeichnis kopieren, den Dienst neu starten), möchten viele Benutzer keine Ausfallzeiten. Meine Lieblingslösung sind Schnappschüsse. Dies kann heiß sein (für InnoDB) oder eine kurze Sperre erfordern (für MyISAM). Vergessen Sie nicht, alle Ihre Daten anzugeben (einschließlich ib_logfiles). Lenz bietet dazu ein nützliches Hilfsprogramm: http://www.lenzg.net/mylvmbackup/

Verwenden von MySQL Enterprise Backup

Vorteile der Verwendung von MySQL Enterprise Backup:

  • "Hot" -Sicherungen von InnoDB-Tabellen erfolgen vollständig online, ohne dass die Sicherung nur bestimmter Tabellen oder Tablespaces blockiert wird
  • Sichern Sie nur die Daten, die sich seit einer vorherigen Sicherung geändert haben
  • Komprimiertes Backup - Spart bis zu 90% Speicherplatz und vieles mehr.

Referenz: http://www.mysql.com/products/enterprise/backup/features.html http://www.mysql.com/products/enterprise/backup.html

Peter Venderberghe
quelle
7

Ich würde empfehlen, ein dediziertes Replikat für die Sicherung einzurichten . Auf diese Weise können Sie Sicherungsaufgaben ausführen, ohne die primäre zu beeinträchtigen. Da dies Ihrer Architektur Komplexität verleiht, sollten Sie die Replikationsverzögerung überwachen, um sicherzustellen, dass alles funktioniert.

Was den eigentlichen Prozess betrifft, stehen Ihnen einige Optionen ohne Tools von Drittanbietern zur Verfügung. Snapshots können mit dem genommen mysqldumpBefehl (vorausgesetzt , Sie verwenden InnoDB): mysqldump --all-databases --single-transaction > all_databases.sql. Abhängig von der Datengröße kann es vorzuziehen sein, MySQL herunterzufahren und die Datendateien direkt zu sichern. Wenn das Replikat neu gestartet wird, werden alle Ereignisse wiedergegeben, die das primäre in der Zeitspanne empfangen hat, in der es inaktiv war. Wenn Sie MySQL Enterprise verwenden, führt das mysqlbackupDienstprogramm dies aus.

Inkrementelle Sicherungen können durchgeführt werden, indem das Binärprotokoll auf dem Replikat aktiviert wird . Offensichtlich werden nur Ereignisse aufgezeichnet, die Daten mutieren. Sie müssen diese also mit den obigen Schnappschüssen kombinieren.

Rich Schumacher
quelle
3
+1 für --single-transactionaber vergiss nicht hinzuzufügen --events --routinesund ich benutze --triggerses immer auch, obwohl es standardmäßig aktiviert ist, da es in my.cnf deaktiviert werden kann. Ich würde sagen, es ist so ziemlich immer gut, diese als Standard zu verwenden, unabhängig davon, ob Sie diese Objekttypen derzeit in Ihrer Datenbank haben oder nicht.
Michael - sqlbot
Hinweis mysqldump - all-databases kann Fehler auslösen, wenn Sie eine niedrige Einstellung für die maximale Anzahl offener Tabellen definiert haben. Behalte also deinen mysql.log im Auge. Replikation wäre in der Tat die beste Sicherungsmöglichkeit
Raymond Nijland
Wie bewahren Sie dann historische Kopien der Daten auf? (Häufig möchte ein Client, dass ein Monat oder mehr Backups aufbewahrt werden. Wenn ein Anwendungsfehler Daten beschädigt, möchten Entwickler eine Kopie der Datenbank vor dem Fehler.)
RonJohn,