26.4. Отслеживание выполнения
В Postgres Pro имеется возможность отслеживать выполнение определённых команд. В настоящее время такое отслеживание поддерживается только для команд ANALYZE, CLUSTER, CREATE INDEX, VACUUM, COPY и BASE_BACKUP (то есть для команды репликации, которую выполняет pg_basebackup). В будущем эта поддержка может быть расширена.
26.4.1. Отслеживание выполнения ANALYZE
Во время выполнения ANALYZE представление pg_stat_progress_analyze будет содержать по одной строке для каждого обслуживающего процесса, выполняющего эту команду. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 26.34. Представление pg_stat_progress_analyze
| Тип столбца Описание | 
|---|
| 
 Идентификатор (PID) обслуживающего процесса | 
| 
 OID базы данных, к которой подключён этот обслуживающий процесс. | 
| 
 Имя базы данных, к которой подключён этот обслуживающий процесс. | 
| 
 OID анализируемой таблицы. | 
| 
 Текущая фаза обработки. См. Таблицу 26.35. | 
| 
 Общее количество блоков кучи, которые попадут в выборку. | 
| 
 Количество просканированных блоков кучи. | 
| 
 Количество объектов расширенной статистики. | 
| 
 Количество вычисленных объектов расширенной статистики. Этот счётчик увеличивается только в фазе  | 
| 
 Количество дочерних таблиц. | 
| 
 Количество просканированных дочерних таблиц. Этот счётчик увеличивается только в фазе  | 
| 
 OID дочерней таблицы, сканируемой в данный момент. Это поле содержит актуальное значение только в фазе  | 
Таблица 26.35. Фазы 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 для родительской таблицы, которое сопровождается сбором наследуемой статистики, а затем о ходе обработки каждой её секции.
26.4.2. Отслеживание выполнения CREATE INDEX
Во время выполнения CREATE INDEX или REINDEX представление pg_stat_progress_create_index будет содержать по одной строке для каждого обслуживающего процесса, создающего индексы в этот момент. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 26.36. Представление pg_stat_progress_create_index
| Тип столбца Описание | 
|---|
| 
 Идентификатор (PID) обслуживающего процесса | 
| 
 OID базы данных, к которой подключён этот обслуживающий процесс. | 
| 
 Имя базы данных, к которой подключён этот обслуживающий процесс. | 
| 
 OID таблицы, в которой создаётся индекс. | 
| 
 OID создаваемого или перестраиваемого индекса. При выполнении  | 
| 
 Выполняемая команда:  | 
| 
 Текущая фаза создания индекса. См. Таблицу 26.37. | 
| 
 Общее число процессов, потребовавших ожидания, если таковые имеются. | 
| 
 Число процессов, ожидание которых уже завершено. | 
| 
 Идентификатор процесса, удерживающего конфликтующую блокировку в данный момент. | 
| 
 Общее число блоков, которые должны быть обработаны в текущей фазе. | 
| 
 Число блоков, уже обработанных в текущей фазе. | 
| 
 Общее число кортежей, которые должны быть обработаны в текущей фазе. | 
| 
 Число кортежей, уже обработанных в текущей фазе. | 
| 
 При создании индекса в секционированной таблице этот столбец содержит общее число секций, в которых создаётся индекс. Во время выполнения  | 
| 
 При создании индекса в секционированной таблице этот столбец содержит число секций, в которых индекс уже построен. Во время выполнения  | 
Таблица 26.37. Фазы 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. | 
26.4.3. Отслеживание выполнения VACUUM
В процессе выполнения VACUUM представление pg_stat_progress_vacuum будет содержать по одной строке для каждого обслуживающего процесса (включая рабочие процессы автоочистки), производящего очистку в данный момент. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать. Выполнение команд VACUUM FULL отслеживается через pg_stat_progress_cluster, так как и VACUUM FULL, и CLUSTER перезаписывают таблицу, тогда как обычная команда VACUUM модифицирует её саму. См. Подраздел 26.4.4.
Таблица 26.38. Представление pg_stat_progress_vacuum
| Тип столбца Описание | 
|---|
| 
 Идентификатор (PID) обслуживающего процесса | 
| 
 OID базы данных, к которой подключён этот обслуживающий процесс. | 
| 
 Имя базы данных, к которой подключён этот обслуживающий процесс. | 
| 
 OID очищаемой таблицы. | 
| 
 Текущая фаза очистки. См. Таблицу 26.39. | 
| 
 Общее число блоков кучи в таблице. Это число отражает состояние в начале сканирования; блоки, добавленные позже, не будут (и не должны) обрабатываться текущей командой  | 
