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
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
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.:
Avertissement: Je travaille pour SQL Sentry.