27.4. Отслеживание выполнения #
В PostgreSQL имеется возможность отслеживать выполнение определённых команд. В настоящее время такое отслеживание поддерживается только для команд ANALYZE
, CLUSTER
, CREATE INDEX
, VACUUM
, COPY
и BASE_BACKUP (то есть для команды репликации, которую выполняет pg_basebackup). В будущем эта поддержка может быть расширена.
27.4.1. Отслеживание выполнения ANALYZE #
Во время выполнения 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 завершит работу. |
Примечание
Заметьте, что когда ANALYZE
обрабатывает секционированную таблицу, все её секции также рекурсивно анализируются. В этом случае сначала сообщается о ходе выполнения ANALYZE
для родительской таблицы, которое сопровождается сбором наследуемой статистики, а затем о ходе обработки каждой её секции.
27.4.2. Отслеживание выполнения CLUSTER #
Во время выполнения 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 завершит работу. |
27.4.3. Отслеживание выполнения COPY #
Во время выполнения COPY
представление pg_stat_progress_copy
будет содержать по одной строке для каждого обслуживающего процесса, выполняющего эту команду. Таблицы ниже показывают, какая информация будет отслеживаться, и поясняют, как её интерпретировать.
Таблица 27.42. Представление pg_stat_progress_copy
Тип столбца Описание |
---|
Идентификатор (PID) обслуживающего процесса |
OID базы данных, к которой подключён этот обслуживающий процесс. |
Имя базы данных, к которой подключён этот обслуживающий процесс. |
OID таблицы, в которой выполняется команда |
Выполняемая команда: |
Метод ввода/вывода, посредством которого считываются или записываются данные: |
Число байт, уже обработанных командой |
Размер исходного файла для команды |
Число кортежей, уже обработанных командой |
Количество необработанных кортежей, которые были исключены предложением |
Количество кортежей, пропущенных из-за того, что они содержат неверные данные. Этот счётчик увеличивается только тогда, когда для параметра |
27.4.4. Отслеживание выполнения CREATE INDEX #
Во время выполнения 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 . |
27.4.5. Отслеживание выполнения VACUUM #
В процессе выполнения 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 завершит свою работу. |
27.4.6. Отслеживание выполнение базового копирования #
Когда приложение 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 . По окончании этой фазы резервное копирование завершается. |