Отчеты о ходе выполнения команд

QHB имеет возможность сообщать о ходе выполнения определенных команд во время их выполнения. В настоящее время командами, которые поддерживают отображение текущего состояния, являются ANALYZE, CLUSTER, CREATE INDEX, VACUUM, COPY и BASE_BACKUP (т. е. команда репликации, которую запускает qhb_basebackup для создания базовой резервной копии). В будущем этот список может быть расширен.



Отчет о ходе выполнения ANALYZE

При каждом выполнении ANALYZE представление pg_stat_progress_analyze будет содержать по одной строке для каждого обслуживающего процесса, который в данный момент выполняет эту команду. В таблицах ниже описываются предоставляемые сведения и поясняется, как их интерпретировать.

Таблица 35. Представление pg_stat_progress_analyze

Столбец ТипОписание
pid integerPID обслуживающего процесса.
datid oidOID базы данных, к которой подключен этот обслуживающий процесс.
datname nameИмя базы данных, к которой подключен этот обслуживающий процесс.
relid oidOID анализируемой таблицы.
phase textТекущая фаза обработки. См. Таблицу 36.
sample_blks_total bigintОбщее количество блоков кучи, которые будут отобраны.
sample_blks_scanned bigintКоличество просканированных блоков кучи.
ext_stats_total bigintКоличество объектов расширенной статистики.
ext_stats_computed bigintКоличество вычисленных объектов расширенной статистики. Этот счетчик увеличивается только в фазе computing extended statistics.
child_tables_total bigintКоличество дочерних таблиц.
child_tables_done bigintКоличество просканированных дочерних таблиц. Этот счетчик увеличивается только в фазе acquiring inherited sample rows.
current_child_table_relid oidOID дочерней таблицы, сканируемой в настоящий момент. Это поле актуально только в фазе acquiring inherited sample rows.

Таблица 36. Фазы ANALYZE

ФазаОписание
initializingКоманда готовится начать сканирование кучи. Предполагается, что эта фаза будет очень короткой.
acquiring sample rowsВ данный момент команда сканирует таблицу с указанным relid, чтобы получить строки выборки.
acquiring inherited sample rowsВ данный момент команда сканирует дочерние таблицы, чтобы получить строки выборки. В столбцах child_tables_total, child_tables_done и current_child_table_relid содержится информация о ходе выполнения этой фазы.
computing statisticsКоманда вычисляет статистику по строкам выборки, полученным во время сканирования таблицы.
computing extended statisticsКоманда вычисляет объекты расширенной статистики по строкам выборки, полученным во время сканирования таблицы.
finalizing analyzeКоманда обновляет каталог pg_class. По окончании этой фазы ANALYZE завершит работу.

Примечание
Обратите внимание, что когда ANALYZE обрабатывает партиционированную таблицу, все ее партиции тоже рекурсивно анализируются. В этом случае сначала выводится информация о ходе ANALYZE для родительской таблицы, во время выполнения которой собирается ее наследуемая статистика, затем выводится такая же информация по каждой партиции.



Отчет о ходе выполнения CLUSTER

При каждом выполнении CLUSTER или VACUUM FULL представление pg_stat_progress_cluster будет содержать по одной строке для каждого обслуживающего процесса, который в данный момент выполняет любую из этих команд. В таблицах ниже описываются предоставляемые сведения и поясняется, как их интерпретировать.

Таблица 37. Представление pg_stat_progress_cluster

Столбец ТипОписание
pid integerPID обслуживающего процесса.
datid oidOID базы данных, к которой подключен этот обслуживающий процесс.
datname nameИмя базы данных, к которой подключен этот обслуживающий процесс.
relid oidOID кластеризуемой таблицы.
command textВыполняемая команда. Либо CLUSTER, либо VACUUM FULL.
phase textТекущая фаза обработки. См. Таблицу 38.
cluster_index_relid oidЕсли таблица сканируется с использованием индекса, здесь отображается OID данного индекса; в противном случае ноль.
heap_tuples_scanned bigintКоличество просканированных кортежей кучи. Этот счетчик увеличивается только в фазе seq scanning heap, index scanning heap или writing new heap.
heap_tuples_written bigintКоличество записанных кортежей кучи. Этот счетчик увеличивается только в фазе seq scanning heap, index scanning heap или writing new heap.
heap_blks_total bigintОбщее количество блоков кучи в таблице. Это число отображает состояние на начало фазы seq scanning heap.
heap_blks_scanned bigintКоличество просканированных блоков кучи. Этот счетчик увеличивается только в фазе seq scanning heap.
index_rebuild_count bigintКоличество перестроенных индексов. Этот счетчик увеличивается только в фазе rebuilding index.

