Перейти к содержимому
davidka.net > 💻 🧠 Код 1001 > Базы данных > Миграция с MySQL на MariaDB > ГЛАВА 11: Резервное копирование и восстановление

ГЛАВА 11: Резервное копирование и восстановление

  • автор:

Цель главы: Настроить надежную систему резервного копирования

← Предыдущая глава | Назад к оглавлению | Следующая глава →

1. Стратегия резервного копирования

1.1 Правило 3-2-1

3 копии данных
2 различных типа носителей
1 копия off-site (удаленная)

1.2 Типы бэкапов

ТипЧастотаRetentionМетод
ПолныйВоскресенье 02:004 неделиmariabackup
ИнкрементальныйЕжедневно 02:007 днейmariabackup
ЛогическийЕжедневно 03:007 днейmariadb-dump
Binary logsПостоянно7 днейКопирование

2. Автоматизация с mariabackup

2.1 Создание backup пользователя

CREATE USER 'backup'@'localhost' IDENTIFIED BY 'BackupPass123!';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
GRANT SELECT ON mysql.* TO 'backup'@'localhost';
FLUSH PRIVILEGES;

2.2 Скрипт полного бэкапа

#!/bin/bash
# mariabackup_full.sh

BACKUP_DIR="/backup/mariabackup"
DATE=$(date +%Y%m%d_%H%M%S)
FULL_BACKUP="$BACKUP_DIR/full_$DATE"
LOG_FILE="$BACKUP_DIR/backup.log"

mkdir -p "$FULL_BACKUP"

echo "[$(date)] Starting full backup..." | tee -a "$LOG_FILE"

mariabackup \
    --backup \
    --target-dir="$FULL_BACKUP" \
    --user=backup \
    --password=BackupPass123! \
    --parallel=4 \
    --compress \
    --compress-threads=4 \
    2>&1 | tee -a "$LOG_FILE"

if [ ${PIPESTATUS[0]} -eq 0 ]; then
    echo "[$(date)] Backup completed: $FULL_BACKUP" | tee -a "$LOG_FILE"

    # Создать маркер успешного бэкапа
    echo "$DATE" > "$BACKUP_DIR/last_full_backup.txt"

    # Архивирование (опционально)
    # tar -czf "${FULL_BACKUP}.tar.gz" -C "$BACKUP_DIR" "full_$DATE"
    # rm -rf "$FULL_BACKUP"
else
    echo "[$(date)] Backup FAILED!" | tee -a "$LOG_FILE"
    exit 1
fi

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

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

#!/bin/bash
# mariabackup_incremental.sh

BACKUP_DIR="/backup/mariabackup"
DATE=$(date +%Y%m%d_%H%M%S)

# Найти последний полный бэкап
LAST_FULL=$(cat "$BACKUP_DIR/last_full_backup.txt")
BASE_DIR="$BACKUP_DIR/full_$LAST_FULL"

if [ ! -d "$BASE_DIR" ]; then
    echo "❌ No full backup found! Run full backup first."
    exit 1
fi

INCR_DIR="$BACKUP_DIR/incr_$DATE"

echo "[$(date)] Starting incremental backup based on: $BASE_DIR"

mariabackup \
    --backup \
    --target-dir="$INCR_DIR" \
    --incremental-basedir="$BASE_DIR" \
    --user=backup \
    --password=BackupPass123! \
    --parallel=4 \
    --compress

if [ $? -eq 0 ]; then
    echo "[$(date)] Incremental backup completed: $INCR_DIR"
    echo "$DATE" > "$BACKUP_DIR/last_incr_backup.txt"
else
    echo "[$(date)] Incremental backup FAILED!"
    exit 1
fi

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

#!/bin/bash
# restore_incremental.sh

BACKUP_DIR="/backup/mariabackup"
FULL_BACKUP="$BACKUP_DIR/full_20251101_020000"
INCR_BACKUP="$BACKUP_DIR/incr_20251102_020000"

