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-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. Удалённый режим #
При удалённых 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=postgresG.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=postgresG.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/dataG.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/2619G.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=postgresG.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=postgresG.5.4.7. index #
pgpro_validate [общие_параметры] [параметры_удалённого_режима] index [--db=имя_базы_данных]
Проверяет версию формата и согласованность метаданных индексов.
--db=имя_базы_данныхСписок баз данных, разделённых запятыми. Если этот параметр опущен, проверяются все базы данных.
Пример:
pgpro_validate index \
--db=mydb \
--username=postgresG.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-relationG.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=postgresG.5.4.10. permissions #
pgpro_validate [общие_параметры] [параметры_удалённого_режима] permissions --pgdata=каталог_данных
Проверяет права доступа, владельца и группу всех файлов и каталогов в PGDATA на соответствие ожидаемым значениям Postgres Pro.
Для этой команды не требуется подключения к базе данных, но требуется параметр --pgdata.
Команда permissions выполняется параллельно. Для задания количества потоков используйте параметр --jobs.
Пример:
pgpro_validate permissions --jobs=4 \
--pgdata=/var/lib/postgresql/15/dataG.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/dataG.5.4.12. tablespace #
pgpro_validate [общие_параметры] [параметры_удалённого_режима] tablespace --pgdata=каталог_данных
Проверяет каталоги табличных пространств: корректность символических ссылок в PGDATA/pg_tblspc, существование целевых каталогов, наличие подкаталогов, соответствующих версии сервера, и согласованность с pg_tablespace.
Эта команда требует и доступа к каталогу PGDATA, и подключения к базе данных.
Пример:
pgpro_validate tablespace \
--pgdata=/var/lib/postgresql/15/data \
--dbname=postgresG.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