Таблица 38. Фазы CLUSTER и VACUUM FULL

ФазаОписание
initializingКоманда готовится начать сканирование кучи. Предполагается, что эта фаза будет очень короткой.
seq scanning heapВ данный момент команда сканирует таблицу с помощью последовательного сканирования.
index scanning heapВ данный момент CLUSTER сканирует таблицу по индексу.
sorting tuplesВ данный момент CLUSTER сортирует кортежи.
writing new heapВ данный момент CLUSTER записывает новую кучу.
swapping relation filesВ данный момент команда переставляет вновь построенные файлы на место.
rebuilding indexВ данный момент команда перестраивает индекс.
performing final cleanupКоманда выполняет окончательную ликвидацию последствий. Когда эта фаза заканчивается, CLUSTER или VACUUM FULL завершает работу.


Отчет о ходе выполнения COPY

При каждом выполнении COPY представление pg_stat_progress_copy будет содержать по одной строке для каждого обслуживающего процесса, который в данный момент выполняет команду COPY. В таблице ниже описываются предоставляемые сведения и поясняется, как их интерпретировать.

Таблица 39. Представление pg_stat_progress_copy

Столбец ТипОписание
pid integerPID обслуживающего процесса.
datid oidOID базы данных, к которой подключен этот обслуживающий процесс.
datname nameИмя базы данных, к которой подключен этот обслуживающий процесс.
relid oidOID таблицы, в которой выполняется команда COPY. Если копирование производится из запроса SELECT, это поле содержит 0.
command textВыполняемая команда: COPY FROM или COPY TO.
type textТип ввода/вывода, посредством которого считываются или записываются данные: FILE (файл), PROGRAM (программа), PIPE (поток) (для COPY FROM STDIN и COPY TO STDOUT) или CALLBACK (функция обратного вызова) (используется, например, во время начальной синхронизации таблицы при логической репликации).
bytes_processed bigintКоличество байтов, уже обработанных командой COPY.
bytes_total bigintРазмер исходного файла для команды COPY FROM в байтах. Если это неприменимо, данное поле содержит 0.
tuples_processed bigintКоличество кортежей, уже обработанных командой COPY.
tuples_excluded bigintКоличество кортежей, которые не были обработаны из-за того, что были исключены предложением WHERE команды COPY.


Отчет о ходе выполнения CREATE INDEX

При каждом выполнении CREATE INDEX или REINDEX представление pg_stat_progress_create_index будет содержать по одной строке для каждого обслуживающего процесса, который в данный момент создает индексы. В таблицах ниже описываются предоставляемые сведения и поясняется, как их интерпретировать.

Таблица 40. Представление pg_stat_progress_create_index

Столбец ТипОписание
pid integerPID обслуживающего процесса.
datid oidOID базы данных, к которой подключен этот обслуживающий процесс.
datname nameИмя базы данных, к которой подключен этот обслуживающий процесс.
relid oidOID таблицы, в которой создается индекс.
index_relid oidOID создаваемого или перестраиваемого индекса. Во время выполнения CREATE INDEX в непараллельном режиме содержит 0.
command textВыполняемая команда: CREATE INDEX, CREATE INDEX CONCURRENTLY, REINDEX или REINDEX CONCURRENTLY.
phase textТекущая фаза создания индекса. См. Таблицу 41.
lockers_total bigintОбщее количество блокирующих процессов, потребовавших ожидания, если применимо.
lockers_done bigintКоличество блокирующих процессов, ожидание которых уже завершено.
current_locker_pid bigintPID блокирующего процесса, ожидание которого происходит в данный момент.
blocks_total bigintОбщее количество блоков, которые будут обработаны в текущей фазе.
blocks_done bigintКоличество блоков, уже обработанных в текущей фазе.
tuples_total bigintОбщее количество кортежей, которые будут обработаны в текущей фазе.
tuples_done bigintКоличество кортежей, уже обработанных в текущей фазе.
partitions_total bigintПри создании индекса в партиционированной таблице в этом столбце выводится общее количество партиций, в которых будет создаваться индекс. Во время выполнения REINDEX это поле содержит 0.
partitions_done bigintПри создании индекса в партиционированной таблице в этом столбце выводится общее количество партиций, в которых уже был создан индекс. Во время выполнения REINDEX это поле содержит 0.

