Разширени събития е лека система за наблюдение на производителността, която позволява на потребителите да събират данни, необходими за наблюдение и отстраняване на проблеми в SQL Server.
Тази статия демонстрира как разширените събития могат да се използват за създаване на регистрационен файл, който съдържа всички отхвърлени функции, които все още се използват в екземпляр на SQL Server. Регистраторът записва всички събития от началото на сесията на събитието.
Ако просто искате бързо да преброите колко пъти е била използвана оттеглена функция от стартирането на SQL Server, вижте Най-бързият начин за намиране на остарели функции, които все още се използват в екземпляр на SQL Server.
Но ако имате нужда от по-подробен дневник, който включва неща като; използваният SQL израз, който съдържа оттеглената функция, базата данни, срещу която е била стартирана, потребителят, който я е стартирал, времето на изпълнение и т.н., прочетете нататък.
Създайте разширената сесия на събитието
Първата стъпка е да създадете разширената сесия на събитието. Тук указваме източника на събитията, целта на сесията на събитието и опциите за сесия на събитието.
CREATE EVENT SESSION [Deprecation Events] ON SERVER ADD EVENT sqlserver.deprecation_announcement( ACTION( sqlserver.database_name, sqlserver.sql_text, sqlserver.username ) ), ADD EVENT sqlserver.deprecation_final_support( ACTION( sqlserver.database_name, sqlserver.sql_text, sqlserver.username ) ) ADD TARGET package0.event_file( SET filename=N'/var/opt/mssql/tmp/DeprecationEvents.xel' ) WITH ( TRACK_CAUSALITY = ON );
В този случай посочвам цел на /var/opt/mssql/tmp/DeprecationEvents.xel
. Това означава, че данните за събитието ще се съхраняват в този файл. Можете да посочите произволно име и път на файл.
Този пример използва Linux файлов път, който използва наклонени черти напред. Ако използвате Windows, ще трябва да използвате обратна наклонена черта. Например:C:\Temp\DeprecationEvents.xel
.
Започнете разширената сесия на събитието
Създаването на сесия на събитието не я стартира. Използвайте ALTER EVENT SESSION
да го спре и започне. В този случай искаме да го стартираме:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Направете нещо отхвърлено
Сега, след като започнахме разширената сесия на събитието, нека изпълним някакъв остарял код:
SELECT * FROM sys.sql_dependencies;
Тъй като sys.sql_dependencies
е отхвърлен, този код ще добави данни към XEL файла, който посочихме по-рано.
Преглед на XEL файла
Сега, след като (вероятно) сме добавили данни към нашия XEL файл, нека да го разгледаме:
SELECT event_data FROM sys.fn_xe_file_target_read_file ( '/var/opt/mssql/tmp/DeprecationEvents*.xel', null, null, null );
Резултат:
<event name="deprecation_announcement" package="sqlserver" timestamp="2019-10-31T04:03:06.528Z"><data name="feature_id"><value>198</value></data><data name="feature"><value><![CDATA[sql_dependencies]]></value></data><data name="message"><value><![CDATA[sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.]]></value></data><action name="username" package="sqlserver"><value><![CDATA[sa]]></value></action><action name="sql_text" package="sqlserver"><value><![CDATA[SELECT * FROM sys.sql_dependencies;]]></value></action><action name="database_name" package="sqlserver"><value><![CDATA[Test]]></value></action><action name="attach_activity_id_xfer" package="package0"><value>5566866F-8266-467A-9950-895310CF21E3-0</value></action><action name="attach_activity_id" package="package0"><value>07971CB0-F9CC-46C6-B885-5BA8A904B880-1</value></action>
В този случай върнах само event_data
, защото там се намират всички данни за събитието.
За съжаление, за нас, хората, не е най-лесният за четене.
Ами ако го форматирам?
<event name="deprecation_announcement" package="sqlserver" timestamp="2019-10-31T04:03:06.528Z"> <data name="feature_id"> <value>198</value> </data> <data name="feature"> <value><![CDATA[sql_dependencies]]></value> </data> <data name="message"> <value><![CDATA[sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.]]></value> </data> <action name="username" package="sqlserver"> <value><![CDATA[sa]]></value> </action> <action name="sql_text" package="sqlserver"> <value><![CDATA[SELECT * FROM sys.sql_dependencies;]]></value> </action> <action name="database_name" package="sqlserver"> <value><![CDATA[Test]]></value> </action> <action name="attach_activity_id_xfer" package="package0"> <value>5566866F-8266-467A-9950-895310CF21E3-0</value> </action> <action name="attach_activity_id" package="package0"> <value>07971CB0-F9CC-46C6-B885-5BA8A904B880-1</value> </action> </event>
Малко по-лесно се чете, когато е форматиран, но можем да направим по-добре от това.
Разберете XEL файла
В този пример анализирам XEL файла, така че да мога да видя данните в мрежа, точно както всяка друга заявка за база данни.
SELECT EventXml.value('(@timestamp)[1]', 'datetime2') AS [timestamp], EventXml.value('(action[@name="username"]/value)[1]', 'nvarchar(256)') AS username, EventXml.value('(action[@name="database_name"]/value)[1]', 'nvarchar(128)') AS database_name, EventXml.value('(action[@name="sql_text"]/value)[1]', 'varchar(4000)') AS sql_text, EventXml.value('(@name)[1]', 'varchar(50)') AS event_name, EventXml.value('(data[@name="feature"]/value)[1]', 'varchar(255)') AS feature, EventXml.value('(data[@name="message"]/value)[1]', 'varchar(max)') AS message FROM (SELECT CAST(event_data AS XML) AS XmlEventData FROM sys.fn_xe_file_target_read_file ( '/var/opt/mssql/tmp/DeprecationEvents*.xel', null, null, null )) AS EventTable CROSS APPLY EventTable.XmlEventData.nodes('event') AS q(EventXml);
Резултат (с помощта на вертикален изход):
timestamp | 2019-10-31 04:03:06.5280000 username | sa database_name | Test sql_text | SELECT * FROM sys.sql_dependencies; event_name | deprecation_announcement feature | sql_dependencies message | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
Тук използвам вертикален изход, за да улесня четенето, без да се налага да превъртате хоризонтално. Това означава, че заглавията на колоните са отляво, а данните са отдясно. Ако стартирате това с помощта на GUI като SSMS или Azure Data Studio, вероятно ще го видите в обичайния формат на таблица (освен ако не сте посочили друго).
Множество реда за една отхвърлена функция?
Вашият XEL файл понякога може да получи множество записи за едно събитие. Например, изпълнявате веднъж една отхвърлена съхранена процедура, само за да откриете, че 10 или 11 реда са върнати от вашия XEL файл за този отделен израз.
Ето един пример:
USE Music; EXEC sp_depends @objname = 'Artists';
sp_depends
системната съхранена процедура е остаряла, така че определено бих очаквал да видя ред за това. Ако го изпълня точно сега, може да очаквам да получа общо 2 реда:1 за предишния пример и 1 за този пример.
Но както се оказа, към моя XEL файл са добавени още 11 реда:
SELECT EventXml.value('(@timestamp)[1]', 'datetime2') AS [timestamp], EventXml.value('(action[@name="username"]/value)[1]', 'nvarchar(256)') AS username, EventXml.value('(action[@name="database_name"]/value)[1]', 'nvarchar(128)') AS database_name, EventXml.value('(action[@name="sql_text"]/value)[1]', 'varchar(4000)') AS sql_text, EventXml.value('(@name)[1]', 'varchar(50)') AS event_name, EventXml.value('(data[@name="feature"]/value)[1]', 'varchar(255)') AS feature, EventXml.value('(data[@name="message"]/value)[1]', 'varchar(max)') AS message FROM (SELECT CAST(event_data AS XML) AS XmlEventData FROM sys.fn_xe_file_target_read_file ( '/var/opt/mssql/tmp/DeprecationEvents*.xel', null, null, null )) AS EventTable CROSS APPLY EventTable.XmlEventData.nodes('event') AS q(EventXml) ORDER BY [Timestamp] ASC;
Резултат (с помощта на вертикален изход):
-[ RECORD 1 ]------------------------- timestamp | 2019-10-31 04:03:06.5280000 username | sa database_name | Test sql_text | SELECT * FROM sys.sql_dependencies; event_name | deprecation_announcement feature | sql_dependencies message | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it. -[ RECORD 2 ]------------------------- timestamp | 2019-10-31 04:15:13.9920000 username | sa database_name | Music sql_text | USE Music; EXEC sp_depends @objname = 'Artists'; event_name | deprecation_announcement feature | sp_depends message | sp_depends will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it. -[ RECORD 3 ]------------------------- timestamp | 2019-10-31 04:15:13.9940000 username | sa database_name | Music sql_text | USE Music; EXEC sp_depends @objname = 'Artists'; event_name | deprecation_final_support feature | String literals as column aliases message | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that -[ RECORD 4 ]------------------------- timestamp | 2019-10-31 04:15:13.9950000 username | sa database_name | Music sql_text | USE Music; EXEC sp_depends @objname = 'Artists'; event_name | deprecation_final_support feature | String literals as column aliases message | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that -[ RECORD 5 ]------------------------- timestamp | 2019-10-31 04:15:13.9950000 username | sa database_name | Music sql_text | USE Music; EXEC sp_depends @objname = 'Artists'; event_name | deprecation_final_support feature | String literals as column aliases message | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that -[ RECORD 6 ]------------------------- timestamp | 2019-10-31 04:15:14.0020000 username | sa database_name | Music sql_text | USE Music; EXEC sp_depends @objname = 'Artists'; event_name | deprecation_announcement feature | sql_dependencies message | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it. -[ RECORD 7 ]------------------------- timestamp | 2019-10-31 04:15:14.0100000 username | sa database_name | Music sql_text | USE Music; EXEC sp_depends @objname = 'Artists'; event_name | deprecation_announcement feature | sql_dependencies message | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it. -[ RECORD 8 ]------------------------- timestamp | 2019-10-31 04:15:14.0100000 username | sa database_name | Music sql_text | USE Music; EXEC sp_depends @objname = 'Artists'; event_name | deprecation_announcement feature | sql_dependencies message | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it. -[ RECORD 9 ]------------------------- timestamp | 2019-10-31 04:15:14.0120000 username | sa database_name | Music sql_text | USE Music; EXEC sp_depends @objname = 'Artists'; event_name | deprecation_final_support feature | sysdepends message | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it. -[ RECORD 10 ]------------------------- timestamp | 2019-10-31 04:15:14.0260000 username | sa database_name | Music sql_text | USE Music; EXEC sp_depends @objname = 'Artists'; event_name | deprecation_final_support feature | sysdepends message | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it. -[ RECORD 11 ]------------------------- timestamp | 2019-10-31 04:15:14.0760000 username | sa database_name | Music sql_text | USE Music; EXEC sp_depends @objname = 'Artists'; event_name | deprecation_final_support feature | sysdepends message | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it. -[ RECORD 12 ]------------------------- timestamp | 2019-10-31 04:15:14.0800000 username | sa database_name | Music sql_text | USE Music; EXEC sp_depends @objname = 'Artists'; event_name | deprecation_final_support feature | sysdepends message | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it. (12 rows affected)
Какво става тук?
Това се случва, защото sp_depends
Самата системна съхранена процедура използва отхвърлени функции.
Не само получавам 1 ред за изпълнение на sp_depends
. Също така получавам 1 ред за всяка отхвърлена функция, която се използва от тази съхранена процедура (независимо дали е в съхранената процедура, или в друг обект, който препраща). В този случай получавам 10 допълнителни реда.
Разгледах набързо sp_depends
дефиниция на и видях, че препраща към (остарялото) sysdepends
на няколко места и които преглеждат препратки (оттеглените) sql_dependencies
. Видях също, че използва низови литерали като псевдоними на колони, практика, която също е маркирана за оттегляне. Всичко това поддържа това, което виждам във файла XEL.
Повече подробности за всяка отхвърлена функция
Вижте статията на Microsoft Deprecated Database Engine Features в SQL Server 2017 за препоръки как да се справите с всеки остарял елемент. Този списък е точно същият като този за SQL Server 2016.
Справочник за документацията на Microsoft
- Бърз старт:Разширени събития в SQL Server
- СЪЗДАВАНЕ НА СЕСИЯ НА СЪБИТИЯ
- ПРОМЕНЯ СЕСИЯ НА СЪБИТИЯ
- sys.fn_xe_file_target_read_file
- Четене на данни за събитие 101:Какво става с XML?