Бэкап 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%';

Чек-лист

  1. Использовать --single-transaction для InnoDB.
  2. Проверить, нет ли MyISAM-таблиц.
  3. Создать отдельного пользователя для бэкапов.
  4. Сжимать дампы и добавлять дату в имя файла.
  5. Хранить копию вне основного сервера.
  6. Не класть дампы в публичную директорию.
  7. Удалять старые копии по правилу хранения.
  8. Регулярно проверять восстановление.

Бэкап MySQL без остановки сайта — обычная рабочая процедура, если она настроена аккуратно. Но настоящий критерий качества один: можно ли быстро и без сюрпризов восстановить базу из созданного файла.

Комментарии (0)

Пока нет комментариев. Будьте первым!