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

383

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

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

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

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

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

11 ответов

473
Лучший ответ

Работает ли параметр --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.
  • 20
    для innodb DB mysqldump --single-транзакция = ИСТИНА -u имя пользователя -p БД
  • 14
    Что делать, если у вас есть innodb и myisam?
Показать ещё 1 комментарий
264

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

--lock-tables=false
  • 1
    Спасибо за ответ, Уоррен, это было очень полезно и работало как шарм.
  • 0
    то же самое. работает отлично.
Показать ещё 3 комментария
40

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

33

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

  • 2
    или также --compact для включения пропуска блокировки с другими оптимизациями.
  • 67
    Это удаляет операторы LOCK TABLES и UNLOCK TABLES из файла дампа, это не влияет на блокировку во время экспорта.
Показать ещё 2 комментария
12

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

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

  • 2
    Опция --quick является частью опции --opt сейчас. И --opt включен по умолчанию.
8

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

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

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

  • 0
    Вся эта БД почти полностью предназначена только для чтения, поэтому меня не слишком беспокоит ее изменение.
  • 2
    Этот комментарий неверен. MVCC позволяет читать согласованное состояние без блокировок на InnoDB.
Показать ещё 2 комментария
7

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

--skip-lock-tables
  • 0
    Это то, что мне помогло создать дамп information_schema без ошибки «Доступ запрещен для пользователя« debian-sys-maint »@« localhost »к базе данных« information_schema »при использовании LOCK TABLES»
6

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

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

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

4
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db
  • 0
    Голосуйте, этот работал для меня, просто добавьте параметры --skip-opt --single -action --max_allowed_packet = 1G
  • 1
    Я не рекомендую "--skip-opt" для этой цели. Это намного больше, чем то, о чем просил оригинальный вопрос. Выключает быстрый режим, не включает кодировку и т. Д.
0

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

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

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

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

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

0

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню