mysqldumps с InnoDB и MyISAM вместе рассматриваются как взаимоисключающие. Вот почему:
Если вы можете войти в mysql во время работы mysqldump, вы увидите что-то вроде этого:
SELECT /* SQL_NO_CACHE */ * FROM tblname
По умолчанию mysqldump сделает следующее:
- Каждая база данных выгружается в алфавитном порядке
- Каждая таблица, выгруженная в базу данных, выводится в алфавитном порядке (независимо от механизма хранения)
Это должно быть хорошо для экземпляра MySQL, который не имеет никакой другой активности базы данных. Таблицы InnoDB и таблицы MyISAM не влияют друг на друга.
Использование --single-transaction
инстанса MySQL против 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 -action
ВАРИАНТ № 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>;