Скрипт автоматического создания бэкапов базы данных

Потеря данных из-за сбоя БД или ошибки администратора обходится бизнесу в среднем от 50 000 до 500 000 рублей за час простоя в зависимости от оборота. Надежный бэкап — это не просто дамп в соседнюю папку, а автоматизированная система с проверкой целостности и внешним хранением.

Почему стандартный mysqldump недостаточно

Многие используют простейший shell-скрипт с mysqldump, но при размере базы свыше 2 ГБ этот метод начинает тормозить систему, создавая высокую нагрузку на I/O и блокируя таблицы (table lock). В высоконагруженных проектах с 100+ RPS это приводит к «зависанию» сайта на 30-120 секунд.

Критическая ошибка — хранение бэкапа на том же SSD, где лежит сама БД. При выходе из строя дискового массива (RAID-0 или дешевый VPS без внешнего бэкапа) вы теряете и данные, и их копии. Практика показывает, что 15% администраторов обнаруживают битые дампы только в момент попытки восстановления, когда данные уже стерты.

Вывод: для баз более 1 ГБ необходимо использовать флаг --single-transaction для InnoDB, чтобы избежать блокировки таблиц, и обязательный экспорт в S3-совместимое хранилище.

Архитектура идеального PHP-скрипта бэкапа

Профессиональное решение должно работать по цепочке: Dump → Compress → Upload → Purge. Использование gzip или zstd сокращает объем дампа в 5-10 раз, что критично при передаче данных по сети. Например, БД на 10 ГБ сжимается до 1.2-1.8 ГБ, сокращая время передачи с 20 минут до 3.

Ключевой нюанс — управление памятью в PHP. Вместо загрузки файла в переменную через file_get_contents, используйте потоки (streams) или системный вызов exec(). Это позволяет обрабатывать файлы любого объема, не упираясь в limit_memory_limit в 128-256 МБ.

Вывод: используйте системные утилиты через PHP для тяжелых операций, а сам PHP оставьте для логики управления, уведомлений в Telegram и ротации файлов.

Сценарии хранения и стоимость ресурсов

Сравним три подхода к хранению бэкапов для проекта с БД 5 ГБ и ежедневным обновлением: 1) Локальный диск — бесплатно, но риск потери 100%; 2) FTP-сервер — дешево (от 200 руб/мес), но низкая скорость и слабая безопасность; 3) S3 (Selectel, AWS, DigitalOcean) — от 500 руб/мес, высокая надежность и API-интеграция.

Кейс: при переходе с FTP на S3-хранилище время создания и выгрузки бэкапа сократилось с 12 минут до 4 минут за счет многопоточной загрузки и оптимизации протокола. При этом вероятность потери данных снизилась с 5% до 0.01% благодаря избыточности хранилища.

Вывод: для коммерческих проектов S3 является единственным оправданным вариантом, так как стоимость хранения ничтожна по сравнению с риском потери данных.

Автоматизация через Cron и мониторинг

Скрипт бесполезен, если он перестал работать, а вы об этом не знаете. Стандартный Cron молча проглатывает ошибки. Необходимо внедрить систему уведомлений: если скрипт не прислал HTTP-запрос (webhook) в Telegram/Slack в течение 5 минут после старта, значит, бэкап не состоялся.

Оптимизация готовых PHP-скриптов в части бэкапов должна включать проверку свободного места на диске перед началом дампа. Если доступно менее 110% от размера БД, скрипт должен прервать операцию и отправить алерт, иначе сервер упадет из-за переполнения /tmp или корневого раздела.

Вывод: бэкап считается существующим только тогда, когда вы получили уведомление об успешном завершении и проверили контрольную сумму файла (MD5/SHA256).

Вывод

Для малых проектов (БД до 500 МБ) достаточно простого PHP-скрипта с mysqldump и выгрузкой на удаленный сервер по FTP. Для средних и крупных проектов (от 1 ГБ) требуйте использование --single-transaction, сжатие zstd и хранение в S3. Избегайте хранения бэкапов на том же сервере и никогда не полагайтесь на автоматику без системы внешнего мониторинга. Начните с настройки ежедневного дампа с ротацией за 7 дней и еженедельного полного архива за месяц.