SQL Server中遇到tempdb突然暴涨怎么办?

发现故障

今天操作着服务器,突然右下角提示“C盘空间不足”!

吓一跳!~看看C盘,还有7M!!!这么大的C盘空间怎么会没了呢?搞不好等下服务器会动不了!

第一反应就想可能是日志问题,很可能是数据库日志问题于是查看日志,都不大,正常。

dbcc sqlperf(logspace)

查找原因


看看系统报错:
图片C盘已用空间
图片
系统提示
图片事件结果
图片
事件原因

确认原因

是tempdb问题,但是刚才看日志才几M,根据提示查看日志状态:

select name,log_reuse_wait_desc from sys.databases

图片
查看系统数据库日志状态
数据库日记现在没什么操作,可能是执行完了。
活动的虚拟日志也不多,10个左右:

dbcc loginfo

查看当前tempdb情况,吓一跳啊,tempdb数据文件55G!看上面的图,也就是突然增长的。
图片

解决问题

于是马上收缩日志,收缩数据文件,收缩出1G左右。还是不行,继续不断地更改大小不断收缩,只要小于55G都改数据进行收缩,竟然还能收缩了9G!

DBCC SHRINKFILE (N'tempdev' , 1024)--单位为MB  
DBCC SHRINKDATABASE (tempdb, 1024);--单位为MB

暂时缓解了,看来是收缩不了了。都说得重启服务器才行,当前连接较多,没有重启.所以先查查什么原因引起的。
查看当前的各种游标,SQL ,堵塞等,没发现什么,事务应该执行完了。
查看tempdb记录的分配情况:

use tempdb  
go  
SELECT top 10 t1.session_id,                                                      
t1.internal_objects_alloc_page_count,  t1.user_objects_alloc_page_count,  
t1.internal_objects_dealloc_page_count , t1.user_objects_dealloc_page_count,
t3.login_name,t3.status,t3.total_elapsed_time  
from sys.dm_db_session_space_usage  t1  
inner join sys.dm_exec_sessions as t3  
on t1.session_id = t3.session_id  
where (t1.internal_objects_alloc_page_count>0  
or t1.user_objects_alloc_page_count >0  
or t1.internal_objects_dealloc_page_count>0  
or t1.user_objects_dealloc_page_count>0)  
order by t1.internal_objects_alloc_page_count desc

(提示:可以左右滑动代码)图片

有四个关键信息:session_id :稍等可以查询该session的相关信息internal_objects_alloc_page_count  :分配给session内部对象的数据页
internal_objects_dealloc_page_count :已经释放的数据页
login_name : 该session的登录名

从internal_objects_alloc_page_count  和internal_objects_dealloc_page_count可以看出,给session分配了7236696页,计算一下:

select 7236696*8/1024/1024 as [size_GB]

竟然为55G,几乎和tempdb增长的大小一致,可以断定就是这个session引起的。internal_objects_dealloc_page_count 可以看到已经释放了,暂用tempdb的数据已经释放了。
通过登录名,已经知道谁在操作了。(这就是给每个相关人员自己登录名的好处之一,可以很快追踪使用者,是内部人员操作)

如果查询上面的DMV距事件发生的时间太久,可能就查不到了。(我这不到5小时再查询,上面的session就查不到了,所以要尽快查看)
现在看看这session_id的用处:

select p.*,s.text  
from master.dbo.sysprocesses p  
cross apply sys.dm_exec_sql_text(p.sql_handle) s  
where spid = 1589

看到最后有一条语句:
图片拷贝出来,几乎是数据库中最大的 8个表做inner join 连接 查询!!代码就不贴出来了。
目前已经查出什么原因导致了tempdb增大的问题。tempdb从55285MB收缩为47765MB。
图片

后来因升级重启过服务器,SQLserver服务页就重新启动了,顺便把tempdb的数据文件大小改了。

USE [master]  
GO  
ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev', SIZE = 524288KB )  
GO

至此,tempdb突然暴涨的问题就解决了

posted on   数据与人文  阅读(358)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2020-06-10 Oracle 字符集修改
2020-06-10 Oracle编译失效对象
2020-06-10 impdp导入报错案例-ORA-00907-建表缺失右括号
2020-06-10 检查交换空间: 可用的交换空间为 0 MB, 所需的交换空间为 150 MB。 未通过 <<<<
2020-06-10 Oracle修改数据文件路径
2020-06-10 Oracle RMAN备份数据库
2020-06-10 SSH Secure Shell Client中文乱码的解决办法
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示