Rozšířené události je odlehčený systém sledování výkonu, který uživatelům umožňuje shromažďovat data potřebná k monitorování a odstraňování problémů na serveru SQL Server.
Tento článek ukazuje, jak lze rozšířené události použít k vytvoření souboru protokolu, který obsahuje všechny zastaralé funkce, které jsou stále používány v instanci serveru SQL Server. Protokol zaznamenává všechny výskyty od zahájení relace události.
Pokud chcete jen rychle spočítat, kolikrát byla zastaralá funkce použita od spuštění SQL Serveru, přečtěte si článek Nejrychlejší způsob, jak najít zastaralé funkce, které se stále používají v instanci SQL Server.
Ale pokud potřebujete podrobnější protokol, který obsahuje věci jako; použitý příkaz SQL, který obsahuje zastaralou funkci, databázi, se kterou byl spuštěn, uživatel, který jej spustil, čas jeho spuštění atd., čtěte dále.
Vytvořte rozšířenou relaci události
Prvním krokem je vytvoření rozšířené relace události. Zde specifikujeme zdroj událostí, cíl relace události a možnosti relace události.
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 );
V tomto případě zadávám cíl /var/opt/mssql/tmp/DeprecationEvents.xel
. To znamená, že data události budou uložena v tomto souboru. Můžete zadat libovolný název souboru a cestu.
Tento příklad používá cestu k souboru Linux, která používá lomítka. Pokud používáte Windows, budete muset použít zpětná lomítka. Například:C:\Temp\DeprecationEvents.xel
.
Spusťte relaci rozšířené události
Vytvořením relace události se nespustí. Použijte ALTER EVENT SESSION
zastavit a spustit. V tomto případě jej chceme spustit:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Udělejte něco, co není podporováno
Nyní, když jsme zahájili rozšířenou relaci události, spustíme nějaký zastaralý kód:
SELECT * FROM sys.sql_dependencies;
Protože sys.sql_dependencies
je zastaralý, tento kód přidá data do souboru XEL, který jsme určili dříve.
Zobrazit soubor XEL
Nyní, když jsme (pravděpodobně) přidali data do našeho souboru XEL, pojďme se na to podívat:
SELECT event_data FROM sys.fn_xe_file_target_read_file ( '/var/opt/mssql/tmp/DeprecationEvents*.xel', null, null, null );
Výsledek:
<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>
V tomto případě jsem vrátil pouze event_data
, protože tam jsou uložena všechna data událostí.
Bohužel to pro nás lidi není nejjednodušší číst.
Co když jej naformátuji?
<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>
Je o něco snazší číst, když je naformátován, ale můžeme to udělat lépe.
Analyzovat soubor XEL
V tomto příkladu analyzuji soubor XEL, abych mohl vidět data v mřížce, stejně jako jakýkoli jiný databázový dotaz.
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);
Výsledek (při použití vertikálního výstupu):
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.
Používám zde vertikální výstup, abych usnadnil čtení, aniž byste museli posouvat vodorovně. To znamená, že záhlaví sloupců jsou vlevo a data vpravo. Pokud to spustíte pomocí GUI, jako je SSMS nebo Azure Data Studio, pravděpodobně to uvidíte v obvyklém formátu mřížky tabulky (pokud neurčíte jinak).
Více řádků pro jednu nepodporovanou funkci?
Váš soubor XEL může někdy získat více záznamů pro jednu událost. Například jednou provedete jednu zastaralou uloženou proceduru, abyste zjistili, že z vašeho souboru XEL je pro tento jediný příkaz vráceno 10 nebo 11 řádků.
Zde je příklad:
USE Music; EXEC sp_depends @objname = 'Artists';
sp_depends
systémová uložená procedura je zastaralá, takže bych určitě očekával, že za to uvidím řádek. Pokud to provedu právě teď, mohl bych očekávat, že budu mít celkem 2 řádky:1 pro předchozí příklad a 1 pro tento příklad.
Ale jak se ukázalo, do mého souboru XEL bylo přidáno 11 dalších řádků:
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;
Výsledek (při použití vertikálního výstupu):
-[ 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)
Co se tady děje?
To se děje, protože sp_depends
samotná systémová uložená procedura používá zastaralé funkce.
Nejenže dostanu 1 řádek za provedení sp_depends
. Dostávám také 1 řádek pro každou zastaralou funkci, kterou tato uložená procedura používá (ať už je to v uložené proceduře nebo v jiném objektu, na který odkazuje). V tomto případě dostanu 10 řádků navíc.
Rychle jsem se podíval na sp_depends
's definice a viděl jsem, že odkazuje na (zastaralou) sysdepends
na několika místech a tento pohled odkazuje (zastaralé) sql_dependencies
. Také jsem viděl, že používá řetězcové literály jako aliasy sloupců, což je praxe, která je také označena jako zastaralá. To vše podporuje to, co vidím v souboru XEL.
Další podrobnosti o každé zastarané funkci
Doporučení, jak se vypořádat s každou zastaralou položkou, najdete v článku Microsoftu Zastaralé funkce databázového stroje v SQL Server 2017. Tento seznam je přesně stejný jako seznam pro SQL Server 2016.
Příručka k dokumentaci Microsoft
- Rychlý start:Rozšířené události na serveru SQL Server
- VYTVOŘIT RELACI UDÁLOSTI
- ZMĚNIT RELACI UDÁLOSTI
- sys.fn_xe_file_target_read_file
- Čtení dat události 101:Co se děje s XML?