Fn trace getinfo: примеры (SQL)

Использование функции fn_trace_getinfo для работы с трассировками SQL Server
Раздел: Функции манипулирования статистиками, Трассировка
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, функция возвращает данные обо всех трассировках в системе.

Возвращаемое значение — таблица с тремя столбцами:

  1. traceid (int) — уникальный идентификатор трассировки.
  2. property (int) — числовой код параметра трассировки. Всего существует 8 свойств.
  3. value (sql_variant) — текущее значение указанного свойства.

Коды свойств (property) и их расшифровка:

  1. 1 — параметры трассировки (options), заданные при создании. Значение является битовой маской.
  2. 2 — имя файла результата трассировки (trc).
  3. 3 — максимальный размер файла трассировки в мегабайтах.
  4. 4 — время остановки трассировки (если задано).
  5. 5 — текущее состояние трассировки: 0 — остановлена, 1 — запущена.
  6. 6 — максимальное количество файлов ротации (при использовании параметра FILE_ROLLOVER).
  7. 7 — флаг, указывающий на возможность чтения файла трассировки сервером (редко используется).
  8. 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 сохраняет свою актуальность для поддержки унаследованных систем и скриптов.

Расширенные примеры применения

Создание отчета о всех трассировках с расшифровкой всех параметров:

Пример sql
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;

Поиск трассировок, которые записывают данные в определённую папку:

Пример sql
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%';

Мониторинг состояния трассировок в реальном времени с определением, сколько времени осталось до остановки:

Пример sql
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;

Определение трассировок, которые используют ротацию файлов и接近 к лимиту количества файлов:

Пример sql
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;

MS SQL fn_trace_getinfo function comments

En
Fn trace getinfo Returns information about a specified trace or all existing traces