惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Last Watchdog
The Last Watchdog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
C
Check Point Blog
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
罗磊的独立博客
V
Vulnerabilities – Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
S
Security @ Cisco Blogs
IT之家
IT之家
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
D
Docker
Engineering at Meta
Engineering at Meta
AWS News Blog
AWS News Blog
S
Security Affairs
U
Unit 42
P
Palo Alto Networks Blog
V
Visual Studio Blog
Y
Y Combinator Blog
D
DataBreaches.Net
Forbes - Security
Forbes - Security
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
Security Latest
Security Latest
aimingoo的专栏
aimingoo的专栏
Simon Willison's Weblog
Simon Willison's Weblog
A
Arctic Wolf
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hacker News: Front Page
博客园 - 司徒正美
博客园 - Franky
宝玉的分享
宝玉的分享
TaoSecurity Blog
TaoSecurity Blog
Latest news
Latest news
Scott Helme
Scott Helme
MongoDB | Blog
MongoDB | Blog
量子位
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cisco Blogs
P
Privacy International News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Реплики с задержкой в применении WAL
Oleg Ivanov · 2026-06-01 · via Все публикации подряд на Хабре

Средний

10 мин

6.6K

В PostgreSQL процесс получения журналов walreceiver запускается на реплике только после того, как процесс startup применит все накопившиеся WAL. Это не создаёт особых проблем, если процесс startup успевает накатывать полученные журналы. Проблема проявляется, если используется реплика с отложенным применением журнальных записей, например, на сутки. Реплика не будет получать журналы сутки, слот репликации будет их удерживать на мастере.

Если процесс walreceiver остановится, то он не запустится до тех пор, пока не пройдёт время задержки, установленное параметром recovery_min_apply_delay. Команд ручного запуска процесса walreceiver нет. Получится, что сутки мастер копит журналы, только потом запускается walreceiver и начинает вытягивать журнальные файлы. Такое поведение нелогично, но его задокументировали: "When the standby is started and primary_conninfo is set correctly, the standby will connect to the primary after replaying all WAL files available in the archive. If the connection is established successfully, you will see a walreceiver in the standby, and a corresponding walsender process in the primary."

Всё время, до запуска walreceiver, слот репликации на мастере удерживает файлы журналов. На мастере скопится много журналов и, если не хватит места, то экземпляр мастера подвиснет по нехватке места в директории pg_wal (или слот инвалидируется по параметру max_slot_wal_keep_size и реплику придётся пересоздать).

Что приводит к остановке walreceiver? Это не только перезапуск экземпляра реплики. Достаточно разрыва сокета между wareceiver и walsender из-за сетевых проблем, перезапуск walsender, перезапуск экземпляра мастера.

То, что walreceiver долго не стартует, не даёт использовать реплики с отложенным применением журналов, как аналог постоянно обновляемых (in place) бэкапов. Утилита pg_combinebackup не может применять инкрементальные бэкапы in-place (утилита копирует полный бэкап, сливая его с инкрементальными, в новую директорию), поэтому использование реплик с отложенным применением журналов имеет преимущества по сравнению с инкрементальными бэкапами.

Реплику с отложенным применением WAL можно было бы использовать для случаев, когда на мастере возникнет повреждение. При появлении повреждения, можно приостановить применение журналов, сделать бэкап реплики и экспериментировать с репликой (или с бэкапом), докатывая журналы до момента сбоя. Если момент сбоя будет определён неверно, и применятся лишние журналы (позже точки повреждения), то откатить их нельзя, для такого случая и понадобится сделанный вначале бэкап с реплики (или реплика, если экспериментировали с бэкапом), чтобы повторить всё заново.

История проблемы

Впервые, на проблему обратил внимание Константин Книжник в 2019 году. Альваро Эррера подтвердил, что он тоже столкнулся с этой проблемой. Томас Манро, как менеджер коммитфеста, запросил патч с тестом, чтобы патч прошел проверку коммитфест бота. Коммитер Майкл Пакье счёл логику патча убогой (kind of ugly) и предложил ввести параметр конфигурации, чтобы DBA могли выбирать, когда им нужно запускать walreceiver. Константин добавил параметр. За приятной перепиской пролетел год.

