Pull to refresh
91.47
Слёрм
Учебный центр для тех, кто работает в IT

Использование Percona XtraBackup в повседневной жизни

Reading time5 min
Views59K
Высокая распространенность баз данных MySQL приводит к её использованию в разнообразных проектах, в том числе, которые требуют безостановочной работы и минимального времени восстановления. Стандартные инструменты, такие как mysqldump неудобен для использования баз данных размер, которых измеряется десятками гигабайт. К сожалению mysqldump вызывает блокировку таблиц, и операция снятия дампа или восстановления базы может занимать далеко не один час, а порой и 5-10 часов.

Благо, к нам на помощь приходит Percona XtraBackup.

image



Сразу хочу обратить внимание на то, что большинство рассматриваемых примеров будет при условии, что вы используете 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
Tags:
Hubs:
Total votes 27: ↑24 and ↓3+21
Comments30

Articles

Information

Website
slurm.io
Registered
Founded
Employees
51–100 employees
Location
Россия
Representative
Антон Скобин