Extended Events
Extended Events — это легковесная, высокопроизводительная система трассировки и мониторинга событий, встроенная в ядро системы управления базами данных Microsoft SQL Server, начиная с версии SQL Server 2008. Она предназначена для сбора, анализа и устранения неисправностей в работе сервера баз данных, позволяя администраторам и разработчикам получать детализированную информацию о внутренних процессах, производительности, ошибках и блокировках без значительного влияния на нагрузку системы. Extended Events пришла на смену устаревшим инструментам, таким как SQL Trace и Profiler, предлагая более гибкую, масштабируемую и менее ресурсоёмкую архитектуру.
История и развитие
До появления Extended Events основным инструментом для мониторинга SQL Server был SQL Trace (реализованный через хранимые процедуры sp_trace_create и т.д.) и его графическая оболочка — SQL Server Profiler. Однако SQL Trace имел ряд ограничений: он был привязан к определённым версиям, потреблял значительные ресурсы сервера, особенно при активном трассировании, и не позволял гибко настраивать фильтрацию и сбор данных. Кроме того, он был ориентирован на события, связанные с запросами, и не покрывал многие внутренние механизмы ядра.
В ответ на эти недостатки, в SQL Server 2008 была представлена новая система — Extended Events. Она была разработана с нуля, используя модель событийного программирования, и изначально была доступна только для опытных администраторов через T-SQL. В SQL Server 2012 Extended Events получила графический интерфейс в среде SQL Server Management Studio (SSMS), что значительно упростило её использование. В последующих версиях (2014, 2016, 2017, 2019, 2022) функциональность была расширена: добавлены новые события, действия, цели, улучшена интеграция с системой динамических представлений (DMV) и расширены возможности фильтрации.
Архитектура и компоненты
Extended Events построена на модульной архитектуре, состоящей из нескольких ключевых компонентов, которые взаимодействуют друг с другом:
Пакеты (Packages)
Пакеты — это контейнеры, содержащие объекты Extended Events. Каждый пакет представляет собой динамическую библиотеку (DLL) или модуль, загружаемый в память SQL Server. Основные пакеты:
sqlserver— содержит большинство событий, действий и предикатов, связанных с ядром SQL Server.sqlos— содержит события, связанные с операционной системой, такие как планирование потоков и управление памятью.package0— базовый пакет, содержащий фундаментальные типы данных, такие какint64,unicode_stringиtimestamp.
События (Events)
События — это точки в коде SQL Server, где может быть зафиксирована определённая активность. Каждое событие имеет уникальное имя и набор полей (данных), которые оно может предоставить. Например, событие sqlserver.sql_statement_completed срабатывает при завершении выполнения T-SQL оператора и предоставляет такие поля, как duration, cpu_time, logical_reads и physical_reads. Всего в SQL Server 2022 насчитывается более 1000 различных событий.
Действия (Actions)
Действия — это дополнительные операции, которые выполняются при срабатывании события. Они позволяют добавить к событию контекстную информацию, которая не входит в стандартный набор полей события. Например, действие sqlserver.sql_text добавляет текст T-SQL запроса, а sqlserver.session_id — идентификатор сессии. Действия могут быть глобальными (применяются ко всем событиям в сессии) или локальными.
Цели (Targets)
Цели — это места, куда отправляются собранные данные. Extended Events поддерживает несколько типов целей:
event_file— сохраняет данные в файл на диске (формат XEL). Это наиболее распространённая цель, так как файлы можно анализировать позже.ring_buffer— хранит данные в оперативной памяти в виде кольцевого буфера. Полезен для быстрого анализа текущих событий, но данные теряются при перезапуске сервера.event_counter— подсчитывает количество срабатываний каждого события без сохранения деталей. Используется для оценки частоты событий.pair_matching— сопоставляет пары событий (например, начало и конец операции) для вычисления длительности.etw_classic_sync_target— передаёт данные в систему трассировки событий Windows (ETW) для интеграции с другими инструментами.
Предикаты (Predicates)
Предикаты — это фильтры, которые определяют, при каких условиях событие будет захвачено. Они позволяют избежать сбора ненужных данных, снижая нагрузку. Предикаты могут быть простыми (например, duration > 1000) или сложными, с использованием логических операторов (AND, OR, NOT). Фильтрация выполняется на стороне ядра до того, как событие будет отправлено в цель, что минимизирует накладные расходы.
Сессии Extended Events
Сессия — это экземпляр мониторинга, который объединяет события, действия, цели и предикаты. Сессии создаются с помощью T-SQL команд CREATE EVENT SESSION или через графический интерфейс SSMS. Сессия может быть активной (запущенной) или остановленной. Она может быть сконфигурирована для работы в реальном времени или для сбора данных в фоновом режиме.
Пример создания простой сессии, которая захватывает все SQL-запросы длительностью более 1 секунды и сохраняет их в файл:
``sql CREATE EVENT SESSION [LongRunningQueries] ON SERVER ADD EVENT sqlserver.sql_statement_completed( ACTION (sqlserver.sql_text, sqlserver.session_id) WHERE ([duration] > 1000000) -- 1 секунда = 1 000 000 микросекунд ) ADD TARGET package0.event_file(SET filename = N'C:\Traces\LongRunningQueries.xel') WITH (MAX_MEMORY = 4096 KB, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY = 30 SECONDS, MAX_EVENT_SIZE = 0 KB, MEMORY_PARTITION_MODE = NONE, TRACK_CAUSALITY = OFF, STARTUP_STATE = OFF); ``
После создания сессию необходимо запустить: ALTER EVENT SESSION [LongRunningQueries] ON SERVER STATE = START;.
Применение
Extended Events используется для решения широкого круга задач:
Диагностика производительности
С помощью Extended Events можно выявить медленные запросы, блокировки, конфликты ресурсов (например, ожидания LCK_M_*), высокую загрузку CPU или диска. Анализируя события sql_statement_completed, sp_statement_completed и wait_completed, администратор может определить узкие места.
Мониторинг блокировок и взаимоблокировок
Событие sqlserver.lock_deadlock позволяет захватывать информацию о взаимоблокировках (deadlock), включая граф взаимоблокировки и текст запросов, участвующих в конфликте. Это эффективнее, чем использование флага трассировки 1222.
Аудит и безопасность
Extended Events может использоваться для отслеживания изменений в структуре базы данных (DDL-операции), попыток входа в систему (события login и logout), выполнения определённых команд (например, GRANT, REVOKE). Это дополняет, но не заменяет полноценный аудит SQL Server Audit.
Отладка приложений
Разработчики могут использовать Extended Events для трассировки вызовов хранимых процедур, функций и триггеров, чтобы понять, как приложение взаимодействует с базой данных.
Мониторинг расширенных событий
SQL Server предоставляет динамические представления (DMV) для мониторинга самих сессий Extended Events, такие как sys.dm_xe_sessions, sys.dm_xe_session_targets и sys.dm_xe_session_events. Они позволяют отслеживать количество собранных событий, размер буфера и ошибки.
Преимущества и недостатки
Преимущества
- Низкое влияние на производительность: Extended Events спроектирована так, чтобы минимизировать накладные расходы, особенно при использовании фильтров. По данным Microsoft, нагрузка может быть на 90% ниже по сравнению с SQL Trace.
- Гибкость: Возможность комбинировать события, действия и цели в любой конфигурации.
- Масштабируемость: Поддержка большого количества одновременных сессий и событий.
- Интеграция с современными инструментами: Данные из XEL-файлов могут быть проанализированы с помощью T-SQL (функция
sys.fn_xe_file_target_read_file), а также импортированы в Power BI, Azure Data Studio или сторонние решения. - Безопасность: Сессии могут быть созданы с ограниченными правами (например, с помощью роли
ALTER ANY EVENT SESSION).
Недостатки
- Сложность настройки: Для новичков может быть сложно разобраться в большом количестве событий и параметров.
- Отсутствие графического интерфейса в некоторых версиях: В ранних версиях (2008, 2008 R2) Extended Events была доступна только через T-SQL.
- Ограниченная документация для некоторых событий: Не все события имеют подробное описание, особенно в старых версиях.
- Не заменяет полностью SQL Trace: Некоторые события, доступные в SQL Trace, не имеют прямых аналогов в Extended Events (например,
UserConfigurable).
Сравнение с SQL Trace
| Характеристика | SQL Trace | Extended Events |
|---|---|---|
| Архитектура | Монолитная, основана на хранимых процедурах | Модульная, событийно-ориентированная |
| Производительность | Высокая нагрузка при активном сборе | Низкая нагрузка, особенно с фильтрами |
| Фильтрация | Ограничена, фильтры применяются после сбора | Фильтрация на стороне ядра до сбора |
| Количество событий | Около 200 | Более 1000 |
| Цели | Файл (TRC), таблица, Profiler | Файл (XEL), кольцевой буфер, счётчик, ETW |
| Гибкость | Низкая | Высокая |
| Поддержка в новых версиях | Устарела, не рекомендуется к использованию | Активно развивается |
Интересные факты
- Extended Events использует формат XEL (XML Event Log), который является бинарным XML-файлом. Его можно открыть в SSMS или прочитать с помощью T-SQL.
- В SQL Server 2016 и новее появилась возможность использовать Extended Events для мониторинга Always On Availability Groups, включая события, связанные с синхронизацией данных и переключением ролей.
- Система Extended Events также доступна в Azure SQL Database и Azure SQL Managed Instance, хотя набор событий может отличаться от локальной версии.
- В SQL Server 2022 была добавлена поддержка событий для мониторинга работы с памятью и новыми функциями, такими как
Query StoreиIntelligent Query Processing.
Источники
- Microsoft Docs: «Extended Events» (SQL Server documentation)
- Microsoft Docs: «CREATE EVENT SESSION (Transact-SQL)»
- Microsoft Docs: «sys.dm_xe_sessions (Transact-SQL)»
- Microsoft Docs: «Compare SQL Server Trace and Extended Events»
- Microsoft Docs: «Use the system_health session»
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →