Partilhar via


Solucionar erros de log de transações com o Banco de Dados SQL do Azure

Aplica-se a:Banco de Dados SQL do Azure

Você pode ver os erros 9002 ou 40552 quando o log de transações estiver cheio e não puder aceitar novas transações. Esses erros ocorrem quando o log de transações do banco de dados, gerenciado pelo Banco de Dados SQL do Azure, excede os limites de espaço e não pode continuar a aceitar transações. Esses erros são semelhantes a problemas com um log de transações completo no SQL Server, mas têm resoluções diferentes no SQL Server, no Banco de Dados SQL do Azure e na Instância Gerenciada do SQL do Azure.

Nota

Este artigo é focado no Banco de Dados SQL do Azure. O Banco de Dados SQL do Azure é baseado na versão estável mais recente do mecanismo de banco de dados do Microsoft SQL Server, portanto, grande parte do conteúdo é semelhante, embora as opções e ferramentas de solução de problemas possam diferir do SQL Server.

Para obter mais informações sobre como solucionar problemas de um log de transações na Instância Gerenciada SQL do Azure, consulte Solucionar erros de log de transações com a Instância Gerenciada SQL do Azure.

Para obter mais informações sobre como solucionar problemas de um log de transações no SQL Server, consulte Solucionar problemas de um log de transações completo (Erro 9002 do SQL Server).

Backups automatizados e o log de transações

No Banco de Dados SQL do Azure, os backups do log de transações são feitos automaticamente. Para obter frequência, retenção e mais informações, consulte Backups automatizados.

O espaço livre em disco, o crescimento do arquivo de banco de dados e o local do arquivo também são gerenciados, portanto, as causas e resoluções típicas de problemas de log de transações são diferentes do SQL Server.

Semelhante ao SQL Server, o log de transações para cada banco de dados é truncado sempre que um backup de log é concluído com êxito. O truncamento deixa espaço vazio no arquivo de log, que pode ser usado para novas transações. Quando o arquivo de log não pode ser truncado por backups de log, o arquivo de log cresce para acomodar novas transações. Se o arquivo de log crescer até seu limite máximo no Banco de Dados SQL do Azure, novas transações de gravação falharão.

Para obter informações sobre tamanhos de log de transações, consulte:

Truncamento do log de transações impedido

Para descobrir o que está impedindo o truncamento de log em um determinado caso, consulte log_reuse_wait_desc em sys.databases. A espera de reutilização de log informa quais condições ou causas estão impedindo que o log de transações seja truncado por um backup de log regular. Para obter mais informações, veja sys.databases (Transact-SQL).

SELECT [name], log_reuse_wait_desc FROM sys.databases;

Para o Banco de Dados SQL do Azure, é recomendável conectar-se a um banco de dados de usuário específico, em vez do master banco de dados, para executar essa consulta.

Os seguintes valores de in sys.databases podem indicar o motivo pelo qual o truncamento do log de transações do banco de log_reuse_wait_desc dados está sendo impedido:

log_reuse_wait_desc Diagnóstico Resposta necessária
NADA Estado típico. Não há nada que impeça o log de truncar. Não
PONTO DE VERIFICAÇÃO Um ponto de verificação é necessário para o truncamento de log. Raros. Nenhuma resposta necessária, a menos que seja mantida. Se for sustentado, registre uma solicitação de suporte no Suporte do Azure.
LOG BACKUP É necessário um backup de log. Nenhuma resposta necessária, a menos que seja mantida. Se for sustentado, registre uma solicitação de suporte no Suporte do Azure.
BACKUP OU RESTAURAÇÃO ATIVA Um backup de banco de dados está em andamento. Nenhuma resposta necessária, a menos que seja mantida. Se for sustentado, registre uma solicitação de suporte no Suporte do Azure.
TRANSAÇÃO ATIVA Uma transação contínua está impedindo o truncamento de log. O arquivo de log não pode ser truncado devido a transações ativas e/ou não confirmadas. Ver secção seguinte.
REPLICAÇÃO No Banco de Dados SQL do Azure, isso pode ocorrer se a captura de dados de alteração (CDC) estiver habilitada. Consulte sys.dm_cdc_errors e resolva erros. Se não for solúvel, envie uma solicitação de suporte ao Suporte do Azure.
AVAILABILITY_REPLICA A sincronização com a réplica secundária está em andamento. Nenhuma resposta necessária, a menos que seja mantida. Se for sustentado, registre uma solicitação de suporte no Suporte do Azure.