Проблема не отпускала пользователей PostgreSQL. Следующим, столкнувшимся с проблемой, и решившимся написать в pg-hackers, был Асим Правен. Он независимо от Константина создал  патч и качественно описал как и когда проявляется проблема. Например, указал, что журнальные записи создаются большим числом серверных процессов, а применяет записи один процесс - startup и, при реальных нагрузках, отставание реплики от мастера будет обычным делом. Также указал, что при реальной работе, с использованием синхронного коммита, поведение synchronous_commit в значении remote_write и on становится эквивалентным remote_apply до тех пор, пока startup не применит накопившиеся журналы и не запустит walreceiver. Такое поведение делает использование синхронной фиксации транзакций опасной для мастера.

Майкл Пакье отметил, что Асим Правен ввёл третий вариант запуска walreceiver: немедленный (startup), помимо consistency и проблемного (exhaust) и дал ценные замечания по логике поиска журнала, который нужно запрашивать.
Также, Асим создал два теста, проявляющие проблему: walreceiver останавливается из-за разрыва соединения и экземпляр реплики перезапускается. Для демонстрации задержки в применении журнальных записей, Асим, использовал параметр recovery_min_apply_delay. Асим отметил, что задержка применения может накапливаться естественным образом, даже если параметр recovery_min_apply_delay не установлен, поскольку генерация WAL на мастере происходит параллельно, а воспроизведение WAL на реплике выполняется только одним процессом startup.

Асим создал улучшенную логику сканирования файлов журнала реплики для определения того, какой журнал запрашивать у процесса walsender.

Асим написал гораздо более быстрое и менее инвазивное решение для определения начальной точки, с которой walreceiver должен начать запрашивать журналы у процесса walsender. Алгоритм следующий: сканируется первый блок каждого WAL-файла среди уже имеющихся на реплике, начиная с того WAL-файла, который, читается процессом startup для наката журнальной записи. Если первый блок WAL-файла валидный, процесс walreceiver переходит к следующему WAL-файлу проверяет его первый блок. Продолжает сканировать по одному WAL-файлу за раз, пока файлы не закончатся или блок будет невалидным. Начальной точкой будет являться начало предыдущего отсканированного WAL-файла. Преимущество алгоритма Асима в том, что не нужно читать все журнальные записи во всех WAL-файла до конца каждого файла, как это делалось в патче Константина. Более того, нет проблемы с частично полученным WAL-файлом: последняя полученная до сбоя walreceiver журнальная запись может не сохраниться на диске и это не будет проблемой - при повторном запуске walreceiver читает только первую запись в каждом журнальном файле и перезапросит весь файл. Слот репликации удерживает журналы целыми файлами и проблем с перезапросом WAL-файла, записи которого передавались ранее, не будет.

Патчем восхитились, пообсуждали и улучшили. В августе 2020 года Масахико Савада нашел ошибку. В ноябре 2021 года Борат Рупиредди дал много полезных комментариев по коду патча. За патч взялся Сумьядип Чакраборти и обновил его с учетом давних замечаний Майкла Пакье. Борат нашел в обновленном патче утечку памяти. Казалось бы патч можно коммитить, но...
Киотаро Хоригучи (NTT) попробовал патч и нашел, что патч не работал в простейшем случае. На этом обсуждение патча закончили.

Через 4 года

Через 4 года, в 2025 году у Сунил С. (Broadcom) появилось время, и он взялся за доработку патча. Как выяснил Сунил, Киотаро Хоригучи натолкнулся на проблему, которую породило исправление, внесенное в код PostgreSQL для устранения race condition между архиватором и checkpointer. Репутация патча была восстановлена.

Патч сменил 10 версий и был номинирован на коммитфест 19 версии в конце 2025 года со статусом Ready for Committer, но не нашёл коммитера. Что неудивительно, так как в коде патча присутствует слово "FIXME".

Третий пост о проблеме появился в апреле 2026 года с заголовком: "баг это или фича реквест??" где справедливо отмечен отложенный сюрприз, который таит нерешенная проблема: первоначальная настройка репликации работает идеально, усыпляя бдительность администратора, а спустя недели/месяцы, как только произойдет перезагрузка экземпляра реплики,  репликация незаметно нарушается. Было отмечено, что в PostgreSQL не существует способа вручную запустить walreceiver и предложено хотя бы дать такую возможность.

Воспроизведение проблемы

Запустим нагрузку:

pgbench -i
pgbench -T 6000 -R 700 -P 10

Создадим реплику с отложенным применением журналов:

