pg_resetxlog

Название

pg_resetxlog -- очистка журнала упреждающей записи и другой управляющей информацию кластера PostgreSQL

Синтаксис

pg_resetxlog [ -f ] [ -n ] [-o oid] [-x xid] [-e xid_epoch] [-m mxid,mxid] [-O mxoff] [-l xlogfile] datadir

Описание

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

После запуска этой команды, старт сервера, скорее всего, будет возможен, однако, стоит учитывать, что сервер может оказаться не в целостном состоянии. Требуется немедленно выгрузить данные (dump), выполнить initdb и загрузить данные. После чего проверить целостность и при необходимости восстановить.

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

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

Чтобы указать значения следующих OID, ID транзакции, времени транзакции, ID мультитранзакции, смещения мультитранзакции и начального адреса WAL, используются соответствующие параметры -o, -x, -e, -m, -O, и -l. Это требуется, когда pg_resetxlog не может самостоятельно определить значения из файла pg_control. Безопасные значения вычисляются, как описано далее:

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

  • Безопасное значение следующего идентификатора мультитранзакции (первый аргумент параметра -m) можно вычислить, найдя наибольшее числовое значение среди имён файлов, расположенных в каталоге pg_multixact/offsets. К найденному значению необходимо прибавить один, затем умножить на 65536. Для вычисления же наиболее старшего ID мультитранзакции (второй аргумент параметра -m), необходимо найти наименьшее числовое значение среди тех же файлов, и умножить его на 65536. Как было описано ранее, имена представлены в шестнадцатеричном формате, поэтому значения аргументов лучше указывать в нём же, приписав четыре замыкающих нуля.

  • Чтобы определить безопасное значение следующего смещения (-O), необходимо найти наибольшее числовое значение в имени файла в каталоге pg_multixact/members, прибавить один, а затем умножить на 52352. Имена файлов также представлены в шестнадцатеричном формате, однако не существует однозначного решения в добавлении замыкающих нулей, аналогично ранее описанным.

  • Начальный адрес журнала WAL (-l) должен превышать наибольшее значение сегмента в имени файла, расположенного в каталоге pg_xlog. Имена также представлены в шестнадцатеричном формате и состоят из трёх частей. Первая из них это "ID временного интервала" (обычно оставляют неизменным), например, если 00000001000000320000004A имеет наибольшее значение в pg_xlog, то можно использовать -l 00000001000000320000004B, либо выше.

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

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

  • Время ID транзакции не хранится в базе данных кроме поля, устанавливаемого командой pg_resetxlog, поэтому принимается любая допустимая величина. Возможно, понадобиться поправить значение для обеспечения работоспособности репликации, например, Slony-I. Значение должно соответствовать состоянию реплицируемой базы данных.

С флагом -n (без выполнения) команда pg_resetxlog отображает извлечённые из pg_control данные, а также значения, которые можно изменить. Режим полезен для отладки и тестирования предстоящей операции без реального применения изменений.

Флаги -V и --version выводят версию pg_resetxlog и прерывают дальнейшее выполнение. Ключи -? и --help выводят справку по поддерживаемым аргументам.

Замечания

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