Автоматический бэкап MySQL в Cron: запуск в 3 ночи и отправка в облако
Почему ручные бэкапы не работают?
Человеческий фактор — главная причина потери данных. Системные администраторы забывают делать копии перед сбоями. Автоматизация через планировщик Cron гарантирует наличие свежего ночного дампа каждый день.
Схема работы cron-скрипта
| Время | Действие | Инструмент |
|---|---|---|
| 03:00 | Создание дампа MySQL | mysqldump |
| 03:05 | Сжатие дампа в архив .gz | gzip |
| 03:10 | Загрузка в S3 / Яндекс Диск | rclone / aws cli |
Создание bash-скрипта и настройка планировщика
- Создаем скрипт резервного копирования:
sudo nano /usr/local/bin/mysql_backup.sh - Вставляем код скрипта:
#!/bin/bash BACKUP_DIR="/var/backups/mysql" DATE=$(date +"%Y-%m-%d_%H-%M") DB_USER="backup_user" DB_PASS="SecretPass123" DB_NAME="my_database" mkdir -p $BACKUP_DIR mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/db_$DATE.sql.gz # Удаляем бэкапы старше 7 дней локально: find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +7 -delete - Делаем скрипт исполняемым:
sudo chmod +x /usr/local/bin/mysql_backup.sh - Добавляем задачу в системный планировщик:
sudo crontab -e - Прописываем запуск каждую ночь в 03:00:
0 3 * * * /usr/local/bin/mysql_backup.sh > /dev/null 2>&1
Для отправки в S3 используйте бесплатную утилиту rclone, добавив в конец скрипта строку rclone copy $BACKUP_DIR remote:my-bucket/.
Частые вопросы (FAQ)
Что означает запись 0 3 * * * в cron?
0 минут, 3 часа ночи, каждый день месяца, каждый месяц, каждый день недели.
Как протестировать работу скрипта прямо сейчас?
Запустите его вручную: sudo /usr/local/bin/mysql_backup.sh и проверьте папку /var/backups/mysql.
Почему скрипт работает вручную, но не запускается в cron?
У cron урезанный PATH. Всегда указывайте абсолютные пути к утилитам (/usr/bin/mysqldump, /usr/bin/gzip).
Как создать отдельного пользователя MySQL только для бэкапов?
GRANT SELECT, LOCK TABLES, SHOW VIEW ON *.* TO 'backup_user'@'localhost' IDENTIFIED BY 'пароль';