Горячий бэкап MySQL с Percona XtraBackup
В отличие от mysqldump, Percona XtraBackup создаёт резервные копии InnoDB без блокировки таблиц и остановки сервера. Незаменим для баз данных от 10 ГБ.
Установка XtraBackup
# Для Ubuntu/Debian (MySQL 8.0)
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
dpkg -i percona-release_latest.generic_all.deb
percona-release setup pdps-80
apt update && apt install percona-xtrabackup-80Полный бэкап
# Создание полного бэкапа
xtrabackup --backup \
--user=root \
--password='YourPass' \
--target-dir=/backup/full
# Подготовка бэкапа к восстановлению
xtrabackup --prepare --target-dir=/backup/fullИнкрементальный бэкап
# Инкрементальный бэкап на основе полного
xtrabackup --backup \
--user=root \
--password='YourPass' \
--target-dir=/backup/inc1 \
--incremental-basedir=/backup/full
# Подготовка: сначала базовый, потом инкрементальный
xtrabackup --prepare --apply-log-only --target-dir=/backup/full
xtrabackup --prepare --apply-log-only \
--target-dir=/backup/full \
--incremental-dir=/backup/inc1
# Финальная подготовка
xtrabackup --prepare --target-dir=/backup/fullВосстановление из бэкапа
# Остановить MySQL
systemctl stop mysql
# Очистить datadir
rm -rf /var/lib/mysql/*
# Скопировать данные
xtrabackup --copy-back --target-dir=/backup/full
# Установить права
chown -R mysql:mysql /var/lib/mysql
# Запустить MySQL
systemctl start mysqlАвтоматизация через cron
#!/bin/bash
# /etc/cron.d/xtrabackup — каждое воскресенье полный, остальные дни инкремент
DATE=$(date +%Y%m%d)
BACKUP_DIR=/backup
if [ $(date +%u) -eq 7 ]; then
# Полный бэкап
xtrabackup --backup --user=root --password='Pass' \
--target-dir=$BACKUP_DIR/full_$DATE
else
# Инкрементальный
LAST_FULL=$(ls -td $BACKUP_DIR/full_* | head -1)
xtrabackup --backup --user=root --password='Pass' \
--target-dir=$BACKUP_DIR/inc_$DATE \
--incremental-basedir=$LAST_FULL
fiСовет: Сжимайте бэкапы флагом
--compress и шифруйте с --encrypt=AES256 перед передачей на удалённое хранилище.