Führen Sie MySQLDump aus, ohne Tabellen zu sperren

437

Ich möchte eine Live-Produktionsdatenbank in meine lokale Entwicklungsdatenbank kopieren. Gibt es eine Möglichkeit, dies zu tun, ohne die Produktionsdatenbank zu sperren?

Ich benutze derzeit:

mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1

Aber es sperrt jede Tabelle, während sie läuft.

Greg
quelle
Eine weitere späte Lösung: Sie können auch Percona XtraBackup verwenden, um Ihre Produktionsdatenbank ohne Unterbrechung der Transaktionsverarbeitung zu sichern. Es ermöglicht ein Hot-Backup, dh es wirkt sich nicht auf aktuelle Aktivitäten aus. Siehe hier: percona.com/software/mysql-database/percona-xtrabackup (Ich bin in keiner Weise mit Percona verbunden.)
delx

Antworten:

625

Funktioniert die --lock-tables=falseOption?

Laut Manpage können Sie beim Dumping von InnoDB-Tabellen die folgende --single-transactionOption verwenden:

--lock-tables, -l

Lock all tables before dumping them. The tables are locked with READ
LOCAL to allow concurrent inserts in the case of MyISAM tables. For
transactional tables such as InnoDB and BDB, --single-transaction is
a much better option, because it does not need to lock the tables at
all.

Für innodb DB :

mysqldump --single-transaction=TRUE -u username -p DB
John Millikin
quelle
23
für innodb DB mysqldump --single-transaction = TRUE -u Benutzername -p DB
AMB
19
Was ist, wenn Sie Innodb und Myisam haben?
CMCDragonkai
Ist dies standardmäßig aktiviert?
CMCDragonkai
offensichtlich eingeschaltet (dh gesperrt)?
evandrix
290

Dies ist Alter zu spät, aber gut für alle, die das Thema suchen. Wenn Sie nicht innoDB sind und sich keine Sorgen über das Sperren während des Dumps machen, verwenden Sie einfach die folgende Option:

--lock-tables=false
Warren Krewenki
quelle
1
Vielen Dank für die Antwort Warren, das war sehr hilfreich und hat wie ein Zauber funktioniert.
Gavin
7
Mit '--lock-table = false --quick' werden die geringsten Serverressourcen verwendet
SyntaxGoonoo
43
Aber Sie sollten sich Sorgen machen, Tische zu sperren. Wenn mehrere Tabellen geschrieben werden, während mysqldump ausgeführt wird (und Sie Fremdschlüssel verwenden), ist Ihr Speicherauszug möglicherweise inkonsistent. Sie werden es erst wissen, wenn Sie es wiederherstellen und JOIN-Abfragen für die inkonsistenten Daten ausführen. Es kann eine Weile dauern, bis die inkonsistenten Daten erkannt werden, da die JOINs von Ihrer Anwendung und nicht von MySQL (mit MyISAM-Tabellen) verwendet werden. Die Wiederherstellung funktioniert einwandfrei, MySQL wird Sie nicht vor Inkonsistenzen warnen. Also: MyIsam -> sperren Sie immer Ihre Tabellen. InnoDB -> verwenden --single-transaction.
Costa
12
@Costa Ich denke nicht, dass das Sperren von Tabellen für MyISAM-Tabellen ausreicht. Wenn mysqldump die Tabellen zwischen Abfragen sperrt, die von der Anwendung ausgeführt werden, treten dieselben Inkonsistenzen auf. Die Antwort ist noch einfacher: MyISAM -> Verwenden Sie stattdessen InnoDB.
CDhowie
@Costa Sie sollten sich auf jeden Fall Sorgen um das Sperren von Tabellen machen, aber nur, wenn Sie einen konsistenten Speicherauszug benötigen . Es gibt einige seltene Fälle, in denen Sie dies nicht tun. Zum Beispiel ein grobes Problem beim datenbankweiten Dump (Debugging): Ich wette, man möchte nicht, dass Benutzer ~ 20 Minuten warten, um einen Dump der Produktionsdatenbank zu erstellen (wahre Geschichte).Wenn es darum geht, nicht nur so schnell wie möglich, sondern auch konsistent einen Speicherauszug zu erhalten , sollte ein replizierter Slave ausgegeben werden oder Snapshots auf niedrigerer Ebene (lvm, zfs, btrfs usw.) verwendet werden FLUSH TABLES WITH READ LOCK.
Alex Offshore
44

Die Antwort hängt davon ab, welche Speicher-Engine Sie verwenden. Das ideale Szenario ist, wenn Sie InnoDB verwenden. In diesem Fall können Sie das --single-transactionFlag verwenden, mit dem Sie einen kohärenten Snapshot der Datenbank zum Zeitpunkt des Beginns des Speicherauszugs erhalten.

dvorak
quelle
35

--skip-add-locks hat mir geholfen

Azamat Tokhtaev
quelle
2
oder auch --compact, um überspringende Sperren mit anderen Optimierungen einzuschließen.
ppostma1
77
Dadurch werden die Anweisungen LOCK TABLES und UNLOCK TABLES aus der Dump-Datei entfernt. Die Sperre während des Exports wird nicht beeinflusst.
dabest1
11
Nein, es ist nicht das, wonach Sie suchen! Siehe den Kommentar von dabest1. Dies tut NICHTS, um zu verhindern, dass Ihre Tabellen beim Ausführen eines mysqldump gesperrt werden. Dies ist KEINE Antwort auf die Frage.
oder
@dabest und @orrd sind korrekt: --skip-add-lockswürde nur die Dump-Wiederherstellung schneller machen. Dies ist keine richtige Antwort.
dr_
10

Ehrlich gesagt würde ich die Replikation dafür einrichten. Wenn Sie keine Tabellen sperren, erhalten Sie inkonsistente Daten aus dem Speicherauszug.

Wenn der Speicherauszug länger dauert, haben sich möglicherweise bereits gespeicherte Tabellen zusammen mit einer Tabelle geändert, die gerade ausgegeben werden soll.

Sperren Sie also entweder die Tabellen oder verwenden Sie die Replikation.

Mike
quelle
Diese ganze Datenbank ist fast vollständig schreibgeschützt, daher mache ich mir keine Sorgen, dass sie sich ändert.
Greg
2
Dieser Kommentar ist falsch. MVCC ermöglicht das Lesen eines konsistenten Status ohne Sperren für InnoDB.
Scott Hyndman
5
Wenn Sie die Replikation noch nicht eingerichtet haben, müssen Sie einen Dump ausführen, um sie einzurichten. Das gleiche Problem besteht.
Matt Connolly
3
Wenn Sie die Replikation noch nicht eingerichtet haben, müssen Sie die Tabellen sperren, um den Speicherauszug durchzuführen und die Datenintegrität sicherzustellen. Es ist also ein Haken 22.
JordanC
9

Dies ist ungefähr so ​​spät im Vergleich zu dem Typ, der sagte, er sei zu spät wie bei der ursprünglichen Antwort, aber in meinem Fall (MySQL über WAMP unter Windows 7) musste ich Folgendes verwenden:

--skip-lock-tables
dtbarne
quelle
Dies hat bei mir funktioniert, um information_schema zu sichern, ohne dass der Fehler "Zugriff für Benutzer 'debian-sys-wart' @ 'localhost' auf die Datenbank 'information_schema' verweigert, wenn LOCK TABLES verwendet wird"
Rui F Ribeiro
6
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db
naveen_sfx
quelle
Bei der Abstimmung hat dieser für mich funktioniert. Fügen Sie einfach die Parameter hinzu --skip-opt --single-transaction --max_allowed_packet = 1G
Steven Lizarazo
1
Ich empfehle "--skip-opt" für diesen Zweck nicht. Das ist viel mehr als die ursprüngliche Frage. Es schaltet den Schnellmodus aus, es enthält nicht den Zeichensatz usw. usw.
oder den
3

Wenn Sie MySQL Workbench verwenden, klicken Sie beim Datenexport auf Erweiterte Optionen und deaktivieren Sie die Optionen für "Sperrtabellen".

Geben Sie hier die Bildbeschreibung ein

Samuel Diogo
quelle
1

Da keiner dieser Ansätze für mich funktioniert hat, habe ich einfach Folgendes gemacht:

mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]

Es werden sowohl Befehle LOCK TABLE <x>als auch UNLOCK TABLESBefehle ausgeschlossen.

Hinweis: Hoffentlich enthalten Ihre Daten diese Zeichenfolge nicht!

Augustomen
quelle
2
- Skip-Add-Locks während des Dumps macht das auch
Codewandler
0

Noch eine späte Antwort:

Wenn Sie versuchen, eine Hot-Kopie der Serverdatenbank (in einer Linux-Umgebung) zu erstellen und das Datenbankmodul aller Tabellen MyISAM ist, sollten Sie verwenden mysqlhotcopy.

Entsprechend Dokumentation:

Es verwendet FLUSH TABLES, LOCK TABLES und cp oder scp, um eine Datenbanksicherung durchzuführen. Es ist eine schnelle Möglichkeit, eine Sicherungskopie der Datenbank oder einzelner Tabellen zu erstellen. Sie kann jedoch nur auf demselben Computer ausgeführt werden, auf dem sich die Datenbankverzeichnisse befinden. mysqlhotcopy funktioniert nur zum Sichern von MyISAM- und ARCHIVE-Tabellen.

Die LOCK TABLESZeit hängt von der Zeit ab, zu der der Server MySQL-Dateien kopieren kann (es wird kein Speicherauszug erstellt).

Andrés Morales
quelle
0

Heute hatte ich sogar das gleiche Problem, aber ich hatte keinen Zugriff auf die Befehlszeile. Also öffnete ich die SQL-Datei im Editor und entfernte sie unter der Zeile aus den Tabellen

LOCK TABLES `yourtable name` WRITE;

dann habe ich in meine Entwicklungsumgebung importiert. hoffe es hilft jemandem

iCoder
quelle