Запустите MySQLDump без таблиц блокировки - PullRequest
413 голосов
/ 19 сентября 2008

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

Я сейчас использую:

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

Но он блокирует каждую таблицу во время работы.

Ответы [ 14 ]

585 голосов
/ 19 сентября 2008

Работает ли опция --lock-tables=false?

Согласно справочной странице , если вы выгружаете таблицы 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 DB :

mysqldump --single-transaction=TRUE -u username -p DB
281 голосов
/ 12 августа 2009

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

--lock-tables=false
45 голосов
/ 20 сентября 2008

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

34 голосов
/ 16 декабря 2010

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

14 голосов
/ 04 мая 2012

Чтобы получить дамп больших таблиц, вы должны объединить опцию --single-транзакции с --quick.

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction

9 голосов
/ 19 сентября 2008

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

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

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

8 голосов
/ 10 января 2013

Для таблиц InnoDB используйте --single-транзакция

«выдает согласованное состояние базы данных в момент выдачи BEGIN без блокировки каких-либо приложений» MySQL DOCS

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction

8 голосов
/ 23 мая 2012

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

--skip-lock-tables
5 голосов
/ 01 мая 2012
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db
1 голос
/ 17 октября 2018

В связи с https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_lock-tables:

Некоторые параметры, такие как --opt (который включен по умолчанию), автоматически включают --lock-таблицы. Если вы хотите переопределить это, используйте --skip-lock-tables в конце списка опций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...