Wie stelle ich MySQL für die Wiederherstellung aus dem MySQL-Dump ein?

4

Die Wiederherstellung meiner kleinen 5-GB-Datenbank dauert 9 Stunden und dauert 5 Minuten, um sie über mysqldump zu sichern. Zum Glück habe ich das während eines Testlaufs herausgefunden, keine tatsächliche Notsituation.

Was sind die besten Parameter zur Optimierung, um dies zu beschleunigen?

Ich habe die folgenden Einstellungen auf meinem Server mit 2 GB RAM versucht:

innodb_buffer_pool_size=512M
innodb_additional_mem_pool_size=50M
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_flush_log_at_trx_commit=0
innodb_log_file_size=1G
innodb_log_buffer_size=1G

Das Seltsame ist, dass auch mit diesen aggressiven Einstellungen, top zeigt nur, dass mysqld kaum einen Bruchteil des zugewiesenen Speichers belegt:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
4421 mysql     20   0  247m  76m 5992 S   91  3.7   4:09.33 mysqld
Alex R
quelle

Antworten:

4

Du solltest dazu fähig sein Berechnen Sie diese Zahlen vor dem mysqldump.

In Bezug auf die Einstellungen, die Sie in der Frage angegeben haben,

innodb_log_file_size=1G

Diese Einstellung ist viel zu groß !!!

Das innodb_log_file_size soll 25% betragen innodb_buffer_pool_size

innodb_log_file_size = 128M

Sobald Sie dies eingestellt haben /etc/my.cnfmüssen Sie die folgenden Schritte ausführen, um die Größe Ihrer InnoDB-Protokolldateien zu ändern:

  1. service mysql stop
  2. rm -f /var/lib/mysql/ib_logfile[01]
  3. service mysql start

Wie für die andere Einstellung

innodb_log_buffer_size=1G

Sie möchten hier niemals eine Menge Daten zwischenspeichern, bevor Sie sie an die InnoDB-Protokolldateien senden, insbesondere für mysqldump-Neuladungen oder umfangreiche Transaktions-COMMITs. Der sollte eine Größenordnung kleiner sein.

innodb_log_buffer_size=32M

BTW Sie sollten die binäre Protokollierung vor dem erneuten Laden deaktivieren. Andernfalls landen alle Daten in Ihren Binärprotokollen. Bitte führen Sie einen der folgenden Schritte aus:

  1. Machen Sie dies - & gt; SET SQL_LOG_BIN=0; die erste Zeile der mysqldump-Datei.
  2. Führen Sie in der MySQL-Befehlszeile Folgendes aus SET SQL_LOG_BIN=0; dann renne source < mysqldumpfile >
  3. Log-bin von auskommentieren /etc/my.cnf und starte MySQL 5.1 neu, lade die mysqldump-Datei, entkommentiere log-bin und starte MySQL neu.

UPDATE 2011-07-24 20:30

Wenn Sie eine mysqldump-Datei haben /root/MyData.sqlkönnen Sie die Befehle weiterhin wie folgt ausführen

SET SQL_LOG_BIN=0;
source /root/MyData.sql

Dies fällt unter Option 2.

