Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server
Azure SQL База данных
Azure SQL Управляемый экземпляр
SQL База данных в Microsoft Fabric
Расширенные события — это упрощенная функция мониторинга производительности, которая позволяет пользователям собирать данные для мониторинга и устранения неполадок. С помощью расширенных событий можно просмотреть сведения о внутренних операциях ядра СУБД, которые относятся к мониторингу производительности и устранению неполадок. Дополнительные сведения о расширенных событиях см. в обзоре расширенных событий.
Эта статья направлена на помощь администраторам SQL, инженерам и разработчикам, которые являются новыми для расширенных событий, и которые хотят начать использовать его и просмотреть данные событий всего за несколько минут.
Расширенные события также называются XEvents, а иногда — XE.
Прочитав эту статью, вы можете:
- Узнайте, как создать сеанс событий в SQL Server Management Studio (SSMS) с примерами снимок экрана.
- Сопоставляйте снимки экрана с эквивалентными операторами Transact-SQL.
- Подробно изучите термины и концепции пользовательского интерфейса SSMS и инструкций XEvents T-SQL.
- Узнайте, как протестировать сеанс мероприятия.
- Ознакомьтесь с результатами сеанса, включая:
- Доступные варианты для хранилища результатов
- Обработанные и необработанные результаты
- Средства просмотра результатов различными способами и по разным шкалам времени
- Узнайте, как искать и обнаруживать все доступные события.
- Изучите связи между системными представлениями расширенных событий.
Совет
Дополнительные сведения о расширенных событиях в Базе данных SQL Azure, включая примеры кода, см. в статье «Расширенные события в Базе данных SQL Azure и Управляемом экземпляре SQL Azure».
Предварительные требования
Чтобы приступить к работе, необходимо выполнить следующие действия.
- Установите последнюю версию SQL Server Management Studio (SSMS).
- Убедитесь, что у вашей учетной записи есть
CREATE ANY EVENT SESSION(представленное в SQL Server 2022) илиALTER ANY EVENT SESSIONразрешение сервера. - Кроме того, при использовании SSMS и для просмотра созданных сеансов для входа требуется разрешение
VIEW SERVER PERFORMANCE STATE. - Для Базы данных SQL Azure, Управляемого экземпляра SQL Azure и базы данных SQL в Fabric файлы событий расширенных событий хранятся в службе хранилища Azure. Вам потребуется учетная запись хранения Azure.
Сведения о безопасности и разрешениях, связанных с расширенными событиями, доступны в конце этой статьи в приложении.
Расширенные события в SSMS
SSMS предоставляет полнофункциональный пользовательский интерфейс для расширенных событий. Многие сценарии можно выполнить с помощью этого пользовательского интерфейса, не используя T-SQL или динамические административные представления (DMV).
В следующем разделе вы увидите шаги пользовательского интерфейса для создания сеанса расширенных событий и просмотра данных, которые он сообщает. Пройдя по шагам или просмотрив их в этой статье, вы можете ознакомиться с понятиями, участвующими в шагах для более глубокого понимания.
Создание сеанса событий в SSMS
При создании сеанса расширенных событий вы сообщаете системе:
- Какие события вас интересуют.
- как система должна предоставлять вам данные.
В демонстрации откроется диалоговое окно "Новый сеанс" , где показано, как использовать четыре страницы с именем:
- Общие сведения
- События
- Хранилище данных
- Расширенные
Текст и вспомогательные снимки экрана могут немного отличаться в вашей версии SSMS, но по-прежнему должны быть актуальными для объяснения основных понятий.
Подключитесь к экземпляру ядра СУБД. Расширенные события поддерживаются начиная с SQL Server 2014 (12.x), в Базе данных SQL Azure и Управляемом экземпляре SQL Azure.
В обозревателе объектов выберите Управление > Расширенные события. В База данных SQL Azure сеансы событий ограничены областью базы данных, поэтому параметр Extended Events находится в разделе каждой базы данных, а не в разделе Management.
Щелкните правой кнопкой мыши папку "Сеансы" и выберите "Создать сеанс".... Диалоговое окно "Новый сеанс" предпочтительнее мастера создания сеансов, хотя они похожи.
Совет
На этих шагах руководства не нажимайте OK, пока не перейдёте через все четыре страницы: Общие, События, Хранилище данных и Дополнительно.
Выберите страницу "Общие ". Затем введите
YourSessionили любое имя, например, в текстовое поле "Имя сеанса". Не нажимайте кнопку "ОК ", так как вам все еще нужно ввести некоторые сведения на других страницах.Выберите страницу "События ".
В разделе Библиотека событий в раскрывающемся списке выберите Только названия событий.
- Введите
sql_statementв текстовое поле. Это фильтрует список, чтобы отобразить только события сsql_statementименем. - Прокрутите и выберите событие с именем
sql_statement_completed. - Нажмите кнопку
>со стрелкой вправо, чтобы переместить событие в поле "Выбранные события ".
- Введите
На странице "События" нажмите кнопку "Настройка". Откроется поле параметров конфигурации событий для выбранных событий.
Перейдите на вкладку "Фильтр (предикат"). Затем выберите новую строку фильтра, которая говорит Click here, чтобы добавить предложение. В этом руководстве мы настроим этот фильтр (также известный как предикат), чтобы отбирать все операторы
SELECTс условиемHAVING.В раскрывающемся списке "Поле " выберите
sqlserver.sql_text.- Для оператора выберите
like_i_sql_unicode_string. Здесьiв имени оператора обозначает нечувствительность к регистру. - Для значения введите
%SELECT%HAVING%. Здесь символы процента (%) служат подстановочными знаками, обозначающими любую строку символов.
Примечание.
В двухэлементном имени поля
sqlserver— это имя пакета, аsql_text— имя поля. Выбранное ранее событие должно находиться в том же пакете,sql_statement_completedчто и выбранное поле.- Для оператора выберите
Выберите страницу хранилища данных.
В области "Целевые объекты " выберите новую строку типа целевого объекта, которая говорит, что щелкните здесь, чтобы добавить целевой объект. В этом руководстве мы запишем собранные данные о расширенных событиях в файл событий. Это означает, что данные события хранятся в файле, который можно открыть и просмотреть позже. Начиная с SQL Server 2019 (15.x), данные событий также можно записывать в службу хранилища Azure. Для Базы данных SQL Azure, Управляемого экземпляра SQL Azure и базы данных SQL в Fabric файлы событий всегда хранятся в службе хранилища Azure.
- В раскрывающемся списке "Тип" выберите
event_file.
- В раскрывающемся списке "Тип" выберите
В области "Свойства" введите полный путь и имя файла в текстовое поле "Файл" на сервере. Вы также можете использовать кнопку "Обзор ". Расширение имени файла должно быть
xel. В нашем примере мы использовалиC:\temp\YourSession_Target.xel.Выберите страницу "Дополнительно ". По умолчанию этот Xel-целевой объект расширенного сеанса событий не должен влиять на производительность сервера, но эти параметры на странице "Дополнительно " можно использовать для увеличения или уменьшения ресурсов и задержки.
Нажмите кнопку "ОК" внизу, чтобы создать этот сеанс событий.
Вернувшись в SSMS обозреватель объектов, откройте или обновите папку Sessions и найдите новый узел для
YourSessionсеанса расширенных событий. Сеанс еще не запущен. В этом руководстве мы начнём это позже.
Изменение сеанса событий в SSMS
В обозревателе объектов SSMS можно изменить сеанс событий, щелкнув правой кнопкой мыши на его узле, а затем выбрав Свойства. Откроется то же самое диалоговое окно с несколькими страницами.
Создание сеанса событий с помощью T-SQL
В SSMS можно создать скрипт T-SQL для создания сеанса событий следующим образом:
- Щелкните правой кнопкой мыши узел сеанса событий, а затем выберите "Сеанс скрипта" как > CREATE в > буфер обмена.
- Вставьте скрипт в любой текстовый редактор.
Ниже приведена созданная CREATE EVENT SESSION инструкция T-SQL для YourSession:
CREATE EVENT SESSION [YourSession]
ON SERVER -- For SQL Server and Azure SQL Managed Instance
-- ON DATABASE -- For Azure SQL Database
ADD EVENT sqlserver.sql_statement_completed
(
ACTION(sqlserver.sql_text)
WHERE
( [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%SELECT%HAVING%')
)
)
ADD TARGET package0.event_file
(SET filename=N'C:\temp\YourSession_Target.xel');
GO
Примечание.
В База данных SQL Azure используйте ON DATABASE вместо ON SERVER.
Условное УДАЛЕНИЕ сеанса событий
Перед инструкцией CREATE EVENT SESSION можно условно выполнить инструкцию DROP EVENT SESSION, если сеанс с таким именем уже существует. При этом удаляется существующий сеанс. Без этого попытка создать сеанс с тем же именем приводит к ошибке.
IF EXISTS (SELECT *
FROM sys.server_event_sessions
WHERE name = 'YourSession')
BEGIN
DROP EVENT SESSION YourSession
ON SERVER;
END
GO
Запуск и остановка сеанса событий с помощью T-SQL
Созданный сеанс событий по умолчанию не запускается автоматически. Вы можете запускать или останавливать сеанс событий в любое время с помощью следующей ALTER EVENT SESSION инструкции T-SQL.
ALTER EVENT SESSION [YourSession]
ON SERVER
STATE = START; -- STOP;
Вы можете настроить сеанс событий для автоматического запуска экземпляра ядра СУБД. См. ключевое STARTUP STATE = ON слово в CREATE EVENT SESSION.
Пользовательский интерфейс SSMS содержит соответствующий флажок Запускать сеанс событий при запуске сервера на странице Новый сеанс > Общие.
Тестирование сеанса событий
Проверьте сеанс событий, выполнив следующие действия.
- В обозреватель объектов щелкните правой кнопкой мыши узел сеанса событий и выберите "Пуск сеанса".
- При подключении к одному серверу (или той же базе данных в База данных SQL Azure), где вы создали сеанс событий, выполните следующую
SELECT...HAVINGинструкцию несколько раз. Рассмотрите возможность изменения значения в конструкцииHAVINGпри каждом запуске, переключаясь между 2 и 3. Таким образом можно увидеть различия в результатах. - Щелкните правой кнопкой мыши узел сеанса и выберите "Остановить сеанс".
- Прочитайте следующий подраздел о выборе и просмотре результатов.
SELECT c.name,
COUNT(*) AS [Count-Per-Column-Repeated-Name]
FROM sys.syscolumns AS c
INNER JOIN sys.sysobjects AS o
ON o.id = c.id
WHERE o.type = 'V'
AND c.name LIKE '%event%'
GROUP BY c.name
HAVING Count(*) >= 3 --2 -- Try both values during session.
ORDER BY c.name;
Для полноты ниже приведен пример выходных данных из предыдущего SELECT...HAVING.
/* Approximate output, 6 rows, all HAVING Count >= 3:
name Count-Per-Column-Repeated-Name
--------------------- ------------------------------
event_group_type 4
event_group_type_desc 4
event_session_address 5
event_session_id 5
is_trigger_event 4
trace_event_id 3
*/
Просмотр данных сеанса событий как XML
В окне запроса в SSMS выполните следующую SELECT инструкцию, чтобы просмотреть данные события, захваченные сеансом. Каждая строка представляет одно событие. Изменяет CAST(... AS xml) тип данных столбца из nvarchar на xml. Это позволяет выбрать значение столбца, чтобы открыть его в новом окне для упрощения чтения.
Примечание.
Целевой event_file объект всегда вставляет числовую часть в xel имя файла. Прежде чем выполнить следующий запрос, необходимо скопировать фактическое полное имя xel файла, включающего эту числовую часть, и вставить его в инструкцию SELECT . В следующем примере числовая часть является _0_131085363367310000.
SELECT object_name,
file_name,
file_offset,
event_data,
'CLICK_NEXT_CELL_TO_BROWSE_XML RESULTS!' AS [CLICK_NEXT_CELL_TO_BROWSE_XML_RESULTS],
CAST(event_data AS XML) AS [event_data_XML]
-- TODO: In the SSMS results grid, click this XML cell
FROM sys.fn_xe_file_target_read_file(
'C:\Temp\YourSession_Target_0_131085363367310000.xel', NULL, NULL, NULL
);
Этот запрос предоставляет два способа просмотра полных результатов любой заданной строки события:
SELECTЗапустите SSMS и выберите ячейку в столбцеevent_data_XML.Скопируйте XML-строку из ячейки в столбце
event_data. Вставьте в любой текстовый редактор, например Блокнот, и сохраните файл с расширениемxml. Затем откройте файл в браузере или редакторе, способный отображать XML-данные.
Данные событий в XML
Ниже приведена часть результатов в формате XML. Следующий XML-код редактируется для краткости.
<data name="row_count"> отображает значение 6, соответствующее шести результирующих строкам, отображаемым ранее. И мы можем увидеть всю инструкцию SELECT целиком.
<event name="sql_statement_completed" package="sqlserver" timestamp="2016-05-24T04:06:08.997Z">
<data name="duration">
<value>111021</value>
</data>
<data name="cpu_time">
<value>109000</value>
</data>
<data name="physical_reads">
<value>0</value>
</data>
<data name="last_row_count">
<value>6</value>
</data>
<data name="offset">
<value>0</value>
</data>
<data name="offset_end">
<value>584</value>
</data>
<data name="statement">
<value>SELECT c.name,
COUNT(*) AS [Count-Per-Column-Repeated-Name]
FROM sys.syscolumns AS c
INNER JOIN sys.sysobjects AS o
ON o.id = c.id
WHERE o.type = 'V'
AND c.name LIKE '%event%'
GROUP BY c.name
HAVING Count(*) >= 3 --2 -- Try both values during session.
ORDER BY c.name;</value>
</data>
</event>
Отображение данных сеанса событий в SSMS
В пользовательском интерфейсе SSMS есть несколько дополнительных функций, которые можно использовать для просмотра данных, захваченных сеансом событий. Дополнительные сведения см. в разделе "Просмотр данных о событиях" в SQL Server Management Studio.
Начните с параметров контекстного меню с метками "Просмотр целевых данных" и "Просмотр динамических данных".
Просмотр целевых данных
В обозревателе объектов SSMS можно щелкнуть правой кнопкой мыши целевой узел под узлом сеанса событий, например package0.event_counter. В контекстном меню выберите "Просмотреть целевые данные". SSMS отображает данные.
Отображение не обновляется, так как в сеансе происходят новые события. Но вы можете снова выбрать представление целевых данных .
Просмотр динамических данных
В обозревателе объектов SSMS можно щелкнуть правой кнопкой мыши по узлу сеанса событий. В контекстном меню выберите "Смотреть динамические данные". В SSMS поступающие данные отображаются в режиме реального времени по мере их поступления.
Термины и понятия в расширенных событиях
В следующей таблице перечислены термины, используемые для расширенных событий, и описываются их значения.
| Срок | Описание |
|---|---|
event session |
Конструкция, построенная вокруг одного или нескольких событий, а также вспомогательных элементов, таких как действия, — это целевой объект. Инструкция CREATE EVENT SESSION создает отдельный сеанс событий. Сеанс событий можно ALTER запускать и останавливать по мере необходимости.Сеанс событий часто называется просто сеансом, если из контекста понятно, что имеется в виду именно сеанс событий. Дополнительные сведения о сеансах событий описаны в разделе " Сеансы расширенных событий". |
event |
Определенное событие в системе, наступление которого отслеживается активным сеансом событий. Например, sql_statement_completed событие представляет момент завершения любой заданной инструкции T-SQL. Событие может сообщать различные данные, например длительность. |
target |
Элемент, получающий выходные данные из захваченного события. Целевой объект отображает вам данные. Примеры включают цель event_file, использованную ранее в этом кратком руководстве, и цель ring_buffer, которая сохраняет последние события в памяти.Любой целевой объект можно использовать для любого сеанса событий. Дополнительные сведения см. в разделе "Целевые объекты для расширенных событий". |
action |
Поле, известное событию. Данные из этого поля отправляются в целевой объект. Поле действия тесно связано с фильтром предиката. |
predicate, или фильтр |
Проверка данных в поле события, благодаря которой только нужное подмножество экземпляров события отправляется целевому объекту. Например, фильтр может включать только те sql_statement_completed события, в которых инструкция T-SQL содержала строку HAVING. |
package |
Квалификатор имени, добавляемый к каждому элементу в наборе элементов, сосредоточенном вокруг ядра событий. Например, пакет может иметь события о тексте T-SQL. Одно событие может относиться ко всем операторам T-SQL в пакете. А другое более частное событие может быть связано с отдельными инструкциями T-SQL. Кроме того, для любой инструкции T-SQL существуют started и completed события.Соответствующие событиям поля также содержатся в пакете с событиями. Большинство целей находятся в package0 и используются вместе с событиями из многих других пакетов. |
Расширенные сценарии событий и сведения об использовании
Существует множество вариантов использования Extended Events для мониторинга и устранения неполадок в ядре СУБД и нагрузках запросов. В следующих статьях приведены примеры использования сценариев блокировки:
-
Поиск объектов, на которые наложено наибольшее число блокировок
- В этом сценарии используется целевой объект histogram, который обрабатывает необработанные данные событий перед тем, как отобразить их в сводном виде, разбитом по сегментам.
-
Определение запросов, содержащих блокировки
- В этом сценарии используется цель pair_matching, где пара событий — это
sqlserver.lock_acquireиsqlserver.lock_release.
- В этом сценарии используется цель pair_matching, где пара событий — это
Обнаружение событий, доступных в пакетах
Следующий запрос возвращает строку для каждого доступного события, имя которого содержит три символьные строки sql. Вы можете изменить условие LIKE, чтобы искать другие имена событий. Результирующий набор также определяет пакет, содержащий событие.
SELECT -- Find an event you want.
p.name AS [Package-Name],
o.object_type,
o.name AS [Object-Name],
o.description AS [Object-Descr],
p.guid AS [Package-Guid]
FROM sys.dm_xe_packages AS p
INNER JOIN sys.dm_xe_objects AS o
ON p.guid = o.package_guid
WHERE o.object_type = 'event' --'action' --'target'
AND p.name LIKE '%'
AND o.name LIKE '%sql%'
ORDER BY p.name,
o.object_type,
o.name;
В следующем примере результата показана возвращённая строка, представленная здесь в формате column name = value. Данные приведены из sql_statement_completed события, которое использовалось в предыдущих примерах. Описание объекта (события в этом примере) служит строкой документации.
Package-Name = sqlserver
object_type = event
Object-Name = sql_statement_completed
Object-Descr = Occurs when a Transact-SQL statement has completed.
Package-Guid = 655FD93F-3364-40D5-B2BA-330F7FFB6491
Поиск событий с помощью пользовательского интерфейса SSMS
Другой способ найти события по имени — использовать диалоговое окно Новый сеанс > События > Библиотека событий, которое показано на предыдущем снимке экрана. Вы можете ввести частичное имя события и найти все соответствующие имена событий.
Классы событий SQL Trace
Описание использования расширенных событий с классами и столбцами событий SQL Trace доступно здесь: Просмотр эквивалентов Extended Events для классов событий SQL Trace.
Трассировка событий Windows (ETW)
Описания использования расширенных событий с трассировкой событий для Windows (ETW) доступны по адресу:
- Трассировка событий для целевого объекта Windows
- Мониторинг активности системы с помощью расширенных событий
Сеансы системных событий
В SQL Server и Управляемом экземпляре SQL Azure по умолчанию создается несколько системных сеансов событий, которые настраиваются на запуск при запуске ядра СУБД. Как и большинство сеансов событий, они используют небольшое количество ресурсов и не существенно влияют на производительность рабочей нагрузки. Корпорация Майкрософт рекомендует, чтобы эти сеансы оставались включенными и запущенными. Сеансы проверки работоспособности, особенно сеанс system_health, часто полезны для мониторинга и устранения неполадок.
Вы можете увидеть эти сеансы событий в обозревателе объектов SSMS в разделе Управление > Расширенные события > Сеансы. Например, в SQL Server эти системные сеансы событий:
AlwaysOn_healthsystem_healthtelemetry_events
Поставщик PowerShell
Вы можете управлять расширенными событиями с помощью поставщика SQL Server PowerShell. Дополнительные сведения см. в статье Использование поставщика PowerShell для расширенных событий.
Системные представления
Системные представления для расширенных событий включают:
-
Представления каталога: содержат сведения о сеансах событий, определённых с помощью
CREATE EVENT SESSION. - Динамические представления управления (DMV): для получения сведений об активных (запущенных) сеансах событий.
SELECTs и JOINs из системных представлений для расширенных событий в SQL Server содержат сведения о следующем:
- Как объединить представления
- Несколько полезных запросов на основе этих представлений
- Корреляция между:
- Просмотр столбцов
-
CREATE EVENT SESSIONпредложения - Пользовательский интерфейс SSMS
Приложение: Запросы для поиска обладателей разрешений Extended Events
В этом разделе упоминаются следующие разрешения:
ALTER ANY EVENT SESSIONVIEW SERVER STATECONTROL SERVER
SELECT...UNION ALL Следующая инструкция возвращает строки, показывающие, у кого есть необходимые разрешения для создания сеансов событий и запроса представлений системного каталога для расширенных событий.
-- Ascertain who has the permissions listed in the ON clause.
-- 'CONTROL SERVER' permission includes all lower permissions like
-- 'ALTER ANY EVENT SESSION' and 'VIEW SERVER STATE'.
SELECT 'Owner-is-Principal' AS [Type-That-Owns-Permission],
NULL AS [Role-Name],
prin.name AS [Owner-Name],
PERM.permission_name COLLATE Latin1_General_CI_AS_KS_WS AS [Permission-Name]
FROM sys.server_permissions AS PERM
INNER JOIN sys.server_principals AS prin
ON prin.principal_id = PERM.grantee_principal_id
WHERE PERM.permission_name IN (
'CREATE ANY EVENT SESSION',
'ALTER ANY EVENT SESSION',
'VIEW SERVER PERFORMANCE STATE',
'VIEW SERVER STATE',
'CONTROL SERVER'
)
UNION ALL
-- Plus check for members of the 'sysadmin' fixed server role,
-- because 'sysadmin' includes the 'CONTROL SERVER' permission.
SELECT 'Owner-is-Role',
prin.name, -- [Role-Name]
CAST((IsNull(pri2.name, N'No members')) AS NVARCHAR(128)),
NULL
FROM sys.server_role_members AS rolm
RIGHT JOIN sys.server_principals AS prin
ON prin.principal_id = rolm.role_principal_id
LEFT JOIN sys.server_principals AS pri2
ON rolm.member_principal_id = pri2.principal_id
WHERE prin.name = 'sysadmin';
функция HAS_PERMS_BY_NAME
SELECT Следующая инструкция сообщает о ваших разрешениях. В ней используется встроенная функция HAS_PERMS_BY_NAME.
Кроме того, если у вас есть права временно выдавать себя за другие учётные записи, вы можете раскомментировать инструкции EXECUTE AS и REVERT, чтобы проверить, есть ли у других учётных записей разрешение ALTER ANY EVENT SESSION.
--EXECUTE AS LOGIN = 'LoginNameHere';
SELECT HAS_PERMS_BY_NAME(NULL, NULL, 'ALTER ANY EVENT SESSION');
--REVERT;