Wie kann ich eine MySQL-Datenbank mit niedriger Priorität sichern?

15

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.

andyuk
quelle
Haben Sie sich mysqlhotcopy angesehen?
@fsb wie unterstützt mysqlhotcopy was das OP will?
Tomas

Antworten:

8

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.

David Pashley
quelle
Leider scheint diese Option die meiste Arbeit zu sein, aber ich denke, sie ist die einzige echte Option, wenn ich nur minimale Auswirkungen auf den Hauptserver haben möchte.
Andyuk
2
Dies ist fast die einzige Möglichkeit, ein ordnungsgemäß stillgelegtes Backup zu erstellen, wenn Sie den Betrieb nicht beeinträchtigen möchten. Wenn Sie langsamer werden, mysqldumpwird entweder eine lange Sperre aufrechterhalten, oder die Tabellen sind nicht mehr synchron.
Dan Carley
15

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:

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql

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.

Brandon
quelle
Gerade getestet und ich arbeite wie ein Zauber! Danke, dass du Brandon teilst!
sucotronic
4

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.

alex.pilon
quelle
1

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.

pQd
quelle
0

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.

Kevin K
quelle
0

cron.d / mysql_dump:

17 22 * * * backup touch /home/backup/all_databases.sql && chmod 600 /home/backup \ 
/all_databases.sql && ionice -n 7 /usr/bin/mysqldump -u root -ppassword --opt --all- \
databases > /home/backup/all_databases.sql && nice -n 20 bzip2 -f \
/home/backupall_databases.sql

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.

Artifex
quelle
0

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.

rodjek
quelle
0

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.

Peter
quelle
Das stimmt nicht: Wenn es sich bei den Tabellen um InnoDB handelt, werden sie nicht zum Lesen gesperrt.
dr01