Uzyskaj transakcje, które zakończyły się niepowodzeniem lub nigdy nie zostały popełnione

Odpowiedzi:

5

Nie, SQL Server nie przechowuje żadnej historii transakcji, które zostały przerwane / wycofane, co jest trywialne i nie wprowadza dodatkowych potencjalnych problemów (zgodnie z odpowiedzią @ ooutwire ). A nawet transakcje, które zostały popełnione.

Będziesz musiał wykonać własne rejestrowanie w ramach obsługi błędów lub przechwycić określone zdarzenia związane z transakcją za pomocą śledzenia po stronie serwera lub zdarzeń rozszerzonych.

Ślad:

wprowadź opis zdjęcia tutaj

Rozszerzone wydarzenia:

wprowadź opis zdjęcia tutaj

Aaron Bertrand
źródło
Pewnie, że tak, znajdują się w pliku dziennika i plikach kopii zapasowych dziennika.
ooutwire
1
@ooutwire i jak łatwo do nich dotrzeć? Jak się do nich dostać, jeśli nie ma ich już w dzienniku? Te zapisy dziennika są co najwyżej przemijające.
Aaron Bertrand
Zobacz moją odpowiedź. Najlepszym sposobem jest tworzenie częstych kopii zapasowych dzienników. Zgodziłbym się, że takie rozwiązanie nie jest idealne; ale nie widzę powodu, dla którego miałbym cały czas szukać w sprawie przerwanych transakcji. Jeśli takie jest pragnienie, rozsądnym rozwiązaniem wydaje się ślad lub XEvent.
ooutwire
2
Oczywiście widziałem twoją odpowiedź. Powiedziałem łatwo, a także powinienem był rzetelnie powiedzieć . :-)
Aaron Bertrand
6
Jestem z @AaronBertrand w tej sprawie. Przy kłopotach związanych z przeczesywaniem dzienników transakcji ( uwaga: nie do tego, do czego są przeznaczone ) równie dobrze możesz po prostu stworzyć lekką sesję XE dla tego rozwiązywania problemów.
Thomas Stringer,
4

Co powiesz na „nieudane” transakcje?

Jeśli chcesz zobaczyć bieżące transakcje w instancji, możesz skorzystać z sys.dm_tran_active_transactionsDMV.

Ponadto, sys.dm_exec_sessionsma open_transaction_count, że może dać Ci te informacje sesji. Poniżej znajduje się zapytanie diagnostyczne umożliwiające pobranie wszystkich procesów użytkownika, które mają otwarte transakcje:

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;

Informacje te można również pobrać z sys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

Jeśli chcesz przechwycić, kiedy transakcje zostały wycofane (zakładając, że tak bardzo pragniesz transakcji „nieudanych”), możesz przechwycić zdarzenie Extended Events rollback_tran_completed. Jeśli szukasz widoku transakcji „wszystko”, możesz uchwycić sql_transactionzdarzenie zdefiniowane przez SQL Server

Występuje, gdy transakcja SQL Server rozpoczyna się, kończy, przywraca lub wykonuje punkt zapisu. To zdarzenie służy do monitorowania zachowania transakcji podczas rozwiązywania problemów z aplikacjami, wyzwalaczami lub procedurami przechowywanymi.

Thomas Stringer
źródło
4

Możesz użyć fn_dblog () i znaleźć identyfikatory transakcji dla przerwanych transakcji, a także wiele innych przydatnych informacji.

WYBIERZ * 
FN_dblog (NULL, NULL)
GDZIE Operacja = „LOP_ABORT_XACT”;
UDAĆ SIĘ

Skanuje wszystkie dzienniki transakcji w aktywnej części dziennika. Można to obejść za pomocą flagi śledzenia 2537, która pozwoli ci cofnąć się tak daleko, jak to możliwe, do początku najstarszego „nieużywanego” VLF. Zachowaj ostrożność podczas korzystania z tej funkcji, ponieważ skanuje ona losowo dziennik, a dziennik nie może się zmienić podczas skanowania; więc możesz zobaczyć wzrost logów.

Możesz także użyć fn_dump_dblog przeciwko plikowi kopii zapasowej dziennika.

ooutwire
źródło