Alle Daten sind InnoDB
So erhalten Sie eine genaue Momentaufnahme der Daten:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
Erzeugt einen Checkpoint, der es dem Dump ermöglicht, alle Daten vor dem Checkpoint zu erfassen, während eingehende Änderungen empfangen werden. Diese eingehenden Änderungen werden nicht Teil des Dumps. Dies stellt für alle Tabellen den gleichen Zeitpunkt sicher.
--routines
Sichert alle gespeicherten Prozeduren und gespeicherten Funktionen
--triggers
Sichert alle Trigger für jede Tabelle, in der sie enthalten sind
Alle Daten sind MyISAM oder ein Mix aus InnoDB / MyISAM
Sie müssen eine globale Lesesperre festlegen, den mysqldump ausführen und die globale Sperre aufheben
mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
sleep 5
mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt
SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'`
echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
mysql -uuser -ppass -A < /tmp/kill_sleep.sql
Versuche es !!!
UPDATE 2012-06-22 08:12 EDT
Da Sie <50 MB Gesamtdaten haben, habe ich eine andere Option. Anstatt einen SLEEP-Befehl im Hintergrund zu starten, um die globale Lesesperre für 86400 Sekunden (diese 24 Stunden) zu halten, nur um die Prozess-ID abzurufen und außerhalb zu beenden, sollten Sie in mysql statt im Betriebssystem eine Zeitüberschreitung von 5 Sekunden festlegen:
SLEEP_TIMEOUT=5
SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})"
mysql -uuser -ppass -Ae"${SQLSTMT}" &
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
Dies ist ein sauberer und einfacherer Ansatz für sehr kleine Datenbanken.
ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
eine Fehlermeldung erwartet?--single-transaction
Option verwenden, wie in einer anderen Antwort erwähnt.--lock-tables
.Hier finden Sie die offizielle Dokumentation
quelle
Wenn Sie dies für MyISAM oder gemischte Tabellen ohne Ausfallzeit durch Sperren der Tabellen tun möchten, können Sie eine Slave-Datenbank einrichten und Ihre Snapshots von dort erstellen. Das Einrichten der Slave-Datenbank verursacht leider einige Ausfallzeiten, um die Live-Datenbank zu exportieren. Sobald sie ausgeführt wird, sollten Sie in der Lage sein, ihre Tabellen zu sperren und mit den von anderen beschriebenen Methoden zu exportieren. Wenn dies geschieht, bleibt es hinter dem Master zurück, hindert den Master jedoch nicht daran, seine Tabellen zu aktualisieren, und holt auf, sobald die Sicherung abgeschlossen ist.
quelle
So habe ich es gemacht. Es sollte in allen Fällen funktionieren, da es verwendet
FLUSH TABLES WITH READ LOCK
.Der Shell-
sleep
Befehl soll nur sicherstellen, dass die Hintergrund-Task, die den mysql-Sperrbefehl ausführt, ausgeführt wird, bevor mysqldump gestartet wird. Sie könnten es auf 1 Sekunde reduzieren und es sollte immer noch in Ordnung sein. Erhöhen Sie den Wert auf 30 Sekunden und versuchen Sie, in den 30 Sekunden, in denen Sie sehen, dass die Tabelle gesperrt ist, Werte aus einem anderen Client in eine Tabelle einzufügen.Es gibt zwei Vorteile, wenn Sie diese manuelle Hintergrundsperre verwenden, anstatt die
mysqldump
Optionen--single-transaction
und--lock-tables
:mysqldump
während derselben Sperrzeit auch andere Befehle ausführen . Dies ist beispielsweise nützlich, wenn Sie die Replikation auf einem Masterknoten einrichten, da Sie die Position des Binärprotokolls mitSHOW MASTER STATUS;
dem genauen Status des von Ihnen erstellten Speicherauszugs (vor dem Entsperren der Datenbank) abrufen müssen, um einen Replikationsslave erstellen zu können.quelle
Die offizielle Dokumentation zu mysql schlägt vor, dass Sie über eine Master "M1" -Datenbank und eine Slave "S1" -Datenbank verfügen, die in "Szenario 2: Sicherung mit einem Nur-Lese-Slave" beschrieben sind. Sichern eines Masters oder Slaves durch Erstellen eines Slaves Schreibgeschützt
Sie sollten die Slave-Datenbank schreibgeschützt einstellen und das ausführen
quelle
Wenn Sie eine sehr große MYISAM-Tabelle haben und die Tabelle ohne Sperre sichern und eine hohe Serverauslastung vermeiden müssen, können Sie das folgende Skript verwenden.
quelle