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

pg_resetwal

примечание

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

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

Синтаксис

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

Описание

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

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

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

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

Параметры

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

-f
--force

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

-n
--dry-run

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

-V
--version

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

-?
--help

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

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

-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-сегмента.

Указанное имя должно быть больше любого имени файла, находящегося в каталоге pg_wal. Имя имеет формат XXXXXXXXYYYYYYYYZZZZZZZZ, где каждая часть представлена в шестнадцатеричной системе:

  • первая часть — идентификатор линии времени;
  • вторая — логическая часть номера;
  • третья — физическая часть номера.

Например, если максимальный файл — 00000001000000320000004A, можно использовать -l 00000001000000320000004B или выше.

Примечание

Хотяpg_resetwal по умолчанию сам определяет следующее имя WAL-файла на основе содержимого pg_wal, ручная установка может понадобиться, если часть файлов WAL отсутствует или каталог pg_wal утерян. Также при нестандартных размерах сегментов имена WAL-файлов могут не совпадать с LSN (логическими номерами), отображаемыми в системных представлениях.

-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).

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

--wal-segsize=wal_segment_size

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

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

Примечание

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

-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 будет допустим.

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

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

PG_COLOR

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

Примечания

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

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

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

pg_controldata