| 
 Число просканированных блоков кучи. Так как для оптимизации сканирования применяется карта видимости, некоторые блоки могут пропускаться без осмотра; пропущенные блоки входят в это общее число, так что по завершении очистки это число станет равно  | 
| 
 Число очищенных блоков кучи. Если в таблице нет индексов, этот счётчик увеличивается только в фазе  | 
| 
 Количество завершённых циклов очистки индекса. | 
| 
 Число «мёртвых» кортежей, которое мы можем сохранить, прежде чем потребуется выполнить цикл очистки индекса, в зависимости от maintenance_work_mem. | 
| 
 Число «мёртвых» кортежей, собранных со времени последнего цикла очистки индекса. | 
Таблица 26.39. Фазы 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завершит свою работу. | 
26.4.4. Отслеживание выполнения CLUSTER
Во время выполнения CLUSTER или VACUUM FULL представление pg_stat_progress_cluster будет содержать по одной строке для каждого обслуживающего процесса, выполняющего любую из этих команд. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 26.40. Представление pg_stat_progress_cluster
| Тип столбца Описание | 
|---|
| 
 Идентификатор (PID) обслуживающего процесса | 
| 
 OID базы данных, к которой подключён этот обслуживающий процесс. | 
| 
 Имя базы данных, к которой подключён этот обслуживающий процесс. | 
| 
 OID обрабатываемой таблицы. | 
| 
 Выполняемая команда:  | 
| 
 Текущая фаза обработки. См. Таблицу 26.41. | 
| 
 Если таблица сканируется по индексу, это поле содержит OID данного индекса, а иначе — 0. | 
| 
 Число просканированных кортежей кучи. Этот счётчик увеличивается только в фазе  | 
| 
 Число записанных кортежей кучи. Этот счётчик увеличивается только в фазе  | 
| 
 Общее число блоков кучи в таблице. Это число отражает состояние в начале фазы  | 
| 
 Число просканированных блоков кучи. Этот счётчик увеличивается только в фазе  | 
| 
 Число перестроенных индексов. Это счётчик увеличивается только в фазе  | 
Таблица 26.41. Фазы 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завершит работу. | 
26.4.5. Отслеживание выполнение базового копирования
Когда приложение pg_basebackup или подобное выполняет базовое копирование, представление pg_stat_progress_basebackup будет содержать по одной строке для каждого процесса-передатчика WAL, выполняющего в данный момент команду репликации BASE_BACKUP и передающего копируемые данные. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 26.42. Представление pg_stat_progress_basebackup
| Тип столбца Описание | 
|---|
| 
 Идентификатор процесса-передатчика WAL. | 
| 
 Текущая фаза обработки. См. Таблицу 26.43. | 
| 
 Общий объём данных, который будет передан. Этот объём примерно оценивается и выдаётся в начале фазы  | 
| 
 Объём переданных данных. Этот показатель увеличивается только в фазе  | 
| 
 Общее число табличных пространств, которые будут переданы. | 
| 
 Число переданных табличных пространств. Этот счётчик увеличивается только в фазе  | 
Таблица 26.43. Фазы базового копирования
| Фаза | Описание | 
|---|---|
| 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, необходимых для базовой копии. Если при запуске pg_basebackup был указан параметр--wal-method=noneили--wal-method=stream, резервное копирования заканчивается сразу после данной фазы. | 
| transferring wal files | Процесс-передатчик WAL в настоящее время переносит все файлы WAL, заполненные во время копирования. Эта фаза следует за фазой waiting for wal archiving to finish, только если при запуске pg_basebackup указывался параметр--wal-method=fetch. По окончании этой фазы резервное копирование завершается. | 
26.4.6. Отслеживание выполнения COPY
Во время выполнения COPY представление pg_stat_progress_copy будет содержать по одной строке для каждого обслуживающего процесса, выполняющего эту команду. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 26.44. Представление pg_stat_progress_copy
| Тип столбца Описание | 
|---|
| 
 Идентификатор (PID) обслуживающего процесса | 
| 
 OID базы данных, к которой подключён этот обслуживающий процесс. | 
| 
 Имя базы данных, к которой подключён этот обслуживающий процесс. | 
| 
 OID таблицы, в которой выполняется команда  | 
| 
 Выполняемая команда:  | 
| 
 Метод ввода/вывода, посредством которого считываются или записываются данные:  | 
| 
 Число байт, уже обработанных командой  | 
| 
 Размер исходного файла для команды  | 
| 
 Число кортежей, уже обработанных командой  | 
| 
 Количество необработанных кортежей, которые были исключены предложением  |