Отримуйте транзакції, які не відбулися або ніколи не здійснювалися


Відповіді:


5

Ні, SQL Server не підтримує жодної історії трансакцій, які були перервані / відмовлені назад, що є тривіальним для отримання та не створює додаткових потенційних проблем (як зазначено у відповіді @ ooutwire ). Або навіть угоди, які були вчинені.

Вам доведеться проводити власний журнал у процесі обробки помилок або фіксувати конкретні події, пов’язані з транзакціями, використовуючи трасування на стороні сервера або Розширені події.

Слід:

введіть тут опис зображення

Розширені події:

введіть тут опис зображення


Звичайно, вони знаходяться у файлі журналу та файлах резервного копіювання журналу.
ooutwire

1
@ooutwire і як до них легко потрапити? А як ви дістанетесь до них, якщо їх більше немає в журналі? Ці записи журналу в кращому випадку є тимчасовими.
Аарон Бертран

Дивіться мою відповідь. Найкращий спосіб - це створювати часті резервні копії журналу. Я погодився б, що таке рішення не є ідеальним; але я не бачу причин, чому б я весь час шукав у продажі для перерваних транзакцій. Якщо це бажання, то сліди чи XEvent здадуться розумним рішенням.
ooutwire

2
Я, звичайно, бачив вашу відповідь. Я сказав легко, і також повинен був би сказати надійно . :-)
Аарон Бертран

6
Я разом з @AaronBertrand. З проблемою, яка буде потрібна для розчісування журналів транзакцій ( Примітка: не те, для чого вони призначені ), ви також можете просто створити легкий XE-сеанс для цього усунення несправностей.
Томас Стрінгер

4

Коли ви говорите "невдалі" транзакції, що саме ви маєте на увазі?

Якщо ви хочете побачити поточні транзакції на екземплярі, ви можете використовувати sys.dm_tran_active_transactionsDMV.

Також sys.dm_exec_sessionsє те, open_transaction_countщо може надати вам цю інформацію за сеансом. Нижче наводиться діагностичний запит, щоб витягнути всі користувацькі процеси, які мають відкриті транзакції:

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;

Цю інформацію можна також отримати з sys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

Якщо ви хочете зафіксувати, коли трансакції були відмовлені назад (якщо ви так сильно бачитесь на "невдалі" транзакції), ви можете зафіксувати rollback_tran_completedподію Extended Events . Якщо ви шукаєте перегляд транзакцій "все", ви можете зафіксувати sql_transactionподію, яку визначає SQL Server

Виникає, коли транзакція SQL Server починається, завершується, повертається назад або виконується точка збереження. Використовуйте цей захід для моніторингу поведінки транзакцій під час усунення несправностей із програмами, тригерами або збереженими процедурами.


4

Ви можете використовувати fn_dblog () і знайти ідентифікатори транзакцій для перерваних транзакцій, а також безліч іншої корисної інформації.

ВИБІР * 
FN_dblog (NULL, NULL)
WHERE Операція = 'LOP_ABORT_XACT';
ПОВЕРНУТИСЯ

Він сканує весь журнал транзакцій в активній частині журналу. Це можна перекрити, використовуючи прапор трас 2537, який дозволить вам повернутися якомога далі до початку найдавнішого "повторно використаного" VLF. Будьте обережні, використовуючи цю функцію, оскільки вона сканує журнал випадковим чином і журнал не може змінюватися, коли відбувається сканування; Таким чином, ви можете побачити зростання журналу.

Ви також можете використовувати fn_dump_dblog проти файлу резервного копіювання журналу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.