Краткое руководство. Расширенные события
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
Расширенные события — это упрощенная функция мониторинга производительности, которая позволяет пользователям собирать данные для мониторинга и устранения неполадок. С помощью расширенных событий можно просмотреть сведения о внутренних операциях ядра СУБД, которые относятся к мониторингу производительности и устранению неполадок. Дополнительные сведения о расширенных событиях см. в обзоре расширенных событий.
Эта статья направлена на помощь администраторам 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). Мы рекомендуем использовать последнюю версию SSMS с последними улучшениями и исправлениями.
- Убедитесь, что ваша учетная запись
CREATE ANY EVENT SESSION
(появилась в SQL Server 2022) илиALTER ANY EVENT SESSION
разрешение сервера. - Кроме того, при использовании SSMS и для просмотра созданных сеансов для входа требуется разрешение
VIEW SERVER PERFORMANCE STATE
.
Сведения о безопасности и разрешениях, связанных с расширенными событиями, доступны в конце этой статьи в приложении.
Расширенные события в SSMS
SSMS предоставляет полнофункциональный пользовательский интерфейс для расширенных событий. Многие сценарии можно выполнить с помощью этого пользовательского интерфейса, не используя T-SQL или динамические административные представления (DMV).
В следующем разделе вы увидите шаги пользовательского интерфейса для создания сеанса расширенных событий и просмотра данных, которые он сообщает. Пройдя по шагам или просмотрив их в этой статье, вы можете ознакомиться с понятиями, участвующими в шагах для более глубокого понимания.
Создание сеанса событий в SSMS
При создании сеанса расширенных событий вы сообщаете системе:
- Какие события вы интересуете.
- как система должна предоставлять вам данные.
В демонстрации откроется диалоговое окно "Новый сеанс" , где показано, как использовать четыре страницы с именем:
- Общие
- События
- Хранилище данных
- Расширенные
Текст и вспомогательные снимки экрана могут немного отличаться в вашей версии SSMS, но по-прежнему должны быть актуальными для объяснения основных понятий.
Подключитесь к экземпляру ядра СУБД. Расширенные события поддерживаются начиная с SQL Server 2014 (12.x), в База данных SQL Azure и Управляемый экземпляр SQL Azure.
В обозреватель объектов выберите "Расширенные события управления>". В База данных SQL Azure сеансы событий находятся в пределах базы данных, поэтому параметр расширенных событий находится в каждой базе данных, а не в разделе "Управление".
Щелкните правой кнопкой мыши папку "Сеансы" и выберите "Создать сеанс".... Диалоговое окно "Новый сеанс" предпочтительнее мастера создания сеансов, хотя они похожи.
Совет
В этом руководстве не нажимайте кнопку "ОК", пока вы не выполнили все четыре страницы: общие, события, хранилище данных и дополнительно.
Выберите страницу "Общие ". Затем введите
YourSession
или любое имя, например, в текстовое поле "Имя сеанса". Не нажимайте кнопку "ОК ", так как вам все еще нужно ввести некоторые сведения на других страницах.Выберите страницу "События ".
В области библиотеки событий в раскрывающемся списке выберите только имена событий.
- Введите
sql_statement
в текстовое поле. Это фильтрует список, чтобы отобразить только события сsql_statement
именем. - Прокрутите и выберите событие с именем
sql_statement_completed
. - Нажмите кнопку
>
со стрелкой вправо, чтобы переместить событие в поле "Выбранные события ".
- Введите
На странице "События" нажмите кнопку "Настройка". Откроется поле параметров конфигурации событий для выбранных событий.
Перейдите на вкладку "Фильтр (предикат"). Затем выберите новую строку фильтра, которая говорит Click here, чтобы добавить предложение. В этом руководстве будет настроен этот фильтр (также известный как предикат) для записи всех
SELECT
инструкций с предложениемHAVING
.В раскрывающемся списке "Поле " выберите
sqlserver.sql_text
.- Для оператора выберите
like_i_sql_unicode_string
. Здесь вi
имени оператора означает значение case-i nsensitive. - Для значения введите
%SELECT%HAVING%
. Здесь знаки процента (%
) являются подстановочными знаками, стоящими для любой символьной строки.
Примечание.
В двух части поля sqlserver — это имя пакета, а sql_text — это имя поля. Ранее выбранное событие sql_statement_completed должно находиться в том же пакете, что и выбранное поле.
- Для оператора выберите
Выберите страницу хранилища данных.
В области "Целевые объекты " выберите новую строку типа целевого объекта, которая говорит, что щелкните здесь, чтобы добавить целевой объект. В этом руководстве мы напишем собранные данные расширенных событий в файл событий. Это означает, что данные события хранятся в файле, который можно открыть и просмотреть позже. Начиная с SQL Server 2019 (15.x), данные событий также можно записать в служба хранилища Azure, значение по умолчанию в SQL Azure.
- В раскрывающемся списке "Тип" выберите
event_file
.
- В раскрывающемся списке "Тип" выберите
В области "Свойства" введите полный путь и имя файла в текстовое поле "Файл" на сервере. Вы также можете использовать кнопку "Обзор ". Расширение имени файла должно быть
xel
. В нашем примере мы использовалиC:\temp\YourSession_Target.xel
.Выберите страницу "Дополнительно ". По умолчанию этот Xel-целевой объект расширенного сеанса событий не должен влиять на производительность сервера, но эти параметры на странице "Дополнительно " можно использовать для увеличения или уменьшения ресурсов и задержки.
Нажмите кнопку "ОК" внизу, чтобы создать этот сеанс событий.
Вернитесь в обозреватель объектов SSMS, откройте или обновите папку сеансов и просмотрите новый узел для сеанса
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 будут в режиме реального времени выводиться поступающие данные.
Термины и понятия в расширенных событиях
В следующей таблице перечислены термины, используемые для расширенных событий, и описываются их значения.
Срок | Description |
---|---|
event session |
Целью является конструкция, основанная на одном или нескольких событиях, а также вспомогательные элементы, такие как действия. Инструкция CREATE EVENT SESSION создает каждый сеанс события. Сеанс событий можно ALTER запустить и остановить.Сеанс событий часто называется просто сеансом, если из контекста понятно, что имеется в виду именно сеанс событий. Дополнительные сведения о сеансах событий описаны в разделе " Сеансы расширенных событий". |
event |
Определенное событие в системе, наступление которого отслеживается активным сеансом событий. Например, sql_statement_completed событие представляет момент завершения любой заданной инструкции T-SQL. Событие может сообщать различные данные, например длительность. |
target |
Элемент, получающий выходные данные из захваченного события. Служит для вывода данных. Примеры включают целевой объект, используемый ранее в этом кратком руководстве, и ring_buffer целевой event_file объект, который сохраняет последние события в памяти.Любой целевой объект можно использовать для любого сеанса событий. Дополнительные сведения см. в разделе "Целевые объекты для расширенных событий". |
action |
Поле, известное событию. Данные из этого поля отправляются в целевой объект. Поле действия тесно связано с фильтром предиката. |
predicate , или фильтр |
Проверка данных в поле события, благодаря которой только нужное подмножество экземпляров события отправляется целевому объекту. Например, фильтр может включать только те sql_statement_completed события, в которых инструкция T-SQL содержала строку HAVING . |
package |
Квалификатор имени, добавляемый к каждому элементу в наборе элементов, связанном с пакетом событий. Например, пакет может иметь события о тексте T-SQL. Одно событие может быть о всех T-SQL в пакете. А другое более частное событие может быть связано с отдельными инструкциями T-SQL. Кроме того, для любой инструкции T-SQL существуют started и completed события.Соответствующие событиям поля также содержатся в пакете с событиями. Большинство целевых объектов находятся package0 и используются с событиями из многих других пакетов. |
Расширенные сценарии событий и сведения об использовании
Существует множество сценариев для мониторинга и устранения неполадок ядра СУБД и рабочих нагрузок запросов. В следующих статьях приведены примеры использования сценариев блокировки:
- Поиск объектов, на которые наложено наибольшее число блокировок
- В этом сценарии используется цель гистограммы , которая обрабатывает необработанные данные событий перед отображением его в форме сводных (сегментизованных).
- Определение запросов, содержащих блокировки
- В этом сценарии используется целевой объект 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
Описание использования расширенных событий с классами событий трассировки SQL и столбцами доступно по адресу: просмотр классов событий трассировки SQL.
Трассировка событий Windows (ETW)
Описания использования расширенных событий с трассировкой событий для Windows (ETW) доступны по адресу:
- Трассировка событий для целевого объекта Windows
- Мониторинг активности системы с помощью расширенных событий
Системные сеансы событий
В SQL Server и Управляемый экземпляр SQL Azure несколько системных сеансов событий создаются по умолчанию и настраиваются для запуска ядра СУБД. Как и большинство сеансов событий, они используют небольшое количество ресурсов и не существенно влияют на производительность рабочей нагрузки. Корпорация Майкрософт рекомендует, чтобы эти сеансы оставались включенными и запущенными. Сеансы работоспособности, особенно сеансы system_health , часто полезны для мониторинга и устранения неполадок.
Эти сеансы событий отображаются в обозреватель объектов SSMS в разделе "Сеансы расширенных событий > управления>". Например, в SQL Server эти системные сеансы событий:
AlwaysOn_health
system_health
telemetry_events
Поставщик PowerShell
Вы можете управлять расширенными событиями с помощью поставщика SQL Server PowerShell. Дополнительные сведения см. в статье Использование поставщика PowerShell для расширенных событий.
Системные представления
Системные представления для расширенных событий включают:
- Представления каталога: сведения о сеансах событий, определенных с помощью
CREATE EVENT SESSION
. - Динамические административные представления (DMV): сведения о активных (запущенных) сеансах событий.
SELECTs и JOINs из системных представлений для расширенных событий в SQL Server содержат сведения о следующем:
- Присоединение представлений
- Несколько полезных запросов на основе этих представлений
- Корреляция между:
- Просмотр столбцов
- Предложения
CREATE EVENT SESSION
- Пользовательский интерфейс SSMS
Приложение. Запросы для поиска владельцев разрешений расширенного события
В этом разделе упоминаются следующие разрешения:
ALTER ANY EVENT SESSION
VIEW SERVER STATE
CONTROL 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;