Инструкции по восстановлению нет: разворачиваем чужой бэкап вслепую
У вас есть файл — 40 гигабайт, называется backup_2026.tar.gz, и больше вы о нём ничего не знаете. Никакого README, никакого письма от прежнего админа с инструкцией «сначала разворачиваем это, потом накатываем то». Просто архив, который лежит на диске или в S3-бакете, и задача — поднять из него рабочий сервис, желательно до того, как кто-то наверху спросит, почему сайт всё ещё не работает. Разворачивать бэкап вслепую — это не про «распаковать и запустить», а про методичное опознание того, что перед вами, и проверку каждого шага в среде, где ошибка ничего не стоит. Если вы вообще ещё не решили, с чего начинать разбор доставшегося вам сервера, есть смысл сначала прочитать методологию обследования незнакомой машины — здесь же разбираем конкретно сам процесс восстановления из бэкапа.
Содержание
Сначала — не трогайте прод
Первый и единственный по-настоящему важный принцип: пока вы не знаете, что внутри архива, он не должен коснуться боевого окружения. Соблазн большой — особенно если сервис уже лежит и давление растёт, — распаковать бэкап прямо на продакшене и посмотреть, что получится. Это ровно то действие, которое превращает одну аварию в две.
Причины конкретные:
- Незнакомый дамп базы может содержать команды
DROP DATABASEили--cleanв начале файла — накатите его поверх существующей базы, и вы потеряете то немногое, что ещё работало. - Архив файлов может распаковаться с правами и владельцем, которые не совпадают с текущими — и то, что работало, перестанет запускаться из-за
Permission denied. - Снапшот диска или контейнера может тянуть за собой конфиги с чужими путями, портами и секретами, которые начнут конфликтовать с тем, что уже поднято.
Поэтому первый практический шаг — не открывать архив, а найти или поднять изолированную площадку: отдельный VPS, тестовый контейнер, любую машину, где сломать можно бесплатно. Если под рукой ничего нет, дешевле за час арендовать отдельный сервер и потратить на это час времени, чем распаковывать неизвестность на боевой машине.
Определяем, что вообще внутри
Прежде чем запускать любую команду восстановления, нужно понять: перед вами дамп базы данных, архив файловой системы, снапшот диска/образа или бэкап конкретного приложения (с собственным форматом, как у Borg, Restic или Duplicati). Это определяет весь дальнейший план, и угадать по расширению файла получается не всегда.
Первый шаг — посмотреть на файл, не распаковывая:
file backup_2026.tar.gz
# gzip compressed data, from Unix, original size modulo 2^32 12884901888
tar -tzvf backup_2026.tar.gz | head -50
Список файлов внутри архива обычно сразу выдаёт тип бэкапа:
- Файлы вида
*.sql,*.sql.gz,*.dump— текстовый или бинарный дамп базы данных (pg_dump,mysqldump). - Структура
var/lib/postgresql/...илиvar/lib/mysql/...целиком — это не логический дамп, а физическая копия каталога данных СУБД, восстанавливается совсем иначе. - Обычная файловая структура (
etc/,home/,var/www/) — архив файловой системы или её части. - Файлы
.vmdk,.qcow2,.raw,.img— образ диска или снапшот виртуальной машины (разница между образом целиком и бэкапом отдельных файлов — тема отдельного разбора о выборе формата для виртуалок, если вы ещё не определились, как будете бэкапить дальше уже сами). - Каталоги с именами-хешами и файлом
indexилиmanifest— это, скорее всего, репозиторий специализированного инструмента бэкапов (Borg, Restic, Kopia), и распаковывать его вручную бессмысленно — нужен именно этот инструмент.
Если файл — бинарный дамп СУБД, полезно посмотреть заголовок:
head -c 200 backup_2026.dump | strings | head -5
# PostgreSQL custom database dump всегда начинается с сигнатуры PGDMP
Для дампов PostgreSQL в формате custom (pg_dump -Fc) сигнатура PGDMP в первых байтах — надёжный признак. Для MySQL текстовый дамп обычно начинается с комментариев -- MySQL dump и указания версии сервера, из которого он снят — это первая зацепка для следующего шага.
Если внутри архива смешано несколько типов — например, дамп базы лежит рядом с файлами приложения и конфигом веб-сервера, — это, скорее всего, бэкап «всего сервиса целиком», сделанный самописным скриптом. Такие бэкапы разворачиваются по частям: сначала файлы и конфиги, потом база, в порядке, который нужно восстановить логически, а не по алфавиту.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверИщем версию ПО, для которого сделан бэкап
Восстановление дампа от одной версии СУБД на другой — источник половины проблем при работе с чужими бэкапами. PostgreSQL и MySQL меняют внутренний формат данных, системные каталоги и иногда синтаксис между мажорными версиями, и дамп, снятый pg_dump 14-й версии, не всегда без проблем ложится в кластер 17-й — а физическая копия каталога данных (не логический дамп) между разными мажорными версиями не совместима вообще.
Что смотреть, чтобы определить версию:
# В текстовом дампе MySQL версия обычно есть прямо в шапке файла
zcat backup.sql.gz | head -20 | grep -i "server version\|mysql dump"
# В дампе PostgreSQL (custom format) версию покажет сам pg_restore
pg_restore -l backup.dump | head -5
# Если рядом есть любые конфиги или логи — версия ПО часто там же
find . -iname "*.conf" -o -iname "*.yml" -o -iname "*.env" | xargs grep -il "version" 2>/dev/null
Если версию нигде найти не удаётся, практичный путь — поднять последнюю доступную стабильную версию СУБД в тестовой среде и попробовать восстановление там. Логические дампы (pg_dump, mysqldump) в большинстве случаев накатываются на более новую версию без проблем — разработчики целенаправленно держат обратную совместимость дамп-формата. А вот попытка поднять физическую копию каталога данных на другой мажорной версии почти всегда заканчивается отказом сервера стартовать — тут версии должны совпадать точно, и если бэкап именно такой, придётся искать нужную версию СУБД отдельно (в Debian/Ubuntu — через архивные репозитории или собранный вручную пакет).
То же самое касается версии самого приложения, если бэкап — это данные какого-то сервиса (CMS, трекер, панель управления). Схема базы данных на диске привязана к версии приложения, которое её создало: миграции применяются последовательно, и попытка запустить свежую версию приложения поверх бэкапа данных пятилетней давности почти гарантированно упадёт на middleware, который ожидает столбец, ещё не добавленный в старой схеме.
Пробное восстановление в изоляции
Как только тип бэкапа и примерная версия ПО понятны, разворачивайте пробную копию на отдельной машине — той самой изолированной площадке, о которой шла речь в начале. Смысл этого шага не «убедиться, что бэкап открывается», а прогнать весь путь до работающего сервиса и зафиксировать каждую проблему, которая всплывёт, пока она ещё не стоит простоя.
Порядок для дампа базы данных:
# PostgreSQL: создаём чистую тестовую базу, ничего не трогаем в существующих
createdb -O testuser test_restore
pg_restore -d test_restore --no-owner --no-privileges backup.dump
# MySQL/MariaDB: аналогично — отдельная тестовая база
mysql -u root -p -e "CREATE DATABASE test_restore CHARACTER SET utf8mb4;"
mysql -u root -p test_restore < backup.sql
Флаг --no-owner --no-privileges для pg_restore намеренно убирает из дампа привязку к ролям и правам оригинального сервера — на чужом бэкапе эти роли почти наверняка не совпадают с вашими, и без флага восстановление будет падать на каждой команде ALTER OWNER.
Для файлового архива — распаковка во временный каталог с проверкой прав:
mkdir /tmp/restore_test
tar -xzf backup_2026.tar.gz -C /tmp/restore_test
ls -la /tmp/restore_test # смотрим владельца и права файлов до переноса
Для образа диска или снапшота — подключение как отдельного тома, без замены существующего диска:
# qcow2-образ можно смонтировать через qemu-nbd, не запуская всю виртуалку
modprobe nbd
qemu-nbd --connect=/dev/nbd0 backup.qcow2
mount /dev/nbd0p1 /mnt/restore_test
На этом шаге вы не гонитесь за скоростью — вы собираете список несостыковок. Опечатка в правах, отсутствующая переменная окружения, недостающий системный пакет — пусть всё это всплывёт сейчас, на тестовой машине, где перезапуск ничего не стоит. Если восстанавливаете именно базу данных и нужен более подробный разбор самой команды восстановления — практика с pg_restore, mysql и частичным восстановлением таблиц разобрана в отдельной статье про восстановление базы данных из бэкапа.
Типичные ловушки
Несколько проблем повторяются в разборе чужих бэкапов настолько часто, что их стоит проверять заранее, а не ждать, пока они проявятся сами.
Несовпадение версий ПО. Уже разобрано выше отдельно, но стоит повторить: это причина номер один для отказов при восстановлении, особенно для физических копий данных СУБД. Если возможности определить версию нет — начинайте с последней стабильной, логические дампы почти всегда накатываются на неё без ошибок.
Забытые переменные окружения. Приложение, поднятое из бэкапа файлов, часто отказывается стартовать без .env, который в архив попросту не попал — прежний админ хранил секреты отдельно, в менеджере паролей или на бумажке, которой у вас нет. Смотрите, что приложение ожидает при старте:
# Для Node.js/Python-приложений часто помогает грубый grep по исходникам
grep -rn "process.env\.\|os.environ\[" . --include="*.js" --include="*.py" | \
grep -oP "(?:env\.|environ\[.)\K[A-Z_]+" | sort -u
Список найденных переменных — это чек-лист того, что придётся восстановить или подобрать заново: строки подключения к базе, ключи API внешних сервисов, секреты для подписи сессий. Часть из них можно взять из самого бэкапа (если в архиве случайно оказался старый .env.example или конфиг с реальными значениями), часть придётся выпускать заново — и это нормально, если сервис умеет работать с новыми ключами без потери данных.
Права доступа и владелец файлов. Архив, распакованный от root, отдаёт файлам владельца root:root, даже если исходно ими владел www-data или системный пользователь конкретного приложения. Сервис стартует под непривилегированным пользователем и упирается в Permission denied на собственных же данных:
# После распаковки — привести владельца к тому, под кем реально работает сервис
chown -R www-data:www-data /var/www/restored_app
find /var/www/restored_app -type d -exec chmod 755 {} \;
find /var/www/restored_app -type f -exec chmod 644 {} \;
Отдельно проверьте права на каталоги, куда приложение пишет во время работы (загрузки, кеш, логи) — именно они чаще всего остаются с неправильными правами после восстановления и вызывают ошибки не сразу при старте, а на первой попытке записи.
Кодировка и локаль базы данных. Для MySQL и PostgreSQL несовпадение кодировки исходной и целевой базы иногда проявляется не сразу, а на первых записях с не-латинскими символами — данные восстанавливаются, но кириллица превращается в вопросительные знаки или ошибку invalid byte sequence. Проверяйте кодировку исходного дампа заранее, а не постфактум по жалобам пользователей.
Отсутствующие расширения и зависимости базы. Дамп PostgreSQL может ссылаться на расширения (postgis, pg_trgm, uuid-ossp), которые не установлены в целевом кластере по умолчанию. pg_restore в этом случае выдаст предупреждение, а не фатальную ошибку, и часть данных или индексов просто не восстановится — важно читать вывод команды целиком, а не только код возврата.
От тестового восстановления к боевому
Когда пробный прогон прошёл без критичных ошибок и список несостыковок закрыт, можно переносить процедуру на целевой сервер — но с той же осторожностью, с которой вы к нему подходили с самого начала.
Практичный порядок:
- Зафиксируйте точную последовательность команд, которая сработала на тестовой машине — это и есть та самая инструкция, которой не было изначально. Сохраните её отдельным файлом рядом с бэкапом, чтобы в следующий раз не проходить весь путь заново.
- Если целевая машина уже что-то обслуживает — сделайте свежий бэкап текущего состояния перед тем, как накатывать чужой. Формат восстановления, отработанный в изоляции, применяется к целевой системе, но у вас должен остаться путь назад.
- Восстанавливайте по частям, а не одной командой на всё: сначала база, проверка целостности, потом файлы приложения, потом конфиги окружения. На каждом шаге — минимальная проверка, что сервис отвечает так, как ожидается.
- После восстановления — сверьте контрольные точки: количество записей в ключевых таблицах, доступность приложения по HTTP, отсутствие ошибок в логе за первые минуты работы. Даже если формальных чек-сумм у бэкапа не было, эти простые проверки ловят большинство проблем сразу.
Если после всех проверок часть данных теряется или не сходится, честно фиксируйте это как факт, а не как временную помеху: неполный бэкап — это ограничение, о котором нужно сказать тем, для кого вы восстанавливаете сервис, а не молчать и надеяться, что не заметят. И раз уж вы прошли через боль восстановления без документации — не повторяйте эту же ситуацию для тех, кто придёт после вас: настройте регулярную проверку восстановления бэкапа для системы, которую только что подняли, и оставьте рядом с бэкапами инструкцию, которую написали сами.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Бэкап не открывается ни одной командой — куда смотреть дальше?
Проверьте, не зашифрован ли файл: попробуйте openssl enc -d с типовыми алгоритмами или посмотрите, нет ли рядом файла-ключа с похожим именем. Если архив повреждён частично, tar с флагом --ignore-failed-read иногда вытаскивает хотя бы часть содержимого — лучше частичное восстановление, чем никакого.
Можно ли доверять тому, что дамп базы открылся без ошибок?
Нет — открытие без ошибок означает только синтаксическую валидность файла. Реальную проверку даёт сверка данных: количество строк в ключевых таблицах, работоспособность приложения поверх восстановленной базы, отсутствие «дыр» в последовательностях ID, указывающих на то, что часть данных не попала в бэкап.
Что делать, если версия СУБД в дампе новее, чем доступна на целевом сервере?
Это сложнее решить в обратную сторону: новый дамп на старый сервер обычно не встаёт из-за отличий в формате хранения. Практичный путь — поднять на тестовой машине ту же (или более новую) версию, что и в дампе, восстановить туда, а дальше при необходимости переносить данные логическим экспортом уже в целевую версию.
Стоит ли сразу распаковывать образ диска и монтировать его как загрузочный, чтобы посмотреть систему целиком?
Нет, монтируйте только файловую систему образа как обычный том (через qemu-nbd или losetup), не пытаясь загрузить его как виртуальную машину на первом шаге — это быстрее и безопаснее для первичного осмотра содержимого, а полноценный запуск виртуалки оставьте на потом, если он вообще понадобится.
Сколько времени закладывать на разбор бэкапа без документации?
Ориентировочно — не меньше времени, чем ушло бы на настройку сервиса с нуля, а часто больше: опознание формата, поиск версии и разбор ловушек с правами и переменными окружения редко укладываются в один присест. Если сроки жёсткие, честнее сообщить об этом заранее, чем обещать быстрое восстановление и сорвать его.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →