Запуск MySQLDump без таблиц блокировки

Я хочу скопировать живую производственную базу данных в свою локальную базу данных разработки. Есть ли способ сделать это без блокировки производственной базы данных?

В настоящее время я использую:

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

Но он блокирует каждую таблицу при ее запуске.

Ответ 1

Работает ли параметр --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.

Ответ 2

Это слишком поздно, но полезно для тех, кто ищет тему. Если вы не innoDB, и вы не беспокоитесь о блокировке, а вы просто используете опцию:

--lock-tables=false

Ответ 3

Ответ зависит от того, какой механизм хранения вы используете. Идеальный сценарий - если вы используете InnoDB. В этом случае вы можете использовать флаг --single-transaction, который даст вам когерентный снимок базы данных в момент начала дампа.

Ответ 4

--skip-add-locks помог мне

Ответ 6

Честно говоря, я бы установил репликацию для этого, как если бы вы не блокировали таблицы, вы получите непоследовательные данные из дампа.

Если дамп занимает больше времени, таблицы, которые уже были сброшены, возможно, были изменены вместе с некоторой таблицей, которая только собирается быть сброшена.

Так что либо блокируйте таблицы, либо используйте репликацию.

Ответ 7

Это примерно так поздно по сравнению с парнем, который сказал, что опаздывает, поскольку он был в оригинальном ответе, но в моем случае (MySQL через WAMP в Windows 7) мне пришлось использовать:

--skip-lock-tables

Ответ 9

    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db

Ответ 10

Поскольку ни один из этих подходов не работал у меня, я просто сделал:

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

Он будет исключать команды LOCK TABLE <x> и UNLOCK TABLES.

Примечание: Надеемся, что ваши данные не содержат в себе эту строку!

Ответ 11

Еще один поздний ответ:

Если вы пытаетесь создать горячую копию базы данных сервера (в среде linux), а механизм базы данных всех таблиц - MyISAM, вы должны использовать mysqlhotcopy.

Соответственно документации:

Он использует FLUSH TABLES, LOCK TABLES и cp или scp для создания базы данных резервное копирование. Это быстрый способ сделать резервную копию базы данных или одного таблицы, но его можно запустить только на том же компьютере, где база данных расположены каталоги. mysqlhotcopy работает только для резервного копирования Таблицы MyISAM и ARCHIVE.

Время LOCK TABLES зависит от времени, которое сервер может скопировать файлы MySQL (он не создает дамп).