Перейти к содержимому
Почта Личный кабинет Выбрать тариф

Бэкап сайта на хостинге: правило 3-2-1, инструменты и проверка восстановления

Бэкап сайта на хостинге: правило 3-2-1, инструменты и проверка восстановления

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

Как мы проверяли

10 ноября 2026 года на тестовом стенде: контейнер Ubuntu 24.04.5 (2 vCPU, 8 ГБ RAM), nginx 1.24.0, PHP-FPM 8.3.6, два отдельных экземпляра MariaDB 10.11.14, WordPress 6.4.3 с 6001 записью, 450 фотографиями (330 МБ) и таблицей логов на 1,5 млн строк; дамп базы занимал 404 МБ. Мы снимали дампы во время непрерывной записи «заказов», сравнивали gzip, zstd и xz, делали копии restic 0.16.4 в отдельный каталог, игравший роль удалённого хранилища, имитировали потерю диска и восстанавливали сайт в чистый экземпляр MariaDB. Это поведение тестового сервера, а не данные с серверов RichHost.

Правило 3-2-1 для сайта на хостинге

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

К правилу стоит добавить ещё два условия, без которых оно не работает. Копии должны храниться несколько дней или недель, а не только последняя, потому что взлом или повреждение сайта можно заметить не сразу. И каждую схему нужно хотя бы раз проверить восстановлением, иначе вы не знаете, есть ли у вас бэкап вообще.

Что бэкапить, чем, как часто и как проверять

Что бэкапить Чем Как часто Как проверять
База данных (записи, заказы, пользователи, настройки) mariadb-dump или mysqldump с --single-transaction, затем zstd Ежедневно; для магазина несколько раз в день Последняя строка дампа «Dump completed», zstd -t, пробный импорт и подсчёт записей
Uploads: фото, PDF, файлы клиентов tar + zstd -3 или restic Ежедневно или после каждой крупной загрузки Количество файлов в копии, открытие нескольких случайных картинок после восстановления
Код: ядро, темы, плагины tar + zstd, git для собственной темы Перед каждым обновлением Сайт открывается из копии с кодом 200, вход в админку работает
Конфигурация: wp-config.php, .htaccess, cron-задачи Вместе с файлами; список cron-задач отдельным текстовым файлом После каждого изменения Файлы есть в архиве, задачи совпадают с текущими
Почта, DNS-записи Экспорт зоны DNS в текстовый файл, почта средствами почтового клиента или панели Раз в месяц и после изменений Зону можно сравнить с текущей через dig

Таблицы логов, статистики и кеша плагинов часто весят больше всего контента. На стенде таблица логов давала примерно 350 МБ из 404 МБ дампа. Если её чистить, копии становятся меньше и быстрее; подробнее об этом в разборе оптимизации базы данных на хостинге.

База данных: почему важен --single-transaction

Мы запускали скрипт, который непрерывно создавал «заказы»: одна строка в wp_posts и четыре строки в wp_postmeta в одной транзакции, около 45 заказов в секунду. Через две секунды стартовал дамп в трёх режимах.

Режим дампа Заказов без данных в копии Самое долгое ожидание записи
Без блокировок (--skip-lock-tables), 3 запуска 3, 7 и 5 0,17 с
Настройки по умолчанию (--lock-tables) 0 3,84 с: все записи стояли, пока шёл дамп
--single-transaction --quick, 3 запуска 0, 0 и 0 0,18 с

Без блокировок дамп читает таблицы по очереди: wp_postmeta раньше, чем wp_posts. Заказы, сохранённые между этими двумя чтениями, попали в копию без суммы, почты и способа оплаты. Такой дамп импортируется без ошибок, и проблема видна только тогда, когда клиент спрашивает о своём заказе. Режим по умолчанию копию не портит, но на время дампа останавливает запись: на большой базе это минуты, когда магазин не может принять заказ. --single-transaction снимает согласованный снимок InnoDB без блокировки. На таблицах MyISAM он не помогает, поэтому старые таблицы стоит перевести на InnoDB.

mariadb-dump --single-transaction --quick --default-character-set=utf8mb4 wp > db.sql
tail -1 db.sql
-- Dump completed on 2026-11-10 14:51:46

Без нагрузки оба режима работали одинаково: 3,2-3,9 секунды на 404 МБ. Разница проявляется только тогда, когда в базу пишут, то есть как раз в рабочее время магазина.

Файлы: чем сжимать архив

Каждый компрессор работал в один поток на одних и тех же данных.

Компрессор Файлы сайта, 388 МБ Дамп базы, 404 МБ
gzip -6 16,6 с, 341,7 МБ (88%) 9,2 с, 85,9 МБ (21%)
zstd -3 1,5 с, 343,4 МБ (88%) 1,9 с, 79,8 МБ (20%)
zstd -19 149,4 с, 333,8 МБ (86%) 350,1 с, 64,8 МБ (16%)
xz -6 207,2 с, 335,0 МБ (86%) 289,3 с, 64,3 МБ (16%)

