Настройка инкрементальных резервных копий MySQL с помощью Percona XtraBackup

Создание и восстановление инкрементальных резервных копий MySQL с помощью Percona XtraBackup: полные резервные копии, цепочки LSN, этапы подготовки и копирования обратно.

Настройка инкрементальных резервных копий MySQL с помощью Percona XtraBackup

Percona XtraBackup (PXB) позволяет создавать горячие резервные копии MySQL-совместимых серверов с данными InnoDB. Полные резервные копии просты, но для больших баз данных часто требуются инкрементальные резервные копии MySQL, чтобы не копировать одни и те же страницы каждую ночь.

Это руководство охватывает команды для полной базовой резервной копии, цепочки инкрементальных резервных копий и последовательность восстановления, применяющую каждую инкрементальную копию по порядку.

Понимание механизма инкрементальных резервных копий Percona XtraBackup

PXB опирается на внутреннюю работу движка InnoDB, в частности отслеживая изменения с помощью номера последовательности журнала (LSN). Каждая страница InnoDB помечена LSN. Когда PXB выполняет инкрементальную резервную копию, он записывает только те страницы, чей LSN больше LSN, записанного на момент предыдущей резервной копии.

Критически важно, что инкрементальные резервные копии требуют полной базовой резервной копии для установления начальной точки. Все последующие инкрементальные резервные копии образуют цепочку, ссылаясь на непосредственно предыдущую резервную копию (которая может быть базовой или другой инкрементальной).

Ключевые файлы и концепции

  • LSN (Log Sequence Number): Маркер, используемый для определения начала и конца изменений.
  • xtrabackup_checkpoints: Файл, создаваемый во время каждой резервной копии, содержащий to_lsn (LSN, достигнутый в конце резервной копии) и, для инкрементальных резервных копий, from_lsn (начальный LSN).
  • --incremental-basedir: Важный флаг, используемый во время инкрементальных запусков, указывающий PXB на каталог предыдущей резервной копии (который определяет начальный LSN).

Шаг 1: Выполнение полной базовой резервной копии

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

Начните с определения четкого каталога для полной резервной копии:

# Определите базовый каталог для полной резервной копии
BASE_DIR="/data/backups/2023-10-01_FULL"

# Создайте каталог
mkdir -p $BASE_DIR

# Выполните полную резервную копию
xtrabackup --backup \
  --target-dir=$BASE_DIR \
  --user=root --password=secret_password \
  --datadir=/var/lib/mysql

# Проверьте LSN полной резервной копии
cat $BASE_DIR/xtrabackup_checkpoints | grep 'to_lsn'

Примечание: target-dir должен быть пустым или не существовать при запуске процесса резервного копирования. Требуемые привилегии различаются в зависимости от версии MySQL и XtraBackup, поэтому создайте выделенного пользователя для резервного копирования, используя текущие рекомендации Percona по привилегиям, вместо повторного использования root.

Шаг 2: Создание первой инкрементальной резервной копии

Для выполнения первой инкрементальной резервной копии мы должны сослаться на каталог полной базовой резервной копии с помощью флага --incremental-basedir. PXB прочитает to_lsn из базовой резервной копии и скопирует только те страницы, которые изменились с этого момента.

# Определите каталог для первой инкрементальной резервной копии
INCREMENTAL_1_DIR="/data/backups/2023-10-02_INC1"

# Выполните инкрементальную резервную копию, ссылаясь на полную базу
xtrabackup --backup \
  --target-dir=$INCREMENTAL_1_DIR \
  --incremental-basedir=/data/backups/2023-10-01_FULL \
  --user=root --password=secret_password

Шаг 3: Создание цепочки последующих инкрементальных резервных копий

Для любой последующей инкрементальной резервной копии (INC2, INC3 и т.д.) --incremental-basedir должен указывать на каталог непосредственно предыдущей инкрементальной резервной копии.

Если мы хотим создать INC2 на основе изменений с момента INC1:

# Определите каталог для второй инкрементальной резервной копии
INCREMENTAL_2_DIR="/data/backups/2023-10-03_INC2"

# Выполните инкрементальную резервную копию, ссылаясь на предыдущую инкрементальную (INC1)
xtrabackup --backup \
  --target-dir=$INCREMENTAL_2_DIR \
  --incremental-basedir=/data/backups/2023-10-02_INC1 \
  --user=root --password=secret_password

Эта цепочка продолжается, пока вы поддерживаете последовательность. Если какое-либо звено в цепочке разорвано (т.е. каталог отсутствует), процесс восстановления завершится ошибкой.

Восстановление: применение инкрементальных изменений

Восстановление набора инкрементальных резервных копий — это многоэтапный процесс, включающий последовательное применение изменений к базовой резервной копии. В отличие от полной резервной копии, инкрементальные резервные копии нельзя напрямую копировать в каталог данных.

Этап восстановления 1: Подготовка базовой резервной копии

Сначала необходимо подготовить базовую резервную копию. Обычно это делается во временной промежуточной области для обеспечения безопасности данных.

