Перейти к основному содержимому

pg_resetwal

примечание

Эта страница переведена при помощи нейросети GigaChat.

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

Синтаксис

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

Описание

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

Некоторые параметры, например --wal-segsize (подробнее смотрите ниже), также могут использоваться для изменения определенных глобальных настроек кластера базы данных без необходимости повторного запуска initdb. Это можно сделать безопасно на другом исправном кластере базы данных, если ни один из опасных режимов, упомянутых ниже, не используется.

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

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

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

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

Параметры

Для утилиты pg_resetwal существуют следующие параметры командной строки:

datadir
-D datadir
--pgdata=datadir Задает расположение каталога базы данных. Из соображений безопасности необходимо указывать каталог данных в командной строке. pg_resetwal не использует переменную окружения PGDATA.

-f
--force Принуждает pg_resetwal продолжать даже в ситуациях, когда это может быть опасным, как объяснено выше. Конкретно этот параметр необходим для продолжения, если сервер не был корректно остановлен или если pg_resetwal не может определить допустимые данные для pg_control.

-n
--dry-run

Инструктирует pg_resetwal только отобразить реконструированные значения из pg_control и значения, которые будут изменены, без внесения каких-либо изменений. Режим полезен для отладки и предварительной проверки перед запуском с изменениями.

-V
--version

Выводит версию pg_resetwal и завершается.

-?
--help

Показывает справку о параметрах командной строки утилиты pg_resetwal и завершается.

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

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

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

Первое значение — самый старый XID, второе — самый новый. Безопасные значения можно получить, проанализировав численно минимальное и максимальное имя файла в каталоге pg_commit_ts под каталогом данных. Эти имена файлов представлены в шестнадцатеричной системе счисления.

-e xid_epoch
--epoch=xid_epoch

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

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

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

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

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

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

Примечание

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

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

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

Безопасные значения определяются на основе содержимого каталога pg_multixact/offsets:

  • следующего ID мультитранзакции — путем нахождения самого большого имени файла, прибавления 1 и умножения на 65536 (0x10000);
  • самого старого ID — по самому маленькому имени файла, также умноженному на 65536.

Все имена файлов в этом каталоге — шестнадцатеричные.

-o oid
--next-oid=oid

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

Точное определение корректного значения затруднено, но важно лишь, чтобы оно было выше всех используемых в базе. Некорректное значение не приводит к фатальным ошибкам.

-O mxoff
--multixact-offset=mxoff

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

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

Формат имен — шестнадцатеричный. Универсального правила для добавления нулей, как у других параметров, здесь нет.

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

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

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

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

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

Безопасное значение можно определить по максимальному имени файла в каталоге pg_xact, прибавив 1 и умножив на 1048576 (0x100000). Например, если максимальный файл — 0011, параметр -x 0x1200000 будет допустим.

--char-signedness=option

Устанавливает вручную значение знака символа по умолчанию. Возможные значения: signed и unsigned.

Для кластера баз данных, который был обновлен с версии PostgreSQL до 18 с помощью pg_upgrade, безопасным значением будет значение знака символа по умолчанию для платформы, на которой работал кластер до обновления. Для всех остальных кластеров безопасным значением будет signed. Однако этот параметр предназначен исключительно для использования с pg_upgrade и обычно не должен использоваться вручную.

--wal-segsize=wal_segment_size

Устанавливает размер сегмента WAL в мегабайтах.

Значение должно быть степенью двойки от 1 до 1024. Подробности представлены в описании параметра --wal-segsize утилиты initdb.

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

Примечание

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

Переменные окружения

Утилита поддерживает переменные окружения:

PG_COLOR

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

Примечания

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

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

Смотрите также

pg_controldata