Фото в формате JPEG уже сжаты, поэтому архив файлов почти не уменьшается, каким бы компрессором вы ни пользовались. Дамп базы сжимается в пять раз. zstd -3 показал лучшее соотношение: в 5-11 раз быстрее gzip и чуть меньший файл. Максимальные уровни zstd и xz сэкономили ещё около 15 МБ на дампе ценой пяти минут процессорного времени; на общем хостинге это лишняя нагрузка.

Инкрементные копии: что даёт дедупликация restic

restic и borg делят данные на фрагменты и сохраняют только новые. Первая копия сайта с дампом весила 791 МБ (в хранилище 427 МБ, потому что restic сжимает данные). Что было дальше:

  • Добавили одну запись, одно фото на 454 КБ и 20 заказов: вторая копия добавила 4,6 МБ.
  • Удалили 1000 самых старых строк таблицы логов, как это делают плагины при чистке: третья копия добавила 359,6 МБ, почти весь дамп.
  • То же изменение, но дамп с одной строкой на INSERT (--skip-extended-insert): добавилось 7,6 МБ.
График со стенда: первая копия restic 791 МБ, следующая после новой записи 4,6 МБ, после чистки логов 359,6 МБ, а с дампом по строке на INSERT 7,6 МБ
Сколько данных добавила каждая следующая копия restic на тестовом стенде

Причина в том, что обычный дамп упаковывает сотни строк в одну команду INSERT. Удаление строк в начале таблицы сдвигает границы всех следующих команд, и для restic весь дальнейший файл выглядит новым. Дамп с отдельной строкой на INSERT дедуплицируется хорошо, но у этого есть цена: на стенде он импортировался 507 секунд против 35. Если копии лежат в хранилище с оплатой за объём, а восстановление случается редко, такой обмен оправдан; если важна скорость восстановления, оставьте обычный дамп и храните меньше версий. Для borg мы этих замеров не делали: в контейнере стенда он не запустился из-за несовместимой версии Python, поэтому цифры относятся только к restic.

export RESTIC_REPOSITORY=sftp:backup@storage.example.net:/restic
export RESTIC_PASSWORD_FILE=~/.restic-pass
restic init
restic backup ~/backup/db.sql ~/web/example.com/public_html
restic forget --keep-daily 14 --keep-weekly 8 --prune
restic check

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

Пробное восстановление: как проверить, что копия работает

Мы воспроизвели худший случай: остановили базу, удалили весь каталог «сервера» вместе с локальными копиями и восстановили сайт из копии restic в новый экземпляр MariaDB с пустой папкой сайта.

restic restore latest --target /srv/restore
Summary: Restored 3523 files/dirs (789.971 MiB) in 0:02
mariadb -e "CREATE DATABASE wp"
mariadb wp < db.sql
curl -s -o /dev/null -w "%{http_code}\n" http://bench.test:8122/
200
curl -sI "http://bench.test:8122/wp-json/wp/v2/posts?per_page=1" | grep -i x-wp-total
X-WP-Total: 6002

От запуска до ответа 200 прошло 23 секунды: 4 на файлы, 19 на импорт базы. Количество записей, заказов и наибольший ID совпали с рабочим сайтом, новое фото отдалось с той же контрольной суммой, кириллица в заголовках не пострадала. Первая попытка, кстати, провалилась из-за нашей же ошибки: restic сохранил пути так, как мы их передали, и файлы развернулись не в ту папку, которую ждал скрипт. Именно такие мелочи и показывает пробное восстановление.

Минимальная проверка, которую стоит делать раз в месяц:

  1. Проверьте целостность архивов: zstd -t, gzip -t или restic check.
  2. Убедитесь, что дамп заканчивается строкой «Dump completed».
  3. Импортируйте дамп в отдельную тестовую базу и сравните количество записей, заказов и пользователей с рабочим сайтом.
  4. Разверните файлы на тестовом поддомене, проверьте код 200, вход в админку и несколько старых картинок.
  5. Запишите, сколько времени это заняло: это ваше реальное время восстановления.

По сути, это та же процедура, что и перенос WordPress на другой хостинг, только без переключения домена.

Четыре сбоя, которые мы воспроизвели на стенде

Копия без каталога uploads

Архив, сделанный с --exclude=wp-content/uploads, весил 15 МБ вместо 361 МБ. После восстановления главная страница отвечала 200, REST API показывал все 6002 записи, но каждое фото давало 404: в базе 450 вложений, в папке 0 файлов. Такой сайт выглядит живым, пока вы не откроете любую запись. Каталог uploads часто исключают, чтобы копия поместилась в лимит, поэтому проверяйте количество файлов в копии.

Копии только на том же сервере

После удаления каталога «сервера» вместе с сайтом исчезли и дамп, и архив файлов, и контрольные суммы, лежавшие рядом: No such file or directory. Сайт спасла только копия в отдельном хранилище. К тому же архивы на сервере нельзя держать в корневой папке сайта: их можно скачать по прямой ссылке. Для каталога с копиями достаточно прав доступа 700 и 600 на файлы.

