Стратегия резервного копирования сайта: полное и инкрементное копирование, частота, места хранения и учебное восстановление

Резервное копирование сайта строится по принципу 3-2-1: 3 копии, 2 носителя, 1 копия вне офиса. Рекомендуемая частота: база данных — инкрементно каждые 4 часа, полный дамп ежедневно; файлы — инкрементно через rsync ежедневно, полная копия раз в неделю. Три уровня хранения: локально на сервере...

独立站备份:3-2-1原则与恢复演练Backup strategy: 3-2-1 rule and restore drills 没恢复过的备份等于没有备份 —— 备份策略一半是怎么存,一半是怎么恢复A backup you never restored is no backup at all — half the job is recovery 副本Copy 位置Location 频率Cadence 1 本地1. Local 服务器磁盘另一分区Another partition on server 每4小时增量 · 每日全量4h incremental, daily full 2 异地2. Offsite 异地对象存储 S3/OSSObject storage S3/OSS 每日同步 · 保留30天Daily sync, keep 30 days 3 冷备3. Cold Glacier/归档 · 季度全量Glacier archive, quarterly 反直觉判断:备份只存在同一台服务器上,等于没有备份 —— 服务器被黑时备份会一起被加密Counter-intuitive: on-server backups are useless — ransomware encrypts them too 3-2-1原则:3份副本、2种介质、1份异地,缺一不可3 copies, 2 media, 1 offsite — non-negotiable 红线:每季度必须做一次恢复演练,没恢复过的备份不算数Red line: quarterly restore drill — untested backups are not backups 真实事故里,超过40%的备份恢复失败是因为备份文件损坏或密码丢失40%+ of restores fail due to corrupt archives or lost keys 保留策略:每日30天 · 每周12周 · 每月12个月 · 每年3年Retention: 30 daily · 12 weekly · 12 monthly · 3 yearly 数据库用mysqldump加binlog,文件用rsync增量,恢复时间目标见灾难恢复一文mysqldump + binlog for DB; rsync incremental for files
Стратегия 3-2-1: три копии — локально, в объектном хранилище вне офиса и в холодном архиве

Стратегия резервного копирования сайта: полное и инкрементное копирование, частота, места хранения и учебное восстановление

Сначала вывод: Резервное копирование сайта строится по принципу 3-2-1: 3 копии, 2 носителя, 1 копия вне офиса. Рекомендуемая частота: база данных — инкрементно каждые 4 часа, полный дамп ежедневно; файлы — инкрементно через rsync ежедневно, полная копия раз в неделю. Три уровня хранения: другой раздел на сервере, объектное хранилище вне офиса (S3/OSS), холодный архив Glacier. Политика хранения: ежедневные копии — 30 дней, еженедельные — 12 недель, ежемесячные — 12 месяцев, ежегодные — 3 года. Контринтуитивный вывод: бэкап, который ни разу не восстанавливали, — это не бэкап. В реальных авариях больше 40% восстановлений из резервной копии заканчиваются неудачей из-за повреждённых файлов или потерянных ключей, поэтому раз в квартал нужно проводить учебное восстановление.

1. Что копировать: базу данных и файлы нужно резервировать отдельно

У сайта нужно резервировать две категории данных: базу данных и файлы. База данных — это содержимое WordPress: wp_posts, wp_options, wp_users. Файлы — это изображения, темы и код плагинов в wp-content/uploads. Эти две категории меняются с разной частотой и резервируются по-разному, поэтому общее копирование приведёт к проблемам.

Базу данных выгружайте через mysqldump или wp-cli, каждый раз с параметром –single-transaction, чтобы не блокировать таблицы и не влиять на работу сайта. Файлы синхронизируйте инкрементно через rsync — только изменившиеся части, не копируйте всё целиком каждый раз. Полное копирование каталога wp-content на 10 ГБ занимает больше десяти минут, а инкрементная синхронизация — несколько секунд.

Объект резервного копирования Частота изменений Рекомендуемые инструменты Способ резервного копирования
База данных MySQL Может меняться каждый час mysqldump или xtrabackup Инкремент binlog каждые 4 часа, полный дамп ежедневно
wp-content/uploads Новые изображения каждую неделю rsync Инкрементная синхронизация ежедневно
Код тем и плагинов Меняется несколько раз в месяц git или rsync Контроль версий, полная копия ежемесячно
wp-config.php Меняется крайне редко Хранить отдельно в менеджере паролей Копировать при каждом изменении
Конфигурация nginx/сайта Меняется несколько раз в месяц Управление через git Копировать при каждом изменении

