Obter transações que falharam ou nunca foram confirmadas

10

Existe algum lugar em que eu possa procurar para encontrar transações com falha no SQL Server 2012?

Jeff
fonte

Respostas:

5

Não, o SQL Server não mantém histórico de transações que foram abortadas / revertidas, o que é trivial e não apresenta problemas potenciais adicionais (conforme descrito na resposta do @ ooutwire ). Ou mesmo transações que foram confirmadas.

Você precisará executar seu próprio log no tratamento de erros ou capturar eventos específicos relacionados à transação usando o rastreamento do lado do servidor ou Eventos Estendidos.

Vestígio:

insira a descrição da imagem aqui

Eventos estendidos:

insira a descrição da imagem aqui

Aaron Bertrand
fonte
Claro que sim, eles estão no arquivo de log e nos arquivos de backup de log.
ooutwire
11
@outout e como você consegue isso facilmente? E como chegar a eles se eles não estão mais no log? Esses registros são transitórios, na melhor das hipóteses.
Aaron Bertrand
Veja minha resposta. A melhor maneira é criar backups de log frequentes. Concordo que essa solução não é ideal; mas não vejo razão para procurar o tempo todo em transações abortadas. Se esse é o desejo, um rastreamento ou um XEvent pareceria a solução prudente.
ooutwire
2
Eu vi sua resposta, é claro. Eu disse com facilidade e também deveria ter dito com segurança . :-)
Aaron Bertrand
6
Estou com @AaronBertrand neste. Com o problema necessário para analisar os logs de transações ( Nota: não para o que eles se destinam ), você também pode criar uma sessão leve do XE para esta solução de problemas.
Thomas Stringer
4

Quando você diz transações "com falha", o que exatamente você quer dizer?

Se você quiser ver as transações atuais na instância, poderá utilizar o sys.dm_tran_active_transactionsDMV.

Além disso, sys.dm_exec_sessionspossui o open_transaction_countque pode fornecer essas informações por sessão. Abaixo está uma consulta de diagnóstico para extrair todos os processos do usuário que possuem transações abertas:

select 
    s.session_id,
    s.login_name,
    s.open_transaction_count,
    st.text as most_recent_sql_text
from sys.dm_exec_sessions s
inner join sys.dm_exec_connections c
on s.session_id = c.session_id
outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) st
where s.is_user_process = 1
and s.open_transaction_count > 0;

Esta informação também pode ser extraída de sys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

Se você deseja capturar quando as transações foram revertidas (assumindo o desejo de transações "com falha"), você pode capturar o rollback_tran_completedevento Eventos Estendidos . Se você estiver procurando por uma exibição "tudo" das transações, poderá capturar o sql_transactionevento, conforme definido pelo SQL Server.

Ocorre quando uma transação do SQL Server começa, é concluída, reverte ou executa um ponto de salvamento. Use este evento para monitorar o comportamento da transação ao solucionar problemas de aplicativos, gatilhos ou procedimentos armazenados.

Thomas Stringer
fonte
4

Você pode usar fn_dblog () e encontrar os IDs de transação para transações abortadas, bem como uma série de outras informações úteis.

SELECT * 
FROM fn_dblog (NULL, NULL)
WHERE Operação = 'LOP_ABORT_XACT';
VAI

Ele verifica todo o log de transações na parte ativa do log. Isso pode ser substituído usando o sinalizador de rastreamento 2537, que permitirá retornar o mais longe possível ao início do VLF "não reutilizado" mais antigo. Tenha cuidado ao usar esta função, pois ela verifica o log aleatoriamente e o log não pode ser alterado quando a verificação estiver ocorrendo; portanto, você pode ver o crescimento do log.

Você também pode usar o fn_dump_dblog em um arquivo de backup de log.

ooutwire
fonte