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>;