收缩 tempdb 数据库

本文介绍了一种在不重启SQL Server的情况下将tempdb数据库收缩至500MB的方法。通过先使用DBCCFREESYSTEMCACHE('ALL')释放缓存中的未使用条目,再执行DBCCSHRINKFILE进行收缩。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自   http://blog.51cto.com/jimshu/1768439

客户需求:

这是一个生产环境,在夜深人静的时候发现 tempdb 已经超过500GB。

 

需求分析:

我们知道,如果重启 SQL Server,tempdb 会自动重新创建,从而使 tempdb 回归到初始大小。但是这是生产环境,不允许重启 SQL Server。

 

尝试:

直接收缩 tempdb,始终不成功。

USE [tempdb]
GO

DBCC SHRINKFILE (N'tempdev' , 0, TRUNCATEONLY)  --释放所有可用空间
GO

DBCC SHRINKFILE (N'tempdev' , 500) -- 收缩到 500MB

GO

 

解决方案:

SQL Server 2005 及后续版本为了增强 tempdb 的性能,会缓存一些 IAM 页,以备将来重新使用这些页面。在这种情况下,必须首先释放 IAM 页,才能释放其对应的页面。因此,通过 DBCC FREESYSTEMCACHE,从所有缓存中释放所有未使用的缓存条目,然后再收缩 tempdb 。

USE [tempdb]
GO

DBCC FREESYSTEMCACHE ('ALL')

GO

DBCC SHRINKFILE (N'tempdev' , 500)

GO

 

终于收缩到 500 MB。成功!

 

 

关于 DBCC FREESYSTEMCACHE,请参考 https://technet.microsoft.com/zh-cn/library/ms178529.aspx

### 关于 SQL Server TempDB 数据库问题及解决方法 #### 温馨提示 TempDB 是 SQL Server 中的一个临时数据库,用于存储临时对象、表变量以及内部工作表等。由于其高并发性和频繁的读写操作,如果未正确配置或管理不当,则可能引发性能瓶颈或其他问题。 --- #### 性能影响因素分析 1. **闩锁争用问题** 当多个会话尝试访问同一页面时,可能会发生闩锁争用现象。这种争用通常发生在 TempDB 的分配结构上(如 PFS 页面)。为了减少此类争用,可以增加 TempDB 文件的数量以匹配服务器上的 CPU 数量[^1]。例如,在具有 8 个逻辑处理器的系统中,建议创建至少 8 个相同大小的数据文件来分担负载。 2. **自动收缩功能的影响** 如果启用了 TempDB 自动收缩功能,这可能导致磁盘 I/O 增加并降低整体性能[^2]。应禁用此选项以防止不必要的资源消耗。 3. **数据文件位置不合理** 默认情况下,TempDB 被放置在操作系统驱动器(C:) 上。然而,随着负载增长,该数据库可能会占用大量空间从而威胁到系统的稳定性[^3]。最佳实践是将其移动至专用高速存储设备或者更大的分区中去。 4. **监控活动事务状态** 可通过动态管理视图(DMVs) 或者其他工具实时跟踪当前正在进行中的事务详情[^4]。这对于诊断长时间运行的操作特别有用。 --- #### 解决方案实施指南 以下是针对上述提到的一些常见问题的具体解决方案: ##### 配置多实例数据文件 可以通过执行下面脚本来调整现有设置: ```sql USE master; GO ALTER DATABASE tempdb ADD FILE ( NAME = 'tempdev2', FILENAME = 'D:\SQLData\tempdb2.ndf', SIZE = 8MB, MAXSIZE = UNLIMITED, FILEGROWTH = 64MB); GO ``` 注意:确保新增加路径存在并且有足够的可用容量支持预期的工作负荷需求。 ##### 修改默认路径 要改变初始安装后的默认目录,请参照如下命令完成迁移过程: ```sql USE master; GO ALTER DATABASE tempdb MODIFY FILE (NAME='tempdev', FILENAME='E:\NewPath\tempdb.mdf'); ALTER DATABASE tempdb MODIFY FILE (NAME='templog', FILENAME='F:\AnotherPath\templog.ldf'); GO ``` > 提醒:重启服务才能使更改生效! ##### 禁止启用自动缩小特性 检查是否已开启此项属性,并设为关闭模式: ```sql EXEC sp_configure 'show advanced options', 1 ; RECONFIGURE ; GO EXEC sp_configure 'automatic shrink',0 ; RECONFIGURE ; GO ``` ##### 查询活跃连接情况 利用 DMVs 获取有关信息以便进一步分析潜在冲突源码样例展示如下所示: ```sql SELECT session_id, blocking_session_id, wait_type, resource_description FROM sys.dm_exec_requests WHERE database_id=DB_ID('tempdb') AND session_id<>@@SPID; ``` --- #### 结论 通过对以上几个方面的优化处理措施能够有效缓解大部分由 TEMPDB 引发的相关难题。当然除了这些常规手段之外还需要定期审查硬件条件是否满足实际业务场景的要求;另外也要记得保持软件版本处于最新稳定版之上以免受到已知漏洞攻击风险侵害。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值