Wie kann ich eine MySQL-Wiederherstellung aus einer Dump-Datei beschleunigen?

28

Ich stelle eine 30-GB-Datenbank aus einer mysqldump-Datei in einer leeren Datenbank auf einem neuen Server wieder her. Wenn Sie SQL über die Dump-Datei ausführen, startet die Wiederherstellung sehr schnell und wird dann immer langsamer. Einzelne Beilagen benötigen nun mehr als 15 Sekunden. Die Tabellen sind meistens MyISAM mit einer kleinen InnoDB. Der Server hat keine anderen aktiven Verbindungen. SHOW PROCESSLIST;Zeigt nur die Einfügung aus dem Restore (und die Show-Prozessliste selbst).

Hat jemand eine Idee, was die dramatische Verlangsamung verursachen könnte?

Gibt es MySQL-Variablen, die ich ändern kann, um die Wiederherstellung während des Vorgangs zu beschleunigen?

Dave Forgac
quelle
Bearbeitet, um die Tabellentypen zu korrigieren
Dave Forgac

Antworten:

26

Eine Sache, die den Prozess möglicherweise verlangsamt, ist key_buffer_size , die Größe des Puffers, der für Indexblöcke verwendet wird. Stellen Sie dies auf mindestens 30% Ihres Arbeitsspeichers ein, da sonst die Neuindizierung wahrscheinlich zu langsam ist.

Wenn Sie InnoDB und Fremdschlüssel verwenden, können Sie auch die Fremdschlüsselprüfung deaktivieren und am Ende wieder aktivieren (mit SET FOREIGN_KEY_CHECKS=0und SET FOREIGN_KEY_CHECKS=1).

Marco Ramos
quelle
1
Ich habe zwei Dinge gefunden: Die key_buffer_size wurde auf 8MB gesetzt und es gab eine InnoDB-Tabelle im Mix mit Fremdschlüsseln. Key_buffer_size wurde auf 1 GB erhöht und die Fremdschlüsselüberprüfung vorübergehend deaktiviert. Die Wiederherstellung war in 5 Minuten abgeschlossen. Vielen Dank!
Dave Forgac
Wow! Froh, dass es geholfen hat :)
Marco Ramos
2
Mir ist gerade aufgefallen, dass ich 5 Minuten eingegeben habe. Ich bin mir ziemlich sicher, dass es mehr wie 50 Minuten war, aber immer noch viel vernünftiger ;-)
Dave Forgac
5
key_buffer_size ist für MYISAM.
Fernando Fabreti
@FernandoFabreti - das ist ein wichtiger Punkt für viele Leser, aber das OP hat angegeben, dass sie hauptsächlich MyISAM hatten
mc0e
22

Dieser Link zeigt, was Sie tun können, um den Wiederherstellungsprozess zu beschleunigen.

http://dev.mysql.com/doc/refman/5.5/de/optimizing-innodb-bulk-data-loading.html

Man kann die Befehle an den Anfang der Dump-Datei setzen

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

Und setzen Sie diese Anweisungen am Ende der Dump-Datei

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

Das hat bei mir funktioniert. Viel Spaß beim restaurieren :-)

Dharmesh Schneider
quelle
8
Das hat sehr geholfen. Anstatt die Datei zu bearbeiten, habe ich pre.sql und post.sql aus den obigen Ausschnitten erstellt und diese verwendet, um die Datenbank wiederherzustellen:cat pre.sql dump.sql post.sql | mysql ...
Jason R. Coombs
1

Der einzige Grund, warum sich die Wiederherstellung allmählich verlangsamt, ist die Indizierung. Prüfen Sie, ob die Indizierung bis zum Ende deaktiviert ist, und lassen Sie es dann die ganze Menge auf einmal erledigen.

John Gardeniers
quelle
1

Wenn Sie die physische Kopie der Dump-Datei (das DB-Verzeichnis) haben, können Sie sie einfach auf den neuen Server kopieren, wenn der neue Server dieselbe MySQL-Version hat und dies funktioniert. Dies funktioniert gut mit MyISAM und für mich ist es besser, als die Daten auf der Basis der logischen SQL-Dump-Datei wiederherzustellen.

usef_ksa
quelle
0

Wenn Sie mehrere Tabellen haben, können Sie möglicherweise von mk-parallel-restore profitieren .

pQd
quelle
Dies ist jetzt veraltet und sollte nur zum Wiederherstellen von Testdaten verwendet werden, nicht zum Wiederherstellen tatsächlicher Sicherungen.
Svandragt
0

Das wird es tun:

mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql

Matiss
quelle
-1

Ich habe dir vorgeschlagen,

  1. Überprüfen Sie Ihre Tabellen: Hat es Trigger? Lösche alle Auslöser
  2. SET: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( UND NICHT VERGESSEN Rollback Dies ändert )
  3. BENUTZEN SIE COMMAND LINE LIKE mysql -u root -pPasss requests < mydb.sql
  4. Überprüfen Sie die Größe Ihrer Datenbankdatei

Viel Glück

Ferhat KOÇER
quelle