Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation d'événements étendus pour consigner les fonctionnalités obsolètes utilisées dans une instance SQL Server (exemple T-SQL)

Événements étendus est un système léger de surveillance des performances qui permet aux utilisateurs de collecter les données nécessaires pour surveiller et résoudre les problèmes dans SQL Server.

Cet article montre comment les événements étendus peuvent être utilisés pour créer un fichier journal contenant toutes les fonctionnalités obsolètes qui sont encore utilisées dans une instance de SQL Server. Le journal enregistre toutes les occurrences depuis le démarrage de la session d'événements.

Si vous voulez juste un décompte rapide du nombre de fois qu'une fonctionnalité obsolète a été utilisée depuis le démarrage de SQL Server, consultez Moyen le plus rapide de trouver des fonctionnalités obsolètes encore utilisées dans une instance SQL Server.

Mais si vous avez besoin d'un journal plus détaillé qui inclut des éléments tels que; l'instruction SQL utilisée qui contient la fonctionnalité obsolète, la base de données sur laquelle elle a été exécutée, l'utilisateur qui l'a exécutée, l'heure à laquelle elle a été exécutée, etc., lisez la suite.

Créer la session d'événement étendue

La première étape consiste à créer la session d'événement étendue. Ici, nous spécifions la source des événements, la cible de la session d'événements et les options de session d'événements.

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
    );

Dans ce cas, je spécifie une cible de /var/opt/mssql/tmp/DeprecationEvents.xel . Cela signifie que les données d'événement seront stockées dans ce fichier. Vous pouvez spécifier n'importe quel nom de fichier et chemin.

Cet exemple utilise un chemin de fichier Linux, qui utilise des barres obliques. Si vous êtes sous Windows, vous devez utiliser des barres obliques inverses. Par exemple :C:\Temp\DeprecationEvents.xel .

Démarrer la session d'événement étendue

La création de la session d'événement ne la démarre pas. Utilisez ALTER EVENT SESSION pour l'arrêter et le démarrer. Dans ce cas, nous voulons le démarrer :

ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;

Faire quelque chose d'obsolète

Maintenant que nous avons lancé la session d'événement étendue, exécutons du code obsolète :

SELECT * FROM sys.sql_dependencies;

Parce que sys.sql_dependencies est obsolète, ce code ajoutera des données au fichier XEL que nous avons spécifié précédemment.

Afficher le fichier XEL

Maintenant que nous avons (vraisemblablement) ajouté des données à notre fichier XEL, examinons-le :

SELECT event_data 
FROM sys.fn_xe_file_target_read_file (
    '/var/opt/mssql/tmp/DeprecationEvents*.xel', 
    null, 
    null, 
    null
    );  

Résultat :

<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>

Dans ce cas, je n'ai renvoyé que event_data , car c'est là que résident toutes les données d'événement.

Malheureusement, ce n'est pas le plus facile à lire pour nous, les humains.

Et si je le formate ?

<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>

Il est légèrement plus facile à lire lorsqu'il est formaté, mais nous pouvons faire mieux que cela.

Analyser le fichier XEL

Dans cet exemple, j'analyse le fichier XEL afin de pouvoir voir les données dans une grille, comme n'importe quelle autre requête de base de données.

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);

Résultat (en utilisant la sortie verticale) :

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.

J'utilise ici la sortie verticale afin de faciliter la lecture sans avoir à faire défiler horizontalement. Cela signifie que les en-têtes de colonne sont à gauche et les données à droite. Si vous l'exécutez à l'aide d'une interface graphique telle que SSMS ou Azure Data Studio, vous le verrez probablement dans le format de grille de tableau habituel (sauf si vous avez spécifié le contraire).

Plusieurs lignes pour une seule fonctionnalité obsolète ?

Votre fichier XEL peut parfois obtenir plusieurs entrées pour un seul événement. Par exemple, vous exécutez une seule procédure stockée obsolète une seule fois, pour constater que 10 ou 11 lignes sont renvoyées de votre fichier XEL pour cette seule instruction.

Voici un exemple :

USE Music;
EXEC sp_depends @objname = 'Artists';

Le sp_depends La procédure stockée du système est obsolète, donc je m'attendrais certainement à voir une ligne pour cela. Si j'exécute cela maintenant, je pourrais m'attendre à avoir 2 lignes au total :1 pour l'exemple précédent et 1 pour cet exemple.

Mais il s'avère que 11 lignes supplémentaires sont ajoutées à mon fichier 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)
ORDER BY [Timestamp] ASC;

Résultat (en utilisant la sortie verticale) :

-[ 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)

Que se passe-t-il ici ?

Cela se produit parce que le sp_depends la procédure stockée du système elle-même utilise des fonctionnalités obsolètes.

Non seulement j'obtiens 1 ligne pour l'exécution de sp_depends . J'obtiens également 1 ligne pour chaque fonctionnalité obsolète utilisée par cette procédure stockée (que ce soit dans la procédure stockée ou dans un autre objet auquel elle fait référence). Dans ce cas, j'obtiens 10 lignes supplémentaires.

J'ai jeté un coup d'œil rapide à sp_depends 's définition, et j'ai vu qu'il fait référence (à l'obsolète) sysdepends à plusieurs endroits, et qui visualisent les références (les obsolètes) sql_dependencies . J'ai également vu qu'il utilise des littéraux de chaîne comme alias de colonne, une pratique qui est également marquée pour l'obsolescence. Tout cela confirme ce que je vois dans le fichier XEL.

Plus de détails sur chaque fonctionnalité obsolète

Consultez l'article de Microsoft sur les fonctionnalités obsolètes du moteur de base de données dans SQL Server 2017 pour obtenir des recommandations sur la manière de traiter chaque élément obsolète. Cette liste est exactement la même que celle de SQL Server 2016.

Référence de la documentation Microsoft

  • Guide de démarrage rapide :événements étendus dans SQL Server
  • CRÉER UNE SESSION D'ÉVÉNEMENT
  • SESSION ALTER EVENT
  • sys.fn_xe_file_target_read_file
  • Lecture des données d'événement 101 :Qu'en est-il du XML ?