В PostgreSQL имеется возможность отслеживать выполнение определённых команд. В настоящее время такое отслеживание поддерживается только для команд ANALYZE, CLUSTER, CREATE INDEX, VACUUM, COPY и BASE_BACKUP (то есть для команды репликации, которую выполняет pg_basebackup). В будущем эта поддержка может быть расширена.
Во время выполнения ANALYZE представление pg_stat_progress_analyze будет содержать по одной строке для каждого обслуживающего процесса, выполняющего эту команду. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 27.38. Представление pg_stat_progress_analyze
Тип столбца Описание |
|---|
Идентификатор (PID) обслуживающего процесса |
OID базы данных, к которой подключён этот обслуживающий процесс. |
Имя базы данных, к которой подключён этот обслуживающий процесс. |
OID анализируемой таблицы. |
Текущая фаза обработки. См. Таблицу 27.39. |
Общее количество блоков кучи, которые попадут в выборку. |
Количество просканированных блоков кучи. |
Количество объектов расширенной статистики. |
Количество вычисленных объектов расширенной статистики. Этот счётчик увеличивается только в фазе |
Количество дочерних таблиц. |
Количество просканированных дочерних таблиц. Этот счётчик увеличивается только в фазе |
OID дочерней таблицы, сканируемой в данный момент. Это поле содержит актуальное значение только в фазе |
Таблица 27.39. Фазы 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 завершит работу. |
Note that when ANALYZE is run on a partitioned table
without the ONLY keyword, all of its partitions are
also recursively analyzed. In that case, ANALYZE
progress is reported first for the parent table, whereby its inheritance
statistics are collected, followed by that for each partition.
Во время выполнения CLUSTER или VACUUM FULL представление pg_stat_progress_cluster будет содержать по одной строке для каждого обслуживающего процесса, выполняющего любую из этих команд. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 27.40. Представление pg_stat_progress_cluster
Тип столбца Описание |
|---|
Идентификатор (PID) обслуживающего процесса |
OID базы данных, к которой подключён этот обслуживающий процесс. |
Имя базы данных, к которой подключён этот обслуживающий процесс. |
OID обрабатываемой таблицы. |
Выполняемая команда: |
Текущая фаза обработки. См. Таблицу 27.41. |
Если таблица сканируется по индексу, это поле содержит OID данного индекса, а иначе — 0. |
Число просканированных кортежей кучи. Этот счётчик увеличивается только в фазе |
Число записанных кортежей кучи. Этот счётчик увеличивается только в фазе |
Общее число блоков кучи в таблице. Это число отражает состояние в начале фазы |
Число просканированных блоков кучи. Этот счётчик увеличивается только в фазе |
Число перестроенных индексов. Это счётчик увеличивается только в фазе |
Таблица 27.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 завершит работу. |
Во время выполнения COPY представление pg_stat_progress_copy будет содержать по одной строке для каждого обслуживающего процесса, выполняющего эту команду. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 27.42. Представление pg_stat_progress_copy
Тип столбца Описание |
|---|
Идентификатор (PID) обслуживающего процесса |
OID базы данных, к которой подключён этот обслуживающий процесс. |
Имя базы данных, к которой подключён этот обслуживающий процесс. |
OID таблицы, в которой выполняется команда |
Выполняемая команда: |
Метод ввода-вывода, посредством которого считываются или записываются данные: |
Число байт, уже обработанных командой |
Размер исходного файла для команды |
Число кортежей, уже обработанных командой |
Количество необработанных кортежей, которые были исключены предложением |
Количество кортежей, пропущенных из-за того, что они содержат неверные данные. Этот счётчик увеличивается только тогда, когда для параметра |
Во время выполнения CREATE INDEX или REINDEX представление pg_stat_progress_create_index будет содержать по одной строке для каждого обслуживающего процесса, создающего индексы в этот момент. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 27.43. Представление pg_stat_progress_create_index
Тип столбца Описание |
|---|
Идентификатор серверного процесса, создающего индексы. |
OID базы данных, к которой подключён этот обслуживающий процесс. |
Имя базы данных, к которой подключён этот обслуживающий процесс. |
OID таблицы, в которой создаётся индекс. |
OID создаваемого или перестраиваемого индекса. При выполнении |
Определённый тип команды: |
Текущая фаза создания индекса. См. Таблицу 27.44. |
Общее число процессов, потребовавших ожидания, если таковые имеются. |
Число процессов, ожидание которых уже завершено. |
Идентификатор процесса, удерживающего конфликтующую блокировку в данный момент. |
Общее число блоков, которые должны быть обработаны в текущей фазе. |
Число блоков, уже обработанных в текущей фазе. |
Общее число кортежей, которые должны быть обработаны в текущей фазе. |
Число кортежей, уже обработанных в текущей фазе. |
Общее количество секций, для которых должен быть создан или прикреплён индекс, включая как прямые, так и косвенные секции. Имеет значение |
Количество секций, для которых уже был создан или прикреплён индекс, включая как прямые, так и косвенные секции. Имеет значение |
Таблица 27.44. Фазы 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 представление pg_stat_progress_vacuum будет содержать по одной строке для каждого обслуживающего процесса (включая рабочие процессы автоочистки), производящего очистку в данный момент. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать. Выполнение команд VACUUM FULL отслеживается через pg_stat_progress_cluster, так как и VACUUM FULL, и CLUSTER перезаписывают таблицу, тогда как обычная команда VACUUM модифицирует её саму. См. Подраздел 27.4.2.
Таблица 27.45. Представление pg_stat_progress_vacuum
Тип столбца Описание |
|---|
Идентификатор (PID) обслуживающего процесса |
OID базы данных, к которой подключён этот обслуживающий процесс. |
Имя базы данных, к которой подключён этот обслуживающий процесс. |
OID очищаемой таблицы. |
Текущая фаза очистки. См. Таблицу 27.46. |
Общее число блоков кучи в таблице. Это число отражает состояние в начале сканирования; блоки, добавленные позже, не будут (и не должны) обрабатываться текущей командой |
Число просканированных блоков кучи. Так как для оптимизации сканирования применяется карта видимости, некоторые блоки могут пропускаться без осмотра; пропущенные блоки входят в это общее число, так что по завершении очистки это число станет равно |
Число очищенных блоков кучи. Если в таблице нет индексов, этот счётчик увеличивается только в фазе |
Количество завершённых циклов очистки индекса. |
Объём данных «мёртвых» кортежей, который можно сохранить, прежде чем потребуется выполнить цикл очистки индекса, в зависимости от maintenance_work_mem. |
Объём данных «мёртвых» кортежей, собранных со времени последнего цикла очистки индекса. |
Число идентификаторов «мёртвых» кортежей, собранных со времени последнего цикла очистки индекса. |
Общее число индексов, которые будут очищены или убраны. Это число сообщается в начале фазы |
Число обработанных индексов. Этот счётчик увеличивается только во время фазы |
Таблица 27.46. Фазы 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 завершит свою работу. |
Когда приложение pg_basebackup или подобное выполняет базовое копирование, представление pg_stat_progress_basebackup будет содержать по одной строке для каждого процесса-передатчика WAL, выполняющего в данный момент команду репликации BASE_BACKUP и передающего копируемые данные. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 27.47. Представление pg_stat_progress_basebackup
Тип столбца Описание |
|---|
Идентификатор процесса-передатчика WAL. |
Текущая фаза обработки. См. Таблицу 27.48. |
Общий объём данных, который будет передан. Оценка этого объёма выдаётся на момент начала фазы |
Объём переданных данных. Этот показатель увеличивается только в фазе |
Общее число табличных пространств, которые будут переданы. |
Число переданных табличных пространств. Этот счётчик увеличивается только в фазе |
Таблица 27.48. Фазы базового копирования
| Фаза | Описание |
|---|---|
initializing | Процесс-передатчик WAL готовится начать копирование. Эта фаза должна быть очень быстрой. |
waiting for checkpoint to finish | Процесс-передатчик WAL в настоящий момент выполняет pg_backup_start, чтобы подготовиться к получению базовой копии, и ждёт завершения контрольной точки для начала копирования. |
estimating backup size | Процесс-передатчик WAL в настоящий момент оценивает общее количество файлов данных, которые будут передаваться при создании базовой копии. |
streaming database files | Процесс-передатчик WAL в настоящий момент передаёт файлы данных в качестве содержимого базовой резервной копии. |
waiting for wal archiving to finish | Процесс-передатчик WAL в настоящий момент выполняет pg_backup_stop, чтобы закончить копирование, и ждёт успешного завершения архивации всех файлов 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. По окончании этой фазы резервное копирование завершается. |