Ich führe jede Nacht Backups auf meinem Server mit mysqldump durch. Leider ist meine Site dadurch jede Nacht für ungefähr eine halbe Stunde lahmgelegt, da die Tabellen während des Backups gesperrt werden.
Laut der Prozessliste scheint es sogar so, als würden Abfragen an nicht verwandte Tabellen manchmal blockiert. Beispielsweise bleibt „INSERT INTO A“ mehrere Minuten lang gesperrt, während die einzige laufende Abfrage nur Tabelle B betrifft.
Gibt es eine bessere Möglichkeit, solche Backups durchzuführen?
Antwort1
Sie haben zwei Möglichkeiten:
A. Verwenden Sie --skip-lock-tables
die Option mysqldump. Ihre Tabellen werden nicht gesperrt, aber Ihr Backup ist möglicherweise nicht konsistent (hängt von Ihrem Schema ab: wenn Ihre Datenbanktransaktionen mehrere Tabellen gleichzeitig betreffen und eine Tabelle bereits gesichert ist und die andere nicht. Beispiel: zwei Tabellen: Kunden und Bestellungen. Wenn zuerst Kunden gesichert werden und dann ein neues Kunden-/Bestellpaar eingefügt wird, könnte Ihr Backup am Ende Bestellungen ohne Kunden enthalten).
Dieses Problem ist der Hauptgrund, warum mysqldump standardmäßig alle Tabellen sperrt. Wenn dieses Problem bei Ihnen nicht auftritt, ist das Überspringen der Tabellensperre in mysql die einfachste Lösung.
B. Verwenden Sie eine andere Sicherungsmethode. Beispiel: Tabellen mit Lesesperre leeren, LVM-Snapshot erstellen, Tabellen entsperren, LVM-Snapshot mounten und Daten sichern. Das wird schnell viel komplexer als ein einfacher mysqldump. Googlen Sie „mysql-Backups mit LVM-Snapshots“, es sind viele Skripte und Tutorials verfügbar.
Wenn sich Ihre MySQL-Daten nicht auf einem LVM-Volume befinden, können Sie einen MySQL-Slave-Server erstellen und ihn sichern, ohne den Master zu berühren. So erfolgt die Sperrung auf dem Slave und der Master ist immer frei.