Таблица 41. Фазы CREATE INDEX

ФазаОписание
initializingCREATE INDEX или REINDEX готовится к созданию индекса. Предполагается, что эта фаза будет очень короткой.
waiting for writers before buildCREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки записи, которые потенциально могут видеть таблицу. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы.
building indexИндекс строится с помощью кода, реализующего метод доступа. На этом этапе методы доступа, поддерживающие отчеты о ходе выполнения, передают собственные данные о ходе выполнения, и в этом столбце указывается внутренняя фаза. Как правило, данные о ходе выполнения содержат столбцы blocks_total и blocks_done и потенциально столбцы tuples_total и tuples_done.
waiting for writers before validationCREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки записи, которые потенциально могут записывать данные в таблицу. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы.
index validation: scanning indexCREATE INDEX CONCURRENTLY сканирует индекс в поисках кортежей, которые необходимо проверить. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах blocks_total (отображает общий размер индекса) и blocks_done содержится информация о ходе выполнения этой фазы.
index validation: sorting tuplesCREATE INDEX CONCURRENTLY сортирует выходные данные фазы сканирования индекса.
index validation: scanning tableCREATE INDEX CONCURRENTLY сканирует таблицу для проверки кортежей индексов, собранных в предыдущих двух фазах. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах blocks_total (отображает общий размер индекса) и blocks_done содержится информация о ходе выполнения этой фазы.
waiting for old snapshotsCREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает освобождения снимков транзакциями, которые потенциально могут видеть таблицу. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы.
waiting for readers before marking deadREINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки чтения, прежде чем пометить старый индекс как нерабочий. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы.
waiting for readers before droppingREINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки чтения, прежде чем удалить старый индекс. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы.


Отчет о ходе выполнения VACUUM

При каждом выполнении VACUUM представление pg_stat_progress_vacuum будет содержать по одной строке для каждого обслуживающего процесса (включая рабочие процессы автовакуума), который в данный момент производит очистку. В таблицах ниже описываются предоставляемые сведения и поясняется, как их интерпретировать. Информация о ходе выполнения команд VACUUM FULL выводится в представлении pg_stat_progress_cluster поскольку VACUUM FULL и CLUSTER перезаписывают таблицу, в то время как простая команда VACUUM только модифицирует ее саму. См. подраздел Отчет о ходе выполнения CLUSTER.

Таблица 42. Представление pg_stat_progress_vacuum

Столбец ТипОписание
pid integerPID обслуживающего процесса.
datid oidOID базы данных, к которой подключен этот обслуживающий процесс.
datname nameИмя базы данных, к которой подключен этот обслуживающий процесс.
relid oidOID очищаемой таблицы.
phase textТекущая фаза очистки. См. Таблицу 43.
heap_blks_total bigintОбщее количество блоков кучи в этой таблице. Это число отображает состояние на начало сканирования; блоки, добавленные позже, не будут (и не должны) обрабатываться этой командой VACUUM.
heap_blks_scanned bigintКоличество просканированных блоков кучи. Поскольку для оптимизации сканирования используется карта видимости, некоторые блоки будут пропущены без проверки; пропущенные блоки включаются в это общее количество, поэтому данное число в итоге по завершении очистки сравняется со значением heap_blks_total. Этот счетчик увеличивается только в фазе scanning heap.
heap_blks_vacuumed bigintКоличество очищенных блоков кучи. Если в таблице имеются индексы, этот счетчик увеличивается только в фазе vacuuming heap. Блоки, не содержащие нерабочие кортежи, пропускаются, поэтому иногда этот счетчик может резко увеличиваться с большими приращениями.
index_vacuum_count bigintКоличество завершенных циклов очистки индекса.
max_dead_tuples bigintКоличество нерабочих кортежей, которые мы можем хранить, прежде чем возникнет необходимость выполнить цикл очистки индекса, исходя из значения maintenance_work_mem.
num_dead_tuples bigintКоличество нерабочих кортежей, собранных с момента последнего цикла очистки индекса.

Таблица 43. Фазы VACUUM