Пример из практики: сайт промышленного оборудования на WordPress для выхода на зарубежные рынки, ежедневно добавляется 3–5 заявок и 2–3 фотографии продукции. База данных выгружается скриптом каждые 4 часа, файлы инкрементно синхронизируются через rsync в 3 часа ночи в объектное хранилище вне офиса. За неделю резервные копии базы занимают около 500 МБ, инкрементные копии файлов — около 200 МБ, общие расходы на хранение — меньше 20 рублей в месяц. Такая схема надёжнее любого платного плагина резервного копирования.

Как написать скрипт резервного копирования — та же логика, что и в Технологический стек crater тот же подход к автоматизации, что и в остальном администрировании: без GUI-плагинов, через cron и скрипты, а при сбое — оповещение.

2. Частота и политика хранения: чем чаще, тем не всегда лучше

Контринтуитивный вывод: чем чаще бэкап, тем лучше — это не так. Слишком частые бэкапы съедают много места и IO, а при восстановлении становится только хуже: перед вами куча почти одинаковых копий, и непонятно, какая из них чистая. Разумная частота зависит от скорости изменений в бизнесе: базу данных — раз в 4 часа, потому что заявки могут прийти в любой момент; файлы — раз в день, потому что картинки загружаются нечасто.

Стратегия хранения строится по схеме дед-отец-сын: ежедневные бэкапы храним 30 дней, еженедельные — 12 недель, ежемесячные — 12 месяцев, ежегодные — 3 года. Так вы сможете восстановить и статью, случайно удалённую вчера, и чистую версию полугодовой давности — до того, как сайт взломали.

Тип бэкапа Частота Срок хранения место хранения Зачем нужен
Полный бэкап базы Ежедневно в 3:00 30 дней Удалённое объектное хранилище Восстановление после случайного удаления
Инкрементный binlog базы данных Каждые 4 часа 7 дней Локально + удалённо Восстановление с точностью до минуты
Полный бэкап файлов Каждое воскресенье ночью 12 недель Удалённое объектное хранилище Откат на уровне недели
Инкрементный rsync файлов Ежедневно ночью 30 дней Удалённое объектное хранилище Откат на уровне дня
Ежемесячный архив 1-го числа каждого месяца 12 месяцев Холодный бэкап Glacier Ежемесячное соответствие и долгосрочное хранение
Ежегодный архив Каждый январь 3 года Холодный бэкап Glacier Ежегодный аудит и история

Пример из жизни: 15 марта днём на сайте для зарубежных рынков обнаружили, что в базу данных внедрён вредоносный код. Благодаря инкрементному бэкапу binlog базу можно восстановить на 12:00 15 марта — состояние до атаки, потеряв лишь половину дня заявок. Если бы был только ежедневный полный бэкап, восстановление откатило бы на 3:00 15 марта, и вы потеряли бы заявки за целый день. Вот в чём разница между инкрементом раз в 4 часа и полным бэкапом раз в день.

Три. Место хранения: принцип 3-2-1, удалённая копия обязательна

Принцип резервного копирования 3-2-1 означает: важные данные хранятся в 3 копиях, на 2 разных носителях, и 1 копия находится в удалённом месте. Это не теория, а вывод из бесчисленных случаев с программами-вымогателями. В реальных авариях злоумышленники шифруют сервер и заодно локальные бэкапы — потому что бэкап и сайт лежат на одной машине.

Как выбрать из трёх уровней хранения: первый — локальный бэкап, на другом дисковом разделе сервера, восстанавливается быстрее всего, но хуже всего защищает от рисков; второй — удалённое объектное хранилище, AWS S3 или Alibaba Cloud OSS, с резервированием между зонами доступности, не боится падения одного сервера; третий — холодный архив, S3 Glacier или архив OSS, дёшево, но восстанавливается медленно, для ежегодного соответствия и долгосрочного хранения.

Уровень хранения Позиция Скорость восстановления Затраты Основное назначение
Локальный бэкап на диск Другой раздел сервера Секунды 0 ₽ Быстрое повседневное восстановление
Удалённое объектное хранилище S3/OSS между зонами Минуты Около 0,02 ₽/ГБ/мес. Основной бэкап, ежедневная синхронизация
Холодный архив Архив Glacier/OSS От часов до дней Около 0,005 ₽/ГБ/мес. Ежегодное соответствие и долгосрочное хранение
Офлайн-носитель Локальный диск/лента Физическое извлечение диска Разовая стоимость диска Подстраховка на случай крайнего вымогательства

