Benutzer beschweren sich, dass das System langsam läuft, wenn mysqldump ausgeführt wird

9

Die MYSQL-Datenbank (ibdata1) hat eine Größe von 73 GB und ist für die Ausführung als dedizierter Datenbankserver unter Windows 2008 O / S für INNODB-Tabellen konfiguriert. Wir führen die Sicherung mit mysqldump aus. Mysqldump --skip-opt --quick --single-transaction --create-options --extended-insert --disable-keys --add-drop-table --complete-insert - set-charset - compress --log-error = Proddb0635.err -u root -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

Die Sicherungsdatei Proddb0635.sql wird auf einem vom Datenbankserver getrennten Server gespeichert. RAM ist 12 GB. Die Größe des INNODB-Pufferpools beträgt 6 GB. Zusätzlicher mem.pool ist 32 MB. Die Größe des Abfragecaches beträgt 2 GB. Die Nettopufferlänge beträgt maximal 16 M. Paketgröße 1 GB.

MySQL-Version ist 5.0.67.

Wenn das Backup nicht ausgeführt wird, sind die Benutzer mit der Leistung zufrieden.

Wenn die Sicherung ausgeführt wird, ist die Trefferquote des INNODB-Pufferpools nahe 100% hoch. Es gibt keine ausstehenden Lese- oder Schreibvorgänge. innodb wait free is 0. Die CPU-Auslastung ist nicht hoch. min 9% bis max. 15% Die Trefferquote des Abfrage-Cache ist niedrig, etwa 40% mit oder ohne laufendem mysqlbackup. Derzeit zeigt der Windows Task-Manager an, dass 10 GB RAM verwendet werden. Sollte ich den Abfrage-Cache mit nur 2 GB verfügbarem RAM erweitern? mysqlld-nt benötigt 9,2 GB RAM und mysqldump benötigt 5 MB RAM. Außerdem wurde festgestellt, dass die Größe der Speicherauszugsdatei bei Vorhandensein oder Nichtvorhandensein der Option --compress gleich ist.

Soll ich die Größe des iNNODB-Pufferpools verringern?

Vielen Dank

Dbachacha
quelle

Antworten:

8

In Windows ist ein Problem bekannt: Wenn Sie eine große Datei auf einen anderen Server übertragen, wird der gesamte Speicher anstelle der Benutzerprozesse dem Systemcache zugewiesen. Sie können im Abschnitt Physischer Speicher (MB) des Task-Managers nachsehen, wie viel Speicher dem Systemcache zugewiesen ist.

Dies kann gelöst werden, indem auf einer lokalen Festplatte gesichert wird und der Remotecomputer diese Datei abruft.

mrdenny
quelle
Vielen Dank, Herr. Wir haben unsere Festplatten in SAN gespeichert. Macht das auch einen Unterschied?
Dbachacha
1
Es ist ein Problem, egal wie der Speicher dargestellt wird. Da es sich bei dem Speicher um einen SAN-Speicher handelt, müssen die Dateien nicht über das Netzwerk auf einen anderen Computer kopiert werden. Präsentieren Sie dem MySQL Server eine neue LUN und sichern Sie sie auf diesem Computer. Wenn Sie die Dateien für die Bandsicherung auf einen anderen Computer übertragen müssen, verwenden Sie das SAN. Snap die LUN, präsentieren Sie den Snapshot auf dem Backup-Server, sichern Sie die Dateien und löschen Sie den Snapshot. Wiederholen Sie am nächsten Tag. Dies kann wahrscheinlich alles per Skript erfolgen.
Mrdenny
Ihr erster Vorschlag: Die # haben sich im Systemcache nicht geändert. In Bezug auf LUN werde ich es meinen Kollegen vermitteln, die im System & Network Team arbeiten.
Dbachacha
Ich habe das Sicherungsskript verschoben, um es auf einem anderen Server auszuführen, und es gibt erhebliche Verbesserungen. Außerdem haben wir festgestellt, dass der Anwendungscode keine einzelne Verbindung wiederverwendet, sondern in mehreren Funktionen geöffnet / geschlossen wird, die in einer Anforderung an den Datenbankserver zusammengefasst sind. Außerdem habe ich festgestellt, dass eine NIC-Karte von Sicherungsdaten und den Online-Transaktionsdaten gemeinsam genutzt wird. Wir planen daher eine dedizierte Netzwerkkarte nur zur Sicherung. Vielen Dank.
Dbachacha
7

