Skip to content

Использование XtraBackup

XtraBackup — это мощный инструмент для создания горячих (hot) резервных копий MySQL и MariaDB баз данных без блокировки сервиса. Он обеспечивает быстрые, надежные и эффективные резервные копии с минимальным влиянием на производительность.

Основные возможности

1. Горячие резервные копии

  • Создание бэкапов без остановки MySQL/MariaDB
  • Минимальное влияние на производительность
  • Поддержка InnoDB, MyISAM и других движков

2. Инкрементальные бэкапы

  • Создание только измененных данных
  • Экономия места на диске
  • Быстрое создание резервных копий

3. Сжатие и шифрование

  • Встроенное сжатие данных
  • Шифрование резервных копий
  • Оптимизация использования дискового пространства

4. Параллельная обработка

  • Многопоточное создание бэкапов
  • Параллельное восстановление
  • Оптимизация для многоядерных систем

Установка XtraBackup

Ubuntu/Debian

bash
# Добавление репозитория Percona
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb

# Обновление списка пакетов
sudo apt update

# Установка XtraBackup
sudo apt install percona-xtrabackup-80

CentOS/RHEL

bash
# Установка репозитория Percona
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

# Установка XtraBackup
sudo yum install percona-xtrabackup-80

Проверка установки

bash
# Проверка версии
xtrabackup --version

# Проверка доступных опций
xtrabackup --help

Полный резервный бэкап

Базовый полный бэкап

bash
# Создание полного бэкапа
xtrabackup --backup --target-dir=/backup/full/$(date +%Y%m%d_%H%M%S) \
  --user=backup --password=password

# С указанием хоста и порта
xtrabackup --backup --target-dir=/backup/full/$(date +%Y%m%d_%H%M%S) \
  --host=localhost --port=3306 --user=backup --password=password

Полный бэкап с дополнительными опциями

bash
# Полный бэкап с логированием
xtrabackup --backup \
  --target-dir=/backup/full/$(date +%Y%m%d_%H%M%S) \
  --user=backup --password=password \
  --log-file=/var/log/xtrabackup.log \
  --verbose=3

# Полный бэкап с исключением таблиц
xtrabackup --backup \
  --target-dir=/backup/full/$(date +%Y%m%d_%H%M%S) \
  --user=backup --password=password \
  --exclude-tables='^test\.temp_table$'

Подготовка полного бэкапа

bash
# Применение логов транзакций
xtrabackup --prepare --target-dir=/backup/full/20241201_120000

# Подготовка с дополнительными опциями
xtrabackup --prepare --target-dir=/backup/full/20241201_120000 \
  --use-memory=1G --apply-log-only

Инкрементальные бэкапы

Создание инкрементального бэкапа

bash
# Первый инкрементальный бэкап (относительно полного)
xtrabackup --backup \
  --target-dir=/backup/inc/inc1 \
  --incremental-basedir=/backup/full/20241201_120000 \
  --user=backup --password=password

# Второй инкрементальный бэкап (относительно предыдущего)
xtrabackup --backup \
  --target-dir=/backup/inc/inc2 \
  --incremental-basedir=/backup/inc/inc1 \
  --user=backup --password=password

Подготовка инкрементальных бэкапов

bash
# Подготовка полного бэкапа
xtrabackup --prepare --apply-log-only --target-dir=/backup/full/20241201_120000

# Применение первого инкрементального бэкапа
xtrabackup --prepare --apply-log-only \
  --target-dir=/backup/full/20241201_120000 \
  --incremental-dir=/backup/inc/inc1

# Применение второго инкрементального бэкапа
xtrabackup --prepare --apply-log-only \
  --target-dir=/backup/full/20241201_120000 \
  --incremental-dir=/backup/inc/inc2

# Финальная подготовка
xtrabackup --prepare --target-dir=/backup/full/20241201_120000

Сжатые бэкапы

Создание сжатого бэкапа

bash
# Сжатый бэкап с gzip
xtrabackup --backup --compress \
  --target-dir=/backup/compressed/$(date +%Y%m%d_%H%M%S) \
  --user=backup --password=password

# Сжатый бэкап с указанием уровня сжатия
xtrabackup --backup --compress --compress-threads=4 \
  --target-dir=/backup/compressed/$(date +%Y%m%d_%H%M%S) \
  --user=backup --password=password

Подготовка сжатого бэкапа

bash
# Распаковка сжатого бэкапа
xtrabackup --decompress --target-dir=/backup/compressed/20241201_120000

