Die Wiederherstellung eines MySQL-Backups ist sehr langsam

791
Knows Not Much

Ich stelle eine 26-GB-mysql-dump-datei auf einem 16-GB-RAM-MySQL unter MacOS wieder her.

Zuerst habe ich versucht, das mysql-Backup so wiederherzustellen

mysql -ufoo -pbar foo < foo.dump 

Dies führte zum Absturz von mySQL, da foo.dump viele sehr lustige internationale Zeichen enthielt und der obige Befehl sich nicht um die Kodierungen kümmerte.

Also habe ich es versucht

mysql -uroot -p --default-character-set=utf8 foo mysql> SET names 'utf8' mysql> SOURCE foo.dump 

Dies funktionierte und der Wiederherstellungsprozess stürzte nicht ab, da die lustigen internationalen Charaktere vermutlich richtig gehandhabt wurden.

Jetzt ist der Wiederherstellungsprozess jedoch sehr langsam. Bei einer 26 GB-Datei läuft es die ganze Nacht hindurch (ein Tisch mit 40 Millionen Zeilen ist der Schuldige). Ich kann sehen, dass es alle 15 Sekunden etwa 3000 Reihen wiederherstellt. Bei dieser Geschwindigkeit dauert der Wiederherstellungsprozess jedoch ewig.

Gibt es eine Möglichkeit, die Dump-Datei schnell wiederherzustellen und die Kodierungen nicht durcheinander zu bringen?

0

1 Antwort auf die Frage

0
Ben Njeri

Ihr Prozess ist aufgrund der hohen Festplattenaktivität I/Ofür SQL-Vorgänge langsam . Sie müssen innodb für intensive Operationen optimieren. Ändern Sie Ihre mysql-Konfigurationsdatei mit folgenden Zeilen:

innodb_buffer_pool_size = 4G innodb_log_buffer_size = 256M innodb_log_file_size = 1G innodb_write_io_threads = 16 

innodb_buffer_pool_size: Der Speicherbereich, in dem InnoDB Tabellen- und Indexdaten zwischenspeichert. Wenn Tabellendaten im InnoDB-Pufferpool zwischengespeichert werden, kann durch Abfragen wiederholt auf sie zugegriffen werden, ohne dass Platten-E / A erforderlich sind. Datenänderungen werden zwischengespeichert und nicht sofort auf die Festplatte geschrieben.

Ein größerer Pufferpool erfordert weniger Platten-E / A, um mehrmals auf dieselben Tabellendaten zuzugreifen. Auf einem dedizierten Datenbankserver können Sie die Größe des Pufferpools auf 80% des physischen Arbeitsspeichers der Maschine festlegen, andernfalls wird 50 to 75der Systemspeicher beansprucht. Die Standardgröße des Pufferpools beträgt 128 MB

innodb_log_buffer_size: Die Größe des Puffers in Bytes, den InnoDB in die Protokolldateien auf der Festplatte schreibt.

Ein großer Protokollpuffer ermöglicht die Ausführung großer Transaktionen, ohne dass das Protokoll vor dem Festschreiben der Transaktionen auf die Festplatte geschrieben werden muss. Wenn Sie also über viele Transaktionen verfügen, die viele Zeilen aktualisieren, einfügen oder löschen, wird durch die Vergrößerung des Protokollpuffers die Platten-E / A gespart.

innodb_log_file_size: Die Größe jeder Protokolldatei in einer Protokollgruppe in Byte. Eine große Größe stellt sicher, dass der Server Spitzen- und Tiefststände in der Workload-Aktivität ausgleichen kann. Dies bedeutet häufig, dass genügend Speicherplatz für die Protokollwiedergabe vorhanden ist, um mehr als eine Stunde Schreibaktivität zu verarbeiten. Je größer der Wert ist, desto weniger Checkpoint-Flush-Aktivitäten sind im Pufferpool erforderlich, wodurch Platten-E / A gespart werden

Innodb_write_io_threads: Die Anzahl der E / A-Threads für Schreibvorgänge in InnoDB. Der Standardwert ist 4. InnoDB verwendet Hintergrundthreads, um verschiedene Arten von E / A-Anforderungen zu bedienen. . Sie können die Anzahl der Hintergrund-Threads konfigurieren, die E / A auf Datenseiten lesen und schreiben, mithilfe der Konfigurationsparameter innodb_read_io_threads und innodb_write_io_threads.

Diese Parameter geben die Anzahl der Hintergrund-Threads an, die für Lese- bzw. Schreibanforderungen verwendet werden. Jeder Hintergrundthread kann bis zu 256 ausstehende E / A-Anforderungen verarbeiten.