G.5. pgpro_validate — проверка целостности данных экземпляра Postgres Pro #

G.5.1. Обзор
G.5.2. Установка
G.5.3. Особенности и ограничения
G.5.4. Команды
G.5.5. Общие параметры
G.5.6. Параметры удалённого режима

G.5.1. Обзор #

Утилита pgpro_validate предоставляет инструменты для проверки целостности файлов и объектов экземпляра Postgres Pro, выполняя следующие виды операций:

  • проверку контрольных сумм блоков базы данных;

  • проверку каталога base;

  • проверку целостности файловой системы (global, pg_xact, pg_wal и др.);

  • проверку целостности индексов;

  • проверку ссылочной целостности системных каталогов (pg_depend, pg_shdepend и др.);

  • проверку таблиц;

  • проверку ограничений целостности (NOT NULL, FOREIGN KEY, UNIQUE);

  • проверку прав доступа к файлам;

  • проверку файлов табличных пространств.

pgpro_validate работает в режиме «только чтение» и не вносит изменений в кластер баз данных. Утилита может выполняться локально на хосте с каталогом PGDATA либо в удалённом режиме через SSH, при котором локальный экземпляр запускает pgpro_validate на удалённом хосте и передаёт его вывод потоково.

G.5.2. Установка #

Утилита pgpro_validate поставляется вместе с Postgres Pro Standard в отдельном пакете pgpro-validate-std-17 (подробные инструкции по установке приведены в Главе 16).

G.5.3. Особенности и ограничения #

Перед началом работы с pgpro_validate обратите внимание на особенности работы, описанные ниже.

G.5.3.1. Общие #

  • Для следующих команд, требующих подключения к базе данных, сервер Postgres Pro должен быть запущен: amcheck, constraints, database_files, index, integrity, molotilka и tablespace. Для этих команд также требуется, чтобы пользователь базы данных имел права суперпользователя или соответствующие роли для чтения системных каталогов и пользовательских таблиц.

    Команды, которые обращаются только к файловой системе — checksum, permissions, postgres_files — могут выполняться на остановленном сервере при условии, что файлы не изменяются во время проверки.

  • Пользователь, от имени которого запускается pgpro_validate, должен иметь права на чтение всех файлов в каталоге PGDATA.

  • Для команды amcheck в каждой целевой базе данных должно быть установлено расширение amcheck или amcheck_next. Базы данных без расширения пропускаются с предупреждением.

  • Для команды molotilka требуется расширение pageinspect. При первом запуске pgpro_validate пытается установить его автоматически (CREATE EXTENSION IF NOT EXISTS pageinspect), поэтому пользователь базы данных должен иметь соответствующие привилегии, либо расширение должно быть установлено заранее.

G.5.3.2. CFS (Compressed File System, сжатая файловая система) #

  • pgpro_validate поддерживает проверки на уровне каталога базы данных для CFS-файлов с помощью следующих команд: amcheck, constraints, database_files, index, integrity, molotilka и tablespace.

  • Команда database_files учитывает файлы *.cfm и не сообщает о них как о потерянных.

  • Команды permissions и postgres_files проверяют только метаданные файловой системы.

  • Команды checksum dir и checksum file не работают с CFS.

G.5.3.3. Удалённый режим #

  • При удалённых SSH-подключениях интерактивный ввод пароля не поддерживается. Аутентификация по ключам должна быть настроена заранее.

  • Пароль базы данных передаётся на удалённый хост через стандартный ввод SSH-сеанса и экспортируется на удалённой стороне как переменная окружения PGPASSWORD. Пароль не отображается в аргументах командной строки и не виден в выводе ps.

  • Основные версии локального и удалённого экземпляров pgpro_validate должны совпадать. Несовпадение дополнительных версий вызывает предупреждение, но проверка продолжается.

  • В обычном (plain) формате вывод удалённого процесса передаётся потоково. В формате JSON вывод буферизуется и проверяется как JSON; при ошибке возвращается синтетический объект {"error": ..., "exit_code": ...}.

