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

437

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

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

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

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

Greg
источник
Еще одно запоздалое решение: вы также можете использовать 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флаг, который даст вам целостный снимок базы данных в момент начала дампа.

Dvorak
источник
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
dtbarne
источник
Вот что сработало для меня, чтобы вывести дамп 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
naveen_sfx
источник
Голосуйте, этот сработал для меня, просто добавьте параметры --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команды.

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

augustomen
источник
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;

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

iCoders
источник