ФазаОписание
initializingVACUUM готовится начать сканирование кучи. Предполагается, что эта фаза будет очень короткой.
scanning heapВ данный момент VACUUM сканирует кучу. Команда будет по мере необходимости обрезать и дефрагментировать каждую страницу и, возможно, замораживать активность. Для отслеживания хода сканирования можно использовать столбец heap_blks_scanned.
vacuuming indexesВ данный момент VACUUM очищает индексы. Если в таблице есть какие-либо индексы, это будет происходить как минимум один раз за очистку после полного сканирования кучи. Это может происходить и несколько раз за очистку, если значения maintenance_work_mem (или, в случае автоочистки, autovacuum_work_mem, если этот параметр установлен) оказывается недостаточно для хранения всех найденных нерабочих кортежей.
vacuuming heapВ данный момент VACUUM очищает кучу. Очистка кучи отличается от сканирования кучи и выполняется после каждого эпизода очистки индексов. Если heap_blks_scanned меньше, чем heap_blks_total, то после завершения этой фазы система вернется к сканированию кучи; в противном случае она начнет приводить в порядок индексы.
cleaning up indexesВ данный момент VACUUM приводит в порядок индексы. Это происходит после того, как была полностью отсканирована куча и завершена вся очистка индексов и кучи.
truncating heapВ данный момент VACUUM опустошает кучу, чтобы вернуть пустые страницы в конце отношения в операционную систему. Это происходит после приведения индексов в порядок.
performing final cleanupVACUUM выполняет окончательную ликвидацию последствий. На этом этапе VACUUM будет очищать карту свободного пространства, обновлять статистику в каталоге pg_class и передавать статистические данные сборщику статистики. Когда эта фаза закончится, VACUUM завершит работу.


Отчет о ходе выполнения базового резервного копирования

Каждый раз, когда приложение вроде qhb_basebackup создает базовую резервную копию, представление pg_stat_progress_basebackup будет содержать по одной строке для каждого процесса-отправителя WAL, который в настоящий момент выполняет команду репликации BASE_BACKUP и поточно передает копируемые данные. В таблицах ниже описываются предоставляемые сведения и поясняется, как их интерпретировать.

Таблица 44. Представление pg_stat_progress_basebackup

Столбец ТипОписание
pid integerPID процесса-отправителя WAL.
phase textТекущая фаза обработки. См. Таблицу 45.
backup_total bigintОбщий объем данных, которые будут передаваться в потоке. Это значение является оценочным и отображает состояние на начало фазы streaming database files (потоковая передача файлов базы данных). Обратите внимание, что это только приблизительная оценка, поскольку база данных может измениться во время фазы streaming database files, и позже в резервную копию может быть добавлен журнал WAL. Это значение всегда становится равным backup_streamed, как только объем переданных данных превысит ожидаемое значение. Если предварительная оценка в qhb_basebackup отключена (т. е. задан параметр --no-estimate-size), это поле содержит NULL.
backup_streamed bigintОбъем переданных в потоке данных. Этот счетчик увеличивается только в фазе streaming database files или transferring wal files.
tablespaces_total bigintОбщее количество табличных пространств, которые будут передаваться в потоке.
tablespaces_streamed bigintКоличество переданных в потоке табличных пространств. Этот счетчик увеличивается только в фазе streaming database files.

Таблица 45. Фазы базового резервного копирования

ФазаОписание
initializingПроцесс-отправитель WAL готовится начать резервное копирование. Предполагается, что эта фаза будет очень короткой.
waiting for checkpoint to finishВ данный момент процесс-отправитель WAL выполняет pg_start_backup, чтобы подготовиться к созданию базовой резервной копии, и ожидает завершения контрольной точки начала резервного копирования.
estimating backup sizeВ данный момент процесс-отправитель WAL оценивает общий объем файлов базы данных, которые будут переданы в потоке в качестве базовой резервной копии.
streaming database filesВ данный момент процесс-отправитель WAL передает в потоке файлы базы данных в качестве базовой резервной копии.
waiting for wal archiving to finishВ данный момент процесс-отправитель WAL выполняет pg_stop_backup, чтобы завершить резервное копирование, и ожидает успешного архивирования всех файлов WAL, требуемых для базовой резервной копии. Если в qhb_basebackup задан параметр --wal-method=none или --wal-method=stream, резервное копирование завершится по окончании этой фазы.
transferring wal filesВ данный момент процесс-отправитель WAL переносит все журналы WAL, сгенерированные во время резервного копирования. Эта фаза наступает после фазы waiting for wal archiving to finish, если в qhb\basebackup задан параметр --wal-method=fetch. Резервное копирование завершится по окончании этой фазы.