Я хочу скопировать живую производственную базу данных в свою локальную базу данных разработки. Есть ли способ сделать это без блокировки производственной базы данных?
В настоящее время я использую:
mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1
Но он блокирует каждую таблицу при ее запуске.
Работает ли параметр --lock-tables=false
?
В соответствии с man page, если вы демпируете таблицы InnoDB, вы можете использовать опцию --single-transaction
:
--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.
Это слишком поздно, но полезно для тех, кто ищет тему. Если вы не innoDB, и вы не беспокоитесь о блокировке, а вы просто используете опцию:
--lock-tables=false
Ответ зависит от того, какой механизм хранения вы используете. Идеальный сценарий - если вы используете InnoDB. В этом случае вы можете использовать флаг --single-transaction
, который даст вам когерентный снимок базы данных в момент начала дампа.
--skip-add-locks
помог мне
Чтобы выгрузить большие таблицы, вы должны объединить опцию --single-transaction с параметром -quick.
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction
Честно говоря, я бы установил репликацию для этого, как если бы вы не блокировали таблицы, вы получите непоследовательные данные из дампа.
Если дамп занимает больше времени, таблицы, которые уже были сброшены, возможно, были изменены вместе с некоторой таблицей, которая только собирается быть сброшена.
Так что либо блокируйте таблицы, либо используйте репликацию.
Это примерно так поздно по сравнению с парнем, который сказал, что опаздывает, поскольку он был в оригинальном ответе, но в моем случае (MySQL через WAMP в Windows 7) мне пришлось использовать:
--skip-lock-tables
Для таблиц InnoDB используется --single-transaction
"он выгружает согласованное состояние базы данных в момент, когда BEGIN был выпущен без блокировки любых приложений" MySQL DOCS
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction
mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db | mysql -u root --password=xxx -h localhost db
Еще один поздний ответ:
Если вы пытаетесь создать горячую копию базы данных сервера (в среде linux), а механизм базы данных всех таблиц - MyISAM, вы должны использовать mysqlhotcopy
.
Соответственно документации:
Он использует FLUSH TABLES, LOCK TABLES и cp или scp для создания базы данных резервное копирование. Это быстрый способ сделать резервную копию базы данных или одного таблицы, но его можно запустить только на том же компьютере, где база данных расположены каталоги. mysqlhotcopy работает только для резервного копирования Таблицы MyISAM и ARCHIVE.
Время LOCK TABLES
зависит от времени, которое сервер может скопировать файлы MySQL (он не создает дамп).
Поскольку ни один из этих подходов не работал у меня, я просто сделал:
mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]
Он будет исключать команды LOCK TABLE <x>
и UNLOCK TABLES
.
Примечание: Надеемся, что ваши данные не содержат в себе эту строку!