pg_resetxlog
pg_resetxlog — сбросить журнал предзаписи и другую управляющую информацию кластера PostgreSQL
Синтаксис
pg_resetxlog [-c xid,xid] [-f] [-n] [-o oid] [-x xid] [-e xid_epoch] [-m mxid,mxid] [-O mxoff] [-l xlogfile] {[-D] каталог_данных}
Описание
pg_resetxlog очищает журнал предзаписи (WAL) и может сбросить некоторую другую управляющую информацию, хранящуюся в файле pg_control. Данная функция может быть востребована при повреждении этих файлов. Использовать её нужно только как крайнюю меру, когда запуск сервера оказывается невозможен из-за этого повреждения.
После выполнения этой команды запуск сервера, скорее всего, будет возможен, однако стоит учитывать, что база данных может содержать несогласованные данные из-за транзакций, зафиксированных частично. Вы должны немедленно выгрузить данные, выполнить initdb, а затем восстановить данные. После этого проверьте целостность базы и внесите необходимые коррективы.
Эту утилиту может запускать только пользователь, установивший сервер, так как ей нужны права записи/чтения в каталоге хранения данных кластера. В целях безопасности каталог необходимо указывать в командной строке. pg_resetxlog не поддерживает переменную окружения PGDATA.
Если pg_resetxlog сообщает о невозможности определить данные из pg_control, то команду можно запустить принудительно, указав -f. В этом случае будут использованы наиболее вероятные значения. Они должны подходить для большинства полей, но для некоторых может потребоваться задать нужные значения явно: следующее значение OID, ID и эпоха следующей транзакции, ID мультитранзакции и смещение, начальный адрес WAL. Эти значения можно указать с помощью описанных далее параметров. Если их невозможно определить, то флаг f позволяет это обойти. Однако достоверность данных восстановленной базы не гарантируется: крайне необходимо незамедлительно выгрузить и затем восстановить данные. Не выполняйте никаких операций модификации до создания дампа данных, так как это может привести к ещё более печальным последствиям.
Для указания значения следующего OID, ID и эпохи следующей транзакции, ID мультитранзакции, смещения мультитранзакции, ID старейшей и новейшей транзакций, для которых можно получить время фиксации, и начального адреса WAL используются соответственно параметры -o, -x, -e, -m, -O, -c и -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. Имена файлов также представлены в шестнадцатеричном формате, однако не существует однозначного решения в добавлении замыкающих нулей, аналогично ранее описанным.Безопасное значение идентификатора старейшей транзакции, для которой можно получить время фиксации (первая часть
-c), можно определить, найдя наименьшее в числовом виде имя файла в каталогеpg_commit_tsвнутри каталога данных. Безопасное значение идентификатора новейшей транзакции, для которой можно получить время фиксации (вторая часть-c), можно определить, найдя, напротив, наибольшее в числовом виде имя файла в том же каталоге. Числа в именах этих файлов, как и предыдущих, представлены в шестнадцатеричном формате.Начальный адрес журнала WAL (
-l) должен превышать наибольшее значение сегмента в имени файла, расположенного в каталогеpg_xlog. Имена также представлены в шестнадцатеричном формате и состоят из трёх частей. Первая из них — «ID временного интервала» (обычно оставляют неизменным). Например, если00000001000000320000004A— наибольшее значение вpg_xlog, то можно использовать-l 00000001000000320000004Bили больше.Примечание
pg_resetxlogищет среди файлов каталогаpg_xlog, и по умолчанию выбирает значение для флага-l, идущее следующим после найденного. Корректировка значения параметра-lтребуется лишь в ситуации, когда известно о существовании других сегментов WAL, отсутствующих на момент в каталогеpg_xlog, например, из архивного файла, или при полной потере данных вpg_xlog.Не существует относительно простого способа вычисления следующего за наибольшим из существующих значением OID, однако это некритично.
Эпоха идентификаторов транзакции не хранится в базе данных нигде, кроме поля, устанавливаемого командой
pg_resetxlog, поэтому пока рассматривается сама база, допустимым будет любое значение. Это значение, возможно, понадобится скорректировать для обеспечения правильной работы системы репликации, например, Slony-I и Skytools. В этом случае подходящее значение следует получить из состояния нижележащей реплицированной базы данных.
С флагом -n (нет операции) команда pg_resetxlog отображает извлечённые из pg_control данные, а также значения, которые можно изменить. Режим полезен для отладки и тестирования предстоящей операции без реального применения изменений.
Флаги -V и --version выводят версию pg_resetxlog и прерывают дальнейшее выполнение. Ключи -? и --help выводят справку по поддерживаемым аргументам.
Замечания
Команду нельзя выполнять на работающем сервере. pg_resetxlog отклонит выполнение при обнаруженном блокирующем файле в каталоге хранения данных. Иногда при аварии сервера блокирующий файл может остаться в системе. В этом случае необходимо самостоятельно удалить его, чтобы дать возможность pg_resetxlog отработать. Перед выполнением операции дважды убедитесь, что сервер остановлен.
pg_resetxlog работает только с серверами той же основной версии.