web-dev-qa-db-ja.com

バージョンストアが爆発しましたが、責任のあるセッションで開いているトランザクションがありません

Tempdbは成長しており、すべてバージョンストアデータです。私が走ると:

select hostname,elapsed_time_seconds,session_id, transaction_id, is_snapshot, blocked, lastwaittype, cpu, physical_io,  open_tran, cmd 
from sys.dm_tran_active_snapshot_database_transactions a
join master..sysprocesses b
on a.session_id=b.spid 
order by a.elapsed_time_seconds desc

これは、elapsed_time_secondsが約400,000(〜4.5日)の2つのセッションを示しています。ただし、これらのセッションのopen_tran列は、確認するたびにゼロです。アプリケーションは暗黙的なトランザクションを使用しています-それが関連しているかどうかは不明です。

また、これらのセッションの1つについて報告されるホスト名は、今朝から変更されています(IPアドレスもホスト名も変更されていません)。したがって、今朝そのセッションIDを持っていたクライアントが切断され、別のクライアントがそのセッションIDを持っているようです。

ほとんどの場合、これらのセッションのアクティブなトランザクションは表示されませんが、sys.dm_tran_active_transactionsのtransaction_idと一致するトランザクションが次のプロパティで見つかります。

transaction_begin_time: [~4.5 days ago]
name: DTCXact
transaction_type: 4
transaction_state: 2
transaction_status: 12
transaction_status2: 386
dtc_state: 1
dtc_status: 0
dtc_isolation_level: 4096

私が見ているものを説明する方法はありますか?開いているトランザクションがない場合、なぜバージョンストアでアクティブなものがあるのですか?

SQL Server 2014 SP2 12.0.5214.6

enter image description here

3
Tony Hinkle

この問題は、孤立した分散トランザクションが原因で発生しました。トランザクションは孤立しているため、セッションIDは表示されるまでに無効になります。状態をクリアするには、アクティブなスナップショットを持つ最も古いトランザクションを見つけ、作業単位(UOW)を検索してから、UOWを強制終了します。

--find the transaction with the oldest snapshot version
select top 1 transaction_id, elapsed_time_seconds 
from sys.dm_tran_active_snapshot_database_transactions a
order by a.elapsed_time_seconds desc

--using the transaction ID from the query above, find it in the active
--transactions DMV.  You should see the begin time as many minutes/hours ago
select transaction_id, transaction_begin_time, transaction_uow 
from sys.dm_tran_active_transactions where transaction_id in(<transaction_id>)

--using the transaction_uow from the query above, kill the unit of work 
kill '<transaction_uow>'

強制終了した後、最初のクエリを再度実行して、クリアする必要があるものがあるかどうかを確認します。

セッションIDが-2であるはずの孤立したトランザクションを最初に見つけることによって、UOWを見つける必要がある場合があります。

select * from sys.dm_tran_locks where request_session_id = -2

詳細は Kill(Transact-SQL) を参照してください。

1
Tony Hinkle