Введение
У PAPER & FORM четыре заказа, но сохранённая копия заканчивается на R-103. Нужно открыть прежнее состояние рядом с оригиналом, прочитать его позиции и доказать, что восстановленный сервис независимо принимает тестовый заказ.
Эта работа начинается отдельно. Исходная база и backups/cutoff.dump уже подготовлены с той же точкой из трёх заказов, что в предыдущем руководстве. Нужны базовые навыки терминала; понятия баз и соединений объясняются заново. Команды выполняйте в Workstation, оригинал смотрите в Original Shop, тестовую цель — в Restored Copy.
Восстанавливать и сбрасывать разрешено только одноразовую базу shop_copy. Сохраните источник, готовую программу, архив и посторонний файл в uploads/. Все данные вымышлены, платежей и почты нет. Две базы на одном учебном экземпляре демонстрируют логический экспорт и изоляцию, не полное аварийное восстановление, аппаратную избыточность или PITR.
Восстановить только в пустую независимую цель
На этом шаге вы откроете работающую копию граничных заказов. Откройте Original Shop, затем Orders. Там четыре записи, R-101—R-104. В R-103 у Rae два Print pair на $36.00. R-104 принадлежит Sol и добавлен после сохранённой точки. Он должен остаться в оригинале, но отсутствовать в восстанавливаемом архиве.
Откройте Restored Copy. Полоса ржавого цвета называет shop_copy. Главная страница работает, но Orders объясняет, что независимая база пуста. Одна доступная главная страница не доказывает восстановление магазина.
Перейдите в Workstation. pwd выводит текущий каталог:
pwd
/home/labex/project/shop-backup
./shopctl identity читает реальные соединения. Сохранённые сервисы задают базу, хост, порт и аккаунт: shop-source подключает shop_source как читающий d09_reader; shop-copy подключает shop_copy как доступный для записи d09_copy. Они используют сервер 127.0.0.1:5432, но роль копии не подключается к источнику:
./shopctl identity
pg_restore --list читает специальный архив, не записывая в базу. Проверьте исходное имя и записи orders и order_items:
pg_restore --list backups/cutoff.dump
База хранит структурированные данные; строки позиций связаны с родительским заказом. Специальные архивы содержат определения, данные, последовательности для новых идентификаторов и ограничения связей. Их восстанавливают через pg_restore, а не отправкой бинарного файла в psql. Подготовленные клиенты выгрузки и восстановления — PostgreSQL 14.
Действие empty показывает настоящую целевую базу и отклоняет базу с пользовательскими таблицами или последовательностями. В непустом назначении может быть нужная работа. Не используйте --clean или --create: они могут удалить объекты либо выбрать исходное имя базы из архива.
В следующей команде && запускает правую часть только после успешной проверки пустоты. --dbname=service=shop-copy явно выбирает независимую цель. --no-owner --no-privileges исключает импорт исходных аккаунтов и разрешений. --single-transaction объединяет импорт в целое: ошибка откатывает его. --exit-on-error останавливается при первой ошибке базы. Запустите всю защищённую команду:
./shopctl empty && pg_restore --dbname=service=shop-copy --no-owner --no-privileges --single-transaction --exit-on-error backups/cutoff.dump
Сначала появится назначение, затем EMPTY: restore may proceed. Успешный pg_restore обычно молчит. Если повтор даёт REFUSED: target is not empty, первый импорт мог уже завершиться. Прочитайте копию, прежде чем что-либо сбрасывать.
records copy читает реальные связанные строки заказов и позиций:
./shopctl records copy
Ожидаются R-101, R-102 и R-103 на $98.00, без R-104. В Restored Copy откройте Orders, R-103 и квитанцию. Два Print pair и $36.00 должны присутствовать. Вернитесь в Original Shop: заказ R-104 от Sol сохранился, все заказы по-прежнему дают $124.00.
Если выбран неверный архив или нужно повторить неудачу, сбрасывайте только одноразовую цель этого курса. Помощник показывает назначение и требует точное имя. Следующая команда — необязательное восстановление после ошибки, не действие после каждого успеха:
./shopctl reset-copy shop_copy
Она удаляет только shop_copy. После этого повторите защищённый импорт. Никогда не сбрасывайте и не удаляйте оригинал, не применяйте массовые очистки баз. Проверка наблюдает настоящую копию, а не восстанавливает её за вас.
Доказать запись в копию без изменения оригинала
На этом шаге вы проверите настоящую запись в копию. Читающая страница может выглядеть верно при сломанной последовательности, связях или соединении для записи. Создайте реальный тестовый заказ в независимой копии и сравните магазины. Оставайтесь в Restored Copy, откройте Collection и найдите форму. Перед отправкой прочитайте Writing to: shop_copy · RESTORED COPY и полосу ржавого цвета. Не отправляйте тест в Original Shop.
Введите точно:
| Поле | Значение |
|---|---|
| Reference | R-901 |
| Name | Copy test |
| Item | Print pair |
| Quantity | 1 |
Нажмите Place order ↗. R-901 содержит один товар на $18.00. Скачайте квитанцию и найдите shop_copy. Новый заказ использует восстановленную последовательность и внешний ключ, а не заранее написанную страницу. Повтор номера даёт Already recorded вместо второго заказа.
Откройте Orders в той же копии. Должны быть R-101, R-102, R-103 и R-901, без R-104. В Original Shop откройте Orders: там остаются R-101—R-104 без R-901. Разных полос недостаточно, если оба приложения пишут в одну базу.
В Workstation покажите оба соединения и прочитайте реальные наборы данных:
./shopctl identity
./shopctl records copy
./shopctl records source
Итог копии — $116.00, источника — по-прежнему $124.00. Требовать постоянного равенства всех строк неверно: R-104 относится только к позднему источнику, R-901 — только к восстановленной копии. Сравнивайте общие граничные записи и допустимое различие каждой стороны.
Оригинальная форма отклоняет R-901 без записи. Если открыли не ту вкладку, прочитайте Check the destination, перейдите в Restored Copy и отправьте там. Неизвестные номера также отклоняются: исправьте форму и повторите. Если в существующем R-901 неверны имя, товар или количество, ./shopctl correct copy R-901 показывает реальную цель и исправляет только этот тест на Copy test / Print pair / 1. Другие заказы копии и все исходные данные остаются неизменными. Если чистый повтор нужен лишь одноразовой копии, используйте точное восстановление reset-copy shop_copy из шага 1, импортируйте заново и добавьте тест один раз.
Финальная проверка читает действующие базы и сайты, сохраняет постороннюю загрузку и испытывает архив в отдельной одноразовой базе. Она не создаёт тестовый заказ и не чинит копию. Теперь резервная копия подтверждена полными данными, ясной границей и независимым восстановлением с записью.
Резюме
Вы определили реальные источник и цель, защитили пустое назначение, транзакционно восстановили специальный архив и прочитали полные позиции заказов. Новый заказ только в копии доказал независимость и возможность записи, а оригинал сохранил поздний заказ. Это доказательство репетиции логического восстановления, не полной стратегии восстановления рабочей среды.


