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 天)。但是,每次我检查时,这些会话的 open_tran 列都是零。该应用程序正在使用隐式事务——不确定这是否相关。
此外,从今天早上起,为其中一个会话报告的主机名已更改(不,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。
杀死后,再次运行第一个查询,看看是否还有需要清除的内容。
在某些情况下,您可能需要首先查找孤立事务来查找 UOW,这些事务的会话 ID 应该为 -2。
有关更多信息,请参阅Kill (Transact-SQL)。