СУБД Firebird предоставляет возможность отслеживать работу с конкретной базой данных, выполняемую на стороне сервера.
Для этих целей используются таблицы мониторинга. Таблицы мониторинга имеют префикс имени MON$
. Эти таблицы являются виртуальными в том смысле, что до обращения к ним со стороны пользователя, никаких данных в них не записано.
Они заполняются данными только в момент запроса пользователя (в том числе, поэтому на такие таблицы бесполезно пытаться создавать триггеры). При этом описания этих таблиц в базе данных присутствуют постоянно.
Ключевым понятием функции мониторинга является снимок активности. Снимок представляет собой текущее состояние базы данных, содержащее множество информации о самой базе данных, активных соединениях, пользователях, транзакциях, подготовленных и выполняемых запросах и т.д.
Снимок создаётся при первой выборке из любой таблицы мониторинга и сохраняется до конца текущей транзакции, чтобы запросы к множеству таблиц (например, главная-подчинённая) всегда возвращал непротиворечивые данные.
Другими словами таблицы мониторинга ведут себя подобно SNAPSHOT TABLE STABILITY
(isc_tpb_consistency
) транзакции, даже если запросы к ним выполняются в транзакции с меньшим уровнем изолированности.
Для обновления снимка, текущая транзакция должна быть завершена и таблицы мониторинга должны быть запрошены в новом контексте транзакции.
-
Обычные пользователи ограничены информацией о собственных соединениях, другие соединения невидимы для них.
Note
|
Частый сбор информации с помощью таблиц мониторинга в сильно нагруженной среде может негативно отразиться на производительности системы. |
MON$ATTACHMENTS
-
Сведения о текущих соединениях с базой данных.
MON$CALL_STACK
-
Обращения к стеку активными запросами хранимых процедур и триггеров.
MON$CONTEXT_VARIABLES
-
Сведения о пользовательских контекстных переменных.
MON$DATABASE
-
Сведения о базе данных, с которой выполнено соединение.
MON$IO_STATS
-
Статистика по вводу-выводу.
MON$MEMORY_USAGE
-
Статистика использования памяти.
MON$RECORD_STATS
-
Статистика на уровне записей.
MON$STATEMENTS
-
Подготовленные к выполнению операторы.
MON$TABLE_STATS
-
Статистика на уровне таблиц.
MON$TRANSACTIONS
-
Запущенные транзакции.
Сведения о текущих соединениях с базой данных.
MON$ATTACHMENTS
Наименование столбца | Тип данных | Описание |
---|---|---|
|
|
Идентификатор соединения. |
|
|
Идентификатор серверного процесса. |
|
|
Состояние соединения: 0 — бездействующее; |
|
|
Строка соединения — полный путь к файлу и имя первичного файла базы данных. |
|
|
Имя пользователя, соединённого с базой данных. |
|
|
Имя роли, указанное при соединении. Если роль во время соединения
не была задана, поле содержит текст |
|
|
Используемый сетевой протокол. |
|
|
Адрес удалённого клиента. |
|
|
Идентификатор клиентского процесса. |
|
|
Идентификатор набора символов в соединении. |
|
|
Дата и время начала соединения. |
|
|
Флаг сборки мусора (указывается в DPB при подключении):
|
|
|
Полный путь к файлу и имя программного файла, выполнившего данное соединение. |
|
|
Идентификатор статистики. |
|
|
Версия клиентской библиотеки. |
|
|
Версия сетевого протокола. |
|
|
Имя удалённого клиентского хоста. |
|
|
Имя пользователя в операционной системе клиента. |
|
|
Метод проверки подлинности, используемый при подключении. |
|
|
Флаг того, что подключение системное:
|
|
|
Тайм-аут простоя соединения уровня соединения. Содержит значение
тайм-аута простоя уровня соединения, в секундах. Если тайм-аут не
установлен — |
|
|
Время истечения таймера ожидания. Содержит |
|
|
Тайм-аут SQL оператора уровня соединения. Содержит значение
тайм-аута, установленное на уровне соединения, в миллисекундах. Если
тайм-аут не установлен — |
|
|
Используется ли сжатие сетевого трафика. Если используется сжатие
сетевого трафика значение равно |
|
|
Используется ли шифрование сетевого трафика. Если используется
шифрование сетевого трафика значение равно |
|
|
Имя текущего плагина для шифрования сетевого трафика, если оно
используется, в противном случае |
SELECT MON$USER, MON$REMOTE_ADDRESS, MON$REMOTE_PID, MON$TIMESTAMP
FROM MON$ATTACHMENTS
WHERE MON$ATTACHMENT_ID <> CURRENT_CONNECTION
Таблицы мониторинга доступны только для чтения.
Однако в сервер встроен механизм для удаления (и только удаления) записей в таблице MON$ATTACHMENTS
, что позволяет, закрыть соединение с базой данных.
Note
|
|
DELETE FROM MON$ATTACHMENTS
WHERE MON$ATTACHMENT_ID <> CURRENT_CONNECTION
Обращения к стеку запросами хранимых процедур, хранимых функций и триггеров.
MON$CALL_STACK
Наименование столбца | Тип данных | Описание |
---|---|---|
|
|
Идентификатор обращения. |
|
|
Идентификатор верхнего уровня оператора SQL — оператора,
инициировавшего цепочку обращений. По этому идентификатору можно
найти запись об активном операторе в таблице |
|
|
Идентификатор обращающегося триггера, хранимой функции или хранимой процедуры. |
|
|
Имя объекта PSQL. |
|
|
Тип объекта PSQL:
|
|
|
Дата и время старта обращения. |
|
|
Номер исходной строки оператора SQL, выполняющегося в настоящий момент. |
|
|
Номер исходного столбца оператора SQL, выполняющегося в настоящий момент. |
|
|
Идентификатор статистики. |
|
|
Имя пакета для упакованных процедур/функций. |
Note
|
В стек вызовов не попадёт информация о вызовах при выполнении оператора |
WITH RECURSIVE
HEAD AS (
SELECT
CALL.MON$STATEMENT_ID, CALL.MON$CALL_ID,
CALL.MON$OBJECT_NAME, CALL.MON$OBJECT_TYPE
FROM MON$CALL_STACK CALL
WHERE CALL.MON$CALLER_ID IS NULL
UNION ALL
SELECT
CALL.MON$STATEMENT_ID, CALL.MON$CALL_ID,
CALL.MON$OBJECT_NAME, CALL.MON$OBJECT_TYPE
FROM MON$CALL_STACK CALL
JOIN HEAD ON CALL.MON$CALLER_ID = HEAD.MON$CALL_ID
)
SELECT MON$ATTACHMENT_ID, MON$OBJECT_NAME, MON$OBJECT_TYPE
FROM HEAD
JOIN MON$STATEMENTS STMT ON STMT.MON$STATEMENT_ID = HEAD.MON$STATEMENT_ID
WHERE STMT.MON$ATTACHMENT_ID <> CURRENT_CONNECTION
Сведения о пользовательских контекстных переменных.
MON$CONTEXT_VARIABLES
Наименование столбца | Тип данных | Описание |
---|---|---|
|
|
Идентификатор соединения. Содержит корректное значение только для
контекстных переменных уровня соединения, для переменных уровня
транзакции устанавливается в |
|
|
Идентификатор транзакции. Содержит корректное значение только для
контекстных переменных уровня транзакции, для переменных уровня
соединения устанавливается в |
|
|
Имя контекстной переменной. |
|
|
Значение контекстной переменной. |
SELECT VAR.MON$VARIABLE_NAME, VAR.MON$VARIABLE_VALUE
FROM MON$CONTEXT_VARIABLES VAR
WHERE VAR.MON$ATTACHMENT_ID = CURRENT_CONNECTION
Сведения о базе данных, с которой выполнено соединение.
MON$DATABASE
Наименование столбца | Тип данных | Описание |
---|---|---|
|
|
Полный путь и имя первичного файла базы данных или псевдоним базы данных. |
|
|
Размер страницы файлов базы данных в байтах. |
|
|
Старшая версия ODS. |
|
|
Младшая версия ODS. |
|
|
Номер старейшей заинтересованной транзакции — OIT, Oldest Interesting Transaction. |
|
|
Номер старейшей активной транзакции — OAT, Oldest Active Transaction. |
|
|
Номер транзакции, которая была активной на момент старта транзакции OAT, транзакция OST — Oldest Snapshot Transaction. |
|
|
Номер следующей транзакции. |
|
|
Количество страниц, выделенных в оперативной памяти для кэша. |
|
|
SQL диалект базы данных: 1 или 3. |
|
|
Текущее состояние останова (shutdown) базы данных: 0 — база данных активна (online); |
|
|
Интервал чистки (sweep interval). |
|
|
Признак, является база данных только для чтения, read only,
(значение |
|
|
Указывает, установлен ли для базы режим синхронного вывода
(forced writes, значение |
|
|
Флаг, указывающий на резервирование пространства. |
|
|
Дата и время создания базы данных. |
|
|
Количество страниц, выделенных для базы данных на внешнем устройстве. |
|
|
Идентификатор статистики. |
|
|
Текущее физическое состояние backup: |
|
|
Текущее состояние шифрования:
|
|
|
Количество зашифрованных/дешифрованных страниц в процессе шифрования/дешифрования; ноль если этот процесс закончился или не начинался. |
|
|
Владелец базы данных. |
|
|
Отображает, какой тип базы данных безопасности используется:
|
|
|
GUID базы данных. |
|
|
Уникальный идентификатор базы данных на уровне файловой системы. |
|
|
Номер (идентификатор) следующего соединения. |
|
|
Номер (идентификатор) следующего SQL запроса. |
|
|
Режим репликации:
|
Статистика по вводу-выводу.
MON$IO_STATS
Наименование столбца | Тип данных | Описание |
---|---|---|
|
|
Идентификатор статистики. |
|
|
Группа статистики:
|
|
|
Количество прочитанных (read) страниц базы данных. |
|
|
Количество записанных (write) страниц базы данных. |
|
|
Количество загруженных в память (fetch) страниц базы данных. |
|
|
Количество отмеченных (mark) страниц базы данных. |
Счётчики этой таблицы являются накопительными и накапливают информацию по каждой из групп статистики.
Статистика использования памяти.
MON$MEMORY_USAGE
Наименование столбца | Тип данных | Описание |
---|---|---|
|
|
Идентификатор статистики. |
|
|
Группа статистики:
|
|
|
Количество используемой памяти, байт. Информация о высокоуровневом распределении памяти, выполненной сервером из пулов. Может быть полезна для отслеживания утечек памяти и чрезмерного потребления памяти в соединениях, процедурах и т.д. |
|
|
Количество памяти, выделенной ОС, байт.
Информация о низкоуровневом распределении памяти, выполненном менеджером памяти Firebird — объем памяти, выделенный операционной системой, что позволяет контролировать физическое потребление памяти.
Обратите внимание, не все записи этого столбца имеют ненулевые значения.
Малые выделения памяти здесь не фиксируются, а вместо этого добавляются к пулу памяти базы данных.
Только |
|
|
Максимальное количество байт, используемое данным объектом. |
|
|
Максимальное количество байт, выделенное ОС данному объекту. |
Note
|
Счётчики, связанные с записями уровня базы данных |
SELECT STMT.MON$ATTACHMENT_ID, STMT.MON$SQL_TEXT, MEM.MON$MEMORY_USED
FROM MON$MEMORY_USAGE MEM
NATURAL JOIN MON$STATEMENTS STMT
ORDER BY MEM.MON$MEMORY_USED DESC
FETCH FIRST 10 ROWS ONLY
Статистика на уровне записей.
MON$RECORD_STATS
Наименование столбца | Тип данных | Описание |
---|---|---|
|
|
Идентификатор статистики. |
|
|
Группа статистики:
|
|
|
Количество последовательно считанных записей (read sequentially). |
|
|
Количество записей, прочитанных при помощи индекса (read via an index). |
|
|
Количество добавленных записей (inserted records). |
|
|
Количество изменённых записей (updated records). |
|
|
Количество удалённых записей (deleted records). |
|
|
Количество удалений версий записей созданных при rollback (backed out records). |
|
|
Количество удалений старых версий записей (purged records). |
|
|
Количество удалений всей цепочки версий записи, если самая последняя версия удалена, и не нужна другим транзакциям (expunged records). |
|
|
Количество записей прочитанных с использованием предложения |
|
|
Количество попыток обновления/модификации/блокировки записей
принадлежащих нескольким активным транзакциям. Транзакция находится
в режиме |
|
|
Количество неудачных попыток обновления/модификации/блокировки
записей принадлежащих нескольким активным транзакциям. В таких
ситуациях сообщается о конфликте обновления ( |
|
|
Количество прочитанных версий при поиске видимых версий записей. |
|
|
Количество прочитанных фрагментов записей. |
|
|
Количество повторно прочитанных записей. |
|
|
Количество записей вычищенных промежуточной сборкой мусора. |
Счётчики этой таблицы являются накопительными и накапливают информацию по каждой из групп статистики.
Подготовленные к выполнению операторы.
MON$STATEMENTS
Наименование столбца | Тип данных | Описание |
---|---|---|
|
|
Идентификатор оператора. |
|
|
Идентификатор соединения. |
|
|
Идентификатор транзакции. |
|
|
Состояние оператора:
|
|
|
Дата и время старта оператора. |
|
|
Текст оператора на языке SQL. |
|
|
Идентификатор статистики. |
|
|
План оператора в explain форме. |
|
|
Тайм-аут SQL оператора уровня SQL оператора. Содержит значение
тайм-аута, установленное на уровне соединения/оператора, в
миллисекундах. Если тайм-аут не установлен — |
|
|
Время истечения таймера SQL оператора. Содержит |
Состояние оператора STALLED
— это состояние “приостановлено”. Возможно для запроса, который начал своё выполнение, ещё не завершил его, но в данный момент не выполняется.
Например, ждёт входных параметров или очередного фетча (fetch) от клиента.
SELECT ATT.MON$USER, ATT.MON$REMOTE_ADDRESS, STMT.MON$SQL_TEXT, STMT.MON$TIMESTAMP
FROM MON$ATTACHMENTS ATT
JOIN MON$STATEMENTS STMT ON ATT.MON$ATTACHMENT_ID = STMT.MON$ATTACHMENT_ID
WHERE ATT.MON$ATTACHMENT_ID <> CURRENT_CONNECTION
AND STMT.MON$STATE = 1
Таблицы мониторинга доступны только для чтения.
Однако в сервер встроен механизм для удаления (и только удаления) записей в таблице MON$STATEMENTS
, что позволяет завершить активный запрос.
Note
|
|
DELETE FROM MON$STATEMENTS
WHERE MON$ATTACHMENT_ID = 32
Статистика на уровне таблицы.
MON$TABLE_STATS
Наименование столбца | Тип данных | Описание |
---|---|---|
|
|
Идентификатор статистики. |
|
|
Группа статистики:
|
|
|
Имя таблицы. |
|
|
Ссылка на MON$RECORD_STATS. |
SELECT
t.mon$table_name,
r.mon$record_inserts,
r.mon$record_updates,
r.mon$record_deletes,
r.mon$record_backouts,
r.mon$record_purges,
r.mon$record_expunges,
------------------------
r.mon$record_seq_reads,
r.mon$record_idx_reads,
r.mon$record_rpt_reads,
r.mon$backversion_reads,
r.mon$fragment_reads,
------------------------
r.mon$record_locks,
r.mon$record_waits,
r.mon$record_conflicts,
------------------------
a.mon$stat_id
FROM
mon$record_stats r
JOIN mon$table_stats t ON r.mon$stat_id = t.mon$record_stat_id
JOIN mon$attachments a ON t.mon$stat_id = a.mon$stat_id
WHERE
a.mon$attachment_id = CURRENT_CONNECTION
Описывает начатые транзакции
MON$TRANSACTIONS
Наименование столбца | Тип данных | Описание |
---|---|---|
|
|
Идентификатор (номер) транзакции. |
|
|
Идентификатор соединения. |
|
|
Состояние транзакции:
Запрос связывается с транзакцией, когда начинает его выполнение. Эта связь разрывается, когда запрос начинает новое выполнение в другой транзакции, или, когда транзакция или запрос удаляется, но не тогда, когда запрос выполнен или из курсора выбраны все записи. |
|
|
Дата и время старта транзакции. |
|
|
Верхний предел используемый транзакцией чистильщика (sweeper) при
продвижении глобального OIT. Все транзакции выше этого порога
считаются активными. Обычно он эквивалентен |
|
|
Номер старейшей заинтересованной транзакции — OIT, Oldest Interesting Transaction. |
|
|
Номер старейшей активной транзакции — OAT, Oldest Active Transaction. |
|
|
Режим (уровень) изоляции:
|
|
|
Время ожидания:
|
|
|
Признак, является ли транзакцией только для чтения, read only
(значение |
|
|
Признак, используется ли автоматическое подтверждение транзакции
auto-commit (значение |
|
|
Признак, используется ли автоматическая отмена транзакции
auto-undo (значение |
|
|
Идентификатор статистики. |
SELECT
DISTINCT a.*
FROM
mon$attachments a
JOIN mon$transactions t ON a.mon$attachment_id = t.mon$attachment_id
WHERE
NOT(t.mon$read_only = 1 AND t.mon$isolation_mode >= 2);