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


437

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

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

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

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


Еще одно запоздалое решение: вы также можете использовать Percona XtraBackup для выгрузки производственной базы данных без прерывания обработки транзакций. Это позволяет делать горячее резервное копирование, то есть не влияет на текущую активность. Смотрите здесь: percona.com/software/mysql-database/percona-xtrabackup (я не имею никакого отношения к Percona.)
delx

Ответы:


626

Имеет ли --lock-tables=falseвариант работы?

Согласно man-странице , если вы создаете дамп таблиц 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 :

mysqldump --single-transaction=TRUE -u username -p DB

23
для базы данных innodb mysqldump --single

19
Что делать, если у вас есть innodb и myisam?
CMCDragonkai

Это включено по умолчанию?
CMCDragonkai

очевидно включен (т.е. заблокирован)?
evandrix

290

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

--lock-tables=false

1
Спасибо за ответ, Уоррен, это было очень полезно и работало как шарм.
Гэвин

7
использование '--lock-table = false --quick' использует наименьшее количество ресурсов сервера
SyntaxGoonoo

43
Но вы должны беспокоиться о блокировке таблиц. Если во время работы mysqldump записано несколько таблиц (и вы используете внешние ключи), ваш дамп может быть непоследовательным. Вы не узнаете, пока не восстановите его и не выполните запросы JOIN для несовместимых данных. Обнаружение несогласованных данных может занять некоторое время, поскольку JOIN используются вашим приложением, а не Mysql (с таблицами MyISAM); восстановление будет работать нормально, mysql не предупредит вас о несоответствиях. Итак: MyIsam -> всегда блокировать ваши таблицы. InnoDB -> использовать --single-transaction.
Коста

12
@ Коста Я не думаю, что блокировки таблиц достаточно даже для таблиц MyISAM. Если mysqldump блокирует таблицы между запросами, выполняемыми приложением, то вы получите те же несоответствия. Ответ еще проще: MyISAM -> вместо этого используйте InnoDB.
cdhowie

@ Коста, тебе определенно следует беспокоиться о блокировке таблиц, но только если тебе нужен постоянный дамп . Есть несколько редких случаев, когда вы этого не делаете. Например, грубый fgrep для дампа всей базы данных (отладка): держу пари, никто не хочет, чтобы пользователи ждали ~ 20 минут, чтобы создать дамп рабочей базы данных (правдивая история) Если цель состоит в том, чтобы получить дамп не только как можно скорее, но и CONSISTENT , следует создать дамп реплицированного ведомого или использовать низкоуровневый снимок (lvm, zfs, btrfs и т. Д.), Помня о FLUSH TABLES WITH READ LOCKвещах.
Алекс

44

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


35

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


2
или также --compact для включения пропуска блокировки с другими оптимизациями.
ppostma1

77
Это удаляет операторы LOCK TABLES и UNLOCK TABLES из файла дампа, это не влияет на блокировку во время экспорта.
dabest1

11
Нет, это не то, что вы ищете! Смотрите комментарий dabest1. Это НИЧЕГО не позволяет предотвратить блокировку ваших таблиц во время выполнения mysqldump. Это НЕ ответ на вопрос.
orrd

@dabest и @orrd верны: --skip-add-locksпросто сделают восстановление дампа быстрее. Это не правильный ответ.
Dr_


11

Для таблиц InnoDB используйте флаг --single-transaction

он сбрасывает согласованное состояние базы данных в то время, когда был запущен BEGIN, без блокировки каких-либо приложений

MySQL DOCS

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


Может быть, вместе с --skip-lock-tables.
Хави Монтеро

10

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

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

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


Вся эта БД почти полностью предназначена только для чтения, поэтому меня не слишком беспокоит ее изменение.
Грег

2
Этот комментарий неверен. MVCC позволяет читать согласованное состояние без блокировок на InnoDB.
Скотт Хиндман

5
Если у вас еще не настроена репликация, вам нужно сделать дамп для ее настройки. Та же проблема существует.
Мэтт Коннолли

3
Если у вас еще не настроена репликация, вам нужно будет заблокировать таблицы, чтобы сделать дамп, чтобы обеспечить целостность данных. Так что это уловка 22.
ДжорданC

9

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

--skip-lock-tables

Вот что сработало для меня, чтобы вывести дамп information_schema без ошибки «Доступ запрещен для пользователя 'debian-sys-maint' @ 'localhost' к базе данных 'information_schema' при использовании LOCK TABLES"
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

Голосуйте, этот сработал для меня, просто добавьте параметры --skip-opt --single -action --max_allowed_packet = 1G
Стивен Лизаразо

1
Я не рекомендую "--skip-opt" для этой цели. Это намного больше, чем то, о чем просил оригинальный вопрос. Он отключает быстрый режим, он не включает кодировку и т. Д. И т. Д.
orrd

3

При использовании MySQL Workbench в разделе «Экспорт данных» щелкните «Дополнительные параметры» и снимите флажки «таблицы блокировки».

введите описание изображения здесь


1

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

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

Это исключит как LOCK TABLE <x>и UNLOCK TABLESкоманды.

Примечание: надеюсь, ваши данные не содержат этой строки!


2
--skip-add-locks во время дампа тоже это делает
codewandler


0

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

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

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

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

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


0

Сегодня даже я столкнулся с той же проблемой, но у меня не было доступа к командной строке. Так что я открыл файл sql в редакторе блокнота и удалил нижнюю строку из таблиц

LOCK TABLES `yourtable name` WRITE;

Затем я импортировал в свою среду разработки. Работает нормально. надеюсь, это поможет кому-то

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.