Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden von erweiterten Ereignissen zum Protokollieren veralteter Funktionen, die in einer SQL Server-Instanz verwendet werden (T-SQL-Beispiel)

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?