Je voudrais savoir comment identifier la requête exacte ou la procédure stockée qui est en train de remplir le journal transactionnel de la base de données TEMPDB.
65
Je voudrais savoir comment identifier la requête exacte ou la procédure stockée qui est en train de remplir le journal transactionnel de la base de données TEMPDB.
Réponses:
De http://www.sqlservercentral.com/scripts/tempdb/72007/
MODIFIER
Comme Martin l'a fait remarquer dans un commentaire, les transactions actives occupant de l'espace dans tempdb ne seraient pas identifiées , mais uniquement les requêtes actives utilisant actuellement cet espace (et probablement responsables de l'utilisation actuelle du journal). Il peut donc y avoir une transaction ouverte, mais la requête à l'origine du problème n'est plus en cours d'exécution.
Vous pouvez changer le
inner join
sursys.dm_exec_requests
enleft outer join
, puis vous retournerez des lignes pour les sessions qui n'exécutent pas activement de requêtes.La requête posée par Martin ...
... identifierait
session_id
s avec des transactions actives occupant de l'espace de journalisation, mais vous ne seriez pas nécessairement en mesure de déterminer la requête réelle à l'origine du problème, car s'il n'est pas en cours d'exécution, il ne sera pas capturé dans la requête ci-dessus pour demandes actives. Vous pourrez peut-être vérifier de manière réactive la requête la plus récente en utilisant,DBCC INPUTBUFFER
mais cela ne vous dira peut-être pas ce que vous voulez entendre. Vous pouvez créer une jointure externe de manière similaire pour capturer ceux qui sont en cours d'exécution, par exemple:Vous pouvez également utiliser le logiciel DMV
sys.dm_db_session_space_usage
pour voir l'utilisation globale de l'espace par session (mais encore une fois, vous risquez de ne pas obtenir des résultats valides pour la requête; si la requête n'est pas active, ce que vous récupérez ne sera peut-être pas le véritable coupable).Avec toutes ces questions à votre disposition, vous devriez être en mesure de déterminer qui utilise tempdb et comment, surtout si vous les surprenez en flagrant délit.
Quelques astuces pour minimiser l'utilisation de tempdb
SORT_IN_TEMPDB
option si elle n'est pas nécessaireVous pouvez également considérer que l'utilisation de votre journal tempdb peut être provoquée par des processus internes sur lesquels vous n'avez que peu ou pas de contrôle - par exemple, le courrier de base de données, les notifications d'événement, les notifications de requête et le courtier de service utilisent tous tempdb d'une manière ou d'une autre. Vous pouvez cesser d'utiliser ces fonctionnalités, mais si vous les utilisez, vous ne pouvez pas dicter comment et quand ils utilisent tempdb.
la source
session_id
requête suivante s'afficheSELECT database_transaction_log_bytes_reserved,session_id FROM sys.dm_tran_database_transactions tdt JOIN sys.dm_tran_session_transactions tst ON tdt.transaction_id = tst.transaction_id WHERE database_id = 2
. La requête que je m'attendais à trouver était après avoir exécuté ce qui suitBEGIN TRAN CREATE TABLE #T(X CHAR(8000)) INSERT INTO #T SELECT name FROM sys.objects
@@SPID
n'est<>
pas=
.dm_db_task_space_usage
rapports0
pour le spid avec la transaction ouverte pour toutes les colonnes pour moi. Je me demande si vous devez l'interroger lorsque la demande est en train de s'exécuter plutôt que de rester inactif avec une transaction ouverte.https://social.msdn.microsoft.com/Forums/sqlserver/en-US/17d9f862-b9ae-42de-ada0-4229f56712dc/tempdb-log-filling-cannot-find-how-or-what-forwhat=forum=sqldatabaseengine
la source
Merci pour ce post, probablement le seul en son genre. Mon test était simple: créez une table temporaire et assurez-vous qu’elle s’affiche lorsque j’exécute l’une des requêtes de cet article ... Seules une ou deux ont vraiment réussi. Je l'ai corrigé pour rejoindre le T-SQL, optimisé pour de plus longues durées et rendu utile. Faites-moi savoir si j'ai manqué quelque chose, mais vous avez jusqu'à présent un script automatisé / en boucle. Il fournit un moyen d'évaluer la requête / le SPID du délinquant sur une période en utilisant la requête à écart type (STDEV) ci-dessous.
Cela fonctionne toutes les 3 minutes pendant 40 fois, soit 2 heures. Modifiez les paramètres comme bon vous semble.
Il existe un filtre WHERE> 50 pages ci-dessous que les utilisateurs peuvent vouloir effacer au cas où vous auriez beaucoup de petits tableaux. Sinon, vous ne pourrez pas saisir cette nuance avec le sous-titre tel quel ...
Prendre plaisir!
la source
Malheureusement, le journal tempDB ne peut pas être directement retracé vers les ID de session en affichant les processus en cours d'exécution.
Réduisez le fichier journal tempDB à un point où il connaîtra une nouvelle croissance importante. Créez ensuite un événement étendu pour capturer la croissance du journal. Une fois que cela a repris, vous pouvez développer l'événement étendu et afficher le fichier d'événements du package. Ouvrez le fichier, ajoutez un filtre de temps, un filtre de type de fichier (vous ne voulez pas que les résultats du fichier de données soient inclus), puis regroupez-le par ID de session dans SSMS. Cela vous aidera à trouver le ou les coupables pendant que vous recherchez les identifiants de session avec le plus grand nombre de groupes. Bien sûr, vous devez collecter ce qui est en cours d'exécution dans les identifiants de session via un autre processus ou un autre outil. Peut-être que quelqu'un sait comment obtenir la requête à partir de la colonne query_hash et aura la gentillesse de poster la solution.
Résultats de l'événement étendu:
Script pour créer l'événement étendu:
la source