Бэкап MySQL без остановки сайта: практический минимум
Резервную копию MySQL часто делают только перед большой правкой. Это лучше, чем ничего, но для рабочего сайта нужен регулярный и проверяемый процесс. Хороший бэкап можно сделать без остановки сайта, если база использует InnoDB и команда подобрана аккуратно.
Главное — помнить, что бэкап полезен только тогда, когда его можно восстановить. Сам факт наличия файла database.sql.gz ещё ничего не гарантирует.
mysqldump с single-transaction
Для InnoDB обычно используют --single-transaction. Он позволяет получить согласованный дамп без остановки сайта и без долгой блокировки таблиц на запись.
mysqldump --single-transaction --routines --triggers \
-u backup_user -p database_name | gzip > database_$(date +%F_%H-%M).sql.gz
Если в базе есть MyISAM-таблицы, поведение будет другим. Их лучше найти заранее.
SELECT table_name, engine
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND engine != 'InnoDB';
Отдельный пользователь для бэкапа
Не стоит делать бэкапы от root-пользователя MySQL без необходимости. Лучше создать отдельного пользователя с минимальными правами.
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'strong-password';
GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES ON database_name.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
Набор прав зависит от структуры базы и параметров дампа. Главное — не использовать лишние административные права там, где достаточно чтения.
Сжатие и имя файла
Дамп без сжатия может занимать много места. Лучше сразу сжимать и давать файлу понятное имя с датой.
database_2026-06-18_09-00.sql.gz
После создания нужно проверить размер файла. Нулевой или подозрительно маленький архив — сигнал ошибки.
ls -lh database_*.sql.gz
Где хранить бэкап
Единственная копия на том же сервере — слабая защита. Если сервер потерян или диск умер, бэкап исчезнет вместе с сайтом. Минимально нужна копия вне основного сервера.
- отдельный backup-сервер;
- объектное хранилище;
- закрытый облачный диск;
- локальный архив плюс внешняя копия.
Нельзя хранить дампы в публичной директории сайта. Файл dump.sql.gz рядом с index.php — частая и опасная ошибка.
Автоматизация через cron
Пример ежедневного бэкапа:
0 3 * * * /usr/local/bin/backup-mysql.sh >> /var/log/mysql-backup.log 2>&1
Скрипт должен писать лог результата: создан файл, размер, ошибка, время выполнения. Иначе cron может падать неделями незаметно.
Удаление старых копий
Если старые бэкапы не удалять, они сами заполнят диск.
find /backup/mysql -type f -name "*.sql.gz" -mtime +14 -delete
Срок хранения выбирается под проект. Для небольших сайтов часто достаточно ежедневных копий за 14-30 дней и отдельных архивов перед крупными релизами.
Проверка восстановления
Самая важная часть — тестовое восстановление. Его можно делать на отдельной базе или тестовом сервере.
createdb test_restore
gunzip < database_2026-06-18_09-00.sql.gz | mysql -u user -p test_restore
После восстановления нужно открыть сайт на тестовой копии или хотя бы проверить количество таблиц и выборочные данные.
Кодировка
Если проект старый, нужно внимательно проверить кодировку дампа и подключения. После восстановления не должно появиться битых русских символов.
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
Чек-лист
- Использовать --single-transaction для InnoDB.
- Проверить, нет ли MyISAM-таблиц.
- Создать отдельного пользователя для бэкапов.
- Сжимать дампы и добавлять дату в имя файла.
- Хранить копию вне основного сервера.
- Не класть дампы в публичную директорию.
- Удалять старые копии по правилу хранения.
- Регулярно проверять восстановление.
Бэкап MySQL без остановки сайта — обычная рабочая процедура, если она настроена аккуратно. Но настоящий критерий качества один: можно ли быстро и без сюрпризов восстановить базу из созданного файла.
Комментарии (0)
Пока нет комментариев. Будьте первым!