pg_rewind [ параметр ...] { -D | --target-pgdata }каталог { --source-pgdata=каталог | --source-server=строка подключения }
Утилита pg_rewind представляет собой средство синхронизации кластера PostgreSQL с другой копией того же кластера после расхождения линий времени этих кластеров. Обычный сценарий её использования — вернуть в работу старый главный сервер после переключения на резервный, в качестве резервного для сервера, ставшего главным.
Её результат равнозначен замене целевого каталога данных исходным. Она копирует все файлы, включая файлы конфигурации. Преимущество pg_rewind по сравнению с созданием новой базовой копии или такими средствами, как rsync, состоит в том, что pg_rewind не требует читать все неизменённые файлы в кластере. Благодаря этому, она действует гораздо быстрее, когда база данных большая, а объём различий между кластерами невелик.
Утилита pg_rewind изучает историю линий времени исходного и целевого кластеров с целью найти точку, в которой они разошлись, и ожидает найти журналы WAL в каталоге pg_xlog целевого кластера вплоть до точки расхождения. В типичном сценарии отработки отказа, когда целевой кластер отключается вскоре после расхождения, это не проблема, но если целевой кластер проработал долгое время после расхождения, старые файлы WAL могут быть уже удалены. В этом случае их можно вручную скопировать из архива WAL в каталог pg_xlog. Автоматическая загрузка недостающих файлов из архива WAL в настоящее время не поддерживается.
Когда целевой сервер запускается в первый раз после выполнения pg_rewind, он переходит в режим восстановления и воспроизводит все изменения из WAL с исходного сервера после точки расхождения. Если какие-то сегменты WAL оказались недоступны на исходном сервере, когда выполнялась pg_rewind, и поэтому не могли быть скопированы в ходе работы pg_rewind, их необходимо предоставить, когда сервер будет запускаться. Это можно сделать, создав в целевом каталоге данных файл recovery.conf с подходящей командой restore_command.
Утилита pg_rewind требует, чтобы на целевом сервере был либо включён режим wal_log_hints в postgresql.conf, либо включены контрольные суммы, когда кластер был инициализирован командой initdb. Оба эти режима по умолчанию отключены. Также должен быть включён режим full_page_writes. По умолчанию он включён.
pg_rewind принимает следующие аргументы командной строки:
Этот параметр задаёт целевой каталог данных, который будет синхронизирован с источником. Целевой сервер должен быть отключён штатным образом до запуска pg_rewind
Задаёт путь к каталогу данных исходного сервера, с которым будет синхронизироваться целевой. Когда используется ключ --source-pgdata, исходный сервер должен быть остановлен штатным образом.
Задаёт строку подключения libpq для подключения к исходному серверу PostgreSQL, с которым будет синхронизирован целевой. Подключение должно устанавливаться как обычное (не реплицирующее) с правами суперпользователя. Сервер должен быть запущен и работать в обычном режиме, не в режиме восстановления.
Делать всё, кроме внесения изменений в целевой каталог.
Включает вывод сообщений о прогрессе. При этом в процессе копирования данных из исходного кластера будет выдаваться приблизительный процент выполнения.
Выводить подробные отладочные сообщения, полезные в основном для разработчиков, отлаживающих pg_rewind.
Показать версию, а затем завершиться.
Показать справку, а затем завершиться.
Когда используется --source-server, pg_rewind также использует переменные среды, поддерживаемые libpq (см. Разд. 31.14).
Основная идея заключается в том, чтобы скопировать из нового кластера в старый всё, за исключением блоков, которые, насколько нам известно, одинаковые.
Просканировать журнал WAL в старом кластере, начиная с последней контрольной точки, и до точки, в которой история линии времени нового кластера разошлась со старым кластером. Для каждой записи WAL отметить, какие блоки данных были затронуты. В результате будет получен список всех блоков данных, которые были изменены в старом кластере после отделения нового кластера.
Скопировать все эти изменённые блоки из нового кластера в старый.
Скопировать все остальные файлы, в частности clog и файлы конфигурации из нового кластера в старый, пропуская файлы отношений.
Применить WAL из нового кластера, начиная с контрольной точки, созданной при отработке отказа. (Строго говоря, утилита pg_rewind не применяет WAL, она просто создаёт файл метки резервной копии, найдя который при следующем запуске, PostgreSQL начнёт воспроизведение с этой контрольной точки и применит все требуемые записи WAL.)
| Пред. | Начало | След. |
| pg_resetxlog | Уровень выше | pg_test_fsync |