Ich möchte eine Datenbank sichern, aber während des Tages, wenn der Server ausgelastet ist. Es ist wichtig, dass sich die Sicherung nicht auf Apache und andere Datenbanken auswirkt, die auf demselben Server ausgeführt werden.
Es sollte möglich sein, den Befehl mysqldump zu verwenden , aber den Befehl mit niedriger Priorität auszuführen.
Wie kann ich das machen?
Update: Es sieht so aus, als würde die einfache Verwendung von nice mit mysqldump nicht funktionieren, da mysqldump einen neuen Prozess erzeugt.
Antworten:
Wenn Sie einen Ersatzserver haben, der die Schreiblast Ihres Servers bewältigen kann, können Sie die Replikation auf diesen Server einrichten und dann eine Sicherung vom Slave-Server durchführen. Dies hat auch den Vorteil, dass Sie die Replikation stoppen können, während Sie die Sicherung durchführen, und eine konsistente Momentaufnahme Ihrer Daten über alle Datenbanken oder alle Tabellen in einer Datenbank hinweg erhalten, ohne den Datenbankserver zu beeinträchtigen. Dies ist das Setup, das ich immer zum Sichern von MySQL empfehle, wenn Sie über die Ressourcen verfügen.
Als netter Bonus haben Sie jetzt einen Nur-Lese-Slave, den Sie für langsame Abfragen mit langer Laufzeit verwenden können.
quelle
mysqldump
wird entweder eine lange Sperre aufrechterhalten, oder die Tabellen sind nicht mehr synchron.Andy, ich vermute, du hattest genug Zeit, um eine Lösung zu finden. Ich habe kürzlich eine Lösung für dieses Problem gefunden , die für mich bei tsheets hervorragend funktioniert , und dachte, ich würde sie teilen.
cstream ist ein universelles Stream-Handling-Tool wie UNIX dd, das normalerweise in Kommandozeilen-Pipes verwendet wird. Das, was cstream für uns nützlich macht, ist, dass Sie die maximale Bandbreite für alle Eingaben angeben können. Dies bedeutet, dass Sie die Festplatten-E / A Ihres mysqldump-Befehls mit einem einfachen Befehl wie dem folgenden begrenzen können:
Angenommen, Sie sichern eine Datenbank, die alle InnoDB-Tabellen verwendet, der obige Befehl ist sicher (hat keine Auswirkungen auf andere Abfragen) und führt Ihren mysqldump durch, während die Festplattenlesevorgänge auf nur ein Megabyte pro Sekunde begrenzt werden. Passen Sie die Bandbreite mit dem Parameter -t an den Wert an, mit dem Ihre Umgebung die Sicherung durchführen kann, ohne die Benutzerfreundlichkeit Ihres Kunden zu beeinträchtigen.
quelle
FWIW solltest du das auch mit pv können ( http://linux.die.net/man/1/pv )
mysqldump --single-transaction --quick -u -p | pv --rate-limit 1m> destination (oder | nc oder | tar cfj backup.bz2 -)
Das Schöne daran sind die verschiedenen Optionen zum Überwachen des Fortschritts und die Option -R, mit der Sie Optionen an einen bereits laufenden Prozess übergeben können, z. --rate-limit um die Übertragungsrate zu ändern.
quelle
Wenn Sie innodb verwenden, können Sie xtrabackup mit der Option --throttle versuchen .
Sie können sich auch ionice ansehen und mysqldump damit ausführen.
oder vielleicht möchten Sie die binäre Protokollierung in mysql aktivieren und einmal pro Woche / Nacht einen vollständigen Speicherauszug ausführen, während Sie die binären Protokolle alle 1-2 Stunden an einen sicheren Ort kopieren. und .. Nur-Lese-Slave für Nur-Backup-Zwecke ist ebenfalls eine Option.
quelle
Wenn Sie es unter Linux oder einer anderen * nix-Variante ausführen, können Sie dies folgendermaßen tun:
nice -n ## mysqldump
Dies gibt ihm eine niedrigere Planungspriorität. Der Bereich der Planungspriorität reicht von -20 (höchste Priorität) bis 19 (niedrigste Priorität). Der Standardwert für nice ist 10, wenn das Argument -n weggelassen wird.
quelle
cron.d / mysql_dump:
ionice für E / A-Priorität und nett für CPU-Priorität.
Führen Sie vmstat 5 aus und überprüfen Sie die Spalte mit der Aufschrift WA. Ein hoher Wert bedeutet, dass die CPU auf E / A wartet. Verwenden Sie ionice, wenn es nur CPU-Last ist, verwenden Sie nice.
Antwort zum Update:
Scheint, als hättest du recht. Es ruft mysql auf, was nicht vernünftig ist. Ich denke, Sie könnten renice dafür verwenden und den netten Wert einstellen, nachdem er ausgeführt wurde.
Ich habe keine ausreichend große Datenbank, um atm auszugeben und ein nützliches Skript für Sie zu erstellen.
Replikation ist, wie Ihr Link andeutet, eine Möglichkeit. Replizieren, stoppen und auf einem anderen Host sichern.
quelle
Platzieren Sie Ihre MySQL-Daten auf einem LV und verwenden Sie einen vernünftigen mylvmbackup- Job, der einen Schnappschuss des LV erstellt und die MySQL- Datendateien tariert . Auf diese Weise sperren Sie die Tabellen nicht und minimieren die Auswirkungen auf Ihre Anwendungen nur auf die E / A-Last.
quelle
Sie können jederzeit versuchen, es während der Stoßzeiten nicht auszuführen. Unabhängig von der Priorität, die Sie verwenden, ist für den Speicherauszug weiterhin eine Sperre für alle Ihre Tabellen erforderlich.
quelle