Утилита 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 на удалённом хосте и передаёт его вывод потоково.
Утилита pgpro_validate поставляется вместе с Postgres Pro Standard в отдельном пакете pgpro-validate-std-17 (подробные инструкции по установке приведены в Главе 16).
Перед началом работы с pgpro_validate обратите внимание на особенности работы, описанные ниже.
Для следующих команд, требующих подключения к базе данных, сервер 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), поэтому пользователь базы данных должен иметь соответствующие привилегии, либо расширение должно быть установлено заранее.
pgpro_validate поддерживает проверки на уровне каталога базы данных для CFS-файлов с помощью следующих команд: amcheck, constraints, database_files, index, integrity, molotilka и tablespace.
Команда database_files учитывает файлы *.cfm и не сообщает о них как о потерянных.
Команды permissions и postgres_files проверяют только метаданные файловой системы.
Команды checksum dir и checksum file не работают с CFS.
При удалённых SSH-подключениях интерактивный ввод пароля не поддерживается. Аутентификация по ключам должна быть настроена заранее.
Пароль базы данных передаётся на удалённый хост через стандартный ввод SSH-сеанса и экспортируется на удалённой стороне как переменная окружения PGPASSWORD. Пароль не отображается в аргументах командной строки и не виден в выводе ps.
Основные версии локального и удалённого экземпляров pgpro_validate должны совпадать. Несовпадение дополнительных версий вызывает предупреждение, но проверка продолжается.
В обычном (plain) формате вывод удалённого процесса передаётся потоково. В формате JSON вывод буферизуется и проверяется как JSON; при ошибке возвращается синтетический объект {"error": ..., "exit_code": ...}.
pgpro_validate [общие_параметры] [параметры_удалённого_режима]
Выполняет последовательно все применимые проверки.
Проверки, требующие подключения к базе данных, выполняются, только если задана строка подключения, а проверки, требующие доступа к PGDATA, — только если указан параметр --pgdata. В противном случае такие проверки пропускаются с информационным сообщением.
Пример:
pgpro_validate \
--pgdata=/var/lib/postgresql/15/data \
--username=postgres \
--dbname=postgrespgpro_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=postgrespgpro_validate [общие_параметры] [параметры_удалённого_режима] checksum [--percent=процент] dir --pgdata=каталог_данных[путь_к_каталогу]
Проверяет контрольные суммы блоков всех файлов отношений в указанном каталоге.
Для этой команды не требуется подключения к базе данных, но требуется параметр --pgdata.
dirpath — необязательный путь к проверяемому каталогу. Если этот аргумент опущен, проверяется каталог PGDATA/base.
Параметр --percent задаёт процент случайно выбранных блоков для проверки в каждом файле. Допустимые значения — от 0 до 100. Значение по умолчанию — 100 (все блоки).
Пример:
pgpro_validate checksum --percent=20 dir \
--pgdata=/var/lib/postgresql/15/datapgpro_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/2619pgpro_validate [общие_параметры] [параметры_удалённого_режима] constraints [--db=имя_базы_данных] [-t=имя_таблицы]
Проверяет ограничения целостности (NOT NULL, FOREIGN KEY, UNIQUE) для пользовательских таблиц.
--db=имя_базы_данныхСписок баз данных, разделённых запятыми, в которых проверяются ограничения. Если этот параметр опущен, проверяются все базы данных.
-t=имя_таблицы--table=имя_таблицыСписок таблиц, разделённых запятыми, для проверки. Если этот параметр опущен, проверяются все пользовательские таблицы.
Пример:
pgpro_validate constraints \
--db=mydb \
--table=public.orders,public.customers \
--username=postgrespgpro_validate [общие_параметры] [параметры_удалённого_режима] database_files --pgdata=каталог_данных
Сравнивает файлы в каталоге base и каталоге табличных пространств (pg_tblspc) с записями в системном каталоге pg_class. Обнаруживает потерянные файлы, не имеющие соответствующих отношений, а также отношения, для которых отсутствуют ожидаемые файлы.
Эта команда требует и доступа к каталогу PGDATA, и подключения к базе данных.
Пример:
pgpro_validate database_files \
--pgdata=/var/lib/postgresql/15/data \
--username=postgrespgpro_validate [общие_параметры] [параметры_удалённого_режима] index [--db=имя_базы_данных]
Проверяет версию формата и согласованность метаданных индексов.
--db=имя_базы_данныхСписок баз данных, разделённых запятыми. Если этот параметр опущен, проверяются все базы данных.
Пример:
pgpro_validate index \
--db=mydb \
--username=postgrespgpro_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-relationpgpro_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=postgrespgpro_validate [общие_параметры] [параметры_удалённого_режима] permissions --pgdata=каталог_данных
Проверяет права доступа, владельца и группу всех файлов и каталогов в PGDATA на соответствие ожидаемым значениям Postgres Pro.
Для этой команды не требуется подключения к базе данных, но требуется параметр --pgdata.
Команда permissions выполняется параллельно. Для задания количества потоков используйте параметр --jobs.
Пример:
pgpro_validate permissions --jobs=4 \
--pgdata=/var/lib/postgresql/15/datapgpro_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/datapgpro_validate [общие_параметры] [параметры_удалённого_режима] tablespace --pgdata=каталог_данных
Проверяет каталоги табличных пространств: корректность символических ссылок в PGDATA/pg_tblspc, существование целевых каталогов, наличие подкаталогов, соответствующих версии сервера, и согласованность с pg_tablespace.
Эта команда требует и доступа к каталогу PGDATA, и подключения к базе данных.
Пример:
pgpro_validate tablespace \
--pgdata=/var/lib/postgresql/15/data \
--dbname=postgresСледующие параметры применяются ко всем командам, за исключением случаев, где явно указано иное.
-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.
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 не задан, команда завершается ошибкой.
Пример полной проверки удалённого сервера:
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