Wenn Sie auf die beschriebene Weise einen Dump und eine Wiederherstellung durchführen, muss MySQL die Indizes vollständig neu erstellen, wenn die Daten importiert werden. Es muss auch jedes Mal die Daten parsen.
Es wäre viel effizienter, wenn Sie Datendateien in einem Format kopieren könnten, das MySQL bereits versteht. Eine gute Möglichkeit hierfür ist die Verwendung von innobackupex von Percona
(Open Source und verteilt als Teil von XtraBackup, das hier heruntergeladen werden kann).
Dadurch wird ein Snapshot von MyISAM-Tabellen erstellt, und für InnoDB-Tabellen werden die zugrunde liegenden Dateien kopiert und dann das Transaktionsprotokoll gegen sie wiedergegeben, um einen konsistenten Zustand sicherzustellen. Es kann dies von einem Live-Server ohne Ausfallzeit tun (ich habe keine Ahnung, ob das eine Anforderung von Ihnen ist?)
Ich schlage vor, Sie lesen die Dokumentation, aber um ein Backup in seiner einfachsten Form zu erstellen, verwenden Sie:
$ innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
$ innobackupex --apply-log /path/to/BACKUP-DIR/
Wenn sich die Daten auf derselben Maschine befinden, hat innobackupex sogar einen einfachen Wiederherstellungsbefehl:
$ innobackupex --copy-back /path/to/BACKUP-DIR
Es gibt viele weitere Optionen und verschiedene Möglichkeiten, um das Backup tatsächlich durchzuführen, daher würde ich Sie wirklich ermutigen, die Dokumentation gut zu lesen, bevor Sie beginnen.
Als Referenz zur Geschwindigkeit:Unser langsamer Testserver, der etwa 600 IOPS leistet, kann mit dieser Methode ein 500-GB-Backup in etwa 4 Stunden wiederherstellen.
Zum Schluss:Sie haben erwähnt, was getan werden könnte, um den Import zu beschleunigen. Es kommt vor allem darauf an, was der Flaschenhals ist. Typischerweise sind Importoperationen E/A-gebunden (Sie können dies testen, indem Sie auf io-Wartezeiten prüfen) und der Weg, dies zu beschleunigen, ist ein schnellerer Plattendurchsatz - entweder schnellere Platten selbst oder mehr von ihnen im Einklang.
Stellen Sie sicher, dass Sie Ihr "max_allowed_packet erhöhen " Variable auf eine ausreichend große Größe. Dies wird wirklich hilfreich sein, wenn Sie viele Textdaten haben. Die Verwendung von Hochleistungshardware wird sicherlich die Geschwindigkeit des Datenimports verbessern.
mysql --max_allowed_packet=256M -u root -p < "database-file.sql"
Eine Sache, die Sie tun können, ist
SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS=0
Und Sie können auch mit den Werten spielen
innodb_buffer_pool_size
innodb_additional_mem_pool_size
innodb_flush_method
in my.cnf
um Sie zum Laufen zu bringen, aber im Allgemeinen sollten Sie sich auch die restlichen innodb-Parameter ansehen, um zu sehen, was am besten zu Ihnen passt.
Dies ist ein Problem, das ich in der Vergangenheit hatte und von dem ich glaube, dass ich es nicht vollständig angegangen bin, aber ich hoffe, ich habe mich von Anfang an in diese Richtung gelenkt. Hätte mir einiges an Zeit erspart.
Es fehlen viele Parameter, um die Ursache des Problems vollständig zu verstehen. wie:
- MySQL-Version
- Festplattentyp und -geschwindigkeit
- Geben Sie Speicherplatz auf dem Server frei, bevor Sie den MySQL-Server starten
- Iostat-Ausgabe vor und zum Zeitpunkt des mysqldump.
- Was sind die Parameter, die Sie verwenden, um die Dump-Datei überhaupt zu erstellen.
und viele mehr.
Also werde ich versuchen zu erraten, dass Ihr Problem in den Festplatten liegt, weil ich 150 Instanzen von MySQL habe, die ich mit 3 TB Daten auf einer davon verwalte, und normalerweise ist die Festplatte das Problem
Nun zur Lösung:
Zunächst einmal - Ihr MySQL ist nicht für die beste Leistung konfiguriert.
Sie können die wichtigsten zu konfigurierenden Einstellungen im Percona-Blogbeitrag nachlesen:http://www.percona.com/blog/2014/01/28/10-mysql-settings-to-tune-after-installation/
Überprüfen Sie insbesondere die Parameter:
innodb_buffer_pool_size
innodb_flush_log_at_trx_commit
innodb_flush_method
Wenn Ihr Problem die Festplatte ist - das Lesen der Datei vom selben Laufwerk - verschlimmert das Problem.
Und wenn Ihr MySQL-Server zu wechseln beginnt, weil er nicht genug RAM zur Verfügung hat, wird Ihr Problem noch größer.
Sie müssen vor und während des Wiederherstellungsvorgangs eine Diagnose auf Ihrem Computer durchführen, um dies herauszufinden.
Außerdem kann ich Ihnen vorschlagen, eine andere Technik zum Ausführen der Wiederherstellungsaufgabe zu verwenden, die schneller als mysqldump funktioniert.
Es ist Percona Xtrabackup - http://www.percona.com/doc/percona-xtrabackup/2.2/
Sie müssen das Backup damit erstellen und daraus wiederherstellen oder vom laufenden Server direkt mit Streaming-Option neu erstellen.
Außerdem ist die MySQL-Version ab 5.5 - InnoDB schneller als MyISAM. Erwägen Sie, alle Ihre Tabellen darauf umzustellen.