Uitgebreide evenementen is een lichtgewicht prestatiebewakingssysteem waarmee gebruikers gegevens kunnen verzamelen die nodig zijn om problemen in SQL Server te bewaken en op te lossen.
Dit artikel laat zien hoe uitgebreide gebeurtenissen kunnen worden gebruikt om een logboekbestand te maken dat alle verouderde functies bevat die nog worden gebruikt in een exemplaar van SQL Server. Het logboek registreert alle gebeurtenissen sinds de gebeurtenissessie is gestart.
Als u snel wilt weten hoe vaak een verouderde functie is gebruikt sinds het opstarten van SQL Server, raadpleegt u Snelste manier om verouderde functies te vinden die nog steeds worden gebruikt in een SQL Server-instantie.
Maar als je een meer gedetailleerd logboek nodig hebt met dingen als; de gebruikte SQL-instructie die de verouderde functie bevat, de database waartegen deze is uitgevoerd, de gebruiker die deze heeft uitgevoerd, het tijdstip waarop deze is uitgevoerd, enzovoort, lees verder.
Maak de uitgebreide gebeurtenissessie
De eerste stap is het maken van de uitgebreide evenementsessie. Hier specificeren we de bron van de gebeurtenissen, het doel van de gebeurtenissessie en de opties voor de gebeurtenissessie.
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 );
In dit geval specificeer ik een doel van /var/opt/mssql/tmp/DeprecationEvents.xel
. Dit betekent dat de gebeurtenisgegevens in dat bestand worden opgeslagen. U kunt elke bestandsnaam en elk pad opgeven.
In dit voorbeeld wordt een Linux-bestandspad gebruikt dat voorwaartse slashes gebruikt. Als u Windows gebruikt, moet u backslashes gebruiken. Bijvoorbeeld:C:\Temp\DeprecationEvents.xel
.
Start de uitgebreide evenementsessie
Door de gebeurtenissessie te maken, wordt deze niet gestart. Gebruik ALTER EVENT SESSION
om te stoppen en te starten. In dit geval willen we het starten:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Doe iets dat verouderd is
Nu we de uitgebreide evenementsessie zijn begonnen, laten we wat verouderde code uitvoeren:
SELECT * FROM sys.sql_dependencies;
Omdat sys.sql_dependencies
verouderd is, voegt die code gegevens toe aan het XEL-bestand dat we eerder hebben gespecificeerd.
Bekijk het XEL-bestand
Nu we (vermoedelijk) gegevens aan ons XEL-bestand hebben toegevoegd, gaan we er eens naar kijken:
SELECT event_data FROM sys.fn_xe_file_target_read_file ( '/var/opt/mssql/tmp/DeprecationEvents*.xel', null, null, null );
Resultaat:
<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>
In dit geval heb ik alleen event_data
. geretourneerd , want daar staan alle gebeurtenisgegevens.
Helaas is het voor ons mensen niet de gemakkelijkste om te lezen.
Wat als ik het formatteer?
<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>
Het is iets gemakkelijker te lezen wanneer het is opgemaakt, maar we kunnen beter dan dat.
Het XEL-bestand ontleden
In dit voorbeeld parseer ik het XEL-bestand zodat ik de gegevens in een raster kan zien, net als elke andere databasequery.
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);
Resultaat (met verticale uitvoer):
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.
Ik gebruik hier verticale uitvoer om het lezen gemakkelijker te maken zonder horizontaal te hoeven scrollen. Dit betekent dat de kolomkoppen aan de linkerkant staan en de gegevens aan de rechterkant. Als u dit uitvoert met een GUI zoals SSMS of Azure Data Studio, ziet u het waarschijnlijk in het gebruikelijke tabelrasterformaat (tenzij u anders hebt aangegeven).
Meerdere rijen voor een enkele verouderde functie?
Uw XEL-bestand kan soms meerdere vermeldingen krijgen voor een enkele gebeurtenis. U voert bijvoorbeeld een enkele verouderde opgeslagen procedure één keer uit, om te ontdekken dat er voor die ene instructie 10 of 11 rijen worden geretourneerd uit uw XEL-bestand.
Hier is een voorbeeld:
USE Music; EXEC sp_depends @objname = 'Artists';
De sp_depends
systeem opgeslagen procedure is verouderd, dus ik zou daar zeker een rij voor verwachten. Als ik dat nu uitvoer, verwacht ik in totaal 2 rijen:1 voor het vorige voorbeeld en 1 voor dit voorbeeld.
Maar het blijkt dat er nog 11 rijen aan mijn XEL-bestand zijn toegevoegd:
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;
Resultaat (met verticale uitvoer):
-[ 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)
Wat is hier aan de hand?
Dit gebeurt omdat de sp_depends
door het systeem opgeslagen procedure zelf gebruikt verouderde functies.
Ik krijg niet alleen 1 rij voor het uitvoeren van sp_depends
. Ik krijg ook 1 rij voor elke verouderde functie die door die opgeslagen procedure wordt gebruikt (of het nu in de opgeslagen procedure is of in een ander object waarnaar het verwijst). In dit geval krijg ik 10 extra rijen.
Ik heb even gekeken naar sp_depends
's definitie, en ik zag dat het verwijst naar (de verouderde) sysdepends
op verschillende plaatsen, en die referenties (de verouderde) sql_dependencies
bekijken . Ik zag ook dat het letterlijke tekenreeksen gebruikt als kolomaliassen, een praktijk die ook is gemarkeerd voor afschaffing. Dat ondersteunt allemaal wat ik in het XEL-bestand zie.
Meer details over elke verouderde functie
Zie Microsoft's artikel Verouderde Database Engine-functies in SQL Server 2017 voor aanbevelingen over hoe om te gaan met elk verouderd item. Die lijst is precies dezelfde als die voor SQL Server 2016.
Microsoft-documentatiereferentie
- Snelstart:uitgebreide gebeurtenissen in SQL Server
- CREER EVENEMENTSESSIE
- ALTER EVENT SESSIE
- sys.fn_xe_file_target_read_file
- Eventgegevens lezen 101:hoe zit het met de XML?