pg_resetwal
pg_resetwal — очистка журнала предзаписи и другой управляющей информации кластера Postgres Pro
Синтаксис
pg_resetwal [ -f | --force ] [ -n | --dry-run ] [параметр...] [ -D | --pgdata ]каталог_данных
Описание #
pg_resetwal очищает журнал предзаписи (WAL) и может сбросить некоторую другую управляющую информацию, хранящуюся в файле pg_control. Данная функция может быть востребована при повреждении этих файлов. Использовать её нужно только как крайнюю меру, когда запуск сервера оказывается невозможен из-за этого повреждения.
Некоторые параметры, такие как --wal-segsize (см. ниже), могут также использоваться для изменения некоторых глобальных параметров кластера баз данных без необходимости повторного запуска initdb. Это можно сделать безопасно в работающем кластере баз данных, если не используются опасные режимы, упомянутые ниже.
Если pg_resetwal используется для каталога данных, где сервер был остановлен в штатном режиме и управляющий файл в порядке, то это не повлияет на содержимое системы баз данных, за исключением того, что неиспользуемые файлы WAL будут удалены. Любое другое использование может быть потенциально опасным и должно осуществляться с большой осторожностью. Для каталога после аварийного отключения сервера или повреждения управляющего файла pg_resetwal потребует указать параметр -f (принудительное выполнение).
После выполнения этой команды в каталоге данных с повреждёнными файлами WAL или управляющим файлом, запуск сервера, скорее всего, будет возможен, однако стоит учитывать, что база данных может содержать несогласованные данные из-за транзакций, зафиксированных частично. Необходимо немедленно выгрузить данные, выполнить initdb, а затем восстановить данные. После этого проверьте целостность базы и внесите необходимые коррективы.
Если pg_resetwal сообщает о невозможности определить данные из pg_control, команду можно запустить принудительно, указав -f. В этом случае будут использованы наиболее вероятные значения. Они должны подходить для большинства полей, но для некоторых может потребоваться задать нужные значения явно: следующее значение OID, ID следующей транзакции, ID следующей мультитранзакции и смещение, начальная позиция WAL. Эти значения можно указать с помощью описанных далее параметров. Если их невозможно определить, то флаг f позволяет это обойти. Однако достоверность данных восстановленной базы не гарантируется: крайне необходимо незамедлительно выгрузить и затем восстановить данные. Не выполняйте никаких операций модификации до создания дампа данных, так как это может привести к ещё более печальным последствиям.
Эту утилиту может запускать только пользователь, установивший сервер, так как ей нужны права записи/чтения в каталоге хранения данных кластера.
Параметры
каталог_данных-Dкаталог_данных--pgdata=каталог_данныхУказывает расположение каталога базы данных. В целях безопасности каталог данных необходимо указывать в командной строке.
pg_resetwalне поддерживает переменную окруженияPGDATA.-f--forceПринудить
pg_resetwalпродолжить работу даже в опасных ситуациях, описанных выше. В частности, этот параметр необходим для продолжения работы, если сервер был аварийно остановлен или еслиpg_resetwalне может определить корректные данные для файлаpg_control.-n--dry-runС ключом
-n/--dry-runкомандаpg_resetwalотображает значения, извлечённые изpg_control, а также значения, которые планируется изменить, и завершается, не внося никаких изменений. Это, прежде всего, средство отладки, хотя оно может быть полезно и для того, чтобы проверить корректность параметров, прежде чемpg_resetwalначнёт что-либо делать.-V--versionПоказать версию, а затем завершиться.
-?--helpПоказать справку, а затем завершиться.
Следующие параметры необходимы, только когда pg_resetwal не может определить подходящие значения, прочитав pg_control. Безопасные значения можно определить, как описано ниже. Для значений, принимающих числовые аргументы, можно задать шестнадцатеричные значения, добавив префикс 0x. Обратите внимание, что эти инструкции относятся только к стандартному блоку размером 8 КБ.
-cxid,xid--commit-timestamp-ids=xid,xidВручную задать идентификаторы старейшей и новейшей транзакций, для которых можно получить время фиксации.
Безопасное значение идентификатора старейшей транзакции, для которой можно получить время фиксации (первый компонент), можно определить, найдя наименьшее в числовом виде имя файла в каталоге
pg_commit_tsвнутри каталога данных. Безопасное значение идентификатора новейшей транзакции, для которой можно получить время фиксации (второй компонент), можно определить, найдя, напротив, наибольшее в числовом виде имя файла в том же каталоге. Числа в именах этих файлов представлены в шестнадцатеричном формате.-lwalfile--next-wal-file=walfileВручную задать начальную позицию WAL, указав имя файла следующего сегмента WAL.
Имя файла следующего сегмента WAL должно превышать имена любых других файлов сегментов WAL, в настоящее время находящихся в подкаталоге
pg_walкаталога данных. Эти имена тоже представлены в шестнадцатеричном виде и состоят из трёх частей. Первая из них — «ID линии времени» и её обычно не следует менять. Например, если00000001000000320000004A— наибольшее значение вpg_wal, нужно указать-l 00000001000000320000004Bили большее число.Заметьте, что при использовании нестандартных размеров сегментов WAL числа в именах файлов WAL отличаются от LSN, выдаваемых системными функциями и представлениями. Этот параметр принимает имя файла WAL, а не LSN.
Примечание
pg_resetwalищет среди файлов каталогаpg_wal, и по умолчанию выбирает значение для флага-l, идущее следующим после найденного. Таким образом, вручную задавать параметр-lнужно лишь если известно о существовании сегментов WAL, отсутствующих в настоящий момент в каталогеpg_wal(например, они могут находится в отдельном архиве); либо если содержимоеpg_walбыло полностью утеряно.-mmxid,mxid--multixact-ids=mxid,mxidВручную задать ID следующей и старейшей мультитранзакции.
Безопасное значение следующего идентификатора мультитранзакции (первый компонент) можно вычислить, найдя наибольшее числовое значение среди имён файлов, расположенных в каталоге
pg_multixact/offsets. К найденному значению необходимо прибавить один, затем умножить на 2097152 (0x200000). Для вычисления безопасного значения ID старейшей мультитранзакции (второй компонент-m) необходимо найти наименьшее числовое значение среди тех же файлов, и умножить его на 2097152. Имена файлов представляются в шестнадцатеричном формате, так что значения проще указывать в нём же, добавив в конце четыре нуля.-ooid--next-oid=oidВручную задать следующий OID.
Не существует относительно простого способа вычисления следующего за наибольшим из существующих значением OID, однако это некритично.
-Omxoff--multixact-offset=mxoffВручную задать смещение следующей мультитранзакции.
Безопасное значение можно определить, найдя наибольшее числовое значение в имени файла в каталоге
pg_multixact/members, прибавив один и умножив результат на 1851392 (0x1c4000). Имена файлов представлены в шестнадцатеричном формате. Простого рецепта с прибавлением нулей в конце, как для других параметров, в данном случае нет.--wal-segsize=размер_сегмента_walЗадать другой размер сегмента WAL, в мегабайтах. Значение параметра должно быть степенью 2 от 1 до 1024 (в мегабайтах). Подробнее о нём можно узнать в описании такого же параметра initdb.
Этот параметр можно также использовать для изменения размера сегментов WAL существующего кластера баз данных, обходясь без повторного использования
initdb.Примечание
Хотя
pg_resetwalвыбирает стартовый адрес WAL, превышающий номер последнего существующего файла сегмента WAL, при некоторых изменениях размера предыдущие имена файлов WAL могут использоваться повторно. Если наложение имён файлов WAL приведёт к проблемам с вашей стратегией архивации, рекомендуется использовать-lвместе с этим ключом, чтобы вручную задать начальный адрес WAL.-uxid--oldest-transaction-id=xidВручную задать ID старейшей незамороженной транзакции.
Безопасное значение можно определить, найдя наименьшее числовое значение в имени файла в подкаталоге
pg_xactкаталога данных, а затем умножив результат на 67108864 (0x4000000). Заметьте, что имена файлов представлены в шестнадцатеричном формате. Значение этого параметра обычно также проще задавать в шестнадцатеричном виде. Например, если0007— наименьшее значение вpg_xact, подходящим значением будет-u 0x700000(нужный множитель дают пять последних нулей).-xxid--next-transaction-id=xidВручную задать ID следующей транзакции.
Безопасное значение можно определить, найдя наибольшее числовое значение в имени файла в подкаталоге
pg_xactкаталога данных, прибавив один и умножив результат на 67108864 (0x4000000). Заметьте, что имена файлов представлены в шестнадцатеричном формате. Значение этого параметра обычно также проще задавать в шестнадцатеричном виде. Например, если0011— наибольшее значение вpg_xact, подходящим значением будет-x 0x1200000(нужный множитель дают пять последних нулей).
Переменные окружения
PG_COLORВыбирает вариант использования цвета в диагностических сообщениях. Возможные значения:
always(всегда),auto(автоматически) иnever(никогда).
Примечания
Эту команду нельзя выполнять на работающем сервере. pg_resetwal отклонит выполнение при обнаруженном блокирующем файле в каталоге хранения данных. Иногда при аварии сервера блокирующий файл может остаться в системе. В этом случае необходимо самостоятельно удалить его, чтобы дать возможность pg_resetwal отработать. Перед выполнением операции дважды проверьте, что сервер остановлен.
pg_resetwal работает только с серверами той же основной версии.