Резервное копирование БД: Руководство по MySQL и PostgreSQL
Резервное копирование и восстановление MySQL и PostgreSQL с помощью mysqldump и pg_dump. Автоматические бэкапы через cron, процедуры восстановления и лучшие практики.
Содержание
Резервное копирование БД: Руководство по MySQL и PostgreSQL
Резервное копирование баз данных — одна из важнейших задач администрирования серверов. Регулярные бэкапы необходимы для восстановления после аппаратных сбоев, ошибок пользователей или кибератак. В этом руководстве рассматриваются процедуры резервного копирования и восстановления для MySQL и PostgreSQL.
Зачем нужно резервное копирование?
- Аппаратный сбой или повреждение диска
- Случайно удалённые данные
- Проблемы после обновления ПО
- Кибератаки или программы-вымогатели
- Копирование данных в среду разработки/тестирования
Без резервных копий потеря данных необратима. Следуйте правилу 3-2-1: 3 копии, 2 разных носителя, 1 удалённое хранилище.
Резервное копирование MySQL / MariaDB
Базовое резервное копирование с mysqldump
# Резервная копия одной базы данных
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
# Согласованная резервная копия для больших баз данных
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
# Восстановление из 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
Безопасное хранение учётных данных
# Создание ~/.my.cnf
nano ~/.my.cnf
[client]
user=root
password=ВАШ_ПАРОЛЬ
host=localhost
# Ограничение прав доступа к файлу
chmod 600 ~/.my.cnf
# Теперь можно использовать без ввода пароля
mysqldump имя_базы > backup.sql
Резервное копирование PostgreSQL
Базовое резервное копирование с pg_dump
# Резервная копия одной базы данных
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
# Восстановление из 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)
nano ~/.pgpass
# Формат: host:port:database:user:password
localhost:5432:*:postgres:ВАШ_ПАРОЛЬ
chmod 600 ~/.pgpass
Автоматическое резервное копирование с Cron
Скрипт автоматического резервного копирования MySQL
#!/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"
# Сделать скрипт исполняемым
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
Отправка резервных копий на удалённый сервер
# Копирование на удалённый сервер с 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/
Проверка резервных копий
# Проверка размера файла резервной копии
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;"
Регулярно тестируйте резервные копии. Резервная копия, которую нельзя восстановить, бесполезна. Выполняйте тестовое восстановление не реже одного раза в месяц.
Лучшие практики
- Регулярное резервное копирование: ежедневно или ежечасно для критических баз данных
- Сжатие: используйте gzip для экономии дискового пространства
- Удалённое хранение: храните резервные копии на другом сервере или в облаке
- Политика хранения: 7 ежедневных, 4 еженедельных, 12 ежемесячных резервных копий
- Шифрование: шифруйте резервные копии с конфиденциальными данными
- Мониторинг: уведомления по электронной почте при сбоях резервного копирования
- Тестирование: регулярно проверяйте резервные копии путём восстановления
Заключение
Регулярное резервное копирование баз данных — важнейшая защита от потери данных. Настроив автоматические скрипты резервного копирования для MySQL и PostgreSQL и храня резервные копии удалённо, вы сможете обеспечить безопасность данных на серверах REXE.
Связанные статьи
Подключение к VDS по SSH: PuTTY, терминал и SSH-ключи
Пошаговое руководство по SSH-подключению к Linux VDS: PuTTY, терминал, аутентификация по ключу, правило фильтрации Path Panel и советы по безопасности.
Подключение к Windows VDS по RDP: полное руководство
Пошаговое руководство по RDP-подключению к Windows Server VDS: настройка, безопасность NLA, правило фильтрации Path Panel и устранение неполадок.
Смена ОС VDS-сервера: пошаговое руководство (Reinstall)
Смена операционной системы VDS через панель REXE: советы по резервному копированию, поддерживаемые дистрибутивы Linux и версии Windows Server.