Обрезанный файл

Копия, оборванная на 60% (переполненный диск или прерванная передача), не проходит zstd -t: «Read error (39) : premature end»; gzip пишет «unexpected end of file». Хуже с несжатым дампом: импорт остановился с ERROR 1064, но перед этим успел создать 7 таблиц из 13 и 3825 строк wp_posts из 9304. Таблиц пользователей и рубрик не было, то есть войти в админку уже нельзя. Признак обрезанного дампа простой: в конце нет строки «Dump completed».

Неправильная кодировка или сопоставление

Дамп с --default-character-set=latin1 завершился без ошибок, но в 5986 заголовках из 6001 кириллица превратилась в вопросительные знаки. Это необратимая потеря: в файле просто нет правильных байтов. Другой вариант: дамп без строки SET NAMES, импортированный клиентом, работающим в latin1 (так вёл себя клиент mariadb на стенде в сессии без UTF-8 локали). Заголовок, начинавшийся со слова «Доставка», превратился в «Ð”Ð¾Ñтавка», а с --default-character-set=utf8mb4 тот же файл импортировался правильно. Третий случай мы эмулировали, заменив в дампе сопоставление (collation) на то, которое обычно создаёт MySQL 8: MariaDB 10.11 ответила ERROR 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci' и не создала ни одной таблицы. Решение: заменить сопоставление на поддерживаемое, например utf8mb4_unicode_520_ci, и повторить импорт.

Если ситуация такая, делайте так

Если Делайте
Блог или сайт-визитка, изменения раз в неделю Копия хостинга плюс ваша еженедельная копия базы и файлов в другом месте, проверка раз в квартал
Магазин или сайт с заказами Дамп с --single-transaction несколько раз в день, файлы ежедневно, пробное восстановление ежемесячно
Копии не помещаются в лимит хранилища restic или borg с дедупликацией и чистка таблиц логов, а не исключение uploads
Переезд с MySQL 8 на MariaDB Пробный импорт до переключения домена; при ERROR 1273 замените сопоставление в дампе
Сайт уже взломан или не работает Сначала выясните причину и сохраните текущее состояние, потом восстанавливайте из копии, сделанной до сбоя
Не знаете, когда делалась последняя копия Настройте оповещение об отсутствии новой копии и проверьте восстановление сегодня

Если сайт уже лежит, начните с диагностики проблем хостинга: часто причина в плагине или переполненном диске, и откат к вчерашней копии лишь сотрёт новые заказы. Скрипт резервного копирования удобно запускать по расписанию через cron; добавьте в него проверку строки «Dump completed» и zstd -t, а о сбое пусть сообщает мониторинг сервера и сайта.

Бэкапы на хостинге RichHost

На всех тарифах RichHost есть постоянные бэкапы в облако: это копия, которая хранится за пределами сервера сайта. По правилу 3-2-1 к ней стоит добавить собственную копию в другом месте и время от времени проверять её восстановлением на тестовом поддомене. Вопросы о резервных копиях можно задать поддержке: она работает с 10:00 до 20:00 по Киеву и отвечает примерно за 30 минут.

Частые вопросы

Достаточно ли бэкапов, которые делает хостинг?

Для большинства сбоев да, но правило 3-2-1 требует ещё одной независимой копии. Она спасает, когда проблема с учётной записью, оплатой или когда нужна версия старше той, что хранится.

Как часто делать бэкап сайта?

Так часто, сколько данных вы готовы потерять. Блогу хватит ежедневной или еженедельной копии, магазину нужно несколько дампов базы в день. Файлы меняются реже базы, их можно копировать реже.

Можно ли копировать базу, когда сайт работает?

Да, с --single-transaction для таблиц InnoDB. На стенде такой дамп не потерял ни одного заказа и не останавливал запись, а дамп без блокировок терял данные 3-7 заказов за запуск.

Как проверить бэкап, не сломав рабочий сайт?

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

Еще по теме

Все статьи
Проблемы хостинга: почему провайдеры молчат, пока сайт не упадет
Дополнительно27.08.2026

Проблемы хостинга: почему провайдеры молчат, пока сайт не упадет

Провайдеры молчат о том, что происходит с вашим сайтом. Какие сигналы говорят о проблемах хостинга и как оценить провайдера без маркетинговых уловок.

HTTP/3 и QUIC на хостинге: что реально дает сайту и как включить
Дополнительно28.07.2026

HTTP/3 и QUIC на хостинге: что реально дает сайту и как включить

Тест HTTP/1.1, HTTP/2 и HTTP/3 на стенде с nginx 1.28: что реально дает QUIC, когда он не помогает, как включить HTTP/3, открыть…

Email-рассылка с хостинга: почему не стоит и как настроить правильно
Вопросы и ответы по хостингу17.04.2026

Email-рассылка с хостинга: почему не стоит и как настроить правильно

Почему рассылки не стоит отправлять с почты хостинга, что требуют Gmail и Yahoo с 2024 года, как настроить SPF, DKIM и DMARC…