Контринтуитивное напоминание: не храните резервные копии в веб-каталоге. Многие кладут бэкапы в wp-content/backup/, думая, что так надёжнее, но на самом деле атакующий находит этот путь и просто скачивает файлы — имена базы данных и таблиц утекают целиком. Правильно: хранить бэкапы вне корня сайта либо после создания автоматически загружать их в объектное хранилище и удалять локальную копию. Про очистку после взлома читайте После взлома сайта.

и Глобальное ускорение CDN Важно учитывать: кэш CDN — это не резервная копия. Он лишь копирует статический контент на периферийные узлы, а если origin упал, кэш CDN тоже устареет. Не считайте кэш CDN решением для аварийного восстановления.

Четвёртое: учебное восстановление — раз в квартал, чтобы убедиться, что бэкап действительно рабочий

Самый недооценённый этап стратегии резервного копирования — учебное восстановление. У многих компаний скрипты бэкапа работают год, но восстановление не проводилось ни разу, и только при аварии выясняется, что файлы повреждены, пароль от архива забыт или процесс восстановления вообще не работает. В реальных инцидентах более 40% восстановлений из бэкапа заканчиваются неудачей, и причины всегда из этих трёх категорий.

Как проводить учебное восстановление: раз в квартал выбирайте окно обслуживания, выгружайте свежий бэкап из удалённого объектного хранилища, разворачивайте его в совершенно новой тестовой среде и прогоняйте весь процесс — «восстановить файлы, импортировать базу данных, настроить nginx, открыть сайт, проверить отправку формы заявки». Засеките время и зафиксируйте фактические RTO (целевое время восстановления) и RPO (объём потерянных данных). Как определять RTO/RPO, читайте 独立站灾难恢复与RTO/RPO定义.

Шаги учебного восстановления Действие Критерии приёмки Частые точки отказа
1. Получить резервную копию Скачать последний полный и инкрементальный бэкап из S3 Скачивание завершено за 5 минут Учётные данные объектного хранилища истекли
2 Проверка распаковки tar -tzf выводит список файлов Количество файлов полное, повреждений нет Архив gzip повреждён, проверка не проводилась
3 Восстановление файлов Распаковать в веб-каталог тестовой среды Права корректны: 755/644 Права потеряны, сайт показывает белый экран
4 Импорт базы данных mysql < backup.sql Количество таблиц совпадает с продакшеном Неверная кодировка, китайский текст превращается в кракозябры
5 Настройка nginx Скопировать конфигурацию и сменить порт Домен открывается Правила ЧПУ потеряны
6 Проверка функций Пройти отправку формы заявки Письмо получено, запись попала в CRM Пароль SMTP прописан в конфигурации жёстко

Пример из практики: команда полгода не проводила учебное восстановление, диск сервера вышел из строя, и только тогда они полезли за удалённым бэкапом. Распаковка оборвалась на середине с ошибкой — оказалось, три месяца назад в скрипте бэкапа был неверный параметр gzip, и все копии за последующие два месяца повреждены. В итоге восстановились из более раннего чистого бэкапа и потеряли два месяца контента. Такой инцидент выявился бы заранее, если запускать учебное восстановление раз в квартал.

Как настроить мониторинг бэкапов, читайте Мониторинг сайта и оповещения: при сбое задачи бэкапа отправлять оповещение в WeCom, при резком падении размера файла бэкапа — оповещение, при возрасте бэкапа более 24 часов — оповещение. Список для ежедневного обслуживания смотрите Шесть задач на месяц в период обслуживания сайта.

FAQ: частые вопросы

