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
совместима только с серверами той же основной версии, что и сама утилита.