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
この問題は、孤立した分散トランザクションが原因で発生しました。トランザクションは孤立しているため、セッション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) を参照してください。