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

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-15 (подробные инструкции по установке приведены в Главе 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. Удалённый режим

  • При удалённых 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.

путь_к_каталогу — необязательный путь к проверяемому каталогу. Если этот аргумент опущен, проверяется каталог 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
FAQ