Truncamento de log impedido por uma transação ativa

O cenário mais comum para um log de transações que não pode aceitar novas transações é uma transação de longa duração ou bloqueada.

Execute esta consulta de exemplo para localizar transações não confirmadas ou ativas e suas propriedades.

  • Retorna informações sobre propriedades de transação, de sys.dm_tran_ative_transactions.
  • Retorna informações de conexão de sessão, do sys.dm_exec_sessions.
  • Retorna informações de solicitação (para solicitações ativas), de sys.dm_exec_requests. Esta consulta também pode ser usada para identificar sessões que estão sendo bloqueadas, procure o request_blocked_by. Para obter mais informações, consulte Reunir informações de bloqueio.
  • Retorna o texto da solicitação atual ou o texto do buffer de entrada, usando os DMVs sys.dm_exec_sql_text ou sys.dm_exec_input_buffer . Se os dados retornados pelo text campo de sys.dm_exec_sql_text é NULL, a solicitação não está ativa, mas tem uma transação pendente. Nesse caso, o campo de contém a última instrução passada para o event_info mecanismo de banco de sys.dm_exec_input_buffer dados.
SELECT [database_name] = db_name(s.database_id)
, tat.transaction_id, tat.transaction_begin_time, tst.session_id 
, session_open_transaction_count = tst.open_transaction_count
, transaction_duration_s = datediff(s, tat.transaction_begin_time, sysdatetime())
, input_buffer = ib.event_info
, request_text = CASE  WHEN r.statement_start_offset = 0 and r.statement_end_offset= 0 THEN left(est.text, 4000)
                       ELSE    SUBSTRING ( est.[text],    r.statement_start_offset/2 + 1, 
                                           CASE WHEN r.statement_end_offset = -1 THEN LEN (CONVERT(nvarchar(max), est.[text])) 
                                                ELSE r.statement_end_offset/2 - r.statement_start_offset/2 + 1
                                           END  )  END
, request_status = r.status
, request_blocked_by = r.blocking_session_id
, transaction_state = CASE tat.transaction_state    
                     WHEN 0 THEN 'The transaction has not been completely initialized yet.'
                     WHEN 1 THEN 'The transaction has been initialized but has not started.'
                     WHEN 2 THEN 'The transaction is active - has not been committed or rolled back.'
                     WHEN 3 THEN 'The transaction has ended. This is used for read-only transactions.'
                     WHEN 4 THEN 'The commit process has been initiated on the distributed transaction. This is for distributed transactions only. The distributed transaction is still active but further processing cannot take place.'
                     WHEN 5 THEN 'The transaction is in a prepared state and waiting resolution.'
                     WHEN 6 THEN 'The transaction has been committed.'
                     WHEN 7 THEN 'The transaction is being rolled back.'
                     WHEN 8 THEN 'The transaction has been rolled back.' END 
, transaction_name = tat.name
, azure_dtc_state    --Applies to: Azure SQL Database only
             =    CASE tat.dtc_state 
                 WHEN 1 THEN 'ACTIVE'
                 WHEN 2 THEN 'PREPARED'
                 WHEN 3 THEN 'COMMITTED'
                 WHEN 4 THEN 'ABORTED'
                 WHEN 5 THEN 'RECOVERED' END