При подготовке базовой резервной копии PXB выполняет два основных действия:

  1. Применяет зафиксированные транзакции (журнал повторного выполнения).
  2. Откатывает незафиксированные транзакции.

Мы используем флаг --prepare, но критически важно добавить флаг --apply-log-only. Это предотвращает откат незафиксированных транзакций PXB, что необходимо, поскольку последующие инкрементальные журналы нуждаются в этих фрагментах транзакций для завершения восстановления.

# Определите промежуточный каталог
RESTORE_TARGET="/data/restore_staging"

# Скопируйте файлы полной базовой резервной копии в промежуточную область
rsync -avr /data/backups/2023-10-01_FULL/ $RESTORE_TARGET

# Подготовьте базовую резервную копию, оставив ее готовой для инкрементов
xtrabackup --prepare --target-dir=$RESTORE_TARGET --apply-log-only

# Ищите подтверждение: 'completed OK!'

Этап восстановления 2: Последовательное применение инкрементальных резервных копий

Затем примените каждую инкрементальную резервную копию в точном хронологическом порядке их создания. Каждая команда должна ссылаться на промежуточный каталог (базовую резервную копию, которая в данный момент изменяется) и использовать флаг --incremental-dir, указывающий на конкретный инкрементальный снимок.

# Примените инкрементальную 1
xtrabackup --prepare --target-dir=$RESTORE_TARGET \
  --incremental-dir=/data/backups/2023-10-02_INC1 \
  --apply-log-only

# Примените инкрементальную 2
xtrabackup --prepare --target-dir=$RESTORE_TARGET \
  --incremental-dir=/data/backups/2023-10-03_INC2 \
  --apply-log-only

# ... продолжайте для всех необходимых инкрементов ...

Этап восстановления 3: Завершение подготовки

После применения последнего необходимого инкрементального снимка выполните финальный шаг подготовки без флага --apply-log-only. Это позволяет PXB выполнить окончательную очистку, откатив любые транзакции, которые оставались незафиксированными во всей последовательности резервных копий, что приводит к согласованному состоянию.

# Завершите подготовку (без --apply-log-only)
xtrabackup --prepare --target-dir=$RESTORE_TARGET

# ВАЖНО: Ищите финальное подтверждение, указывающее 'xtrabackup: Recovery completed OK!'

Этап восстановления 4: Копирование данных обратно в MySQL

После успешной подготовки данные в промежуточном каталоге ($RESTORE_TARGET) согласованы и готовы к использованию сервером MySQL.

  1. Остановите службу MySQL.
  2. Убедитесь, что каталог данных MySQL пуст или зарезервирован (опционально: используйте опцию --move-back, если разрешено, но --copy-back безопаснее для восстановления).
  3. Используйте xtrabackup --copy-back для перемещения файлов.
  4. Исправьте права доступа.
  5. Перезапустите MySQL.
# Остановите службу MySQL
sudo systemctl stop mysql

# Скопируйте подготовленные файлы обратно в каталог данных MySQL
xtrabackup --copy-back --target-dir=$RESTORE_TARGET

# Убедитесь в правильной принадлежности файлов
sudo chown -R mysql:mysql /var/lib/mysql

# Запустите MySQL
sudo systemctl start mysql

Лучшие практики управления инкрементальными резервными копиями

Автоматизация и скриптинг

Стратегии инкрементальных резервных копий наиболее эффективны при полной автоматизации. Скрипты должны автоматически управлять цепочкой LSN, динамически определяя самый последний каталог резервных копий для использования с флагом --incremental-basedir.

Политика хранения

Цепочки инкрементальных резервных копий могут стать очень длинными, что делает восстановление медленным и хрупким. Периодически перезапускайте цепочку, создавая новую полную резервную копию. Некоторые команды также хранят еженедельные и ежемесячные полные резервные копии по схеме "дед-отец-сын".

Сжатие и ограничение скорости

Для очень загруженных серверов рассмотрите использование опции --throttle во время фазы резервного копирования для ограничения операций ввода-вывода. Используйте --compress для уменьшения размера резервной копии, что особенно полезно для меньших наборов данных, создаваемых инкрементальными резервными копиями.

# Пример со сжатием и ограничением скорости
xtrabackup --backup \
  --target-dir=$INCREMENTAL_3_DIR \
  --incremental-basedir=$INCREMENTAL_2_DIR \
  --compress \
  --throttle=100

Проверка и мониторинг

Всегда регулярно тестируйте процедуры восстановления. Резервная копия, которую нельзя восстановить, бесполезна. Следите за дисковым пространством, потребляемым вашей цепочкой инкрементальных резервных копий, особенно перед запуском новой полной базовой резервной копии.

Вывод

Инкрементальные резервные копии XtraBackup работают только при целостности цепочки: полная резервная копия, первая инкрементальная на основе полной, затем каждая последующая инкрементальная на основе предыдущей. При восстановлении подготовьте базу с --apply-log-only, примените каждую инкрементальную по порядку, выполните одну финальную подготовку без --apply-log-only и только затем скопируйте подготовленные данные обратно в MySQL.