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

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Расширенные события — это упрощенная функция мониторинга производительности, которая позволяет пользователям собирать данные для мониторинга и устранения неполадок. С помощью расширенных событий можно просмотреть сведения о внутренних операциях ядра СУБД, которые относятся к мониторингу производительности и устранению неполадок. Дополнительные сведения о расширенных событиях см. в обзоре расширенных событий.

Эта статья направлена на помощь администраторам SQL, инженерам и разработчикам, которые являются новыми для расширенных событий, и которые хотят начать использовать его и просмотреть данные событий всего за несколько минут.

Расширенные события также называются XEvents, а иногда — XE.

Прочитав эту статью, вы можете:

  • Узнайте, как создать сеанс событий в СРЕДЕ SQL Server Management Studio (SSMS) с примерами снимок экрана
  • Сопоставление снимок экрана с эквивалентными операторами Transact-SQL
  • Подробные сведения о терминах и концепциях пользовательского интерфейса SSMS и инструкций XEvents T-SQL
  • Узнайте, как протестировать сеанс событий
  • Общие сведения о результатах сеанса, включая:
    • Доступные варианты для хранилища результатов
    • Обработанные и необработанные результаты
    • Средства просмотра результатов различными способами и по разным шкалам времени
  • Узнайте, как искать и обнаруживать все доступные события
  • Общие сведения о связях между системными представлениями расширенных событий

Совет

Дополнительные сведения о расширенных событиях в База данных SQL Azure, включая примеры кода, см. в База данных SQL.

Начальные предварительные требования

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

  1. Скачайте SQL Server Management Studio (SSMS). Мы рекомендуем использовать последнюю версию SSMS с последними улучшениями и исправлениями.
  2. Убедитесь, что у вашей учетной ALTER ANY EVENT SESSIONзаписи есть разрешение сервера.

Сведения о безопасности и разрешениях, связанных с расширенными событиями, доступны в конце этой статьи в приложении.

Расширенные события в SSMS

SSMS предоставляет полнофункциональный пользовательский интерфейс для расширенных событий. Многие сценарии можно выполнить с помощью этого пользовательского интерфейса, не используя T-SQL или динамические административные представления (DMV).

В этом разделе описаны шаги пользовательского интерфейса для создания сеанса расширенных событий и просмотра данных, которые он сообщает. Пройдя по шагам или просмотрив их в этой статье, вы можете ознакомиться с понятиями, участвующими в шагах для более глубокого понимания.

Создание сеанса событий в SSMS

При создании сеанса расширенных событий вы сообщаете системе:

  • Какие события вы хотите
  • Как вы хотите, чтобы система сообщала данные вам

В демонстрации откроется диалоговое окно "Новый сеанс" , где показано, как использовать четыре страницы с именем:

  • Общие
  • События
  • Хранилище данных
  • Продвинутый уровень

Текст и вспомогательные снимки экрана могут немного отличаться в вашей версии SSMS, но по-прежнему должны быть актуальными для объяснения основных понятий.

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

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

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

    Screenshot of New Session > General > Session name.

  4. В левом верхнем углу выберите страницу "События ".

    Screenshot of New Session > Events > Select > Event library, Selected events.

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

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

    Screenshot of New Session > Events > Configure > Filter (Predicate) > Field.

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

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

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

    Примечание.

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

  9. В левом верхнем углу выберите страницу "Данные служба хранилища".

  10. В области "Целевые объекты " выберите "Выбрать здесь", чтобы добавить целевой объект.

    • В раскрывающемся списке "Тип" выберите event_file. Это означает, что данные события хранятся в файле, который можно открыть и просмотреть позже. В База данных SQL Azure и Управляемый экземпляр SQL Azure данные событий хранятся в служба хранилища Azure BLOB-объектов.

    Примечание.

    Начиная с SQL Server 2019, вы можете использовать Хранилище BLOB-объектов Azure в целевом объекте event_file в SQL Server.

    Screenshot of New Session > Data Storage > Targets > Type > event_file.

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

    Screenshot of New Session > Advanced > Maximum dispatch latency > OK.

  12. В левом верхнем углу выберите страницу "Дополнительно ". Уменьшите максимальную задержку отправки до 3 секунд.

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

  14. Вернитесь в обозреватель объектов, откройте или обновите папку Сеансов и просмотрите новый узел.YourSession Сеанс еще не запущен. Вы начинаете его позже.

    Screenshot of Node for your new *event session* named YourSession, in the Object Explorer, under Management > Extended Events > Sessions.

Изменение сеанса событий в 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',
        max_file_size = (2),
        max_rollover_files = (2)
    )
    WITH (
        MAX_MEMORY = 2048 KB,
        EVENT_RETENTION_MODE = ALLOW_MULTIPLE_EVENT_LOSS,
        MAX_DISPATCH_LATENCY = 3 SECONDS,
        MAX_EVENT_SIZE = 0 KB,
        MEMORY_PARTITION_MODE = NONE,
        TRACK_CAUSALITY = OFF,
        STARTUP_STATE = OFF
    );
GO

Условное УДАЛЕНИЕ сеанса событий

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

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

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

  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
        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
        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(*) &gt;= 3   --2     -- Try both values during session.
    ORDER BY
        c.name</value>
  </data>
</event>

Отображение данных сеанса событий в SSMS

В пользовательском интерфейсе SSMS есть несколько дополнительных функций, которые можно использовать для просмотра данных, захваченных сеансом событий. Дополнительные сведения см. в разделе "Просмотр данных о событиях" в SQL Server Management Studio.

Начните с параметров контекстного меню с метками "Просмотр целевых данных" и "Просмотр динамических данных".

Просмотр целевых данных

В обозреватель объектов SSMS щелкните правой кнопкой мыши целевой узел, который находится в узле сеанса событий. В контекстном меню выберите "Просмотреть целевые данные". В SSMS будут выведены данные.

Отображение не обновляется, так как в сеансе происходят новые события. Но вы можете снова выбрать представление целевых данных .

Screenshot of View Target Data, in SSMS, Management > Extended Events > Sessions > YourSession > package0.event_file, right-click.

Просмотр динамических данных

В обозревателе объектовSSMS можно щелкнуть правой кнопкой мыши узел сеанса событий. В контекстном меню выберите "Смотреть динамические данные". В SSMS будут в режиме реального времени выводиться поступающие данные.

Screenshot of Watch Live Data, in SSMS, Management > Extended Events > Sessions > YourSession, right-click.

Термины и понятия в расширенных событиях

В следующей таблице перечислены термины, используемые для расширенных событий, и описываются их значения.

Срок 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 можно найти в следующих разделах:

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

В 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 the permissions
-- '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 (
    'ALTER ANY EVENT SESSION',
    '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 LOGIN и REVERT инструкции, чтобы узнать, содержат ALTER ANY EVENT SESSION ли другие имена входа разрешение.

--EXECUTE AS LOGIN = 'LoginNameHere';
SELECT HAS_PERMS_BY_NAME(NULL, NULL, 'ALTER ANY EVENT SESSION');
--REVERT;