G.5.4. Команды #

G.5.4.1. Без команды #

pgpro_validate [общие_параметры] [параметры_удалённого_режима]

Выполняет последовательно все применимые проверки.

Проверки, требующие подключения к базе данных, выполняются, только если задана строка подключения, а проверки, требующие доступа к PGDATA, — только если указан параметр --pgdata. В противном случае такие проверки пропускаются с информационным сообщением.

Пример:

pgpro_validate \
    --pgdata=/var/lib/postgresql/15/data \
    --username=postgres \
    --dbname=postgres

G.5.4.2. amcheck #

pgpro_validate [общие_параметры] [параметры_удалённого_режима] amcheck [--all] [--check-db=имя_базы_данных]
[--checkunique] [--exclude-schema=имя_схемы] [--heapallindexed]

Выполняет логическую проверку индексов B-дерево с использованием расширения amcheck.

Для этой команды требуется только подключение к базе данных. Параметр --pgdata не используется.

--check-db=имя_базы_данных

Список баз данных, разделённых запятыми, в которых выполняется проверка индексов. Если этот параметр опущен, проверяются все базы данных.

В отличие от команд index и constraints, amcheck использует параметр --check-db, а не --db.

--exclude-schema=имя_схемы

Список схем, разделённых запятыми, которые исключаются из проверки.

--heapallindexed

Включить дополнительную проверку того, что все версии строк, видимые согласно текущему снимку, присутствуют в индексе.

--checkunique

Дополнительно проверить соблюдение ограничения уникальности.

-a
--all

Включить все доступные проверки (--heapallindexed и --checkunique).

Пример:

pgpro_validate amcheck --all \
    --dbname=postgres \
    --username=postgres

G.5.4.3. checksum dir #

pgpro_validate [общие_параметры] [параметры_удалённого_режима] checksum [--percent=процент] dir --pgdata=каталог_данных [путь_к_каталогу]

Проверяет контрольные суммы блоков всех файлов отношений в указанном каталоге.

Для этой команды не требуется подключения к базе данных, но требуется параметр --pgdata.

dirpath — необязательный путь к проверяемому каталогу. Если этот аргумент опущен, проверяется каталог PGDATA/base.

Параметр --percent задаёт процент случайно выбранных блоков для проверки в каждом файле. Допустимые значения — от 0 до 100. Значение по умолчанию — 100 (все блоки).

Пример:

pgpro_validate checksum --percent=20 dir \
    --pgdata=/var/lib/postgresql/15/data

G.5.4.4. checksum file #

pgpro_validate [общие_параметры] [параметры_удалённого_режима] checksum [--percent=процент] file --pgdata=каталог_данных
[--bstart=номер] [--bend=номер] путь

Проверяет контрольные суммы блоков одного файла отношения.

Для этой команды не требуется подключения к базе данных, но требуется параметр --pgdata, даже если путь указывает на файл за пределами PGDATA.

путь — путь к проверяемому файлу. Должен быть обычным файлом (не каталогом и не символической ссылкой).

--bstart=номер

Номер начального блока (включительно).

--bend=номер

Номер конечного блока (включительно). Если этот параметр не указан, проверяются все блоки до конца файла.

--percent=процент

Процент случайно выбранных блоков из указанного диапазона. Допустимые значения — от 0 до 100. Значение по умолчанию — 100.

Пример:

pgpro_validate checksum file \
    --pgdata=/var/lib/postgresql/15/data \
    --bstart=0 --bend=1024 \
    /var/lib/postgresql/15/data/base/16384/2619

G.5.4.5. constraints #

pgpro_validate [общие_параметры] [параметры_удалённого_режима] constraints [--db=имя_базы_данных] [-t=имя_таблицы]

Проверяет ограничения целостности (NOT NULL, FOREIGN KEY, UNIQUE) для пользовательских таблиц.

