Ежедневный бэкап базы MySQL: dump, gzip и cron

У клиента «бэкапы есть» — в crontab пусто, свежих .sql.gz за месяц нет. Ниже — рабочий рецепт: ежедневный mysqldump, сжатие, retention и cron. Под Bitrix / обычный сайт на VPS с MySQL или MariaDB.

Серия «бэкап базы»

  1. Этот гайд — ежедневный dump
  2. Проверка дампа — gzip -t, размер, свежесть
  3. Restore по чеклисту — откат без паники

Отдельно: ловушка «дампы на том же диске» — dump есть, а при смерти диска теряете и прод, и бэкап.

Что нужно до старта

  • Root или sudo на VPS.
  • Отдельный MySQL-пользователь только на SELECT / dump (не root в cron).
  • Каталог под дампы с местом (лучше не тот же раздел, что data MySQL — см. гайд про диск).
  • Пароль не в git и не в открытом crontab: ~/.my.cnf с chmod 600.

Шаг 1 — пользователь для бэкапа

CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'СИЛЬНЫЙ_ПАРОЛЬ';
GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES, EVENT, ROUTINE ON bitrix.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
Имя БД подставьте своё (bitrix — пример). На MariaDB/MySQL 8 синтаксис GRANT может чуть отличаться — главное: хватает прав на dump без DROP/DELETE.

Шаг 2 — скачать скрипт

Готовый файл с комментариями:

Скачать mysql-backup-daily.sh →

Или собрать под свои имена БД/пути:

Сборщик скрипта бэкапа →

sudo mkdir -p /var/backups/mysql /usr/local/sbin
sudo curl -fsSL -o /usr/local/sbin/mysql-backup-daily.sh \
  https://mediops.ru/tools/scripts/mysql-backup-daily.sh
sudo chmod 750 /usr/local/sbin/mysql-backup-daily.sh

Шаг 3 — настроить переменные

В шапке скрипта или через env:

export DB_NAME=bitrix
export DB_USER=backup_user
export BACKUP_DIR=/var/backups/mysql
export KEEP_DAYS=14
export DEFAULTS_FILE=/root/.my.cnf

Пример ~/.my.cnf:

[client]
user=backup_user
password=СИЛЬНЫЙ_ПАРОЛЬ
host=127.0.0.1
chmod 600 ~/.my.cnf

Шаг 4 — пробный запуск

sudo -E /usr/local/sbin/mysql-backup-daily.sh
ls -lh /var/backups/mysql/
tail -20 /var/backups/mysql/backup.log

Должен появиться файл вида bitrix_20260731_030015.sql.gz, в логе — ok size=….

Если размер подозрительно маленький (<1–2 КБ) — dump пустой или ошибка авторизации. Смотрите stderr в логе.

Шаг 5 — cron

Ночью, когда нагрузка ниже (подстройте час под проект):

sudo crontab -e
# каждый день в 03:15
15 3 * * * DEFAULTS_FILE=/root/.my.cnf DB_NAME=bitrix /usr/local/sbin/mysql-backup-daily.sh
Ночной dump может поднять CPU/IO — если ловите алерты по нагрузке, см. ночной бэкап и нагрузка.

Postgres?

Логика та же: pg_dump → gzip → retention → cron. Команды другие; для Bitrix на VPS чаще MySQL/Maria — поэтому скрипты заточены под них.

Дальше обязательно

Dump без проверки — лотерея. Следующий шаг:

Проверка дампа: gzip -t, размер, свежесть →

И уметь откатить: restore по чеклисту →

Честно про Mediops

Мы не бэкапим вашу базу и не принимаем upload дампов. Бэкап — ваша ответственность + эти скрипты. Mediops заметит косвенно: диск 80%+, сайт недоступен — алерт в почту или мессенджер.

Диск растёт от дампов — увидите вовремя

Бесплатно: метрики VDS + email-алерты по диску и доступности сайта.