失敗した、またはコミットされなかったトランザクションを取得する


回答:


5

いいえ、SQL Serverは、中止またはロールバックされたトランザクションに関する履歴を保持していません。これは簡単に到達でき、潜在的な問題が発生することはありません(@ooutwireの回答で概説されています)。または、コミットされたトランザクションですらあります。

エラー処理内で独自のロギングを実行するか、サーバー側のトレースまたは拡張イベントを使用して特定のトランザクション関連イベントをキャプチャする必要があります。

痕跡:

ここに画像の説明を入力してください

拡張イベント:

ここに画像の説明を入力してください


もちろん、ログファイルとログバックアップファイルにあります。
ooutwire 2013年

1
@ooutwire、そしてどうやってそれらに簡単に行くのですか?また、ログに記録されなくなった場合はどうすればそれらにアクセスできますか?これらのログレコードは、せいぜい一時的なものです。
アーロンバートランド

私の答えを見てください。最善の方法は、頻繁なログバックアップを作成することです。そのような解決策は理想的ではないことに同意します。しかし、中止されたトランザクションを常にprodで検索する理由はわかりません。それが望ましい場合は、トレースまたはXEventよりも賢明なソリューションのようです。
ooutwire 2013年

2
もちろんあなたの答えを見ました。私は簡単に言ったし、また確実に言ったほうがいい。:-)
アーロンベルトラン

6
これについては@AaronBertrandと一緒です。トランザクションログをくまなく調べるには問題があります(注:ログの対象ではありません)。このトラブルシューティングのために軽量のXEセッションを作成することもできます。
Thomas Stringer 2013年

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イベントをキャプチャできます。トランザクションの「すべて」のビューを探している場合sql_transactionは、SQL Serverで定義されているイベントをキャプチャできます。

SQL Serverトランザクションが開始、完了、ロールバック、またはセーブポイントを実行すると発生します。このイベントを使用して、アプリケーション、トリガー、またはストアドプロシージャのトラブルシューティングを行うときにトランザクションの動作を監視します。


4

fn_dblog()を使用して、中止されたトランザクションのトランザクションIDや、その他の役立つ情報を見つけることができます。

選択する * 
FROM fn_dblog(NULL、NULL)
WHEREオペレーション= 'LOP_ABORT_XACT';
行く

ログのアクティブな部分にあるすべてのトランザクションログをスキャンします。これは、トレースフラグ2537を使用してオーバーライドできます。これにより、最も古い「再利用されていない」VLFの先頭に可能な限り戻ることができます。この関数はログをランダムにスキャンし、スキャンの実行中にログを変更できないため、この関数を使用するときは注意してください。そのため、ログの増加が見られる場合があります。

ログバックアップファイルに対してfn_dump_dblogを使用することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.