--db=имя_базы_данных

Список баз данных, разделённых запятыми, в которых проверяются ограничения. Если этот параметр опущен, проверяются все базы данных.

-t=имя_таблицы
--table=имя_таблицы

Список таблиц, разделённых запятыми, для проверки. Если этот параметр опущен, проверяются все пользовательские таблицы.

Пример:

pgpro_validate constraints \
    --db=mydb \
    --table=public.orders,public.customers \
    --username=postgres

G.5.4.6. database_files #

pgpro_validate [общие_параметры] [параметры_удалённого_режима] database_files --pgdata=каталог_данных

Сравнивает файлы в каталоге base и каталоге табличных пространств (pg_tblspc) с записями в системном каталоге pg_class. Обнаруживает потерянные файлы, не имеющие соответствующих отношений, а также отношения, для которых отсутствуют ожидаемые файлы.

Эта команда требует и доступа к каталогу PGDATA, и подключения к базе данных.

Пример:

pgpro_validate database_files \
    --pgdata=/var/lib/postgresql/15/data \
    --username=postgres

G.5.4.7. index #

pgpro_validate [общие_параметры] [параметры_удалённого_режима] index [--db=имя_базы_данных]

Проверяет версию формата и согласованность метаданных индексов.

--db=имя_базы_данных

Список баз данных, разделённых запятыми. Если этот параметр опущен, проверяются все базы данных.

Пример:

pgpro_validate index \
    --db=mydb \
    --username=postgres

G.5.4.8. integrity #

pgpro_validate [общие_параметры] [параметры_удалённого_режима] integrity [--select-from-relation[=true|false]]

Проверяет ссылочную целостность системных каталогов: согласованность pg_depend, pg_shdepend, pg_class, pg_namespace, pg_authid и других.

--select-from-relation[=true|false]

Включить дополнительную проверку, которая выполняет команду SELECT для каждого найденного отношения, чтобы убедиться в его доступности для чтения.

Пример:

pgpro_validate integrity \
    --dbname=postgres \
    --username=postgres \
    --select-from-relation

G.5.4.9. molotilka #

pgpro_validate [общие_параметры] [параметры_удалённого_режима] molotilka --pgdata=каталог_данных [--percent=процент] [-t=имя_таблицы]

Выполняет полное сканирование страниц таблиц и обнаруживает повреждённые страницы.

--percent=процент

Процент случайно выбранных страниц для сканирования. Допустимые значения — от 0 до 100. Значение по умолчанию — 100.

-t=имя_таблицы
--table=имя_таблицы

Список таблиц, разделённых запятыми, для сканирования. Если этот параметр опущен, сканируются все пользовательские таблицы.

Пример:

pgpro_validate molotilka --percent=10 \
    --pgdata=/var/lib/postgresql/15/data \
    --dbname=mydb \
    --username=postgres

G.5.4.10. permissions #

pgpro_validate [общие_параметры] [параметры_удалённого_режима] permissions --pgdata=каталог_данных

Проверяет права доступа, владельца и группу всех файлов и каталогов в PGDATA на соответствие ожидаемым значениям Postgres Pro.

Для этой команды не требуется подключения к базе данных, но требуется параметр --pgdata.

Команда permissions выполняется параллельно. Для задания количества потоков используйте параметр --jobs.

Пример:

pgpro_validate permissions --jobs=4 \
    --pgdata=/var/lib/postgresql/15/data

G.5.4.11. postgres_files #

pgpro_validate [общие_параметры] [параметры_удалённого_режима] postgres_files --pgdata=каталог_данных

Проверяет наличие фиксированного набора файлов и каталогов, которые Postgres Pro ожидает увидеть в PGDATA, например, PG_VERSION, postgresql.conf, pg_xact, pg_wal.

Для этой команды не требуется подключения к базе данных, но требуется параметр --pgdata.

Пример:

pgpro_validate postgres_files \
    --pgdata=/var/lib/postgresql/15/data

