Fn trace getinfo: примеры (SQL)
fn_trace_getinfo(trace_id): tableФункция fn_trace_getinfo в MS SQL Server
Функция fn_trace_getinfo относится к системным функциям MS SQL Server и предназначена для получения конфигурационной информации о существующих трассировках. Её основное применение — администрирование и мониторинг, когда требуется просмотреть параметры активных или остановленных трассировок, созданных с помощью хранимой процедуры sp_trace_create.
Функция принимает один необязательный аргумент:
- @traceid (тип
int) — идентификатор конкретной трассировки. Если указать значениеNULLили0, функция возвращает данные обо всех трассировках в системе.
Возвращаемое значение — таблица с тремя столбцами:
- traceid (
int) — уникальный идентификатор трассировки. - property (
int) — числовой код параметра трассировки. Всего существует 8 свойств. - value (
sql_variant) — текущее значение указанного свойства.
Коды свойств (property) и их расшифровка:
- 1 — параметры трассировки (options), заданные при создании. Значение является битовой маской.
- 2 — имя файла результата трассировки (
trc). - 3 — максимальный размер файла трассировки в мегабайтах.
- 4 — время остановки трассировки (если задано).
- 5 — текущее состояние трассировки:
0— остановлена,1— запущена. - 6 — максимальное количество файлов ротации (при использовании параметра
FILE_ROLLOVER). - 7 — флаг, указывающий на возможность чтения файла трассировки сервером (редко используется).
- 8 — флаг, указывающий на необходимость шифрования файла трассировки (используется при аудите).
Примеры базового применения
Запрос для получения информации обо всех трассировках в экземпляре SQL Server:
SELECT * FROM fn_trace_getinfo(0);traceid property value ------- -------- ------ 1 1 8 1 2 C:\Traces\MyTrace_1.trc 1 3 100 1 4 NULL 1 5 1 1 6 5 1 7 NULL 1 8 0 2 1 2 2 2 C:\Audit\Audit.trc 2 3 500 2 4 NULL 2 5 0 2 6 NULL 2 7 NULL 2 8 1
Получение данных о конкретной трассировке с идентификатором 2:
SELECT * FROM fn_trace_getinfo(2);traceid property value ------- -------- ------ 2 1 2 2 2 C:\Audit\Audit.trc 2 3 500 2 4 NULL 2 5 0 2 6 NULL 2 7 NULL 2 8 1
Расшифровка состояния трассировки с помощью оператора CASE:
SELECT
traceid,
property,
CASE property
WHEN 1 THEN 'Options'
WHEN 2 THEN 'File name'
WHEN 3 THEN 'Max size'
WHEN 4 THEN 'Stop time'
WHEN 5 THEN 'Current status'
WHEN 6 THEN 'Max rollover files'
WHEN 7 THEN 'Server read flag'
WHEN 8 THEN 'Encryption flag'
END AS property_name,
value
FROM fn_trace_getinfo(0)
WHERE traceid = 1;traceid property property_name value ------- -------- --------------- ------ 1 1 Options 8 1 2 File name C:\Traces\MyTrace_1.trc 1 3 Max size 100 1 4 Stop time NULL 1 5 Current status 1 1 6 Max rollover files 5 1 7 Server read flag NULL 1 8 Encryption flag 0
Похожие функции MS SQL Server
Для работы с трассировками в MS SQL Server существует несколько системных представлений и функций, которые могут частично заменить fn_trace_getinfo или дополнить её данные.
- sys.traces — системное представление, которое возвращает информацию о работающих трассировках. Содержит столбцы, аналогичные свойствам из
fn_trace_getinfo, но в более удобном табличном формате. Его применение предпочтительнее для мониторинга, так как не требует расшифровки кодов свойств и обеспечивает лучшую производительность. - sys.fn_trace_geteventinfo — функция, возвращающая список событий и столбцов, собираемых конкретной трассировкой. Полезно для анализа конфигурации трассировки.
- sys.fn_trace_getfilterinfo — функция, предоставляющая данные о фильтрах, применённых к трассировке.
Для получения полной картины о трассировке часто используют комбинацию этих объектов. Представление sys.traces стало основным источником информации с версии SQL Server 2005.
Аналоги в других СУБД
Концепция трассировки SQL-запросов и аудита существует во всех основных СУБД, но реализация отличается.
PostgreSQL: Расширение pg_stat_statements собирает статистику выполнения SQL-запросов. Для низкоуровневого аудита используют расширения типа pgaudit.
-- Включение расширения
CREATE EXTENSION pg_stat_statements;
SELECT query, calls FROM pg_stat_statements;Oracle: Используется механизм AUDIT для регистрации событий и представление V$SQL для мониторинга запросов.
-- Включение аудита
AUDIT SELECT TABLE BY SCOTT;
-- Просмотр записей
SELECT * FROM DBA_AUDIT_TRAIL;MySQL: Существует общий журнал запросов (general log) и медленный журнал (slow query log). Параметры можно посмотреть через переменные.
SHOW VARIABLES LIKE 'general_log%';
SHOW VARIABLES LIKE 'slow_query_log%';SQLite: Встроенных механизмов трассировки нет, но можно использовать пользовательские функции или внешние средства профилирования.
В отличие от MS SQL, где fn_trace_getinfo возвращает строго структурированные данные о каждой трассировке, в других СУБД информация часто разбросана по различным представлениям и журналам.
Типичные ошибки
Ошибки при использовании fn_trace_getinfo чаще всего связаны с неверной интерпретацией кодов свойств или попыткой доступа к несуществующей трассировке.
Использование недопустимого идентификатора трассировки приводит к пустому результату, а не к ошибке:
SELECT * FROM fn_trace_getinfo(9999);traceid property value ------- -------- ------
Неправильная расшифровка кода свойства 1 (options). Значение является битовой маской, где: 1 = TRACE_FILE_ROLLOVER, 2 = SHUTDOWN_ON_ERROR, 4 = TRACE_PRODUCE_BLACKBOX, 8 = TRACE_PRODUCE_BLACKBOX (устаревшее). Например, значение 8 может означать как флаг 8, так и комбинацию флагов.
-- Неправильная интерпретация
SELECT value AS options FROM fn_trace_getinfo(1) WHERE property = 1;
-- Правильный подход через побитовые операции
SELECT
CASE WHEN value & 1 = 1 THEN 'FILE_ROLLOVER, ' ELSE '' END +
CASE WHEN value & 2 = 2 THEN 'SHUTDOWN_ON_ERROR, ' ELSE '' END +
CASE WHEN value & 4 = 4 THEN 'PRODUCE_BLACKBOX, ' ELSE '' END AS options
FROM fn_trace_getinfo(1)
WHERE property = 1;options ------- FILE_ROLLOVER, PRODUCE_BLACKBOX,
Игнорирование типа данных столбца value (sql_variant) при фильтрации может привести к ошибкам сравнения. Рекомендуется явное приведение типа.
-- Ошибка: сравнение sql_variant без приведения
SELECT * FROM fn_trace_getinfo(0)
WHERE property = 5 AND value = 1;
-- Правильный вариант
SELECT * FROM fn_trace_getinfo(0)
WHERE property = 5 AND CAST(value AS int) = 1;Изменения в последних версиях
Функция fn_trace_getinfo остаётся практически неизменной с момента её появления в SQL Server 2000. Основные изменения связаны не с самой функцией, а с инфраструктурой трассировки.
В SQL Server 2012 представлена технология расширенных событий (Extended Events) как более современная и производительная альтернатива классической трассировки SQL. Однако классическая трассировка и функция fn_trace_getinfo полностью поддерживаются во всех актуальных версиях, включая SQL Server 2022.
Важное изменение касается свойства 8 (шифрование), которое стало актуально с усилением требований к безопасности данных. В ранних версиях SQL Server это свойство всегда возвращало NULL или 0.
Корпорация Microsoft рекомендует для новых разработок использовать расширенные события, но fn_trace_getinfo сохраняет свою актуальность для поддержки унаследованных систем и скриптов.
Расширенные примеры применения
Создание отчета о всех трассировках с расшифровкой всех параметров:
DECLARE @trace_id INT;
DECLARE trace_cursor CURSOR FOR
SELECT DISTINCT traceid FROM fn_trace_getinfo(0);
OPEN trace_cursor;
FETCH NEXT FROM trace_cursor INTO @trace_id;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Трассировка ID: ' + CAST(@trace_id AS VARCHAR(10));
SELECT
@trace_id as trace_id,
MAX(CASE WHEN property = 1 THEN CAST(value AS INT) END) AS options,
MAX(CASE WHEN property = 2 THEN CAST(value AS NVARCHAR(500)) END) AS file_name,
MAX(CASE WHEN property = 3 THEN CAST(value AS INT) END) AS max_size_mb,
MAX(CASE WHEN property = 4 THEN CAST(value AS DATETIME) END) AS stop_time,
MAX(CASE WHEN property = 5 THEN CAST(value AS INT) END) AS is_running,
MAX(CASE WHEN property = 6 THEN CAST(value AS INT) END) AS max_rollover_files,
MAX(CASE WHEN property = 8 THEN CAST(value AS INT) END) AS encryption_flag
FROM fn_trace_getinfo(@trace_id);
FETCH NEXT FROM trace_cursor INTO @trace_id;
END
CLOSE trace_cursor;
DEALLOCATE trace_cursor;Поиск трассировок, которые записывают данные в определённую папку:
SELECT DISTINCT
t.traceid,
f.value AS file_path
FROM fn_trace_getinfo(0) t
CROSS APPLY (
SELECT CAST(value AS NVARCHAR(500)) AS value
FROM fn_trace_getinfo(t.traceid)
WHERE property = 2
) f
WHERE f.value LIKE '%C:\Audit%';Мониторинг состояния трассировок в реальном времени с определением, сколько времени осталось до остановки:
SELECT
traceid,
MAX(CASE WHEN property = 2 THEN CAST(value AS NVARCHAR(500)) END) AS trace_file,
MAX(CASE WHEN property = 5 THEN CAST(value AS INT) END) AS status,
MAX(CASE WHEN property = 4 THEN CAST(value AS DATETIME) END) AS stop_time,
DATEDIFF(MINUTE, GETDATE(),
MAX(CASE WHEN property = 4 THEN CAST(value AS DATETIME) END)) AS minutes_until_stop
FROM fn_trace_getinfo(0)
GROUP BY traceid
HAVING MAX(CASE WHEN property = 5 THEN CAST(value AS INT) END) = 1
AND MAX(CASE WHEN property = 4 THEN CAST(value AS DATETIME) END) IS NOT NULL;Определение трассировок, которые используют ротацию файлов и接近 к лимиту количества файлов:
SELECT
traceid,
MAX(CASE WHEN property = 6 THEN CAST(value AS INT) END) AS max_files,
COUNT(DISTINCT
REVERSE(SUBSTRING(REVERSE(CAST(value AS NVARCHAR(500))),
CHARINDEX('.', REVERSE(CAST(value AS NVARCHAR(500)))) + 1, 256))) AS current_files_count
FROM fn_trace_getinfo(0)
WHERE property = 2
GROUP BY traceid
HAVING MAX(CASE WHEN property = 6 THEN CAST(value AS INT) END) IS NOT NULL
AND COUNT(DISTINCT
REVERSE(SUBSTRING(REVERSE(CAST(value AS NVARCHAR(500))),
CHARINDEX('.', REVERSE(CAST(value AS NVARCHAR(500)))) + 1, 256)))
>= MAX(CASE WHEN property = 6 THEN CAST(value AS INT) END) * 0.8;