web-dev-qa-db-fra.com

Capturer des requêtes SQL Server sans outils tiers et sans utiliser de fonctionnalités obsolètes?

Est-il possible de capturer toutes les requêtes envoyées à un serveur MS SQL, sans outils tiers et sans utiliser de fonctionnalités obsolètes?

Je cherche quelque chose de similaire au "journal général des requêtes" dans MySQL.

Voici un exemple d'utilisation d'un outil tiers:

Voici une alternative utilisant des fonctionnalités obsolètes:

Existe-t-il une solution native non déconseillée?

6
Alex R

Vous pouvez utiliser Événements étendus pour capturer ces données. Cependant, selon la quantité de trafic que votre serveur obtient, cela peut devenir très rapidement un grand nombre de données et entraîner des problèmes de performances.

Je chercherais à limiter les événements que vous suivez à quelque chose comme sqlserver.rpc_completed ou sqlserver.sql_statement_completed, ceux-ci ne capturent que ce qui a été réalisé. Erin Stellato a écrit un excellent article sur l'utilisation de XEvent Profiler pour capturer des requêtes dans SQL Server.

À partir de SSMS, accédez à Gestion> Événements étendus> Session et utilisez le New Session Wizard ou New Session pour commencer à créer votre session pour suivre les données. Microsoft Docs donne beaucoup de détails sur la façon de configurer cela.

Voici un exemple de quelque chose que j'ai implémenté récemment pour capturer des requêtes sur un serveur spécifique, vous pouvez ajouter des filtres pour supprimer les requêtes que vous ne voulez pas voir - comme certains noms de serveur ou noms d'application qui exécutent également des requêtes:

CREATE EVENT SESSION [Track Queries] ON SERVER 
ADD EVENT sqlserver.rpc_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_instance_name,sqlserver.server_principal_name,sqlserver.sql_text,sqlserver.username)
    WHERE (NOT [sqlserver].[like_i_sql_unicode_string]([sqlserver].[client_hostname],N'%name%') 
            AND [sqlserver].[not_equal_i_sql_unicode_string]([sqlserver].[client_hostname],N'name') 
            AND NOT [sqlserver].[like_i_sql_unicode_string]([sqlserver].[client_app_name],N'%name%') 
            AND [sqlserver].[server_principal_name]<>N'<username>')),
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_instance_name,sqlserver.server_principal_name,sqlserver.sql_text,sqlserver.username)
    WHERE (NOT [sqlserver].[like_i_sql_unicode_string]([sqlserver].[client_hostname],N'%<name>%') 
            AND [sqlserver].[not_equal_i_sql_unicode_string]([sqlserver].[client_hostname],N'name') 
            AND NOT [sqlserver].[like_i_sql_unicode_string]([sqlserver].[client_app_name],N'%name%') 
            AND [sqlserver].[server_principal_name]<>N'<username>'))
ADD TARGET package0.event_file(SET filename=N'D:\XE\TrackQueries.xel',max_file_size=(5120))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

Cela capture les détails de ce qui a été exécuté et le place dans un fichier pour une interrogation et une analyse faciles.

12
Taryn

Utilisez les événements étendus SQL Server pour capturer les instructions T-SQL lors de leur exécution.

SQL Server Management Studio 17+ inclut un élément "XEvent Profiler" dans l'Explorateur d'objets pour chaque SQL Server connecté de version 2012 ou supérieure. Cliquez avec le bouton droit sur la session TSQL, puis Launch Session.

Sachez que la capture d'instructions T-SQL sur un serveur entier peut affecter négativement les performances, vous ne voudrez donc probablement le faire que pendant une courte période avant d'arrêter la session.

7
Max Vernon
0
Muab Nhoj