Горячее резервное копирование данных MySQL при помощи Percona XtraBackup в CentOS 7

Для активных систем баз данных горячее резервное копирование (то есть, создание резервных копий без остановки сервиса или изменения прав доступа) является процессом довольно проблемным. Простое копирование файлов данных в таком случае часто приводит ко внутренним противоречиям и несоответствиям данных (например, транзакции, которые произошли во время копирования, будут отсутствовать). С другой стороны, при остановке работы базы данных на время резервного копирования часть приложения, зависящая от БД, будет недоступна. Percona XtraBackup – это открытая утилита, позволяющая обойти эту проблему и создать последовательную полную или инкрементную резервную копию баз данных на запущенном сервере MySQL, MariaDB и Percona (что и называется горячим резервным копированием, или hot backup).

В отличие от логического резервного копирования (для которого предназначена утилита mysqldump), XtraBackup создает физические резервные копии файлов базы данных. Полученные резервные копии БД можно скопировать в удалённую систему при помощи rsync или системы резервного копирования Bacula.

Данное руководство поможет создать полную резервную копию БД MySQL или MariaDB при помощи Percona XtraBackup на CentOS 7. Также оно охватывает процесс восстановления базы данных из резервной копии.

Примечание: Аналогичное руководство для Ubuntu можно найти здесь.

Требования

  • Права суперпользователя CentOS 7.
  • БД MySQL или MariaDB.
  • Доступ root к базе данных.
  • Для создания горячей резервной копии нужно использовать движок InnoDB (поскольку XtraBackup зависит от её лога транзакций).

Примечание: XtraBackup можно использовать и с MyISAM, но в таком случае БД будет ненадолго заблокирована к концу резервного копирования.

Проверка движка базы данных

Если вы не знаете точно, какой движок использует БД, вы можете узнать это несколькими способами. Во-первых, это можно сделать через консоль MySQL; запросите статус каждой таблицы необходимой базы данных. Чтобы открыть консоль:

mysql -u root -p

Введите root-пароль MySQL.

В командной строке MySQL выберите базу данных, которую нужно проверить.

USE database_name;

Запросите статус таблиц:

SHOW TABLE STATUS\G;

В выводе будет указан движок:

...
*************************** 11. row ***************************
Name: wp_users
Engine: InnoDB
...

После этого закройте консоль:

exit

Установка Percona XtraBackup

Проще всего установить Percona XtraBackup можно при помощи пакетного менеджера yum, поскольку репозиторий Percona предоставляет пакет RPM.

sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

После этого запустите установку XtraBackup:

sudo yum install percona-xtrabackup

Примите все запросы подтверждения, чтобы завершить установку.

Пакет XtraBackup состоит из собственно программы XtraBackup и Perl-скрипта innobackupex, который используется для создания бэкапа базы данных.

Подготовка системы

Прежде чем впервые запустить XtraBackup, нужно подготовить пользователей системы и MySQL.

Пользователь системы

Если вы не планируете использовать root-пользователя системы, то нужно подготовить систему к работе XtraBackup.

Примечание: В данном разделе предполагается, что вы работаете в сессии пользователя XtraBackup, у которого есть права суперпользователя.

Добавьте пользователя в группу mysql:

sudo gpasswd -a username mysql

Создайте каталог для хранения резервных копий XtraBackup:

sudo mkdir -p /data/backups
sudo chown -R username: /data

Команда chown даёт пользователю право на запись в каталоге backups.

Пользователь MySQL

Для корректной работы XtraBackup необходим отдельный пользователь MySQL, при помощи которого будет выполняться резервное копирование. Создайте такого пользователя.

Откройте консоль MySQL:

mysql -u root -p

Введите root-пароль MySQL.

Создайте нового пользователя MySQL и пароль для него при помощи следующей команды (заменив условные данные bkpuser и bkppassword своими данными).

CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bkppassword';

Затем передайте новому пользователю права на перезагрузку, блокировку и репликацию всех баз данных.

GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
FLUSH PRIVILEGES;

Это минимальные права, необходимые для создания полного бэкапа БД при помощи XtraBackup.

Закройте консоль MySQL:

exit

Теперь всё готово к созданию полной резервной копии базы данных.

Полная горячая резервная копия БД

Подготовив систему, можно приступать к созданию полного горячего бэкапа базы данных MySQL с помощью XtraBackup.

Права на каталог даных

В системе CentOS 7 файлы данных MySQL хранятся в каталоге /var/lib/mysql (который также называется datadir). По умолчанию доступ к этому каталогу заблокирован для всех, кроме пользователя mysql. XtraBackup требует доступа к этому каталогу для создания бэкапа, потому нужно передать созданному для XtraBackup пользователю соответствующие права.

sudo chown -R mysql: /var/lib/mysql
sudo find /var/lib/mysql -type d -exec chmod 775 "{}" \;

Эти команды открывают группе mysql доступ ко всем каталогам datadir.

Примечание: Если вы добавили пользователя в группу mysql в той же сессии, вам нужно будет войти повторно, чтобы права доступа вступили в силу.

Создание резервной копии

Итак, теперь можно запустить резервное копирование. Чтобы скопировать работающую БД MySQL, используйте утилиту innobackupex.

Примечание: Замените условные данные в команде данными своего пользователя MySQL.

innobackupex --user=bkpuser  --password=bkppassword --no-timestamp /data/backups/new_backup

Это создаст резервную копию БД в /data/backups/new_backup:

innobackupex: Backup created in directory '/data/backups/new_backup'
150420 13:50:10  innobackupex: Connection to database server closed
150420 13:50:10  innobackupex: completed OK!

Также можно пропустить флаг —no-timestamp, чтобы программа XtraBackup создала каталог резервного копирования с текущей временной меткой:

innobackupex --user=bkpuser  --password=bkppassword /data/backups

Это создаст резервную копию БД в автоматически сгенерированном подкаталоге:

innobackupex: Backup created in directory '/data/backups/2015-04-20_13-50-07'
150420 13:50:10  innobackupex: Connection to database server closed
150420 13:50:10  innobackupex: completed OK!

С флагом или без него, программа должна вернуть «innobackupex: completed OK!» в последней строке результата.

Резервную копию базы данных нужно подготовить, прежде чем её можно будет использовать.

Подготовка БД

Последнее, что нужно сделать, — это подготовить горячую копию БД к использованию; для этого нужно воспроизвести лог транзакций и внести все несовершённые транзакции в резервную копию. Подготовка резервной копии позволяет согласовать и уточнить данные.

Чтобы подготовить полученную копию (/data/backups/new_backup), нужно запустить команду:

innobackupex --apply-log /data/backups/new_backup

В случае успешного выполнения команды программа вернёт «innobackupex: completed OK!».

Теперь резервную копию можно восстановить. Кроме того, если у вас есть система резервного копирования файлов (например, Bacula), эта резервная копия базы данных должна быть добавлена в backup selection.

Восстановление резервной копии

Для восстановления резервной копии XtraBackup нужно остановить БД и очистить datadir.

Остановите сервис MySQL:

sudo systemctl stop mariadb

Переместите или удалите содержимое каталога данных (/var/lib/mysql). В данном примере данные будут просто временно перемещены:

mkdir /tmp/mysql
mv /var/lib/mysql/* /tmp/mysql/

Теперь можно восстановить резервную копию:

innobackupex --copy-back /data/backups/new_backup

Восстановленные файлы будут принадлежать пользователю, запустившему резервное копирование. Передайте права mysql, чтобы система MySQL могла читать и писать в файлах.

sudo chown -R mysql: /var/lib/mysql

Теперь можно запустить MySQL:

sudo systemctl start mariadb

Резервная копия БД полностью восстановлена.

Заключение

Теперь можно без проблем создавать горячие копии БД MySQL с помощью Percona XtraBackup; однако нужно иметь в виду несколько моментов.

Во-первых, рекомендуется автоматизировать процесс бэкапа, чтобы всегда иметь под рукой актуальную версию данных. Во-вторых, хранить резервные копии лучше удалённо на случай, если с сервером базы данных возникнут проблемы (для этого можно использовать Rsync, систему резервного копирования Bacula и т.п.). Также нужно настроить ротацию резервных копий (т.е. процесс замены устаревших копий более актуальными) и ознакомиться с созданием инкрементальных резервных копий (с помощью XtraBackup), чтобы сэкономить дисковое пространство.

Tags: , , ,