Высокая распространенность баз данных MySQL приводит к её использованию в разнообразных проектах, в том числе, которые требуют безостановочной работы и минимального времени восстановления. Стандартные инструменты, такие как mysqldump неудобен для использования баз данных размер, которых измеряется десятками гигабайт. К сожалению mysqldump вызывает блокировку таблиц, и операция снятия дампа или восстановления базы может занимать далеко не один час, а порой и 5-10 часов.
Благо, к нам на помощь приходит Percona XtraBackup.
Сразу хочу обратить внимание на то, что большинство рассматриваемых примеров будет при условии, что вы используете InnoDB, т.к. при использовании MyISAM в процессе дампа будет происходить блокировка таблиц, что даст вам выигрыш только в скорости бекапа/восстановления.
Многие сразу попробуют закидать шпалами, типа используйте реплику. Абсолютно согласен, сервер реплики идеальное решение. С ним можем делать и дампы, и блокировки — сколько хотим. Но:
1) Нам нужно всегда мониторить состояние реплики, дабы она была актуальная, на которую дополнительно нужны ресурсы.
2) В данном примере мы рассматриваем вопрос времени восстановления, именно поэтому mysqldump с репликой ничем не ускорит ситуацию в момент краха БД.
Моей целью не ставилось перевести всю документацию по XtraBackup, а лишь хочу показать вам как можно быстро бекапить/копировать/восстанавливать большие базы данных и как это делаем мы.
Для тех, кто не хочет думать, а мы админы ленивые (а лень двигатель прогресса), достаточно будет скопипастить пару строк и засунуть в крон. Кто же хочет копнуть глубже, основываясь на предоставленных мной строках может «допилить» под себя.
Для получения всех прелестей инкрементального бэкапа необходимо чтобы все таблицы были типа InnoDB и была установлена опция innodb_file_per_table=1. Физически таблица будет представлять два файла — определение таблицы и данные таблицы
Предположим по феншую root пароль к MySQL лежит у нас в /root/.mysql
Создаём полную резервную копию
--no-timestamp нам не нужно создавать поддиректорию с временной меткой
--rsync используем rsync для копирования фалов БД не InnoDB, копирует часть до блокировки, копирует часть внутри блокировки. Не работает в потоковом режиме!
--throttle если вам нужно не грузить диски – используйте.
Накатываем бинарные логи которые накопились за время создания дампа
Важное замечание:
Папка /var/lib/mysql-xtra должна быть пуста, если вы используете --no-timestamp
Например мы хотим сделать инкрементный бекап
Аналогично накатываем бинарные логи которые накопились за время создания бекапа
На данном этапе мы получили полный бекап и инкрементный бекап.
Папку полного бекапа можно скопировать на другой сервер в папку mysql сервера и у вас готова полная копия сервера.
Процедура восстановления достаточно проста:
Если мы хотим восстановить инкрементный бекап, то сначала накатим его полный бекап.
Теперь наш полный бекап содержит в себе и изменения из инкрементоного бекапа и можно восстанавливать бекап по схеме восстановления полного бекапа.
Например, мы не хотим бекапить весь сервер, а только базу. Сделать это можно таким способом:
Полезные опции:
--parallel=4 параллельное копирование, имеет смысл только с innodb_file_per_table=1
--no-lock не блокирует таблички, НО! Убедитесь, что во время создания бекапа не выполняются ALTER TABLE, INSERT/UPDATE/DELETE на MyISAM таблицы.
--compress начиная с версии 2.0 умеет делать компрессию, юзаем если диски не резиновые.
Innobackupex так-же позволяет копировать отдельно таблички, партиции, но в связи с крайней редкостью использования в данной статье рассматривать не буду.
Для табличек InnoDB можно использовать xtrabackup, который достаточно прост в использовании. Т.к. зачастую у нас mix из таблиц, то мы его не используем. Но я опишу пару команд, которые будут вам достаточны для создания/восстановления базы данных.
Для запуска процесса создания бекапа:
Для восстановления, необходимо выплнить команду с опцией "--prepare":
Команду восстановления данных нужно выполнить дважды, после чего будут созданы лог файлы для MySQL. После этого нужно скопировать лог файл и файл данных в папку MySQL (по умолчанию — /var/lib/mysql).
Инкрементальные бекапы
Понятно, что делать полный бекап на больших объемах будет крайне ресурсоемко, поэтому XtraBackup обладает возможностью инкрементальных бекапов и восстановления. Для этого, Вам сначала необходимо сделать полный бекап, а затем в отдельную папку — т.н. дельта бекап:
Для восстановления нужно выполнить следующую команду:
На этом пока всё.
Автор: Игорь Медынский, старший системный администратор centos-admin.ru
Благо, к нам на помощь приходит Percona XtraBackup.
Сразу хочу обратить внимание на то, что большинство рассматриваемых примеров будет при условии, что вы используете InnoDB, т.к. при использовании MyISAM в процессе дампа будет происходить блокировка таблиц, что даст вам выигрыш только в скорости бекапа/восстановления.
Многие сразу попробуют закидать шпалами, типа используйте реплику. Абсолютно согласен, сервер реплики идеальное решение. С ним можем делать и дампы, и блокировки — сколько хотим. Но:
1) Нам нужно всегда мониторить состояние реплики, дабы она была актуальная, на которую дополнительно нужны ресурсы.
2) В данном примере мы рассматриваем вопрос времени восстановления, именно поэтому mysqldump с репликой ничем не ускорит ситуацию в момент краха БД.
Моей целью не ставилось перевести всю документацию по XtraBackup, а лишь хочу показать вам как можно быстро бекапить/копировать/восстанавливать большие базы данных и как это делаем мы.
Для тех, кто не хочет думать, а мы админы ленивые (а лень двигатель прогресса), достаточно будет скопипастить пару строк и засунуть в крон. Кто же хочет копнуть глубже, основываясь на предоставленных мной строках может «допилить» под себя.
Для получения всех прелестей инкрементального бэкапа необходимо чтобы все таблицы были типа InnoDB и была установлена опция innodb_file_per_table=1. Физически таблица будет представлять два файла — определение таблицы и данные таблицы
Предположим по феншую root пароль к MySQL лежит у нас в /root/.mysql
Создаём полную резервную копию
innobackupex --defaults-file=/etc/my.cnf --password=`cat /root/.mysql` --no-timestamp --rsync /var/lib/mysql-xtra 2>&1
--no-timestamp нам не нужно создавать поддиректорию с временной меткой
--rsync используем rsync для копирования фалов БД не InnoDB, копирует часть до блокировки, копирует часть внутри блокировки. Не работает в потоковом режиме!
--throttle если вам нужно не грузить диски – используйте.
Накатываем бинарные логи которые накопились за время создания дампа
innobackupex --apply-log --redo-only --defaults-file=/etc/my.cnf --password=`cat /root/.mysql` --no-timestamp --throttle=40 /var/lib/mysql-xtra 2>&1
Важное замечание:
Папка /var/lib/mysql-xtra должна быть пуста, если вы используете --no-timestamp
Например мы хотим сделать инкрементный бекап
innobackupex --defaults-file=/etc/my.cnf --password=`cat /root/.mysql` --no-timestamp --throttle=40 --rsync --incremental /var/lib/mysql-xtra-inc --incremental-basedir=/var/lib/mysql-xtra 2>&1
Аналогично накатываем бинарные логи которые накопились за время создания бекапа
innobackupex --defaults-file=/etc/my.cnf --password=`cat /root/.mysql` --no-timestamp --throttle=40 --apply-log /var/lib/mysql-xtra --incremental-dir=/var/lib/mysql-xtra-inc 2>&1
На данном этапе мы получили полный бекап и инкрементный бекап.
Папку полного бекапа можно скопировать на другой сервер в папку mysql сервера и у вас готова полная копия сервера.
Процедура восстановления достаточно проста:
# останавливаем mysql
service mysql stop
# Бэкапим текущую базу
mv /var/lib/mysql /var/lib/mysql.old
mkdir /var/lib/mysql
# Восстанавливаем бэкап
innobackupex --defaults-file=/etc/my.cnf --copy-back /var/lib/mysql-xtra
# Не забываем про права права
chown -R mysql.mysql /var/lib/mysql
# Запускаем mysql
service mysql start
innobackupex --defaults-file=/etc/my.cnf --copy-back /var/lib/mysql-xtra
Если мы хотим восстановить инкрементный бекап, то сначала накатим его полный бекап.
innobackupex --apply-log --redo-only /var/lib/mysql-xtra --incremental-dir=/var/lib/mysql-xtra-inc
Теперь наш полный бекап содержит в себе и изменения из инкрементоного бекапа и можно восстанавливать бекап по схеме восстановления полного бекапа.
Например, мы не хотим бекапить весь сервер, а только базу. Сделать это можно таким способом:
# Делаем дамп c указанием названия базы, например test
innobackupex --defaults-file=/etc/my.cnf --password=`cat /root/.mysql` --no-timestamp --databases "test" --rsync /var/lib/mysql-xtra 2>&1
# Накатываем бинарные логи которые накопились за время создания дампа
innobackupex --apply-log --redo-only --defaults-file=/etc/my.cnf --password=`cat /root/.mysql` --no-timestamp --throttle=40 /var/lib/mysql-xtra 2>&1
# останавливаем mysql
service mysql stop
# Бэкапим текущую базу
mkdir -p /var/lib/mysql.old/test
mv /var/lib/mysql/test /var/lib/mysql.old/test
# Восстанавливаем бэкап
mkdir /var/lib/mysql/test
innobackupex --copy-back /var/lib/mysql-xtra/
# Восстанавливаем права
chown -R mysql.mysql /var/lib/mysql
# Запускаем mysql
service mysql start
Полезные опции:
--parallel=4 параллельное копирование, имеет смысл только с innodb_file_per_table=1
--no-lock не блокирует таблички, НО! Убедитесь, что во время создания бекапа не выполняются ALTER TABLE, INSERT/UPDATE/DELETE на MyISAM таблицы.
--compress начиная с версии 2.0 умеет делать компрессию, юзаем если диски не резиновые.
Innobackupex так-же позволяет копировать отдельно таблички, партиции, но в связи с крайней редкостью использования в данной статье рассматривать не буду.
Для табличек InnoDB можно использовать xtrabackup, который достаточно прост в использовании. Т.к. зачастую у нас mix из таблиц, то мы его не используем. Но я опишу пару команд, которые будут вам достаточны для создания/восстановления базы данных.
Для запуска процесса создания бекапа:
xtrabackup --defaults-file=/etc/mysql/my.cnf --datadir=/var/lib/mysql --target-dir=/var/lib/mysql-xtra --backup
Для восстановления, необходимо выплнить команду с опцией "--prepare":
xtrabackup --prepare --target-dir=/var/lib/mysql-xtra/ --datadir=/var/lib/mysql
Команду восстановления данных нужно выполнить дважды, после чего будут созданы лог файлы для MySQL. После этого нужно скопировать лог файл и файл данных в папку MySQL (по умолчанию — /var/lib/mysql).
Инкрементальные бекапы
Понятно, что делать полный бекап на больших объемах будет крайне ресурсоемко, поэтому XtraBackup обладает возможностью инкрементальных бекапов и восстановления. Для этого, Вам сначала необходимо сделать полный бекап, а затем в отдельную папку — т.н. дельта бекап:
xtrabackup --defaults-file=/etc/mysql/my.cnf --target-dir=/var/lib/mysql-xtra-inc --incremental-basedir=/var/lib/mysql-xtra --backup
Для восстановления нужно выполнить следующую команду:
xtrabackup --target-dir=/var/lib/mysql-xtra-inc --incremental-basedir=/var/lib/mysql-xtra --prepare
На этом пока всё.
Автор: Игорь Медынский, старший системный администратор centos-admin.ru