Hier sind einige Gedanken, die ich zur Verbesserung der mysqldump-Leistung unter Ihren Umständen habe. Hier ist dein Befehl:

mysqldump --skip-opt --quick --single-transaction --create-options --extended-insert --disable-keys --add-drop-table --complete-insert --set-charset --compress - -log-error = Proddb0635.err -u root -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

Das erste, was mir auffällt, ist, dass Sie die Ausgabe in ein Dateisystem umleiten. Es heißt 'devNas', also gehe ich davon aus, dass dies Network Attached Storage ist . Ich bin ein Fan von NAS für Backups, aber es muss auf einer vom Produktionsverkehr getrennten physischen Netzwerkkarte verbunden sein . Sie können die Bandbreite nicht sättigen, aber sie konkurrieren immer noch. Dies wird aufgrund des Flags --quick eher ein Problem sein, da es jede Zeile löscht, anstatt sie im Speicher zu halten.

Das nächste, was ich sehe, ist, dass Sie --compress aufgerufen haben. Es sieht so aus, als würden Sie MySQL lokal ausführen, da Sie den Schalter -h nicht verwendet haben. Dies kann eine lokale CPU verwenden, die in diesem Zusammenhang nicht erforderlich ist. Ist --compress notwendig? Es werden nur Daten zwischen dem mysqldump-Client und dem mysql-Server komprimiert, nicht der Dateiinhalt.

Als nächstes sehe ich, dass Sie das Flag --single-transaction verwenden. Dies wird zusätzliche CPU verursachen, da es bei jeder Auswahl als Teil des mysqldump getestet wird.

Dies hat nichts mit der Leistung zu tun, aber Sie verwenden --disable-keys, die nur unter MyISAM ( manuell ) funktionieren .

Möglicherweise möchten Sie mit der Remote-Ausführung von mysqldump von einem Offline-Host aus experimentieren und die Dump-Datei nach Abschluss auf den NAS verschieben, um so viel wie möglich von diesem Vorgang zu trennen.

randomx
quelle
Ja, ich habe mich beim Netzwerk- und Systemadministrator erkundigt. Es handelt sich um Network Attached Storage. Ich kann versuchen, mysqldump auf einen anderen Server zu verschieben. Außerdem machte es mir jetzt Sinn, --compress zu verwenden. Das Handbuch besagt, dass --compress mit Client und Server funktioniert, aber ich habe es so formuliert, um zu sehen, ob es einen Unterschied macht. Welche Art von Daten fließt zwischen dem Client, auf dem mysqldump ausgeführt wird, und dem mysql-Datenbankserver? Die Daten fließen zwischen dem MySQL-Datenbankserver und devNas. In der MySQl-Dokumentation und im Buch Database Design and Tuning wird die Verwendung einer einzelnen Transaktion für INNODB-Tabellen bevorzugt.
Dbachacha
Ich habe das Sicherungsskript verschoben, um es auf einem anderen Server auszuführen, und es gibt erhebliche Verbesserungen. Außerdem haben wir festgestellt, dass der Anwendungscode keine einzelne Verbindung wiederverwendet, sondern in mehreren Funktionen geöffnet / geschlossen wird, die in einer Anforderung an den Datenbankserver zusammengefasst sind. Außerdem habe ich festgestellt, dass eine NIC-Karte von Sicherungsdaten und den Online-Transaktionsdaten gemeinsam genutzt wird. Wir planen daher eine dedizierte Netzwerkkarte nur zur Sicherung. Vielen Dank.
Dbachacha
Ich bin froh, dass das hilft. Schöne Grüße.
randomx
Hier brauche ich Hilfe, um das folgende Szenario zu verstehen: Die MySQL-Datenbank befindet sich auf Server A. MySQLldump wird auf Server B ausgeführt, der Daten auf Server C speichert. Wir haben eine dedizierte Netzwerkkarte von Server A zu Server C. Ist dies korrekt? Ich war mir nicht sicher, ob der mysqldump gestern Abend auf Server A ausgeführt wurde. Ich möchte ihn auf einem anderen Server ausführen, um CPU-Konflikte zu reduzieren.
Dbachacha
mysqldump ist ein 'Client-Dienstprogramm', dh Sie können es von jedem Host ausführen, der über Berechtigungen zum Zugriff auf die Tabellen in der Datenbank verfügt. Die Strategie für Sie wäre, mysqldump über die Shell von Server C auszuführen, die auf die Tabellen von Server A abzielt. Natürlich müssen Sie Server C Zugriff auf das Schema gewähren, das Sie sichern möchten.
randomx
2

