Gostaria de saber como identificar a consulta exata ou o processo armazenado que está realmente preenchendo o log transacional do banco de dados TEMPDB.
65
Gostaria de saber como identificar a consulta exata ou o processo armazenado que está realmente preenchendo o log transacional do banco de dados TEMPDB.
Respostas:
Em http://www.sqlservercentral.com/scripts/tempdb/72007/
EDITAR
Como Martin apontou em um comentário, isso não encontraria transações ativas que ocupam espaço no tempdb, ele encontrará apenas consultas ativas que atualmente estão utilizando espaço lá (e provavelmente culpados pelo uso atual do log). Portanto, pode haver uma transação aberta, mas a consulta real que causa o problema não está mais sendo executada.
Você pode alterar para
inner join
onsys.dm_exec_requests
eleft outer join
, em seguida, retornará linhas para sessões que não estão atualmente executando consultas ativamente.A consulta que Martin postou ...
... identificaria
session_id
s com transações ativas que ocupam espaço de log, mas você não seria capaz de determinar necessariamente a consulta real que causou o problema, pois, se não estiver em execução agora, não será capturada na consulta acima para solicitações ativas. Você pode verificar reativamente a consulta mais recente usando,DBCC INPUTBUFFER
mas ela pode não lhe dizer o que você deseja ouvir. Você pode ingressar externamente de maneira semelhante para capturar os que estão ativamente executando, por exemplo:Você também pode usar o DMV
sys.dm_db_session_space_usage
para ver a utilização geral do espaço por sessão (mas, novamente, pode não receber resultados válidos para a consulta; se a consulta não estiver ativa, o que você recupera pode não ser o culpado).Com todas essas consultas à sua disposição, você poderá restringir quem está usando o tempdb e como, especialmente se você as capturar em flagrante.
algumas dicas para minimizar a utilização do tempdb
SORT_IN_TEMPDB
opção se não for necessáriaVocê também pode considerar que o uso do log tempdb pode ser causado por processos internos sobre os quais você tem pouco ou nenhum controle - por exemplo, correio do banco de dados, notificações de eventos, notificações de consulta e intermediário de serviço, todos usam o tempdb de alguma forma. Você pode parar de usar esses recursos, mas se os estiver usando, não poderá determinar como e quando eles usam o tempdb.
fonte
session_id
aparecer com a seguinte consultaSELECT 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
. A consulta que eu esperava encontrar era depois de executar o seguinteBEGIN TRAN CREATE TABLE #T(X CHAR(8000)) INSERT INTO #T SELECT name FROM sys.objects
@@SPID
é . relatórios para o spid com a transação aberta para todas as colunas para mim. Pergunte-se se você precisa consultá-lo quando a solicitação está realmente em execução, em vez de ociosa com uma transação aberta.<>
=
dm_db_task_space_usage
0
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/17d9f862-b9ae-42de-ada0-4229f56712dc/tempdb-log-filling-cannot-find-how-or-what?forum=sqldatabaseengine
fonte
Obrigado por este post, provavelmente o único de seu tipo. Meu teste foi simples, crie uma tabela temporária e verifique se ela aparece quando executo qualquer uma das consultas desta postagem ... apenas uma ou duas foram realmente bem-sucedidas. Corrigi-o para ingressar no T-SQL, otimizei-o para execuções mais longas e o tornei bastante útil. Deixe-me saber se eu perdi alguma coisa, mas até agora você recebeu um script automatizado / em loop. Ele fornece uma maneira de avaliar qual consulta / SPID é o ofensor por um período de tempo usando a consulta de desvio padrão (STDEV) abaixo.
Isso é executado a cada 3 minutos por 40 vezes, portanto, 2 horas. Modifique os parâmetros como achar melhor.
Existe um filtro WHERE> 50 páginas abaixo que as pessoas podem querer limpar caso você tenha muitas tabelas pequenas. Caso contrário, você não vai capturar essa nuance com o abaixo, pois é ...
Desfrutar!
fonte
Infelizmente, o log tempDB não pode ser rastreado diretamente para os IDs da sessão, exibindo os processos em execução.
Reduza o arquivo de log tempDB para um ponto em que ele crescerá significativamente novamente. Em seguida, crie um evento estendido para capturar o crescimento do log. Depois que crescer novamente, você poderá expandir o evento estendido e visualizar o arquivo de evento do pacote. Abra o arquivo, adicione um filtro de hora, filtro de tipo de arquivo (você não deseja que os resultados do arquivo de dados sejam incluídos) e agrupe-o por ID de sessão no SSMS. Isso o ajudará a encontrar o (s) culpado (s) enquanto procura os IDs de sessão com mais grupos por. Obviamente, você precisa coletar o que está sendo executado nos IDs da sessão por meio de outro processo ou ferramenta. Talvez alguém saiba como obter a consulta da coluna query_hash e tenha a gentileza de postar a solução.
Resultados do evento estendido:
Script para criar o evento estendido:
fonte