Holen Sie sich Transaktionen, die fehlgeschlagen sind oder nie festgeschrieben wurden

Antworten:

5

Nein, SQL Server verwaltet keinen Verlauf von Transaktionen, die abgebrochen / zurückgesetzt wurden, was trivial ist und keine zusätzlichen potenziellen Probleme mit sich bringt (wie in der Antwort von @ ooutwire beschrieben ). Oder sogar Transaktionen, die festgeschrieben wurden.

Sie müssen Ihre eigene Protokollierung im Rahmen Ihrer Fehlerbehandlung durchführen oder bestimmte transaktionsbezogene Ereignisse mithilfe der serverseitigen Ablaufverfolgung oder der erweiterten Ereignisse erfassen.

Spur:

Geben Sie hier die Bildbeschreibung ein

Erweiterte Veranstaltungen:

Geben Sie hier die Bildbeschreibung ein

Aaron Bertrand
quelle
Sicher, sie befinden sich in der Protokolldatei und den Protokollsicherungsdateien.
Ooutwire
1
@ooutwire und wie kommst du leicht zu diesen? Und wie kommt man zu ihnen, wenn sie nicht mehr im Protokoll sind? Diese Protokollsätze sind bestenfalls vorübergehend.
Aaron Bertrand
Siehe meine Antwort. Der beste Weg ist, häufige Protokollsicherungen zu erstellen. Ich würde zustimmen, dass eine solche Lösung nicht ideal ist; Aber ich sehe keinen Grund, warum ich die ganze Zeit in Prod nach abgebrochenen Transaktionen suchen würde. Wenn dies der Wunsch ist, dann scheint eine Spur oder XEvent die umsichtige Lösung zu sein.
Ooutwire
2
Ich habe deine Antwort natürlich gesehen. Ich sagte leicht und hätte es auch zuverlässig sagen sollen . :-)
Aaron Bertrand
6
Ich bin mit @AaronBertrand in diesem Fall. Mit der Mühe, Transaktionsprotokolle zu durchsuchen ( Hinweis: nicht das, wofür sie bestimmt sind ), können Sie für diese Fehlerbehebung auch einfach eine einfache XE-Sitzung erstellen.
Thomas Stringer
4

Was genau meinen Sie mit "fehlgeschlagenen" Transaktionen?

Wenn Sie aktuelle Transaktionen auf der Instanz anzeigen möchten, können Sie die sys.dm_tran_active_transactionsDMV verwenden.

Hat sys.dm_exec_sessionsauch das open_transaction_count, das Ihnen diese Informationen nach Sitzung geben kann. Im Folgenden finden Sie eine Diagnoseabfrage zum Abrufen aller Benutzerprozesse mit offenen Transaktionen:

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;

Diese Informationen können auch abgerufen werden aus sys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

Wenn Sie erfassen möchten, wann Transaktionen zurückgesetzt wurden (vorausgesetzt, Sie möchten "fehlgeschlagene" Transaktionen wünschen), können Sie das Ereignis "Erweiterte Ereignisse" erfassen rollback_tran_completed. Wenn Sie nach einer "Alles" -Ansicht von Transaktionen suchen, können Sie sql_transactiondas von SQL Server definierte Ereignis erfassen

Tritt auf, wenn eine SQL Server-Transaktion einen Sicherungspunkt beginnt, abschließt, zurücksetzt oder ausführt. Verwenden Sie dieses Ereignis, um das Transaktionsverhalten bei der Fehlerbehebung bei Anwendungen, Triggern oder gespeicherten Prozeduren zu überwachen.

Thomas Stringer
quelle
4

Sie können fn_dblog () verwenden und die Transaktions-IDs für abgebrochene Transaktionen sowie eine Vielzahl anderer nützlicher Informationen finden.

WÄHLEN * 
FROM fn_dblog (NULL, NULL)
WHERE Operation = 'LOP_ABORT_XACT';
GEHEN

Es durchsucht das gesamte Transaktionsprotokoll im aktiven Teil des Protokolls. Dies kann mit dem Trace-Flag 2537 überschrieben werden, mit dem Sie so weit wie möglich zum Start des ältesten "nicht wiederverwendeten" VLF zurückkehren können. Seien Sie vorsichtig, wenn Sie diese Funktion verwenden, da das Protokoll zufällig gescannt wird und sich das Protokoll während des Scanvorgangs nicht ändern kann. Möglicherweise sehen Sie ein logarithmisches Wachstum.

Sie können fn_dump_dblog auch für eine Protokollsicherungsdatei verwenden.

ooutwire
quelle