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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: SQL数据库开发

发现故障

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

吓一跳!~

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

第一反应就想可能是日志问题,很可能是数据库日志问题

于是查看日志,都不大,正常。


dbcc sqlperf(logspace)




查找原因


看看系统报错:

80.jpg

         C盘已用空间

81.jpg

                         系统提示

82.jpg

                                 事件结果

83.jpg

                                 事件原因



确认原因


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


select name,log_reuse_wait_desc from sys.databases

                            84.jpg

查看系统数据库日志状态


数据库日记现在没什么操作,可能是执行完了。


活动的虚拟日志也不多,10个左右:


dbcc loginfo


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


85.jpg


解决问题


于是马上收缩日志,收缩数据文件,收缩出1G左右。

还是不行,继续不断地更改大小不断收缩,只要小于55G都改数据进行收缩,竟然还能收缩了9G!


DBCCSHRINKFILE (N'tempdev' , 1024)--单位为MB  

DBCCSHRINKDATABASE (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  

innerjoin 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)  

orderby t1.internal_objects_alloc_page_count desc

86.jpg

有四个关键信息:

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  

crossapply sys.dm_exec_sql_text(p.sql_handle) s  

where spid = 1589


看到最后有一条语句:



87.jpg

拷贝出来,几乎是数据库中最大的 8个表做inner join 连接 查询!

代码就不贴出来了。


目前已经查出什么原因导致了tempdb增大的问题。tempdb从55285MB收缩为47765MB。

88.jpg

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


USE [master]  

GO  

ALTERDATABASE [tempdb] MODIFYFILE ( NAME = N'tempdev', SIZE = 524288KB )  

GO


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

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
13天前
|
SQL 数据可视化 算法
SQL Server聚类数据挖掘信用卡客户可视化分析
SQL Server聚类数据挖掘信用卡客户可视化分析
|
2天前
|
SQL 存储 数据库连接
LabVIEW与SQL Server 2919 Express通讯
LabVIEW与SQL Server 2919 Express通讯
|
3天前
|
SQL Windows
安装SQL Server 2005时出现对性能监视器计数器注册表值执行系统配置检查失败的解决办法...
安装SQL Server 2005时出现对性能监视器计数器注册表值执行系统配置检查失败的解决办法...
12 4
|
3天前
|
SQL 数据可视化 Oracle
这篇文章教会你:从 SQL Server 移植到 DM(上)
这篇文章教会你:从 SQL Server 移植到 DM(上)
|
3天前
|
SQL 关系型数据库 数据库
SQL Server语法基础:入门到精通
SQL Server语法基础:入门到精通
SQL Server语法基础:入门到精通
|
3天前
|
SQL 存储 网络协议
SQL Server详细使用教程
SQL Server详细使用教程
26 2
|
3天前
|
SQL 存储 数据库连接
C#SQL Server数据库基本操作(增、删、改、查)
C#SQL Server数据库基本操作(增、删、改、查)
7 0
|
4天前
|
SQL 存储 小程序
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
数据库数据恢复环境: 5块硬盘组建一组RAID5阵列,划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库,存储空间在操作系统层面划分了三个逻辑分区。 数据库故障: 数据库文件丢失,主要涉及3个数据库,数千张表。数据库文件丢失原因未知,不能确定丢失的数据库文件的存放位置。数据库文件丢失后,服务器仍处于开机状态,所幸未写入大量数据。
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
|
5天前
|
SQL 存储 关系型数据库
SQL Server详细使用教程及常见问题解决
SQL Server详细使用教程及常见问题解决
|
6天前
|
SQL 安全 数据库
SQL Server 备份和还原
SQL Server 备份和还原