Я ищу решение для резервного копирования моих серверов 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, у вас есть варианты
Перезапустите mysql, чтобы никто другой не мог войти через TCP / IP, а затем mysqldump
service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart
Если все таблицы MyISAM предназначены только для чтения, просто mysqldump с помощью --single-transaction
Если какие-либо таблицы 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.