Отчеты о ходе выполнения команд
QHB имеет возможность сообщать о ходе выполнения определенных
команд во время их выполнения. В настоящее время командами, которые поддерживают
отображение текущего состояния, являются ANALYZE, CLUSTER, CREATE INDEX,
VACUUM, COPY и BASE_BACKUP (т. е. команда репликации, которую запускает
qhb_basebackup для создания базовой резервной копии). В будущем этот
список может быть расширен.
Отчет о ходе выполнения ANALYZE
При каждом выполнении ANALYZE представление pg_stat_progress_analyze
будет содержать по одной строке для каждого обслуживающего процесса, который в
данный момент выполняет эту команду. В таблицах ниже описываются предоставляемые
сведения и поясняется, как их интерпретировать.
Таблица 35. Представление pg_stat_progress_analyze
| Столбец Тип | Описание |
|---|---|
| pid integer | PID обслуживающего процесса. |
| datid oid | OID базы данных, к которой подключен этот обслуживающий процесс. |
| datname name | Имя базы данных, к которой подключен этот обслуживающий процесс. |
| relid oid | OID анализируемой таблицы. |
| 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 oid | OID дочерней таблицы, сканируемой в настоящий момент. Это поле актуально только в фазе 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 integer | PID обслуживающего процесса. |
| datid oid | OID базы данных, к которой подключен этот обслуживающий процесс. |
| datname name | Имя базы данных, к которой подключен этот обслуживающий процесс. |
| relid oid | OID кластеризуемой таблицы. |
| 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 integer | PID обслуживающего процесса. |
| datid oid | OID базы данных, к которой подключен этот обслуживающий процесс. |
| datname name | Имя базы данных, к которой подключен этот обслуживающий процесс. |
| relid oid | OID таблицы, в которой выполняется команда 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 integer | PID обслуживающего процесса. |
| datid oid | OID базы данных, к которой подключен этот обслуживающий процесс. |
| datname name | Имя базы данных, к которой подключен этот обслуживающий процесс. |
| relid oid | OID таблицы, в которой создается индекс. |
| index_relid oid | OID создаваемого или перестраиваемого индекса. Во время выполнения 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 bigint | PID блокирующего процесса, ожидание которого происходит в данный момент. |
| 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
| Фаза | Описание |
|---|---|
| initializing | CREATE INDEX или REINDEX готовится к созданию индекса. Предполагается, что эта фаза будет очень короткой. |
| waiting for writers before build | CREATE 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 validation | CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки записи, которые потенциально могут записывать данные в таблицу. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы. |
| index validation: scanning index | CREATE INDEX CONCURRENTLY сканирует индекс в поисках кортежей, которые необходимо проверить. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах blocks_total (отображает общий размер индекса) и blocks_done содержится информация о ходе выполнения этой фазы. |
| index validation: sorting tuples | CREATE INDEX CONCURRENTLY сортирует выходные данные фазы сканирования индекса. |
| index validation: scanning table | CREATE INDEX CONCURRENTLY сканирует таблицу для проверки кортежей индексов, собранных в предыдущих двух фазах. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах blocks_total (отображает общий размер индекса) и blocks_done содержится информация о ходе выполнения этой фазы. |
| waiting for old snapshots | CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY ожидает освобождения снимков транзакциями, которые потенциально могут видеть таблицу. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы. |
| waiting for readers before marking dead | REINDEX CONCURRENTLY ожидает завершения транзакций, удерживающих блокировки чтения, прежде чем пометить старый индекс как нерабочий. Эта фаза пропускается, когда команда выполняется не в параллельном режиме. В столбцах lockers_total, lockers_done и current_locker_pid содержится информация о ходе выполнения этой фазы. |
| waiting for readers before dropping | REINDEX 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 integer | PID обслуживающего процесса. |
| datid oid | OID базы данных, к которой подключен этот обслуживающий процесс. |
| datname name | Имя базы данных, к которой подключен этот обслуживающий процесс. |
| relid oid | OID очищаемой таблицы. |
| 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
| Фаза | Описание |
|---|---|
| initializing | VACUUM готовится начать сканирование кучи. Предполагается, что эта фаза будет очень короткой. |
| 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 cleanup | VACUUM выполняет окончательную ликвидацию последствий. На этом этапе VACUUM будет очищать карту свободного пространства, обновлять статистику в каталоге pg_class и передавать статистические данные сборщику статистики. Когда эта фаза закончится, VACUUM завершит работу. |
Отчет о ходе выполнения базового резервного копирования
Каждый раз, когда приложение вроде qhb_basebackup создает базовую резервную
копию, представление pg_stat_progress_basebackup будет содержать по одной
строке для каждого процесса-отправителя WAL, который в настоящий момент выполняет
команду репликации BASE_BACKUP и поточно передает копируемые данные. В таблицах
ниже описываются предоставляемые сведения и поясняется, как их интерпретировать.
Таблица 44. Представление pg_stat_progress_basebackup
| Столбец Тип | Описание |
|---|---|
| pid integer | PID процесса-отправителя 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. Резервное копирование завершится по окончании этой фазы. |