G.5.4.12. tablespace #

pgpro_validate [общие_параметры] [параметры_удалённого_режима] tablespace --pgdata=каталог_данных

Проверяет каталоги табличных пространств: корректность символических ссылок в PGDATA/pg_tblspc, существование целевых каталогов, наличие подкаталогов, соответствующих версии сервера, и согласованность с pg_tablespace.

Эта команда требует и доступа к каталогу PGDATA, и подключения к базе данных.

Пример:

pgpro_validate tablespace \
    --pgdata=/var/lib/postgresql/15/data \
    --dbname=postgres

G.5.5. Общие параметры #

Следующие параметры применяются ко всем командам, за исключением случаев, где явно указано иное.

-d=имя_базы_данных
--dbname=имя_базы_данных

Имя базы данных для подключения. Значение по умолчанию — postgres.

-h=хост
--hostname=хост

Имя или адрес хоста сервера Postgres Pro.

-p=порт
--port=порт

Порт сервера Postgres Pro. Значение по умолчанию — 5432.

-U=имя_пользователя
--username=имя_пользователя

Имя пользователя базы данных. Значение по умолчанию — postgres.

-W=пароль
--password=пароль

Пароль пользователя базы данных. Если этот параметр не указан, используется переменная окружения PGPASSWORD или файл .pgpass.

-D=каталог_данных
--pgdata=каталог_данных

Путь к каталогу данных PGDATA.

Параметр --pgdata не применяется к команде amcheck.

--tmp=путь

Путь к временному каталогу. По умолчанию используется /tmp.

-j=число_потоков
--jobs=число_потоков

Количество параллельных потоков для проверки. Значение должно быть положительным целым числом. По умолчанию используется количество доступных ядер процессора (runtime.NumCPU()). Если указанное значение превышает количество ядер, команда завершается с ошибкой «exceed number of CPU cores» (превышено количество ядер процессора).

--format={json|plain}

Формат вывода. По умолчанию используется обычный (plain) формат. Если для параметра задано значение json, стандартный журнал отключается, а результат записывается в стандартный вывод в виде единого JSON-документа.

--report-size=целое_число

Максимальное количество сообщений об ошибках, выводимых для одной проверки.

--log-level={error|warn|info|debug}

Уровень протоколирования.

-?
--help

Вывести справку по командной строке.

-v
--version

Вывести версию pgpro_validate.

G.5.6. Параметры удалённого режима #

pgpro_validate поддерживает выполнение проверок на удалённом сервере через SSH. Локальный экземпляр запускает pgpro_validate на удалённом хосте с переданными параметрами.

--remote-host=адрес_хоста

Адрес удалённого хоста. Указание этого параметра активирует удалённый режим.

--remote-path=путь

Путь к исполняемому файлу pgpro_validate на удалённом хосте. Этот параметр обязателен в удалённом режиме.

--remote-port=порт

SSH-порт. Значение по умолчанию — 22.

-u=имя_пользователя
--remote-user=имя_пользователя

SSH-пользователь.

--ssh-key=путь

Путь к файлу закрытого SSH-ключа.

--ssh-config=путь

Путь к файлу конфигурации SSH.

--ssh-options=параметры

Дополнительные параметры SSH, разделённые точкой с запятой. Например: StrictHostKeyChecking=no;UserKnownHostsFile=/dev/null.

--remote-version

Вывести версию pgpro_validate на удалённом хосте и версию локальной утилиты, после чего завершить работу. Если параметр --remote-host не задан, команда завершается ошибкой.

G.5.6.1. Пример #

Пример полной проверки удалённого сервера:

pgpro_validate \
    --remote-host=db-server \
    --remote-path=/usr/bin/pgpro_validate \
    --remote-user=dba \
    --ssh-key=/home/dba/.ssh/id_db_server \
    --pgdata=/var/lib/postgresql/15/data \
    --username=postgres \
    --dbname=mydb