BEOBACHTUNG # 1

Folgendes sollten Sie beachten, wenn Sie einen mysqldump gegen InnoDB ausführen.

Alle im InnoDB-Pufferpool vorhandenen schmutzigen Seiten müssen zuerst auf die Festplatte geleert werden. Ein mysqldump löst das Leeren einer InnoDB-Tabelle aus, die noch schmutzige Seiten enthält.

Es gibt eine Serveroption namens innodb_max_dirty_pages_pct . Der Standardwert ist 75 ist MySQL 5.5 und 90 in Versionen von MySQL vor 5.5. In einer Produktionsumgebung ist es in Ordnung, diese Nummer auf dem Standardwert zu belassen.

Führen Sie Folgendes aus, um festzustellen, ob sich im InnoDB-Pufferpool viele schmutzige Seiten befinden:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';

Übrigens ist eine Seite 16K, wie aus dieser hervorgeht:

SHOW GLOBAL STATUS LIKE 'Innodb_page_size';

Wenn es um InnoDB und mysqldump geht, können Sie diese Zahl unter zwei Umständen senken.

UMSTAND 1: Setzen Sie ihn dauerhaft auf 0

Fügen Sie dies einfach zu my.ini hinzu:

[mysqld]
innodb_max_dirty_pages_pct=0

Dadurch bleibt der InnoDB-Pufferpool schlank und gemein. Der Schritt zum Leeren der zu sichernden InnoDB-Tabelle ist schnell, da möglicherweise einige schmutzige Seiten (möglicherweise 0) geleert werden müssen, bevor der mysqldump darauf ausgeführt wird.

Der einzige Nachteil besteht darin, dass bei einem MySQL-Speicherauszug aus einer stark frequentierten Datenbank die Schreib-E / A möglicherweise weniger stark zunehmen, da schmutzige Seiten häufiger gelöscht werden. Sie können feststellen, ob dies der Fall ist, ohne mysql neu zu starten, indem Sie Folgendes ausführen:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Lassen Sie die Einstellung für 12-24 Stunden. Wenn die Schreibleistung akzeptabel ist, können Sie loslegen. Wenn nicht, setzen Sie es zurück mit:

SET GLOBAL innodb_max_dirty_pages_pct = 90;

UMSTAND 2: Setzen Sie ihn ungefähr 1 Stunde vor mysqldump auf 0

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Führen Sie den mysqldump aus

SET GLOBAL innodb_max_dirty_pages_pct = 90;

BEOBACHTUNG # 2

Sie haben --complete-insert als mysqldump-Option. Dadurch werden vor der VALUES-Klausel Spaltennamen in jedes INSERT-Statament eingebettet. Selbst mit --extended-insert werden bei jedem Stapel eingefügter Zeilen die Spaltennamen in den mysqldump gesendet. Sie können die Anzahl der an mysqldump gesendeten Bytes reduzieren, indem Sie --complete-insert entfernen.

EMPFEHLUNG

Wenn Sie einen anderen Windows Server haben, der als Slave eingerichtet werden kann, führen Sie die mysqldumps von diesem Slave aus und nicht von der Produktionsmaschine aus.

RolandoMySQLDBA
quelle
Danke. Ich habe vergessen zu erwähnen, dass Benutzer sich beschweren, dass "Speichern" Zeit braucht, anstatt zu lesen. Ich werde Ihre Beobachtung Nr. 2 sofort umsetzen. Ich mag definitiv Ihre Empfehlung, einen Sklaven zu haben und dann mysqldump vom Sklaven zu nehmen.
Dbachacha
innodb_buffer_pool_dirty_pages war kurz vor dem Start der Sicherung nicht zu hoch. Es ist ungefähr 9 bis max. 196. Master-Slave ist auch eine gute Empfehlung.
Dbachacha
1
Ich habe das Sicherungsskript verschoben, um es auf einem anderen Server auszuführen, und es gibt erhebliche Verbesserungen. Außerdem haben wir festgestellt, dass der Anwendungscode keine einzelne Verbindung wiederverwendet, sondern in mehreren Funktionen geöffnet / geschlossen wird, die in einer Anforderung an den Datenbankserver zusammengefasst sind. Außerdem habe ich festgestellt, dass eine NIC-Karte von Sicherungsdaten und den Online-Transaktionsdaten gemeinsam genutzt wird. Wir planen daher eine dedizierte Netzwerkkarte nur zur Sicherung. Vielen Dank. Wenn nichts davon funktioniert, ist der Master-Slave sicher auch gut.
Dbachacha