web-dev-qa-db-fra.com

Requête SQL pour obtenir les blocages dans SQL SERVER 2008

Duplicate possible:
Aide au blocage dans SQL Server 2008

SQLServer enregistre automatiquement tous les blocages. Quelqu'un peut-il m'aider à obtenir une requête SQL qui capturera les données de blocage qui sont collectées, pour un événement récent.

J'utilise SQL SERVER 2008 R2 pour mes activités de développement.

Merci et salutations, Santosh Kumar Patro

28
santosh kumar patro

Vous pouvez utiliser un deadlock graph et rassemblez les informations requises à partir du fichier journal.

Le seul autre moyen que je pourrais suggérer est de creuser l'information en utilisant EXEC SP_LOCK (Bientôt obsolète), EXEC SP_WHO2 ou la sys.dm_tran_locks table.

SELECT  L.request_session_id AS SPID, 
    DB_NAME(L.resource_database_id) AS DatabaseName,
    O.Name AS LockedObjectName, 
    P.object_id AS LockedObjectId, 
    L.resource_type AS LockedResource, 
    L.request_mode AS LockType,
    ST.text AS SqlStatementText,        
    ES.login_name AS LoginName,
    ES.Host_name AS HostName,
    TST.is_user_transaction as IsUserTransaction,
    AT.name as TransactionName,
    CN.auth_scheme as AuthenticationMethod
FROM    sys.dm_tran_locks L
    JOIN sys.partitions P ON P.hobt_id = L.resource_associated_entity_id
    JOIN sys.objects O ON O.object_id = P.object_id
    JOIN sys.dm_exec_sessions ES ON ES.session_id = L.request_session_id
    JOIN sys.dm_tran_session_transactions TST ON ES.session_id = TST.session_id
    JOIN sys.dm_tran_active_transactions AT ON TST.transaction_id = AT.transaction_id
    JOIN sys.dm_exec_connections CN ON CN.session_id = ES.session_id
    CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST
WHERE   resource_database_id = db_id()
ORDER BY L.request_session_id

http://www.sqlmag.com/article/sql-server-profiler/gathering-deadlock-information-with-deadlock-graph

http://weblogs.sqlteam.com/mladenp/archive/2008/04/29/SQL-Server-2005-Get-full-information-about-transaction-locks.aspx

45
Darren

Pour capturer des graphiques d'interblocage sans utiliser de trace (vous n'avez pas nécessairement besoin du profileur), vous pouvez activer l'indicateur de trace 1222. Ceci écrira des informations d'interblocage dans le journal des erreurs. Cependant, le journal des erreurs est textuel, vous n'obtiendrez donc pas de belles images de graphique de blocage, vous devrez lire le texte des blocages pour le comprendre.

Je définirais cela comme un indicateur de trace de démarrage (dans ce cas, vous devrez redémarrer le service). Toutefois, vous ne pouvez l'exécuter que pour l'instance en cours d'exécution du service (qui ne nécessitera pas de redémarrage, mais ne reprendra pas lors du prochain redémarrage) à l'aide de la commande d'indicateur de trace globale suivante:

DBCC TRACEON(1222, -1);

Une recherche rapide a donné ce tutoriel:

http://www.mssqltips.com/sqlservertip/2130/finding-sql-server-deadlocks-using-trace-flag-1222/

Notez également que si votre système rencontre de nombreux blocages, cela peut réellement bloquer votre journal des erreurs, et peut devenir une source importante de bruit, entraînant la noyade d’autres erreurs importantes.

Avez-vous envisagé des outils de surveillance tiers? SQL Sentry Performance Advisor , par exemple, a un graphique de type interblocage beaucoup plus esthétique, qui vous indique les noms d’objet/index ainsi que l’ordre dans lequel les verrous ont été utilisés. En prime, elles sont automatiquement capturées sur des serveurs surveillés sans avoir à configurer d’indicateurs de trace, ni à exécuter vos propres traces, etc.:

enter image description here

Avertissement: Je travaille pour SQL Sentry.

12
Aaron Bertrand