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
Hier sind einige Gedanken, die ich zur Verbesserung der mysqldump-Leistung unter Ihren Umständen habe. Hier ist dein Befehl:
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.
quelle
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:
Übrigens ist eine Seite 16K, wie aus dieser hervorgeht:
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:
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:
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:
UMSTAND 2: Setzen Sie ihn ungefähr 1 Stunde vor mysqldump auf 0
Führen Sie den mysqldump aus
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.
quelle