, transaction_type = CASE tat.transaction_type    WHEN 1 THEN 'Read/write transaction'
                                             WHEN 2 THEN 'Read-only transaction'
                                             WHEN 3 THEN 'System transaction'
                                             WHEN 4 THEN 'Distributed transaction' END
, tst.is_user_transaction
, local_or_distributed = CASE tst.is_local WHEN 1 THEN 'Local transaction, not distributed' WHEN 0 THEN 'Distributed transaction or an enlisted bound session transaction.' END
, transaction_uow    --for distributed transactions. 
, s.login_time, s.host_name, s.program_name, s.client_interface_name, s.login_name, s.is_user_process
, session_cpu_time = s.cpu_time, session_logical_reads = s.logical_reads, session_reads = s.reads, session_writes = s.writes
, observed = sysdatetimeoffset()
FROM sys.dm_tran_active_transactions AS tat 
INNER JOIN sys.dm_tran_session_transactions AS tst  on tat.transaction_id = tst.transaction_id
INNER JOIN Sys.dm_exec_sessions AS s on s.session_id = tst.session_id 
LEFT OUTER JOIN sys.dm_exec_requests AS r on r.session_id = s.session_id
CROSS APPLY sys.dm_exec_input_buffer(s.session_id, null) AS ib 
OUTER APPLY sys.dm_exec_sql_text (r.sql_handle) AS est;

Gestão de ficheiros para libertar mais espaço

Se o log de transações for impedido de truncar nos pools elásticos do Banco de Dados SQL do Azure, liberar espaço para o pool elástico pode fazer parte da solução. No entanto, resolver a raiz da condição que bloqueia o truncamento do arquivo de log de transações é fundamental. Em alguns casos, a criação temporária de mais espaço em disco permite que transações de longa duração sejam concluídas, removendo a condição que impede o truncamento do arquivo de log de transações com um backup de log de transações normal. No entanto, liberar espaço pode fornecer apenas alívio temporário até que o log de transações cresça novamente.

Para obter mais informações sobre como gerenciar o espaço de arquivo de bancos de dados e pools elásticos, consulte Gerenciar espaço de arquivo para bancos de dados no Banco de Dados SQL do Azure.

Erro 40552: A sessão foi encerrada devido ao uso excessivo de espaço no log de transações

40552: The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Para resolver este problema, experimente os métodos seguintes:

  1. O problema pode ocorrer em qualquer operação DML, como inserir, atualizar ou excluir. Revise a transação para evitar gravações desnecessárias. Tente reduzir o número de linhas que são operadas imediatamente implementando lotes ou dividindo em várias transações menores. Para obter mais informações, consulte Como usar o processamento em lote para melhorar o desempenho do aplicativo do Banco de dados SQL.
  2. O problema pode ocorrer devido a operações de reconstrução de índice. Para evitar esse problema, verifique se a seguinte fórmula é verdadeira: (número de linhas afetadas na tabela) multiplicado por (o tamanho médio do campo atualizado em bytes + 80) < 2 gigabytes (GB). Para tabelas grandes, considere criar partições e executar a manutenção do índice apenas em algumas partições da tabela. Para obter mais informações, consulte Criar tabelas e índices particionados.
  3. Se você executar inserções em massa usando o utilitário ou a System.Data.SqlClient.SqlBulkCopy classe, tente usar as -b batchsize opções ou BatchSize para limitar o número de linhas copiadas para o bcp.exe servidor em cada transação. Para obter mais informações, consulte bcp Utility.
  4. Se você estiver reconstruindo um índice com a ALTER INDEX instrução, use as SORT_IN_TEMPDB = ONopções , ONLINE = ONe RESUMABLE=ON . Com índices retomáveis, o truncamento de log é mais frequente. Para obter mais informações, consulte ALTER INDEX (Transact-SQL).

Nota

Para obter mais informações sobre outros erros de governança de recursos, consulte Erros de governança de recursos.

Próximos passos