Erweiterte Ereignisse ist ein leichtes Leistungsüberwachungssystem, mit dem Benutzer Daten sammeln können, die zum Überwachen und Beheben von Problemen in SQL Server erforderlich sind.
Dieser Artikel zeigt, wie erweiterte Ereignisse verwendet werden können, um eine Protokolldatei zu erstellen, die alle veralteten Features enthält, die noch in einer Instanz von SQL Server verwendet werden. Das Protokoll zeichnet alle Vorkommnisse auf, seit die Ereignissitzung gestartet wurde.
Wenn Sie nur schnell zählen möchten, wie oft eine veraltete Funktion seit dem Start von SQL Server verwendet wurde, lesen Sie den Artikel Schnellste Methode zum Auffinden veralteter Funktionen, die noch in einer SQL Server-Instanz verwendet werden.
Aber wenn Sie ein detaillierteres Protokoll benötigen, das Dinge enthält wie:die verwendete SQL-Anweisung, die die veraltete Funktion enthält, die Datenbank, für die sie ausgeführt wurde, der Benutzer, der sie ausgeführt hat, die Uhrzeit der Ausführung usw., lesen Sie weiter.
Erstellen Sie die erweiterte Veranstaltungssitzung
Der erste Schritt besteht darin, die erweiterte Ereignissitzung zu erstellen. Hier geben wir die Quelle der Ereignisse, das Ereignissitzungsziel und die Ereignissitzungsoptionen an.
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 diesem Fall gebe ich als Ziel /var/opt/mssql/tmp/DeprecationEvents.xel
an . Das bedeutet, dass die Ereignisdaten in dieser Datei gespeichert werden. Sie können einen beliebigen Dateinamen und Pfad angeben.
Dieses Beispiel verwendet einen Linux-Dateipfad, der Schrägstriche verwendet. Unter Windows müssen Sie Backslashes verwenden. Beispiel:C:\Temp\DeprecationEvents.xel
.
Starten Sie die erweiterte Veranstaltungssitzung
Durch das Erstellen der Ereignissitzung wird diese nicht gestartet. Verwenden Sie ALTER EVENT SESSION
zu stoppen und zu starten. In diesem Fall wollen wir es starten:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Mach etwas Veraltetes
Nachdem wir nun die erweiterte Ereignissitzung gestartet haben, führen wir veralteten Code aus:
SELECT * FROM sys.sql_dependencies;
Weil sys.sql_dependencies
veraltet ist, fügt dieser Code der zuvor angegebenen XEL-Datei Daten hinzu.
XEL-Datei anzeigen
Nun, da wir (vermutlich) Daten zu unserer XEL-Datei hinzugefügt haben, werfen wir einen Blick darauf:
SELECT event_data FROM sys.fn_xe_file_target_read_file ( '/var/opt/mssql/tmp/DeprecationEvents*.xel', null, null, null );
Ergebnis:
<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 diesem Fall habe ich nur event_data
zurückgegeben , weil sich dort alle Ereignisdaten befinden.
Leider ist es für uns Menschen nicht ganz einfach zu lesen.
Was ist, wenn ich es formatiere?
<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>
Es ist etwas einfacher zu lesen, wenn es formatiert ist, aber wir können es noch besser machen.
Parsen Sie die XEL-Datei
In diesem Beispiel parse ich die XEL-Datei, sodass ich die Daten in einem Raster sehen kann, genau wie bei jeder anderen Datenbankabfrage.
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);
Ergebnis (bei vertikaler Ausgabe):
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.
Ich verwende hier die vertikale Ausgabe, um das Lesen zu erleichtern, ohne horizontal scrollen zu müssen. Das bedeutet, dass sich die Spaltenüberschriften links und die Daten rechts befinden. Wenn Sie dies über eine GUI wie SSMS oder Azure Data Studio ausführen, sehen Sie es wahrscheinlich im üblichen Tabellenrasterformat (sofern Sie nichts anderes angegeben haben).
Mehrere Zeilen für ein einzelnes veraltetes Feature?
Ihre XEL-Datei kann manchmal mehrere Einträge für ein einzelnes Ereignis erhalten. Sie führen beispielsweise eine einzelne veraltete gespeicherte Prozedur einmal aus, nur um festzustellen, dass 10 oder 11 Zeilen aus Ihrer XEL-Datei für diese einzelne Anweisung zurückgegeben werden.
Hier ist ein Beispiel:
USE Music; EXEC sp_depends @objname = 'Artists';
Die sp_depends
Die gespeicherte Systemprozedur ist veraltet, daher würde ich definitiv erwarten, dass dafür eine Zeile angezeigt wird. Wenn ich das jetzt ausführe, erwarte ich am Ende insgesamt 2 Zeilen:1 für das vorherige Beispiel und 1 für dieses Beispiel.
Aber wie sich herausstellt, werden meiner XEL-Datei 11 weitere Zeilen hinzugefügt:
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;
Ergebnis (bei vertikaler Ausgabe):
-[ 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)
Was ist hier los?
Dies geschieht, weil sp_depends
Die gespeicherte Systemprozedur selbst verwendet veraltete Funktionen.
Ich bekomme nicht nur 1 Zeile für die Ausführung von sp_depends
. Ich erhalte auch 1 Zeile für jede veraltete Funktion, die von dieser gespeicherten Prozedur verwendet wird (ob in der gespeicherten Prozedur oder in einem anderen Objekt, auf das sie verweist). In diesem Fall erhalte ich 10 zusätzliche Zeilen.
Ich habe mir sp_depends
kurz angesehen ’s-Definition, und ich habe gesehen, dass sie auf (das veraltete) sysdepends
verweist an mehreren Stellen, und diese Ansicht verweist auf (die veralteten) sql_dependencies
. Ich habe auch gesehen, dass es Zeichenfolgenliterale als Spaltenaliase verwendet, eine Praxis, die ebenfalls als veraltet gekennzeichnet ist. All dies unterstützt das, was ich in der XEL-Datei sehe.
Weitere Details zu jeder veralteten Funktion
Im Microsoft-Artikel Deprecated Database Engine Features in SQL Server 2017 finden Sie Empfehlungen zum Umgang mit den einzelnen veralteten Elementen. Diese Liste ist genau die gleiche wie die für SQL Server 2016.
Microsoft-Dokumentationsreferenz
- Schnellstart:Erweiterte Ereignisse in SQL Server
- VERANSTALTUNGSSITZUNG ERSTELLEN
- VERANSTALTUNGSSITZUNG ÄNDERN
- sys.fn_xe_file_target_read_file
- Lesen von Ereignisdaten 101:Was ist los mit XML?