Запустіть 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

Відповіді:


625

Чи працює --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 :

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

23
для innodb DB mysqldump --single -action = TRUE -u ім'я користувача -p DB
AMB

19
Що робити, якщо у вас є innodb і myisam?
CMCDragonkai

Це увімкнено за замовчуванням?
CMCDragonkai

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

290

Це надто пізно, але добре для тих, хто шукає тему. Якщо ви не невинні, і не переймаєтесь блокуванням під час скидання, просто скористайтеся опцією:

--lock-tables=false

1
Дякую за відповідь Уоррен, це було дуже корисно і працювало як шарм.
Гавін

7
використовуючи '--lock-table = false --quick' використовує найменші ресурси сервера
SyntaxGoonoo

43
Але ви повинні турбуватися про блокування столів. Якщо під час запуску mysqldump записується кілька таблиць (і ви використовуєте сторонні ключі), ви можете скасувати дамп. Ви не будете знати, поки не відновите його і не будете запускати JOIN-запити на несумісні дані. Може знадобитися деякий час, щоб виявити суперечливі дані, оскільки ПРИЄДНАННЯ використовуються вашою програмою, а не Mysql (з таблицями MyISAM); відновлення буде працювати чудово, mysql не попередить вас про невідповідності. Отже: MyIsam -> завжди блокуйте свої столи. InnoDB -> використання --single-transaction.
Коста

12
@Costa Я не думаю, що блокування таблиць навіть недостатньо для таблиць MyISAM. Якщо mysqldump заблокує таблиці між запитами, виконаними програмою, ви виявите ті самі невідповідності. Відповідь ще простіша: MyISAM -> використовуйте замість InnoDB.
cdhowie

@Costa ви, безумовно, повинні турбуватися про блокування таблиць, але тільки якщо вам потрібен послідовний дамп . Є рідкісні випадки, коли цього не робиш. Наприклад, груба фреп на дампінгу для всієї бази даних (налагодження): Я маю на увазі, що не хочу, щоб користувачі чекали ~ 20 хвилин, щоб створити дамп виробничої бази даних (правдива історія). Якщо справа в тому, щоб отримати дамп не тільки якнайшвидше, але і КОНСИСТЕНТНО , слід скинути реплікуваний підлеглий або використовувати знімок нижчого рівня (lvm, zfs, btrfs тощо), пам’ятаючи про FLUSH TABLES WITH READ LOCKречі.
Олексій Офшор

44

Відповідь залежить від того, який механізм зберігання даних ви використовуєте. Ідеальний сценарій - якщо ви використовуєте InnoDB. У цьому випадку ви можете використовувати --single-transactionпрапор, який дасть вам узгоджений знімок бази даних під час початку дампа.


35

--skip-add-locks допомогли мені


2
або також - увімкніть включення пропускних замків з іншими оптимізаціями.
ppostma1

77
Це видаляє операції LOCK TABLES та UNLOCK TABLES з файлу дампа, це не впливає на блокування під час експорту.
dabest1

11
Ні, це не те, що ви шукаєте! Дивіться коментар dabest1. Це НІЧОГО не дозволяє запобігти блокуванню ваших таблиць під час виконання mysqldump. Це НЕ відповідь на запитання.
orrd

@dabest і @orrd вірні: --skip-add-locksпросто змусить відновити дамп швидше. Це не правильна відповідь.
dr_



10

Чесно кажучи, я налаштував би реплікацію для цього, так як якщо ви не заблокуєте таблиці, ви отримаєте невідповідні дані з дампа.

Якщо дамп займає більше часу, таблиці, які вже були скинуті, могли змінитись разом із таблицею, яка тільки збирається скинути.

Тому або заблокуйте таблиці, або використовуйте реплікацію.


Весь цей БД майже повністю читається лише для того, щоб я не надто переживав, що він зміниться.
Грег

2
Цей коментар невірний. MVCC дозволяє зчитувати послідовний стан без блокування на InnoDB.
Скотт Хайндман

5
Якщо у вас ще не створена реплікація, вам потрібно зробити дамп, щоб налаштувати її. Ця ж проблема існує.
Метт Конноллі

3
Якщо реплікація вже не налаштована, вам потрібно буде заблокувати таблиці, щоб зробити дамп, щоб забезпечити цілісність даних. Так що це улов 22.
JordanC

9

Це приблизно пізно в порівнянні з хлопцем, який сказав, що спізнився, як і на початкову відповідь, але в моєму випадку (MySQL через WAMP на Windows 7) мені довелося використовувати:

--skip-lock-tables

Це те, що працювало для мене, щоб скинути information_schema, не маючи помилки "Відмовлено в доступі для користувача" debian-sys-maint "@" localhost "до бази даних" information_schema "при використанні БЛОКОВИХ СТОЛІВ"
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-транзакції --max_allowed_packet = 1G
Стівен Лізаразо

1
Я не рекомендую для цієї мети "--skip-opt". Це робить набагато більше, ніж те, про що було задано оригінальне запитання. Він вимикає швидкий режим, він не включає в себе шаблони тощо тощо
or

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.