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 verwende derzeit:
mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1
Aber es sperrt jeden Tisch, während er läuft.
Funktioniert die --lock-tables=false
-Option?
Wenn Sie InnoDB-Tabellen sichern, können Sie gemäß der man-Seite die Option --single-transaction
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
Dies ist zu spät, aber gut für alle, die das Thema durchsuchen. Wenn Sie nicht innoDB sind und sich nicht um das Sperren während des Abzugs kümmern, verwenden Sie einfach die Option:
--lock-tables=false
Die Antwort hängt von der verwendeten Speicher-Engine ab. Das ideale Szenario ist, wenn Sie InnoDB verwenden. In diesem Fall können Sie das Flag --single-transaction
verwenden, mit dem Sie zu Beginn des Speicherauszugs eine zusammenhängende Momentaufnahme der Datenbank erhalten.
--skip-add-locks
hat für mich geholfen
Um große Tabellen zu sichern, sollten Sie die Option --single-transaction mit --quick kombinieren.
http://dev.mysql.com/doc/refman/5.1/de/mysqldump.html#option_mysqldump_single-transaction
Um ehrlich zu sein, 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 einigen Tabellen geändert, die nur kurz vor dem Speicherauszug stehen.
Sperren Sie also entweder die Tabellen oder verwenden Sie die Replikation.
Für InnoDB-Tabellen verwenden Sie --single-transaction
msgstr "Es speichert den konsistenten Zustand der Datenbank zu dem Zeitpunkt, zu dem BEGIN ausgegeben wurde, ohne Anwendungen zu blockieren" MySQL DOCS
http://dev.mysql.com/doc/refman/5.1/de/mysqldump.html#option_mysqldump_single-transaction
Dies ist ungefähr so spät im Vergleich zu dem Typ, der sagte, er sei zu spät gekommen, als er zur ursprünglichen Antwort kam, aber in meinem Fall (MySQL über WAMP unter Windows 7) musste ich Folgendes verwenden:
--skip-lock-tables
mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db | mysql -u root --password=xxx -h localhost db
Wegen https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_lock-tables :
Einige Optionen wie --opt (standardmäßig aktiviert) aktivieren --locktabellen automatisch. Wenn Sie dies überschreiben möchten, verwenden Sie --skip-lock-tables am Ende der Optionsliste.
Heute Selbst ich war mit demselben Problem konfrontiert, hatte jedoch keinen Zugriff auf die Befehlszeile. So öffnete ich die SQL-Datei im Editor und entfernte die Zeile unterhalb der Tabellen
LOCK TABLES `yourtable name` WRITE;
dann importierte ich in meine Entwicklungsumgebung .Works fine . hoffe es hilft jemandem
Noch eine späte Antwort:
Wenn Sie versuchen, eine heiße Kopie der Serverdatenbank (in einer Linux-Umgebung) zu erstellen und das Datenbankmodul aller Tabellen MyISAM ist, verwenden Sie solltemysqlhotcopy
.
Entsprechend der Dokumentation:
Es verwendet FLUSH TABLES, LOCK TABLES und cp oder scp, um eine Datenbank zu erstellen Backup. Dies ist eine schnelle Methode zum Erstellen einer Sicherung der Datenbank oder einzelner Tabellen, aber es kann nur auf demselben Computer ausgeführt werden, auf dem die Datenbank Verzeichnisse befinden sich. mysqlhotcopy funktioniert nur zum Sichern von MyISAM- und ARCHIVE-Tabellen.
Die LOCK TABLES
-Zeit hängt von der Zeit ab, zu der der Server MySQL-Dateien kopieren kann (er erstellt keinen Speicherauszug).