pg_resetwal#

pg_resetwal

pg_resetwal

pg_resetwal — сбросить журнал предварительной записи и другую управляющую информацию кластера базы данных Tantor SE

Синтаксис

pg_resetwal [ -f | --force ] [ -n | --dry-run ] [option...] [ -D | --pgdata ]datadir

Описание

pg_resetwal очищает журнал предварительной записи (WAL) и при необходимости сбрасывает некоторую другую управляющую информацию, хранящуюся в файле pg_control. Иногда эта функция требуется, если эти файлы были повреждены. Она должна использоваться только как крайний случай, когда сервер не запускается из-за такой коррупции.

После выполнения этой команды должно быть возможно запустить сервер, но имейте в виду, что база данных может содержать несогласованные данные из-за частично завершенных транзакций. Вы должны немедленно создать резервную копию данных, запустить команду initdb и восстановить данные. После восстановления проверьте наличие несоответствий и внесите необходимые исправления.

Эта утилита можно запустить только пользователем, который установил сервер, потому что она требует чтения/записи доступа к каталогу данных. По соображениям безопасности вы должны указать каталог данных в командной строке. pg_resetwal не использует переменную среды PGDATA.

Если pg_resetwal сообщает, что не может определить допустимые данные для pg_control, вы можете заставить его все равно продолжить, указав опцию -f (force). В этом случае для отсутствующих данных будут подставлены вероятные значения. Ожидается, что большая часть полей будет совпадать, но для следующих полей может потребоваться ручная помощь: следующий OID, следующий идентификатор транзакции и эпоха, следующий идентификатор множественной транзакции и смещение, а также поля начального местоположения WAL. Эти поля можно установить с помощью опций, описанных ниже. Если вы не можете определить правильные значения для всех этих полей, все равно можно использовать опцию -f, но восстановленную базу данных необходимо рассматривать с еще большим подозрением, чем обычно: немедленное создание резервной копии и восстановление обязательны. Не выполняйте никаких операций модификации данных в базе данных перед созданием резервной копии, так как любое такое действие может ухудшить повреждение.

Опции

-f
--force

Принудительно pg_resetwal продолжить, даже если он не может определить действительные данные для pg_control, как объяснено выше.

-n
--dry-run

Опция -n/--dry-run указывает команде pg_resetwal выводить значения, восстановленные из файла pg_control и значения, которые будут изменены, а затем завершить работу без внесения изменений. Это в основном инструмент отладки, но может быть полезным для проверки перед разрешением pg_resetwal продолжить работу на самом деле.

-V
--version

Отобразить информацию о версии, а затем завершить работу.

-?
--help

Показать справку, а затем выйти.

Следующие параметры необходимы только в том случае, если pg_resetwal не может определить соответствующие значения, считывая pg_control. Безопасные значения могут быть определены следующим образом. Для значений, принимающих числовые аргументы, можно указать шестнадцатеричные значения, используя префикс 0x.

-c xid,xid
--commit-timestamp-ids=xid,xid

Установите вручную самые старые и самые новые идентификаторы транзакций, для которых можно получить время коммита.

Значение для самого старого идентификатора транзакции, для которого можно получить время коммита (первая часть), можно определить, поискав наименьшее числовое имя файла в каталоге pg_commit_ts внутри каталога данных. Соответственно, значение для самого нового идентификатора транзакции, для которого можно получить время коммита (вторая часть), можно определить, поискав наибольшее числовое имя файла в том же каталоге. Имена файлов представлены в шестнадцатеричном формате.

-e xid_epoch
--epoch=xid_epoch

Установите эпоху следующего идентификатора транзакции вручную.

Эпоха идентификатора транзакции фактически не хранится нигде в базе данных, кроме поля, которое устанавливается с помощью pg_resetwal, поэтому любое значение будет работать, что касается самой базы данных. Вам может потребоваться настроить это значение, чтобы обеспечить правильную работу систем репликации, таких как Slony-I и Skytools - в этом случае соответствующее значение можно получить из состояния реплицированной базы данных нижестоящего уровня.

-l walfile
--next-wal-file=walfile

Установите начальное положение WAL вручную, указав имя следующего файла сегмента WAL.

Вам следует выбрать имя следующего файла WAL-сегмента, которое будет больше, чем любое существующее имя файла WAL-сегмента в каталоге pg_wal внутри каталога данных. Эти имена также записываются в шестнадцатеричном формате и состоят из трех частей. Первая часть - это идентификатор временной шкалы и обычно должна оставаться неизменной. Например, если 00000001000000320000004A является наибольшим значением в pg_wal, используйте -l 00000001000000320000004B или более высокое значение.