独立站备份用什么插件,UpdraftPlus够吗?
Бесплатной версии UpdraftPlus достаточно: она умеет делать резервные копии базы данных и файлов отдельно и синхронизировать их напрямую с S3, Dropbox и Google Drive. Но у плагина есть два ограничения: во-первых, резервное копирование занимает веб-процессы и в часы пик замедляет сайт; во-вторых, если файлы бэкапа лежат в веб-каталоге, их скачают сканеры. Надёжнее делать бэкап на уровне сервера — скриптом из mysqldump и rsync, запускать его по cron, а после завершения автоматически загружать копию в удалённое объектное хранилище и удалять локальную. Оба способа можно совмещать: плагин — для быстрого восстановления, скрипт — для основного бэкапа.
Какую частоту резервного копирования выбрать, нужно ли делать бэкап каждый час?
Не нужно. На B2B-сайтах заявки и контент меняются не так часто. Рекомендую для базы данных инкрементный binlog каждые 4 часа плюс ежедневный полный dump, для файлов — ежедневный инкрементный rsync плюс полный бэкап раз в неделю. Тогда при обычном восстановлении вы потеряете максимум 4 часа данных, а в крайнем случае по binlog восстановите с точностью до минуты. Бэкап каждый час нужен, только если у вас интернет-магазин, где заказы появляются ежеминутно. Слишком частые бэкапы занимают много места и ресурсов диска, а при восстановлении вы ещё и не будете знать, какую копию выбрать.
Как применить принцип резервного копирования 3-2-1 на практике?
Три копии: первая — на другом локальном разделе диска сервера, восстанавливается быстрее всего; вторая — в удалённом объектном хранилище, например S3 или Alibaba Cloud OSS, в другой зоне доступности; третья — в холодном архиве, например Glacier, для долгого хранения. Два носителя: локальный диск и облачное хранилище считаются двумя. Одна копия вне площадки: облачное хранилище должно быть не в том же дата-центре или у того же облачного провайдера, что и исходный сайт, лучше в другой зоне доступности. Нужны все три уровня, ни один нельзя пропускать. При атаке шифровальщика сайты, у которых бэкап был только локально, почти все погибают: файлы резервных копий шифруются вместе с остальными.
Как проводить учения по восстановлению и как часто?
Раз в квартал. Порядок такой: берём последнюю полную копию из удалённого объектного хранилища, восстанавливаем её в новой тестовой среде и проходим весь путь — распаковываем файлы, импортируем базу данных, настраиваем nginx, открываем сайт, отправляем тестовую заявку по почте и проверяем, что CRM её получила. Засекаем время всего процесса, фиксируем фактическое время восстановления и объём потерянных данных. В реальных авариях больше 40% восстановлений из бэкапа срывается из-за повреждённых файлов копии или потерянных ключей, и обнаружить это можно, только реально восстановив сайт хотя бы раз.
Нужно ли шифровать файлы резервных копий и как хранить ключи?
Обязательно шифруйте бэкапы, особенно дампы базы данных — в них заявки, данные клиентов и пароль от базы из wp-config.php. Шифруйте файлы бэкапов через gpg или openssl, а пароль храните в менеджере паролей, не в скрипте резервного копирования. Потеря ключа равносильна отсутствию бэкапа: архив просто не откроется. Заведите два ключа: один для повседневной работы, второй для архива, а архивный ключ распечатайте на бумаге и держите под замком в ящике. На стороне объектного хранилища включите серверное шифрование — для надёжности.
Как узнать, что скрипт резервного копирования упал, и как настроить оповещения?
Задачами резервного копирования нужно следить. Три правила оповещений: первое — если код завершения задачи не 0, отправляйте оповещение; второе — если размер файла бэкапа упал более чем на 30% по сравнению с предыдущим днём, оповещайте: возможно, подключение к базе данных не удалось и бэкап пустой; третье — если последний бэкап старше 24 часов, оповещайте: значит, скрипт не запускался. Каналы оповещений — WeCom или почта, не ограничивайтесь локальным логом: если сервер упадёт, вы его тоже не увидите. Как построить систему мониторинга, читайте Мониторинг сайта и оповещения в статье.

В заключение

В резервном копировании хуже всего установка плагина с мыслью, что на этом всё. Плагин работает каждый день, файлы бэкапов создаются каждый день, но восстановление ни разу не проводилось — и когда случается авария, выясняется, что бэкап повреждён, пароль потерян, а процесс не работает. Стратегия резервного копирования наполовину о том, как хранить, а наполовину о том, как восстанавливать, — и второе в десять раз важнее первого.

Три шага к внедрению: первый — выстройте три уровня резервного копирования по принципу 3-2-1: локальная копия, удалённое объектное хранилище и холодный архив; второй — определите частоту и политику хранения: для базы данных инкрементный бэкап каждые 4 часа плюс ежедневный полный, для файлов ежедневный инкрементный, хранение от 30 дней до 3 лет; третий — раз в квартал проводите учения по восстановлению, полностью проходите процесс восстановления в тестовой среде и фиксируйте фактические RTO и RPO. Только после этих трёх шагов вы можете сказать, что у вас есть бэкапы.

Запомните одну фразу: бэкап, который ни разу не восстанавливали, равен отсутствию бэкапа — год работы скрипта резервного копирования не стоит одного полного учения по восстановлению, а в реальных авариях 40% бэкапов в решающий момент не открываются.

crater
crater Эксперт Crater

Официальный аккаунт организации · crater Crater

环形山 (Crater) — компания, которая помогает выходить на зарубежные рынки: разработка сайтов на WordPress, Google SEO и комплексный рост в GEO. Мы работаем с умными устройствами, промышленным оборудованием, SaaS и новой энергетикой.

Возможности продуктаБелая книга по методологииОтраслевые отчёты
965篇分享
78статей в базе знаний