Чи блокуються таблиці InnoDB під час mysqldump, коли їх змішують з MyISAM?


9

Я шукаю резервне рішення для моїх серверів mysql, і мені потрібно якомога менше простоїв. У мене є таке:

  • MySQL-сервери
  • вони не тиражуються
  • кожен сервер виступає за своє

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

Найпростішим способом резервного копіювання, як я бачу, було б використання mysqldump з таким програмним забезпеченням, як "automysqlbackup". Мої найважливіші дані використовують InnoDB. Мої таблиці InnoDB досить важкі.

Питання: Якщо я зробить mysqldump до всіх баз даних на сервері, він заблокує мої таблиці Innodb?

Відповіді:


7

mysqldumps разом з InnoDB та MyISAM разом трактуються як взаємовиключні. Ось чому:

Якщо ви можете увійти в mysql під час роботи mysqldump, ви побачите щось подібне:

SELECT /* SQL_NO_CACHE */ * FROM tblname

За замовчуванням mysqldump виконає наступне:

  • Кожна база даних скидається в алфавітному порядку
  • Кожна таблиця, завантажена на базу даних, скидається в алфавітному порядку (незалежно від двигуна зберігання)

Це має бути добре для екземпляра MySQL, який не має іншої активності в базі даних. Таблиці InnoDB та таблиці MyISAM не впливають одна на одну.

Використання --single-transactionпроти екземпляра MySQL All-InnoDB створює контрольну точку і скидає всі таблиці з одного і того ж часу. Як тільки зустрічається таблиця MyISAM, усі ставки знищуються. Це може спричинити скидання всіх таблиць InnoDB після MyISAM з іншого моменту часу.

Щоб мати послідовний дамп-час-дамп для суміші InnoDB і MyISAM, у вас є варіанти

ВАРІАНТ №1

Перезапустіть mysql, щоб ніхто більше не міг увійти через TCP / IP, а потім mysqldump

service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart 

ВАРІАНТ №2

Якщо всі таблиці MyISAM призначені лише для читання, просто mysqldump використовує --single-транзакцію

ВАРІАНТ №3

Якщо записуються будь-які таблиці MyISAM, --single-транзакції недостатньо

Ви повинні зробити наступне:

mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql

Відразу після того, як буде зроблено mysqldump, увійдіть у mysql та зробіть show processlist;. Шукайте запит SELECT SLEEP(86400), знайдіть ідентифікатор процесу та запустітьKILL <procidnumn>;


5

mysqldump --single-transactionне блокує таблиці, але в таблицях MyISAM не гарантується наявність послідовних скидів із цією опцією. Краще використовувати mydumper, mydumperблокує таблиці MyISAM і не блокує InnoDB, щоб дамп був послідовним.


Нічого, дякую за цей чудовий інструмент! Чи знайомі ви з інструментом, який може автоматизувати щоденні, щотижневі, місячні резервні копії за допомогою mydumper? Щось на кшталт "automysqlbackup", просто з mydumper? Дякую.
tounano

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.