Назад | Перейти на главную страницу

Блокируются ли таблицы InnoDB во время mysqldump при смешивании с MyISAM?

Я ищу решение для резервного копирования моих серверов mysql, и мне нужно как можно меньше времени простоя. Имею следующее:

Это число может увеличиваться, поэтому установка репликации главный / подчиненный не будет хорошей идеей.

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

Возникает вопрос: если я сделаю mysqldump для всех баз данных на сервере, заблокирует ли он мои таблицы Innodb?

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

ВАРИАНТ №3

Если какие-либо таблицы MyISAM записываются, --single-transaction недостаточно

Вам нужно будет сделать следующее:

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

mysqldump --single-transaction не блокирует таблицы, но при использовании этой опции не гарантируется, что таблицы MyISAM будут иметь согласованные дампы. Лучше использовать mydumper, mydumper блокирует таблицы MyISAM и не блокирует InnoDB, поэтому дамп согласован.

mysqldump блокирует таблицу во время дампа. Используйте снимки LVM или Xtrabackup.