Обратите внимание, что при использовании нестандартного размера сегментов WAL номера в именах файлов журнала предзаписи отличаются от LSN, которые сообщаются системными функциями и системными представлениями. Этот параметр принимает имя файла журнала предзаписи, а не LSN.

Примечание

Сама команда pg_resetwal просматривает файлы в pg_wal и выбирает настройку по умолчанию для -l за пределами последнего существующего имени файла. Поэтому ручная настройка -l должна быть необходима только в случае, если вы знаете о сегментах WAL, которые в настоящее время отсутствуют в pg_wal, таких как записи в автономном архиве; или если содержимое pg_wal было полностью потеряно.

-m mxid,mxid
--multixact-ids=mxid,mxid

Установите следующий и предыдущий многотранзакционный идентификатор вручную.

Значение для следующего безопасного идентификатора многократной транзакции (первая часть) можно определить, поискав наибольшее числовое имя файла в каталоге pg_multixact/offsets внутри каталога данных, добавив единицу и умножив на 65536 (0x10000). Соответственно, значение для самого старого идентификатора многократной транзакции (вторая часть -m) можно определить, поискав наименьшее числовое имя файла в том же каталоге и умножив на 65536. Имена файлов представлены в шестнадцатеричном формате, поэтому самым простым способом сделать это является указание значения опции в шестнадцатеричном формате и добавление четырех нулей.

-o oid
--next-oid=oid

Установите следующий OID вручную.

Нет такого простого способа определить следующий OID, который находится за пределами самого большого в базе данных, но к счастью это не критично для правильной настройки следующего OID.

-O mxoff
--multixact-offset=mxoff

Установите следующий смещение для многотранзакционности вручную.

Безопасное значение можно определить, посмотрев на численно наибольшее имя файла в каталоге pg_multixact/members внутри каталога данных, добавив единицу, а затем умножив на 52352 (0xCC80). Имена файлов представлены в шестнадцатеричном формате. Нет простого рецепта, такого как для других параметров добавления нулей.

--wal-segsize=wal_segment_size

Установите новый размер сегмента WAL в мегабайтах. Значение должно быть установлено как степень двойки от 1 до 1024 (мегабайт). Дополнительную информацию смотрите в той же опции initdb.

Примечание

В то время как команда pg_resetwal установит начальный адрес WAL за пределами последнего существующего файла сегмента WAL, некоторые изменения размера сегмента могут привести к повторному использованию предыдущих имен файлов журнала предзаписи. Рекомендуется использовать -l вместе с этой опцией для ручной установки начального адреса WAL, если перекрытие имен файлов журнала предзаписи может вызвать проблемы с вашей стратегией архивирования.

-u xid
--oldest-transaction-id=xid

Установите вручную самый старый не замороженный идентификатор транзакции.

Безопасное значение можно определить, посмотрев на численно наименьшее имя файла в каталоге pg_xact внутри каталога данных, а затем умножив на 1048576 (0x100000). Обратите внимание, что имена файлов записаны в шестнадцатеричном формате. Обычно самым простым способом является указание значения опции также в шестнадцатеричном формате. Например, если 0007 является наименьшим значением в pg_xact, то -u 0x700000 будет работать (пять нулей в конце обеспечивают правильный множитель).

-x xid
--next-transaction-id=xid

Установите следующий идентификатор транзакции вручную.

Значение безопасного значения можно определить, посмотрев на наибольшее числовое значение имени файла в каталоге pg_xact внутри каталога данных, добавив единицу и затем умножив на 1048576 (0x100000). Обратите внимание, что имена файлов представлены в шестнадцатеричном формате. Обычно самым простым способом является указание значения параметра в шестнадцатеричном формате. Например, если 0011 является наибольшим значением в pg_xact, то -x 0x1200000 будет работать (пять нулей в конце обеспечивают правильный множитель).

Окружение

PG_COLOR

Определяет, следует ли использовать цвет в диагностических сообщениях. Возможные значения: always, auto и never.

Примечания

Необходимо избегать использования этой команды при работающем сервере. pg_resetwal откажется запускаться, если обнаружит файл блокировки сервера в каталоге данных. Если сервер аварийно завершил работу, то файл блокировки мог остаться. В этом случае вы можете удалить файл блокировки, чтобы запустить pg_resetwal. Однако перед этим убедитесь, что серверный процесс действительно не работает.

pg_resetwal работает только с серверами той же основной версии.

См. также

pg_controldata