# Подготовка распакованного бэкапа
xtrabackup --prepare --target-dir=/backup/compressed/20241201_120000

Частичные бэкапы

Бэкап отдельных баз данных

bash
# Бэкап конкретной базы данных
xtrabackup --backup \
  --databases="database1 database2" \
  --target-dir=/backup/partial/$(date +%Y%m%d_%H%M%S) \
  --user=backup --password=password

# Бэкап с использованием регулярных выражений
xtrabackup --backup \
  --databases="^test.*" \
  --target-dir=/backup/partial/$(date +%Y%m%d_%H%M%S) \
  --user=backup --password=password

Бэкап отдельных таблиц

bash
# Бэкап конкретных таблиц
xtrabackup --backup \
  --tables="database1.table1 database2.table2" \
  --target-dir=/backup/partial/$(date +%Y%m%d_%H%M%S) \
  --user=backup --password=password

# Исключение таблиц
xtrabackup --backup \
  --exclude-tables="^test\.temp_.*" \
  --target-dir=/backup/partial/$(date +%Y%m%d_%H%M%S) \
  --user=backup --password=password

Полное восстановление

Восстановление из полного бэкапа

bash
# Остановка MySQL
sudo systemctl stop mysql

# Очистка директории данных
sudo rm -rf /var/lib/mysql/*

# Восстановление данных
xtrabackup --copy-back --target-dir=/backup/full/20241201_120000

# Установка правильных прав доступа
sudo chown -R mysql:mysql /var/lib/mysql

# Запуск MySQL
sudo systemctl start mysql

Восстановление с инкрементальными бэкапами

bash
# Остановка MySQL
sudo systemctl stop mysql

# Очистка директории данных
sudo rm -rf /var/lib/mysql/*

# Восстановление полного бэкапа
xtrabackup --copy-back --target-dir=/backup/full/20241201_120000

# Применение инкрементальных изменений
xtrabackup --copy-back --target-dir=/backup/inc/inc1
xtrabackup --copy-back --target-dir=/backup/inc/inc2

# Установка прав и запуск
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysql

Частичное восстановление

Восстановление отдельных баз данных

bash
# Создание временной директории
mkdir -p /tmp/restore

# Извлечение конкретных баз данных
xtrabackup --prepare --export \
  --target-dir=/backup/partial/20241201_120000

# Копирование файлов баз данных
cp /backup/partial/20241201_120000/database1/* /tmp/restore/

# Импорт в MySQL
mysql -u root -p database1 < /tmp/restore/database1.sql

Восстановление отдельных таблиц

bash
# Подготовка бэкапа для экспорта
xtrabackup --prepare --export \
  --target-dir=/backup/partial/20241201_120000

# Восстановление таблицы через ALTER TABLE
mysql -u root -p -e "
ALTER TABLE database1.table1 DISCARD TABLESPACE;
"

# Копирование файлов таблицы
cp /backup/partial/20241201_120000/database1/table1.ibd /var/lib/mysql/database1/
cp /backup/partial/20241201_120000/database1/table1.cfg /var/lib/mysql/database1/

# Импорт таблицы
mysql -u root -p -e "
ALTER TABLE database1.table1 IMPORT TABLESPACE;
"

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

Скрипт для ежедневного полного бэкапа

bash
#!/bin/bash
# daily_backup.sh

BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
FULL_BACKUP_DIR="$BACKUP_DIR/full/$DATE"
LOG_FILE="/var/log/xtrabackup.log"

# Создание директории
mkdir -p $FULL_BACKUP_DIR

# Создание полного бэкапа
xtrabackup --backup \
  --target-dir=$FULL_BACKUP_DIR \
  --user=backup --password=password \
  --log-file=$LOG_FILE \
  --verbose=3

# Подготовка бэкапа
xtrabackup --prepare --target-dir=$FULL_BACKUP_DIR

# Сжатие бэкапа
tar -czf $FULL_BACKUP_DIR.tar.gz -C $BACKUP_DIR/full $DATE
rm -rf $FULL_BACKUP_DIR

# Удаление старых бэкапов (старше 7 дней)
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete

echo "Backup completed: $FULL_BACKUP_DIR.tar.gz" >> $LOG_FILE

Скрипт для инкрементального бэкапа

bash
#!/bin/bash
# incremental_backup.sh

BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
INC_BACKUP_DIR="$BACKUP_DIR/inc/$DATE"
BASE_DIR="$BACKUP_DIR/full/latest"
LOG_FILE="/var/log/xtrabackup.log"

# Поиск последнего полного бэкапа
if [ ! -d "$BASE_DIR" ]; then
    echo "No base backup found. Creating full backup first."
    exit 1
fi

# Создание инкрементального бэкапа
xtrabackup --backup \
  --target-dir=$INC_BACKUP_DIR \
  --incremental-basedir=$BASE_DIR \
  --user=backup --password=password \
  --log-file=$LOG_FILE

echo "Incremental backup completed: $INC_BACKUP_DIR" >> $LOG_FILE

Мониторинг и проверка

Проверка целостности бэкапа

bash
# Проверка файлов бэкапа
xtrabackup --verify --target-dir=/backup/full/20241201_120000

# Проверка с подробным выводом
xtrabackup --verify --target-dir=/backup/full/20241201_120000 --verbose=3

Мониторинг процесса бэкапа

bash
# Мониторинг в реальном времени
tail -f /var/log/xtrabackup.log

# Проверка размера бэкапа
du -sh /backup/full/20241201_120000

# Проверка файлов в бэкапе
ls -la /backup/full/20241201_120000/

Оптимизация производительности

Настройка параметров

bash
# Бэкап с оптимизацией для SSD
xtrabackup --backup \
  --target-dir=/backup/optimized/$(date +%Y%m%d_%H%M%S) \
  --user=backup --password=password \
  --parallel=4 \
  --compress-threads=4 \
  --use-memory=2G

Настройка MySQL для XtraBackup

ini
# /etc/mysql/mysql.conf.d/xtrabackup.cnf
[mysqld]
# Включение бинарного логирования
log-bin=mysql-bin
binlog_format=ROW

# Настройки для InnoDB
innodb_file_per_table=1
innodb_flush_log_at_trx_commit=1

# Настройки для XtraBackup
innodb_buffer_pool_size=1G
innodb_log_file_size=256M

Решение проблем

Проблемы с правами доступа

bash
# Создание пользователя для бэкапа
mysql -u root -p -e "
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'secure_password';
GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
GRANT SELECT ON performance_schema.log_status TO 'backup'@'localhost';
GRANT SELECT ON performance_schema.keyring_component_status TO 'backup'@'localhost';
FLUSH PRIVILEGES;
"

Проблемы с местом на диске

bash
# Очистка старых бэкапов
find /backup -name "*.tar.gz" -mtime +30 -delete

# Сжатие существующих бэкапов
gzip /backup/full/20241201_120000/*.ibd

# Мониторинг использования диска
df -h /backup
du -sh /backup/*

Проблемы с производительностью

bash
# Ограничение использования ресурсов
xtrabackup --backup \
  --target-dir=/backup/limited/$(date +%Y%m%d_%H%M%S) \
  --user=backup --password=password \
  --throttle=100 \
  --parallel=2

Лучшие практики

1. Регулярное тестирование восстановления

bash
# Еженедельное тестирование восстановления
#!/bin/bash
TEST_DIR="/tmp/restore_test"
BACKUP_DIR="/backup/full/latest"

# Создание тестовой среды
mkdir -p $TEST_DIR
xtrabackup --prepare --target-dir=$BACKUP_DIR
xtrabackup --copy-back --target-dir=$BACKUP_DIR --target-dir=$TEST_DIR

# Проверка целостности
mysql -u root -p -e "CHECK TABLE test_database.test_table;"

2. Мониторинг и алерты

bash
# Скрипт проверки бэкапов
#!/bin/bash
LATEST_BACKUP=$(find /backup -name "*.tar.gz" -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-)
BACKUP_AGE=$(stat -c %Y $LATEST_BACKUP)
CURRENT_TIME=$(date +%s)
AGE_HOURS=$(( (CURRENT_TIME - BACKUP_AGE) / 3600 ))

if [ $AGE_HOURS -gt 24 ]; then
    echo "WARNING: Backup is older than 24 hours" | mail -s "Backup Alert" admin@example.com
fi

3. Резервное копирование конфигурации

bash
# Бэкап конфигурации MySQL
cp /etc/mysql/mysql.conf.d/*.cnf /backup/config/
cp /etc/mysql/my.cnf /backup/config/

# Бэкап пользователей и привилегий
mysql -u root -p -e "SELECT * FROM mysql.user;" > /backup/config/users.sql
mysql -u root -p -e "SELECT * FROM mysql.db;" > /backup/config/databases.sql

Заключение

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

Ключевые преимущества:

  • Горячие бэкапы без остановки сервиса
  • Инкрементальные копии для экономии места
  • Гибкое восстановление данных
  • Высокая производительность и надежность