Краткое руководство. Расширенные события

Область применения: 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, но по-прежнему должны быть актуальными для объяснения основных понятий.

  1. Подключитесь к экземпляру ядра СУБД. Расширенные события поддерживаются начиная с SQL Server 2014 (12.x), в База данных SQL Azure и Управляемый экземпляр SQL Azure.

  2. В обозреватель объектов выберите "Расширенные события управления>". В База данных SQL Azure сеансы событий находятся в пределах базы данных, поэтому параметр расширенных событий находится в каждой базе данных, а не в разделе "Управление".

  3. Щелкните правой кнопкой мыши папку "Сеансы" и выберите "Создать сеанс".... Диалоговое окно "Новый сеанс" предпочтительнее мастера создания сеансов, хотя они похожи.

    Совет

    В этом руководстве не нажимайте кнопку "ОК", пока вы не выполнили все четыре страницы: общие, события, хранилище данных и дополнительно.

  4. Выберите страницу "Общие ". Затем введите YourSessionили любое имя, например, в текстовое поле "Имя сеанса". Не нажимайте кнопку "ОК ", так как вам все еще нужно ввести некоторые сведения на других страницах.

  5. Выберите страницу "События ".

  6. В области библиотеки событий в раскрывающемся списке выберите только имена событий.

    • Введите sql_statement в текстовое поле. Это фильтрует список, чтобы отобразить только события с sql_statement именем.
    • Прокрутите и выберите событие с именем sql_statement_completed.
    • Нажмите кнопку > со стрелкой вправо, чтобы переместить событие в поле "Выбранные события ".
  7. На странице "События" нажмите кнопку "Настройка". Откроется поле параметров конфигурации событий для выбранных событий.

    Снимок экрана: выбор событий > нового сеанса > из события library. sql_statement_completed. Кнопка настройки — это следующее действие.

  8. Перейдите на вкладку "Фильтр (предикат"). Затем выберите новую строку фильтра, которая говорит Click here, чтобы добавить предложение. В этом руководстве будет настроен этот фильтр (также известный как предикат) для записи всех SELECT инструкций с предложением HAVING .

  9. В раскрывающемся списке "Поле " выберите sqlserver.sql_text.

    • Для оператора выберите like_i_sql_unicode_string. Здесь в i имени оператора означает значение case-i nsensitive.
    • Для значения введите %SELECT%HAVING%. Здесь знаки процента (%) являются подстановочными знаками, стоящими для любой символьной строки.

    Примечание.

    В двух части поля sqlserver — это имя пакета, а sql_text — это имя поля. Ранее выбранное событие sql_statement_completed должно находиться в том же пакете, что и выбранное поле.

    Снимок экрана: поле

  10. Выберите страницу хранилища данных.

  11. В области "Целевые объекты " выберите новую строку типа целевого объекта, которая говорит, что щелкните здесь, чтобы добавить целевой объект. В этом руководстве мы напишем собранные данные расширенных событий в файл событий. Это означает, что данные события хранятся в файле, который можно открыть и просмотреть позже. Начиная с SQL Server 2019 (15.x), данные событий также можно записать в служба хранилища Azure, значение по умолчанию в SQL Azure.

    • В раскрывающемся списке "Тип" выберите event_file.
  12. В области "Свойства" введите полный путь и имя файла в текстовое поле "Файл" на сервере. Вы также можете использовать кнопку "Обзор ". Расширение имени файла должно быть xel. В нашем примере мы использовали C:\temp\YourSession_Target.xel.

    Снимок экрана: тип целевых объектов > > хранилища > данных нового сеанса > event_file.

  13. Выберите страницу "Дополнительно ". По умолчанию этот Xel-целевой объект расширенного сеанса событий не должен влиять на производительность сервера, но эти параметры на странице "Дополнительно " можно использовать для увеличения или уменьшения ресурсов и задержки.

    Снимок экрана: расширенный сеанс > .

  14. Нажмите кнопку "ОК" внизу, чтобы создать этот сеанс событий.

  15. Вернитесь в обозреватель объектов 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 предлагает соответствующий флажок, запуск сеанса событий при запуске сервера на странице "Новый сеанс общего сеанса>".

Тестирование сеанса событий

Проверьте сеанс событий, выполнив следующие действия.

  1. В обозреватель объектов щелкните правой кнопкой мыши узел сеанса событий и выберите "Пуск сеанса".
  2. При подключении к одному серверу (или той же базе данных в База данных SQL Azure), где вы создали сеанс событий, выполните следующую SELECT...HAVING инструкцию несколько раз. Рассмотрите возможность изменения значения в HAVING предложении для каждого запуска, переключение между 2 и 3. Таким образом можно увидеть различия в результатах.
  3. Щелкните правой кнопкой мыши узел сеанса и выберите "Остановить сеанс".
  4. Прочитайте следующий подраздел о выборе и просмотре результатов.
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 и используются с событиями из многих других пакетов.

Расширенные сценарии событий и сведения об использовании

Существует множество сценариев для мониторинга и устранения неполадок ядра СУБД и рабочих нагрузок запросов. В следующих статьях приведены примеры использования сценариев блокировки:

Обнаружение событий, доступных в пакетах

Следующий запрос возвращает строку для каждого доступного события, имя которого содержит три символьные строки 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) доступны по адресу:

Системные сеансы событий

В 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;