export PGDATA=/var/lib/postgresql/tantor-se-18-replica/data1
pg_ctl stop -D /var/lib/postgresql/tantor-se-18-replica/data1
rm -rf  /var/lib/postgresql/tantor-se-18-replica/data1
psql -qc "select pg_drop_replication_slot('replica1')"
pg_basebackup -D $PGDATA -P -R -C --slot=replica1 -c fast
echo "port=5433" >> $PGDATA/postgresql.auto.conf
echo "cluster_name='replica1'" >> $PGDATA/postgresql.auto.conf
echo "logging_collector = off" >> $PGDATA/postgresql.auto.conf
echo "recovery_min_apply_delay = '5min'" >> $PGDATA/postgresql.auto.conf
pg_ctl start -D $PGDATA
waiting for server to start....
done 
server started

Репликация идёт, walreceiver работает, журналы применяются через 5 минут.

psql -p 5433 -qc "select pg_get_wal_replay_pause_state() state, pg_is_wal_replay_paused() p, pg_last_wal_replay_lsn() replay_lsn, pg_last_wal_receive_lsn() receive_lsn, pg_last_xact_replay_timestamp();"
psql -qc "select application_name, state, flush_lsn, replay_lsn, replay_lag from pg_stat_replication"

  state    | p | replay_lsn | receive_lsn | pg_last_xact_replay_timestamp  
-----------+---+------------+-------------+------------------------------- 
not paused | f | 0/4000130  | 0/671A360   | 21:25:19.866532+03 
(1 row) 

application_name |   state   | flush_lsn | replay_lsn |   replay_lag     
-----------------+-----------+-----------+------------+----------------- 
replica1         | streaming | 0/671B3D0 | 0/4000130  | 00:01:30.018386 
(1 row)

Даже бэкап с реплики выполняется:

rm -rf /var/lib/postgresql/tantor-se-18-replica/data2
pg_basebackup -p 5433 -D /var/lib/postgresql/tantor-se-18-replica/data2 -P -R -c fast
40190/40190 kB (100%), 1/1 tablespace

Перезапустим экземпляр мастера или реплики:

pg_ctl restart -D /var/lib/postgresql/tantor-se-18-replica/data1
psql -qc "select application_name, state, flush_lsn, replay_lsn, replay_lag from pg_stat_replication"
psql -p 5433 -qc "select pg_get_wal_replay_pause_state() state, pg_is_wal_replay_paused() p,
pg_last_wal_replay_lsn() replay_lsn, pg_last_wal_receive_lsn() receive_lsn, pg_last_xact_replay_timestamp();"
waiting for server to shut down....
server stopped 
waiting for server to start....
LOG:  entering standby mode 
LOG:  redo starts at 0/3000080 
LOG:  consistent recovery state reached at 0/4000130 
LOG:  database system is ready to accept read-only connections 
done 
server started 

application_name | state | flush_lsn | replay_lsn | replay_lag  
-----------------+-------+-----------+------------+------------ 
(0 rows) 

  state    | p | replay_lsn | receive_lsn | pg_last_xact_replay_timestamp  
-----------+---+------------+-------------+------------------------------- 
not paused | f | 0/4000130  |             | 21:25:19.866532+03 
(1 row)

walreceiver не запустился. Он запустится только через recovery_min_apply_delay. А этот параметр может быть выставлен в несколько суток. Просто так поменять его нельзя, так как применятся изменения, и реплику не удастся использовать для восстановления на момент в прошлом.

Решение проблемы задержки с запуском walreceiver

В Tantor Postgres, начиная с версии 17.9, добавлен параметр wal_receiver_start_at, который устраняет проблему: walreceiver можно запускать сразу после запуска экземпляра или по достижению согласованного состояния. Параметр был добавлен техподдержкой Тантор, по запросу администратора небольшой компании, купившей Tantor Postgres SE 1C.

В PostgreSQL новые параметры добавлются только в мажорные версии, которые выпускаются раз в год, в минорные не добавляются. Это сделано потому, что новшества добавляются членами сообщества независимо друг от друга и могут повлиять на параллельно добавляемые новшества, что породит ошибки, похожие на ту, которую обнаружил Киотаро Хоригучи (NTT): Два патча работали независимо друг от друга без ошибок, но при применении первого патча нужно было учесть его исправления и доработать второй патч.
В Tantor Postgres новые возможности добавляются быстрее - в минорных версиях, так как разработка централизована и есть возможность оценить влияние изменений друг на друга. В примере на картинке параметры enable_eager_aggregate и min_eager_agg_group_size появятся в 19 версии PostgreSQL, а в Tantor Postgres начиная с версии 18.3.
Запрос на добавление параметра wal_receiver_start_at был создан 24 июля 2025 года. На следующий день техподдержка создала задачу на добавление параметра. Седьмую версию патча Сунил опубликовал через 4 дня, 29 июля. Патч стал активно дорабатываться. Десятая версия патча была выпущена 23 ноября, после неё доработок не было. 7 января 2026 года патч получил статус ready for commiter и разработчики Тантор добавили параметр в ближайшие версии Tantor Postgres 17 и 18 версий. Первой, в которой появился параметр, была сборка Tantor Postggres BE 18.1, которая вышла 16 марта 2026 года.

