web-dev-qa-db-ja.com

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

SQL Server 2012で失敗したトランザクションを見つけるために調べられる場所はありますか?

10
Jeff

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

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

痕跡:

enter image description here

拡張イベント:

enter image description here

5
Aaron Bertrand

「失敗した」トランザクションと言うとき、正確にはどういう意味ですか?

インスタンスの現在のトランザクションを確認する場合は、 sys.dm_tran_active_transactions DMVを利用できます。

また、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 Serverで定義されているsql_transactionイベントをキャプチャできます。

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

4
Thomas Stringer

Fn_dblog()を使用して、打ち切られたトランザクションのトランザクションIDと、その他の有用な情報のホストを見つけることができます。

 SELECT * 
 FROM fn_dblog(NULL、NULL)
 WHERE操作= 'LOP_ABORT_XACT'; 
 GO 

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

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

4
ooutwire