Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Was ist der schnellste Weg, um eine MySQL InnoDB-Datenbank mit mysqldump zu sichern und zu laden?

SCHNELLES Sichern einer stillgelegten Datenbank:

Die Verwendung der Option „-T“ mit mysqldump führt zu vielen .sql- und .txt-Dateien im angegebenen Verzeichnis. Dies ist ca. 50 % schneller beim Sichern großer Tabellen als eine einzelne .sql-Datei mit INSERT-Anweisungen (benötigt 1/3 weniger Gesamtzeit).

Darüber hinaus gibt es beim Wiederherstellen einen großen Vorteil, wenn Sie mehrere Tabellen parallel laden und mehrere Kerne sättigen können. Auf einer 8-Core-Box könnte dies bis zu einer 8-fachen Differenz in der Wanduhrzeit betragen, um den Dump wiederherzustellen, zusätzlich zu den Effizienzverbesserungen, die durch "-T" bereitgestellt werden. Da "-T" bewirkt, dass jede Tabelle in einer separaten Datei gespeichert wird, ist es einfacher, sie parallel zu laden, als eine riesige .sql-Datei aufzuteilen.

Wenn man die obigen Strategien bis zu ihrem logischen Extrem führt, könnte man ein Skript erstellen, um eine Datenbank weitgehend parallel zu sichern. Nun, genau das ist der Maakit mk-parallel-dump (siehe http:/ /www.maatkit.org/doc/mk-parallel-dump.html ) und mk-parallel-restore-Tools sind; Perl-Skripte, die das zugrunde liegende mysqldump-Programm mehrfach aufrufen. Als ich jedoch versuchte, diese zu verwenden, hatte ich Probleme, die Wiederherstellung ohne doppelte Schlüsselfehler abzuschließen, die bei Vanilla-Dumps nicht auftraten. Denken Sie also daran, dass Ihre Laufleistung variieren kann.

Speichern von Daten aus einer LIVE-Datenbank (ohne Dienstunterbrechung):

Der Schalter --single-transaction ist sehr nützlich, um einen Dump einer Live-Datenbank zu erstellen, ohne sie stilllegen zu müssen, oder einen Dump einer Slave-Datenbank zu erstellen, ohne das Slaven beenden zu müssen.

Leider ist -T nicht mit --single-transaction kompatibel, also bekommst du nur eine.

Normalerweise ist das Erstellen des Dumps viel schneller als das Wiederherstellen. Es ist immer noch Platz für ein Tool, das die eingehende monolithische Dump-Datei nimmt und sie in mehrere Teile zerlegt, die parallel geladen werden können. Ein solches Tool existiert meines Wissens noch nicht.

Die Übertragung des Dumps über das Netzwerk ist normalerweise ein Gewinn

Um auf einem Host auf einen eingehenden Dump zu warten, führen Sie Folgendes aus:

nc -l 7878 > mysql-dump.sql

Führen Sie dann auf Ihrem DB-Host

aus
mysqldump $OPTS | nc myhost.mydomain.com 7878

Dies reduziert die Konkurrenz für die Plattenspindeln auf dem Master beim Schreiben des Dumps auf die Platte, wodurch Ihr Dump leicht beschleunigt wird (vorausgesetzt, das Netzwerk ist schnell genug, um mitzuhalten, eine ziemlich sichere Annahme für zwei Hosts im selben Rechenzentrum). Wenn Sie einen neuen Slave bauen, erspart dies außerdem den Schritt, die Dump-Datei nach der Fertigstellung übertragen zu müssen.

Vorbehalte - natürlich müssen Sie über genügend Netzwerkbandbreite verfügen, um die Dinge nicht unerträglich zu verlangsamen, und wenn die TCP-Sitzung unterbrochen wird, müssen Sie von vorne beginnen, aber für die meisten Dumps ist dies kein großes Problem.

Abschließend möchte ich einen Punkt klären, der häufig verwechselt wird.

Ungeachtet dessen, wie oft Sie diese Flags in mysqldump-Beispielen und Tutorials sehen, sind sie überflüssig, da sie standardmäßig eingeschaltet sind:

  • --opt
  • --add-drop-table
  • --add-locks
  • --create-options
  • --disable-keys
  • --extended-insert
  • --lock-tables
  • --quick
  • --set-charset .

Von http://dev.mysql.com/doc/refman/ 5.1/en/mysqldump.html :

Von diesen Verhaltensweisen ist "--quick" eines der wichtigsten (überspringt das Zwischenspeichern der gesamten Ergebnismenge in mysqld vor der Übertragung der ersten Zeile) und kann mit "mysql" (das --quick NICHT standardmäßig aktiviert) verwendet werden. Abfragen drastisch zu beschleunigen, die eine große Ergebnismenge zurückgeben (z. B. alle Zeilen einer großen Tabelle ausgeben).