echo "[$(date)] Preparing full backup..."
mariabackup --prepare --apply-log-only --target-dir="$FULL_BACKUP"

echo "[$(date)] Applying incremental backup..."
mariabackup \
    --prepare \
    --apply-log-only \
    --target-dir="$FULL_BACKUP" \
    --incremental-dir="$INCR_BACKUP"

echo "[$(date)] Final prepare..."
mariabackup --prepare --target-dir="$FULL_BACKUP"

echo "[$(date)] Stopping MariaDB..."
sudo systemctl stop mariadb

echo "[$(date)] Backing up current data..."
sudo mv /var/lib/mysql /var/lib/mysql.old

echo "[$(date)] Restoring backup..."
mariabackup --copy-back --target-dir="$FULL_BACKUP"

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

echo "[$(date)] Starting MariaDB..."
sudo systemctl start mariadb

echo "✅ Restore completed!"

4. Point-in-time recovery

4.1 Сохранение binary logs

#!/bin/bash
# backup_binlogs.sh

BINLOG_DIR="/var/log/mysql"
BACKUP_DIR="/backup/binlogs"
DATE=$(date +%Y%m%d)

# Flush текущих binlogs
mariadb -u root -p -e "FLUSH BINARY LOGS;"

# Копировать старые binlogs
mkdir -p "$BACKUP_DIR/$DATE"
find "$BINLOG_DIR" -name "mariadb-bin.[0-9]*" -type f -mtime +1 \
    -exec cp {} "$BACKUP_DIR/$DATE/" \;

echo "Binary logs backed up to: $BACKUP_DIR/$DATE"

4.2 Восстановление на определенное время

#!/bin/bash
# point_in_time_recovery.sh

BINLOG_DIR="/backup/binlogs/20251101"
STOP_DATETIME="2025-11-01 14:30:00"

# 1. Восстановить из полного бэкапа
# (используйте restore_incremental.sh)

# 2. Применить binlogs до нужного времени
for binlog in "$BINLOG_DIR"/mariadb-bin.*; do
    echo "Applying: $binlog"
    mariadb-binlog \
        --stop-datetime="$STOP_DATETIME" \
        "$binlog" | mariadb -u root -p
done

echo "✅ Point-in-time recovery to $STOP_DATETIME completed"

5. Тестирование восстановления

5.1 Ежемесячный тест восстановления

#!/bin/bash
# test_restore_monthly.sh

TEST_DATE=$(date +%Y%m%d)
LATEST_BACKUP=$(ls -t /backup/mariabackup/full_* | head -1)

echo "=== Monthly Restore Test: $TEST_DATE ==="
echo "Using backup: $LATEST_BACKUP"

# 1. Создать тестовый контейнер
docker run -d --name mariadb-restore-test \
    -e MYSQL_ROOT_PASSWORD=testpass \
    -v "$LATEST_BACKUP":/backup \
    mariadb:10.11

