AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 282534
Accepted
user960567
user960567
Asked: 2021-01-05 05:20:06 +0800 CST2021-01-05 05:20:06 +0800 CST 2021-01-05 05:20:06 +0800 CST

Encontrando o motivo do log de transações 'tempdb' cheio devido a 'ACTIVE_TRANSACTION' [duplicado]

  • 772
Essa pergunta já tem resposta aqui :
Espaço sustentado inexplicável usado no arquivo de log TempDB (1 resposta)
Fechado no ano passado .

Nosso aplicativo parou de funcionar repentinamente devido a The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'.. Agora, ele começa a funcionar novamente. Mas como posso saber o motivo exato para esse erro ter surgido?

sql-server sql-server-2014
  • 2 2 respostas
  • 12192 Views

2 respostas

  • Voted
  1. Best Answer
    J.D.
    2021-01-05T07:17:26+08:002021-01-05T07:17:26+08:00

    Você pode usar essa consulta para obter uma lista das consultas em execução ativa em todo o servidor, incluindo o ID do processo, há quanto tempo estão em execução, em qual banco de dados estão sendo executados, quem as executou, informações de estatísticas de espera, IDs de consulta de bloqueio , etc. Eu recomendo colocá-lo dentro de um procedimento armazenado para que você possa chamá-lo facilmente conforme necessário (mesmo com seus parâmetros padrão) e você pode agendá-lo rotineiramente com um trabalho do SQL Agent para registrar os resultados em uma tabela.

    DECLARE @Database VARCHAR(100) = NULL 
    DECLARE @EntityName VARCHAR(100) = NULL
    DECLARE @ExcludeMyQueries BIT = 0
    DECLARE @RunningThreadsOnly BIT = 0
    DECLARE @LocksOnly BIT = 0
    DECLARE @MinDuration INT = 0
    DECLARE @OutputMode INT = 0 -- TODO: Setup formally documented modes, and clean up usage below, can even have different kinds of modes like Verbose, vs EmergenciesOnly, etc
    
    DECLARE @ExecutionDate DATETIME = GETDATE();
    
    SELECT 
        SP.HostName,
        SP.SPID,    
        ER.request_id AS RequestId,
        ER.percent_complete AS PercentComplete, 
        DATEDIFF(s, start_time, @ExecutionDate) AS Duration,
        CAST(((DATEDIFF(s, start_time, @ExecutionDate)) / 3600) AS VARCHAR) + ' hour(s), '
            + CAST((DATEDIFF(s, start_time, @ExecutionDate) % 3600) / 60 AS VARCHAR) + 'min, ' 
            + CAST((DATEDIFF(s, start_time, @ExecutionDate) % 60) AS VARCHAR) + ' sec' AS RunningTime, 
        CAST((estimated_completion_time / 3600000) AS VARCHAR) + ' hour(s), ' 
            + CAST((estimated_completion_time % 3600000) / 60000 AS VARCHAR) + 'min, ' 
            + CAST((estimated_completion_time % 60000) / 1000 AS VARCHAR) + ' sec' AS EstimatedTimeRemaining, 
        DATEADD(SECOND, estimated_completion_time/1000, @ExecutionDate) AS EstimatedCompletionDate, 
        ER.Command,
        ER.blocking_session_id AS BlockingSessionId, 
        LastWaitType,  
        SP.[DBID],  
        DB_NAME(SP.[DBID]) AS DbName,       
        --[TEXT] AS EntityText,
        CPU,
        ER.plan_handle AS PlanHandle,
        ER.query_plan_hash AS QueryPlanHash,
        LOGIN_TIME AS LoginTime,
        LOGINAME AS LoginName, 
        SP.[Status],
        [PROGRAM_NAME] AS ProgramName,
        NT_DOMAIN AS NT_Domain, 
        NT_USERNAME AS NT_Username, 
        @@SERVERNAME AS ServerName,
        @ExecutionDate AS ExecutionDate 
    INTO #ExecutingQueries
    FROM sys.sysprocesses SP  
    INNER JOIN sys.dm_exec_requests ER 
        ON sp.spid = ER.session_id 
    WHERE --TEXT NOT LIKE N'%spGetRunningQueries%'
        --AND 
        DB_NAME(SP.dbid) NOT IN ('msdb','master','Distribution')    
        AND
        (
            @Database IS NULL
            OR (@Database IS NOT NULL AND @Database = DB_NAME(SP.[DBID]))
        )
        AND
        (
            @ExcludeMyQueries = 0
            OR (@ExcludeMyQueries = 1 AND hostname <> HOST_NAME())
        )   
        AND
        (
            @RunningThreadsOnly = 0
            OR (@RunningThreadsOnly = 1 AND SP.[Status] = 'RUNNABLE')
        )
        AND 
        (
            @LocksOnly = 0
            OR (@LocksOnly = 1 AND ER.blocking_session_id <> 0) -- TODO: Show the source running query that IS the blocking session ID (will need to join / union this in somehow?)
        )
        AND DATEDIFF(s, start_time, @ExecutionDate) >= @MinDuration
    
    -- TODO: Clean this up and DON'T USE SELECT *
    IF (@OutputMode = 0) -- Everything mode
    BEGIN
        SELECT *
        FROM #ExecutingQueries
    END
    ELSE IF (@OutputMode = 1) -- Lightweight mode
    BEGIN
        SELECT 
            HostName,
            SPID,
            RequestId,
            RunningTime,
            BlockingSessionId,
            LastWaitType,
            DbName,
            LEFT(EntityText, 100) AS EntityText,
            PlanHandle,
            [Status]
        FROM #ExecutingQueries
    END
    

    Usando isso, você pode ver as consultas de execução mais longa (as colunas Durationou RunningTime) e também ver por que elas estão em execução por tanto tempo observando as colunas LastWaitTypee/ou .BlockingSessionId

    Este é um trabalho em andamento que criei a partir do sp_WhoIsActive de Adam Machanic que uso regularmente para depurar problemas no SQL Server.

    • 5
  2. Danielle Paquette-Harvey
    2021-01-05T05:27:25+08:002021-01-05T05:27:25+08:00

    Você provavelmente tem uma transação ativa em tempdb. Você pode ver a contagem de transações ativas.

    select @@TRANCOUNT
    

    Você também pode verificar o conteúdo de tempdb para encontrá-lo.

    SELECT * FROM tempdb..sysobjects
    

    O que eu faria seria verificar quais consultas/trabalhos estão sendo executados quando você está recebendo esse erro para encontrar exatamente o que está travando.

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve