Перейти к основному содержимому
Вернуться в категорию

Резервное копирование БД: Руководство по MySQL и PostgreSQL

Резервное копирование и восстановление MySQL и PostgreSQL с помощью mysqldump и pg_dump. Автоматические бэкапы через cron, процедуры восстановления и лучшие практики.

Время чтения: 13 мин Управление сервером
mysqlpostgresqlрезервное копированиеdumprestorecronбаза данныхmysqldump

Содержание

Резервное копирование БД: Руководство по MySQL и PostgreSQL

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

Зачем нужно резервное копирование?

  • Аппаратный сбой или повреждение диска
  • Случайно удалённые данные
  • Проблемы после обновления ПО
  • Кибератаки или программы-вымогатели
  • Копирование данных в среду разработки/тестирования

Без резервных копий потеря данных необратима. Следуйте правилу 3-2-1: 3 копии, 2 разных носителя, 1 удалённое хранилище.

Резервное копирование MySQL / MariaDB

Базовое резервное копирование с mysqldump

hljs bash
# Резервная копия одной базы данных
mysqldump -u root -p имя_базы > backup.sql

# С паролем (для скриптов)
mysqldump -u root -pПАРОЛЬ имя_базы > backup.sql

# Резервная копия всех баз данных
mysqldump -u root -p --all-databases > all_databases.sql

# Резервная копия конкретных таблиц
mysqldump -u root -p имя_базы таблица1 таблица2 > tables.sql

# Сжатая резервная копия
mysqldump -u root -p имя_базы | gzip > backup_$(date +%Y%m%d).sql.gz

Расширенные параметры mysqldump

hljs bash
# Согласованная резервная копия для больших баз данных
mysqldump -u root -p \
  --single-transaction \
  --routines \
  --triggers \
  --events \
  имя_базы > full_backup.sql

# Только структура (без данных)
mysqldump -u root -p --no-data имя_базы > schema.sql

# Только данные (без структуры)
mysqldump -u root -p --no-create-info имя_базы > data.sql

# Резервная копия с удалённого сервера
mysqldump -h remote_server -u user -p имя_базы > remote_backup.sql

Восстановление MySQL

hljs bash
# Восстановление из SQL-файла
mysql -u root -p имя_базы < backup.sql

# Восстановление из сжатой резервной копии
gunzip -c backup.sql.gz | mysql -u root -p имя_базы

# Создание новой базы и восстановление
mysql -u root -p -e "CREATE DATABASE new_database;"
mysql -u root -p new_database < backup.sql

# Восстановление всех баз данных
mysql -u root -p < all_databases.sql

Безопасное хранение учётных данных

hljs bash
# Создание ~/.my.cnf
nano ~/.my.cnf
hljs ini
[client]
user=root
password=ВАШ_ПАРОЛЬ
host=localhost
hljs bash
# Ограничение прав доступа к файлу
chmod 600 ~/.my.cnf

# Теперь можно использовать без ввода пароля
mysqldump имя_базы > backup.sql

Резервное копирование PostgreSQL

Базовое резервное копирование с pg_dump

hljs bash
# Резервная копия одной базы данных
pg_dump -U postgres имя_базы > backup.sql

# Сжатый пользовательский формат (рекомендуется)
pg_dump -U postgres -Fc имя_базы > backup.dump

# Формат каталога (для параллельного восстановления)
pg_dump -U postgres -Fd имя_базы -f backup_dir/

# Резервная копия всех баз данных (включая роли)
pg_dumpall -U postgres > all_pg.sql

# Сжатая резервная копия
pg_dump -U postgres имя_базы | gzip > backup_$(date +%Y%m%d).sql.gz

Восстановление PostgreSQL

hljs bash
# Восстановление из SQL-формата
psql -U postgres имя_базы < backup.sql

# Восстановление пользовательского формата (.dump)
pg_restore -U postgres -d имя_базы backup.dump

# Параллельное восстановление (быстрее)
pg_restore -U postgres -d имя_базы -j 4 backup.dump

# Создание новой базы и восстановление
psql -U postgres -c "CREATE DATABASE new_database;"
pg_restore -U postgres -d new_database backup.dump

Доступ без пароля (.pgpass)

hljs bash
nano ~/.pgpass
# Формат: host:port:database:user:password
localhost:5432:*:postgres:ВАШ_ПАРОЛЬ
hljs bash
chmod 600 ~/.pgpass

Автоматическое резервное копирование с Cron

Скрипт автоматического резервного копирования MySQL

hljs bash
#!/bin/bash

# Конфигурация
DB_USER="root"
DB_PASS="ВАШ_ПАРОЛЬ"
DB_NAME="имя_базы"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# Создание директории для резервных копий
mkdir -p $BACKUP_DIR

# Создание резервной копии
mysqldump -u $DB_USER -p$DB_PASS \
  --single-transaction \
  --routines \
  --triggers \
  $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz

# Удаление старых резервных копий
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

echo "Резервное копирование завершено: ${DB_NAME}_${DATE}.sql.gz"
hljs bash
# Сделать скрипт исполняемым
chmod +x /root/scripts/mysql-backup.sh

# Добавить в crontab (каждую ночь в 02:00)
crontab -e
0 2 * * * /root/scripts/mysql-backup.sh >> /var/log/mysql-backup.log 2>&1

Отправка резервных копий на удалённый сервер

hljs bash
# Копирование на удалённый сервер с rsync
rsync -avz /var/backups/mysql/ user@remote-server:/backup/mysql/

# Отправка одного файла с scp
scp /var/backups/mysql/backup.sql.gz user@remote-server:/backup/

# Отправка в облачное хранилище с rclone (S3, Google Drive и т.д.)
rclone copy /var/backups/mysql/ remote:bucket-name/mysql/

Проверка резервных копий

hljs bash
# Проверка размера файла резервной копии
ls -lh /var/backups/mysql/

# Проверка путём восстановления в тестовую базу данных
mysql -u root -p -e "CREATE DATABASE test_restore;"
mysql -u root -p test_restore < backup.sql
mysql -u root -p -e "SHOW TABLES;" test_restore
mysql -u root -p -e "DROP DATABASE test_restore;"

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

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

  1. Регулярное резервное копирование: ежедневно или ежечасно для критических баз данных
  2. Сжатие: используйте gzip для экономии дискового пространства
  3. Удалённое хранение: храните резервные копии на другом сервере или в облаке
  4. Политика хранения: 7 ежедневных, 4 еженедельных, 12 ежемесячных резервных копий
  5. Шифрование: шифруйте резервные копии с конфиденциальными данными
  6. Мониторинг: уведомления по электронной почте при сбоях резервного копирования
  7. Тестирование: регулярно проверяйте резервные копии путём восстановления

Заключение

Регулярное резервное копирование баз данных — важнейшая защита от потери данных. Настроив автоматические скрипты резервного копирования для MySQL и PostgreSQL и храня резервные копии удалённо, вы сможете обеспечить безопасность данных на серверах REXE.