# 2. Восстановить бэкап
docker exec mariadb-restore-test bash -c "
    systemctl stop mariadb
    rm -rf /var/lib/mysql/*
    mariabackup --copy-back --target-dir=/backup
    chown -R mysql:mysql /var/lib/mysql
    systemctl start mariadb
"

# 3. Проверить данные
RECORD_COUNT=$(docker exec mariadb-restore-test \
    mariadb -u root -ptestpass -N -e \
    'SELECT COUNT(*) FROM production_db.users;')

echo "Restored record count: $RECORD_COUNT"

# 4. Очистка
docker stop mariadb-restore-test
docker rm mariadb-restore-test

# 5. Отчет
cat > "/backup/test_reports/restore_test_$TEST_DATE.txt" << EOF
Restore Test Report
Date: $TEST_DATE
Backup: $LATEST_BACKUP
Record Count: $RECORD_COUNT
Status: SUCCESS
EOF

echo "✅ Test completed"

6. Disaster recovery

6.1 Disaster Recovery Plan

=== MariaDB Disaster Recovery Plan ===

RTO (Recovery Time Objective): 4 часа
RPO (Recovery Point Objective): 1 час

Шаги восстановления:

1. ОЦЕНКА (15 минут)
   - Определить масштаб проблемы
   - Найти последний валидный бэкап
   - Уведомить команду

2. ПОДГОТОВКА (30 минут)
   - Подготовить новый сервер (если нужно)
   - Загрузить бэкапы
   - Проверить целостность

3. ВОССТАНОВЛЕНИЕ (2 часа)
   - Восстановить из полного бэкапа
   - Применить инкрементальные бэкапы
   - Применить binlogs (point-in-time)

4. ПРОВЕРКА (1 час)
   - Проверить данные
   - Тест подключений
   - Smoke tests приложений

5. ПЕРЕКЛЮЧЕНИЕ (30 минут)
   - Обновить DNS/конфиги
   - Переключить трафик
   - Мониторинг

6.2 Скрипт автоматического DR

#!/bin/bash
# disaster_recovery.sh

BACKUP_SERVER="backup.company.com"
BACKUP_USER="backup"
LATEST_BACKUP_DIR="/backups/mariadb/latest"

echo "=== DISASTER RECOVERY INITIATED ==="
echo "Timestamp: $(date)"

# 1. Остановить проблемный сервер (если работает)
sudo systemctl stop mariadb

# 2. Загрузить последний бэкап с backup сервера
echo "[$(date)] Downloading latest backup..."
rsync -avz --progress \
    "$BACKUP_USER@$BACKUP_SERVER:$LATEST_BACKUP_DIR/" \
    /tmp/restore_backup/

# 3. Подготовить бэкап
echo "[$(date)] Preparing backup..."
mariabackup --prepare --target-dir=/tmp/restore_backup/

# 4. Восстановить
echo "[$(date)] Restoring data..."
sudo rm -rf /var/lib/mysql/*
mariabackup --copy-back --target-dir=/tmp/restore_backup/
sudo chown -R mysql:mysql /var/lib/mysql

# 5. Запустить MariaDB
echo "[$(date)] Starting MariaDB..."
sudo systemctl start mariadb

# 6. Проверка
echo "[$(date)] Verification..."
mariadb -u root -p -e "SELECT COUNT(*) FROM production_db.users;"

echo "✅ DISASTER RECOVERY COMPLETED"
echo "Please verify all data and applications"

Автоматизация (Cron)

# Добавить в crontab

# Полный бэкап каждое воскресенье в 2:00
0 2 * * 0 /usr/local/bin/mariabackup_full.sh

# Инкрементальный ежедневно в 2:00 (кроме воскресенья)
0 2 * * 1-6 /usr/local/bin/mariabackup_incremental.sh

# Binary logs каждый час
0 * * * * /usr/local/bin/backup_binlogs.sh

# Ротация старых бэкапов
0 3 * * * find /backup/mariabackup -type d -mtime +30 -exec rm -rf {} \;

# Ежемесячный тест восстановления
0 4 1 * * /usr/local/bin/test_restore_monthly.sh

Чек-лист

✅ Обязательные действия

  • [ ] Стратегия бэкапов определена
  • [ ] mariabackup настроен
  • [ ] Полные бэкапы автоматизированы
  • [ ] Инкрементальные бэкапы настроены
  • [ ] Binary logs сохраняются
  • [ ] Тестирование восстановления регулярное
  • [ ] Disaster Recovery Plan документирован
  • [ ] Off-site копии настроены

🔄 Проверки

  • [ ] Последний бэкап успешен
  • [ ] Тест восстановления пройден
  • [ ] Достаточно места для бэкапов
  • [ ] RTO/RPO соблюдаются

Следующий шаг

→ ГЛАВА 12: Мониторинг и обслуживание

В следующей главе:

  • Prometheus + Grafana
  • Alerting
  • Регулярное обслуживание
  • Performance monitoring

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *