Восстановление WAL-файлов из нескольких хранилищ
Исполнять сценарий необходимо от имени пользователя postgres.
Проблематика
В процессе архивирования WAL-файлов хранилище, указанное в параметре wal_destination_uri (copywala.yaml), может быть переключено на другой сервер. В результате часть WAL-файлов окажется в старом хранилище, а часть — в новом.
При восстановлении на точку во времени (PITR) PostgreSQL запрашивает WAL-файлы через restore_command. Если restore_command обращается только к одному хранилищу, восстановление может завершиться с ошибкой из-за отсутствия части необходимых WAL-файлов.
Для решения этой проблемы реализован механизм multi-restore: восстановление WAL-файлов из нескольких хранилищ. При восстановлении на точку во времени (PITR) multi-restore позволяет последовательно запрашивать WAL-файлы из нескольких хранилищ, обеспечивая восстановление полной цепочки WAL-файлов даже после смены хранилища.
Механизм multi-restore поддерживает только смену параметра wal_destination_uri. Все остальные параметры в конфигурационном файле copywala.yaml должны быть одинаковыми для всех хранилищ, из которых выполняется восстановление.
Описание сценария
Функциональность восстановления WAL-файлов из нескольких хранилищ включает три этапа:
-
Подготовка
Пользователь выполняет команду
copywala restore-wal prepare-multi-restore, передав в нее URI тех хранилищ, в которых заархивированы WAL-файлы. В ходе выполнения команды:- в конфигурационном файле
copywala.yamlсоздается секцияwal_restore(если ее не было), и в значении параметраwal_restore.multi_restore_wal_urisсохраняется список URI хранилищ; - из каждого хранилища списка запрашиваются WAL-файлы для экземпляра
restore_instance_name; - на основе полученного списка WAL-файлов создается кеш-файл
multi_restore.wals.cache, содержащий информацию о соответствии WAL-файлов и хранилищ, в которых они находятся. Расположение кеш-файла можно изменить с помощью параметраwal_restore.multi_restore_cache_pathвcopywala.yaml. По умолчанию файл создается в каталоге, указанном в параметреcopywala_dirфайлаcopywala.yaml. Если параметр не задан, используется каталог/var/pbr/copywala/; - сформированный кеш-файл используется при последующих вызовах
restore_commandдля ускорения поиска требуемого WAL-сегмента.
При каждом запуске
copywala restore-wal prepare-multi-restoreкеш-файл формируется заново.Пример содержания
multi_restore.wals.cache{
"prepared_for_instance_name": "test_019f5a44-a1a9-7431-8876-6fc9122044bd",
"storages": [
{
"uri": "local-fs:///home/postgres/backups/wals_first_dir",
"wals": [
{
"wal_start": "000000010000000000000019",
"wal_end": "000000010000000000000067"
},
{
"wal_start": "00000001000000000000006F",
"wal_end": "000000010000000000000075"
}
],
"history_files": []
},
{
"uri": "local-fs:///home/postgres/backups/wals_second_dir",
"wals": [
{
"wal_start": "000000010000000000000068",
"wal_end": "00000001000000000000006E"
}
],
"history_files": []
},
{
"uri": "local-fs:///home/postgres/backups/wals_third_dir",
"wals": [
{
"wal_start": "000000010000000000000076",
"wal_end": "00000001000000000000007C"
}
],
"history_files": []
}
]
}ПодсказкаПоле
history_filesсодержит список файлов истории временных шкал (timeline), присутствующих в соответствующем хранилище.Временная шкала — это концепция PostgreSQL, используемая для идентификации различных ветвей истории журнала WAL, возникающих при восстановлении до заданной точки во времени (PITR). Каждый раз при выполнении PITR-восстановления создается новая временная шкала с уникальным числовым идентификатором. PostgreSQL генерирует файл истории (
.history), который описывает, от какой родительской временной шкалы и в какой точке WAL произошло ветвление.При восстановлении из архива, содержащего несколько временных шкал, PostgreSQL использует файлы истории для выбора правильных WAL-файлов. В рамках механизма
multi-restoreинформация о файлах истории из каждого хранилища сохраняется в кеш-файле, чтобы обеспечить корректное восстановление даже в сценариях с ветвлением временных шкал. - в конфигурационном файле
-
Восстановление
При запуске PostgreSQL и выполнении
restore_commandCopywala:- загружает информацию из файла
multi_restore.wals.cache; - определяет хранилище, содержащее запрошенный WAL-файл;
- загружает требуемый WAL-сегмент из соответствующего хранилища.
примечаниеCopywala использует хранилище по умолчанию, указанное в параметре
wal_destination_uriесли:multi_restore.wals.cacheнедоступен или не содержит информации о хранилищах;- запрошенный WAL-файл отсутствует в
multi_restore.wals.cache.
- загружает информацию из файла
-
Отключение
После завершения восстановления пользователь выполняет команду
copywala restore-wal disable-multi-restore.В результате:
- очищается значение параметра
wal_restore.multi_restore_wal_urisв файлеcopywala.yaml; - удаляются файлы кеша, созданные для работы механизма
multi-restore.
- очищается значение параметра
Предусловия
Перед выполнением восстановления WAL-файлов из нескольких хранилищ убедитесь, что выполнены следующие условия:
- Выполнено восстановление данных
PGDATAи табличных пространств из резервной копии. - Настроен сетевой доступ ко всем хранилищам, в которые выполнялось архивирование WAL-файлов.
Пользователем получен список URI хранилищ WAL-файлов.
Файл ${PGDATA}/copywala_meta/wal_destination_uri.history содержит историю изменений wal_destination_uri, которые совершались только командой copywala config set. Если параметр wal_destination_uri в copywala.yaml изменялся вручную или внешней СРК, список хранилищ, в которых могут находиться WAL-файлы, необходимо уточнить у администраторов СРК.
Последовательность выполнения
-
Выполните команду
copywala restore-wal prepare-multi-restore(ознакомьтесь со справкой по команде ниже), передав в нее необходимые хранилища.Справка по команде
copywala restore-wal prepare-multi-restoreОписание:
Команда выполняет подготовку к восстановлению WAL-файлов из нескольких хранилищ:
-
сохраняет список URI хранилищ в параметре
wal_restore.multi_restore_wal_urisконфигурационного файлаcopywala.yaml; -
формирует кеш-файл
multi_restore.wals.cache, в котором хранится информация о соответствии WAL-файлов и хранилищ, где они находятся. Кеш-файл используется при последующих вызовахrestore_commandдля поиска необходимого WAL-файла.Расположение кеш-файла задается параметром
wal_restore.multi_restore_cache_pathвcopywala.yaml. Если параметр не указан, файл создается в каталоге/var/pbr/copywala/.
Синтаксис:
copywala restore-wal prepare-multi-restore [flags]Обязательные параметры:
Флаг Описание --uri <wal destination uri>URI хранилища WAL-файлов. Может быть указан несколько раз Опциональные параметры:
[flags]– доступны следующие флаги:Флаг Описание -h|--helpПоказать справку по команде -c|--config <path to copywala config>Использовать конфигурационный файл, отличный от файла по умолчанию: /etc/pbr/copywala.yaml:caption: Пример успешного ответа
2026-07-13 10:12:36.074 [129535] INF successfully add config param path=wal_restore.multi_restore_wal_uris value="[\"local-fs:///home/postgres/backups/wals_first_dir\"]"
2026-07-13 10:12:36.089 [129535] INF cache for wals multi storage restore successfully prepared path=/var/pbr/copywala/multi_restore.wals.cache -
-
Настройте в конфигурационном файле
postgresql.confцелевую точку во времени, до которой требуется произвести восстановление.
По умолчанию при восстановлении применяются все доступные WAL-файлы, данное поведение можно ограничить, задав один из параметров: recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid. Подробнее про это читайте в документации Platform V Pangolin.
Например, задайте контрольную точку во времени, используя параметр recovery_target_lsn. Установите его значение равным номеру журнала транзакций (LSN), полученному после завершения подготовки данных для таблицы test. Альтернативно можно задать точное время восстановления с помощью параметра recovery_target_time.
Чтобы сервер запускался после завершения процесса восстановления, установите в конфигурационном файле опцию:
recovery_target_action = 'promote'
Это позволит автоматически перевести сервер из режима восстановления в обычный рабочий режим сразу после достижения целевой точки восстановления.
- Создайте файл для переключения сервера в режим восстановления:
touch /pgdata/db-restored/recovery.signal
- Запустите сервер:
pg_ctl start -D /pgdata/db-restored/
-
Выполните команду
copywala restore-wal disable-multi-restore(ознакомьтесь со справкой по команде ниже).Справка по команде
copywala restore-wal disable-multi-restoreОписание:
Команда выполняет удаление кеш-файла и «сбрасывает» значение параметра
multi_restore_wal_urisвcopywala.yaml.Синтаксис:
copywala restore-wal disable-multi-restore [flags]Обязательные параметры:
Нет.
Опциональные параметры:
[flags]– доступны следующие флаги:Флаг Описание -h|--helpПоказать справку по команде -c|--config <path to copywala config>Использовать конфигурационный файл, отличный от файла по умолчанию: /etc/pbr/copywala.yaml:caption: Пример успешного ответа
2026-07-13 10:19:21.906 [130593] INF successfully replace config param path=wal_restore.multi_restore_wal_uris value=[]
2026-07-13 10:19:21.906 [130593] INF successfully removed wals cache for multi restore path=/var/pbr/copywala/multi_restore.wals.cache
Результат
Восстановление на целевую точку во времени успешно выполнено.
Исключительные сценарии
Сценарий | Сообщение в выводе | Возможная причина | Решение |
|---|---|---|---|
Отсутствует кеш-файл |
|
| Выполните команду |
Не найден WAL-файл |
| Запрошенный WAL-сегмент не попадает ни в один из диапазонов
| Добавьте недостающее хранилище и повторно выполните |
Кеш-файл поврежден |
| Не удалось прочитать файл | Выполните команду |
Ошибка при записи кеш-файла |
| Не удалось создать или записать файл
| Проверьте права доступа пользователя к директории, указанной в |