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

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

Указанное имя должно быть больше любого имени файла, находящегося в каталоге 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 существующего кластера баз данных, избегая необходимости повторной операции 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