背景
某医院 信息科接到CIS系统磁盘空间不足告警,通过排查发现tempdb的日志文件暴增,已经涨到了130G左右,并且还在持续增长中。 需要我们紧急排查原因。
现象 1
登陆到服务器里,确实看到了如上所说,D盘空间仅剩14.5G,并且tempdb的日志文件已经达到了130G。
登录到SQL专家云,通过趋势分析进行回溯,在 1 月2 2日上午 8 点40分之前,tempdb日志文件的总大小(蓝线)一直保持在500M,使用空间(黄线)也能被重用。从这个时间点之后, 总空间和使用空间一直增长 。
分析 2
据此推测 在1月22日上午8点40分左右有一个或者多个会话有 没有提交的事务,并且一直到现在为止都没有提交。进入 SQL专家云的 空闲会话 页面, 点击 有未提交事务 选项卡,开始查找这个时间段内的空闲会话,找到了ID为667的会话,空闲时间为16185分钟,语句最后请求结束时间正好对应上Tempdb开始增长的时间点。
点击进入完整信息,可以看到该会话在1月22日8点29分08秒建立的,在1月22日8点29分10秒开始了一个事务,在 1月 22日8点40分11秒后执行最后一条语句后不再执行语句,到目前为止该事务已经开了11天的时间。
解决 3
KILL掉这个会话,过几分钟后观察日志文件的使用空间已经下降。
但是日志文件的总大小是不变的,再执行收缩tempdb日志文件的命令即可释放掉磁盘的空间。
总结 4
这类问题的大多数原因是应用程序实现不严谨造成的,正常的流程下会提交事务,关闭数据库连接,但是如果中间某个步骤出错了,因为没有异常处理,在这个出错步骤后面的提交事务和关闭连接的代码都没有执行到,最终导致 事务和连接的泄露。