RolandoMySQLDBA
quelle
Bei einigen SQL-Dateien kann es schwierig sein, "SET SQL_LOG_BIN = 0;" Stattdessen: Echo "SET SQL_LOG_BIN = 0;" | gzip & gt; sql_log_bin.sql.gz; Führen Sie dann Folgendes aus: zcat sql_log_bin.sql.gz backup.sql.gz | MySQL
Andy Lee Robinson
Ich möchte nur sicherstellen, dass Sie --opt mit dem Dienstprogramm mysqldump verwenden. Dies ist eine enorme Zeitersparnis beim Nachladen. ohne es erstellt mysqldump die SQL-Datei zeilenweise. --opt bewirkt Folgendes: Fügt Sperren hinzu, löscht und erstellt neu, wobei alle Erstellungsoptionen aktiviert sind, deaktiviert vorübergehend die Schlüssel für ein schnelles Neuladen und schaltet die Schlüssel am Ende wieder ein, um die Indizes nach dem Schreiben neu zu erstellen. Es verkettet mehrere Zeilen in Einfügungen, um die AND-Parsing-Zeit für jede Anweisung (um bis zu 70%) zu reduzieren, und ermöglicht --quick, die Last für die Dumping-DB während der Ausführung zu reduzieren. Reduziert die Ladezeit um 80%
ppostma1
@ ppostma1 --opt ist standardmäßig aktiviert. In der Dokumentation heißt es schon: dev.mysql.com/doc/refman/5.6/en/…
RolandoMySQLDBA
Ich habe 4 verschiedene Linux-Varianten, auf denen Online-Server laufen, und die mysql-Paketmanager einiger Distributionen deaktivieren sie! Es kann zwischen 12 Stunden liegen, um eine WP-Datenbank neu zu laden, und 8 Minuten, wenn sie eingeschaltet ist. Die Erklärung des Managers lautet "Verfügbarkeit inkrementeller Sicherungen". Mein bestes Verständnis ist, wenn der Server routinemäßig gesichert wird, könnte er standardmäßig ausgeschaltet sein. Anschließend muss der Benutzer die Option --opt manuell hinzufügen, um anzugeben, dass es sich nicht um einen inkrementellen Sicherungsversuch handelt.
ppostma1
1
@ ppostma1 Oh, das ist beängstigend !!! Die Dokumentation besagt, dass es standardmäßig aktiviert ist. Ich vermute, dass die Distributionen das nicht haben --opt muss aus dem Quellcode kompiliert und die Option vergessen worden sein. Ich werde dieses Thema auf jeden Fall für zukünftige Begegnungen wie diese in meiner Hosentasche behalten. Danke dir.
RolandoMySQLDBA
0

Ich sah mich einer ähnlichen Situation gegenüber, bei der eine Dump-Restaurierung zu lange dauerte. In meinem Fall konnte ich die Wiederherstellung 3- bis 10-mal beschleunigen, indem ich die Erstellung des MySQL-Index verschoben habe.

Kurz gesagt, der Index wird bei jeder Einfügung neu berechnet. Es ist also besser, den Index für die gesamte Tabelle auf einmal zu berechnen.

Hier ist ein Beispiel, wie MySQL Daten exportiert:

CREATE TABLE `SOME_TABLE` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `SOME_COLUMN` varchar(255) NOT NULL,
  `OTHER_COLUMN` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_SOME_COLUMN` (`SOME_COLUMN`),
  KEY `IDX_OTHER_COLUMN` (`OTHER_COLUMN`)
);

INSERT INTO `SOME_TABLE` (`id`, `SOME_COLUMN`, `OTHER_COLUMN`)
VALUES (...), (...), ... ;

Wenn Sie Millionen von Zeilen in einer Tabelle mit Indizes haben, wird diese wesentlich länger wiederhergestellt, als wenn Indizes nach Einfügungen angewendet würden.

Sie erzielen eine höhere Importgeschwindigkeit, wenn Sie nur Indexerstellungsanweisungen nach Einfügungen verschieben:

CREATE TABLE `SOME_TABLE` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `SOME_COLUMN` varchar(255) NOT NULL,
  `OTHER_COLUMN` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `SOME_TABLE` (`id`, `SOME_COLUMN`, `OTHER_COLUMN`)
VALUES (...), (...), ... ;

ALTER TABLE `SOME_TABLE`
ADD UNIQUE KEY `UK_SOME_COLUMN` (`SOME_COLUMN`),
ADD KEY `IDX_OTHER_COLUMN` (`OTHER_COLUMN`);

Prüfen mein Repository für ein einfaches Python-Skript, das die obige Transformation ausführt.

Denis Kokorin
quelle
3
Dies ist eine Antwort nur auf einen Link, die in einen Kommentar eingeschlossen ist. Auch wenn Ihr Python-Skript für sich allein hilfreich ist, was ist, wenn jemand Python oder ein Skript nicht verwenden möchte? Ist die Antwort dann nur "erst dann Indizes setzen, wenn alle Daten eingegeben wurden?"
JakeGould
Dies ist eine großartige Antwort, die nutzlos wäre (vage und nicht vorschreibend), wenn sie nicht mit einem Link zu einer Referenzimplementierung verbunden wäre.
Alex R
-1

Ihr Problem ist E / A, nicht Speicher. Wenn Sie eine Profilerstellung für die Festplatte durchführen, werden Sie feststellen, dass das Lesen und Schreiben der Festplatte unerträglich ist, insbesondere, wenn sie sich auf derselben Festplatte befindet wie das Backup.

Ich würde die Datei auf ein anderes physisches Laufwerk verschieben und sehen, ob das hilft.


quelle