Установим параметр wal_receiver_start_at на реплике и перезапустим экземпляр:

psql -p 5433 -qc "alter system set wal_receiver_start_at=startup"
pg_ctl restart -D $HOME/tantor-se-18-replica/data1
psql -p 5433 -qc "select pg_get_wal_replay_pause_state() state, pg_is_wal_replay_paused() p,
pg_last_wal_replay_lsn() replay_lsn, pg_last_wal_receive_lsn() receive_lsn, pg_last_xact_replay_timestamp();" 
psql -qc "select application_name, state, flush_lsn, replay_lsn, replay_lag from pg_stat_replication"

ALTER SYSTEM 
LOG:  received fast shutdown request 
waiting for server to shut down....
done 
server stopped 
waiting for server to start....
LOG:  database system was shut down in recovery at 21:31:49 MSK 
LOG:  requesting stream from beginning of: "000000010000000000000009" 
LOG:  entering standby mode 
LOG:  redo starts at 0/3000080 
LOG:  started streaming WAL from primary at 0/9000000 on timeline 1 
LOG:  consistent recovery state reached at 0/66C92B8 
LOG:  database system is ready to accept read-only connections 
done 
server started 
  state    | p | replay_lsn | receive_lsn | pg_last_xact_replay_timestamp  
-----------+---+------------+-------------+------------------------------- 
not paused | f | 0/66FE800  | 0/C899BE8   | 21:26:50.104791+03 
(1 row) 

21:31:50.113 MSK [92940] LOG:  autoprewarm successfully prewarmed 2550 of 2550 previously-loaded blocks 
application_name |   state   | flush_lsn | replay_lsn |   replay_lag     
-----------------+-----------+-----------+------------+----------------- 
replica1         | streaming | 0/C89A6E8 | 0/66FFC18  | 00:00:00.574187 
(1 row)

Процесс walreceiver запустился сразу после запуска экземпляра реплики.

Защита мастера от повреждений репликой с отложенным применением журналов

Реплика с отложенным на долгое время (сутки или несколько суток) применением журналов полезна тем, что если на мастере возникнет повреждение, то можно будет приостановить применение журналов, сделать бэкап этой реплики и экспериментировать с бэкапом, докатывая журналы до момента сбоя. При этом будет иметься бэкап (он же реплика), с которого ещё раз можно будет взять бэкап, если не угадать со временем восстановления. Нужно только помнить, что после рестарта реплики, нужно снова ставить применение журналов на паузу. Также следить за тем, чтобы журналы удерживались или скопировать их.

psql -p 5433 -qc "select pg_wal_replay_pause()" 
rm -rf /var/lib/postgresql/tantor-se-18-replica/data2
pg_basebackup -p 5433 -D /var/lib/postgresql/tantor-se-18-replica/data2 -P -R -c fast
LOG:  recovery has paused 
HINT:  Execute pg_wal_replay_resume() to continue. 
pg_wal_replay_pause  
--------------------- 
 
(1 row)
54422/54422 kB (100%), 1/1 tablespace

Примеры повреждений мастера: удаление базы данных или важных объектов по ошибке. Вместо реплики с отложенным применением можно использовать бэкапы. Они могут быть хорошим решением, если размер кластера небольшой. В 17 версии появились инкрементальные бэкапы, но есть недостаток: их нельзя накладывать на директорию с полным бэкапом (in-place).

Заключение

Параметр wal_receiver_start_at позволяет запускать walreceiver на реплике сразу или по достижению согласованного состояния файлов. При перезапуске экземпляра реплики или процесса walreceiver, процесс walreceiver будет немедленно запускаться и продолжать вытягивать журналы без задержки.

Это позволяет использовать реплику с отложенным применением журналов для защиты мастера от повреждений, как постоянно обновляемый (in place) бэкап. С реплики с отложенным применением журналов можно делать бэкапы.

Без параметра wal_receiver_start_at, реплика не может принимать журнальные файлы до истечения recovery_min_apply_delay.