前言


 


tempdb暴增,造成磁盘空间不足,甚至影响业务运行。


 


 


正文


 


如图,tempdb log文件从7.40开始突然暴涨,因为 tempdb 0 M到 40G


 




tempdb突然暴增_回滚

 


 


tempdb 所在磁盘是C 盘




tempdb突然暴增_Server_02


C盘的可用空间正好也为40G



tempdb突然暴增_回滚_03


在下午16.22左右的时候tempdb 文件暴涨已经影响到业务使用.临时解决是备份收缩日志。下面通过监控信息查找造成问题的原因:


 


查看7.40 之后这段时间 的运行语句,发下有个会话1085一直在运行



tempdb突然暴增_Server_04


这个会话分配了内部对象(就是使用了tempdb的对象)


 

tempdb突然暴增_回滚_05


而言会话从7.46开始,一直持续到下午16.20 从时间上也非常吻合。所以他就是我们要找的元凶。


 


原因


 


对应普通的 简单模式的数据库无法重用日志的主要原因是没有做checkpoint,和存在没有提交的事务。但对于TEMPDB 来讲 他不需要预写日志。因为Tempdb 不支持重做(Redo)但需支持回滚(rollback).这也是tempdb日志存在的原因.


 


如果一个事务还没有提交,那它可以在任何时候回滚。SQL Server必须做好这种准备,以便能够从日志记录中找回修改前的数据内容,完成回滚。在SQL Server里面,所有的日志记录都有严格顺序,中间不可以有任何跳跃。所以如果某个数据库有没有提交的事务,SQL Server会标记所有从这个事务开始的日志记录(不管和这个事务有没有关系)为活动事务日志 。这些日志记录都有可能“需要”被用来做回滚。


 


解决


找到语句后,这个语句一直持续运行的原因是,等待ASYNC_NETWORK_IO


这说明,客户端和数据库服务器网络传输存在问题或者程序中未接收数据库传输的数据。更多的是后者。问题就提交给开发,检查代码,对程序进行优化。


补充


 


查看日志空间使用的方法:


 


DBCC LOGinfo() 查看vlf的状态


 


DBCC SQLPERF(LOGSPACE) 建议用,查看日志空间的使用 ,更准。



tempdb突然暴增_Server_06


从UI 或者查


 


 

tempdb突然暴增_tempdb突然暴增_07

 用下面的语句查:



tempdb突然暴增_回滚_08


都是不准的