TempDB 收缩方法

1.重启服务,tempdb自动重建

2.执行脚本,避免服务重启
USE [tempdb]
GO
dbcc  freesystemcache('ALL')
Go
DBCC SHRINKfile(N'tempdev' ,10240) --收缩到2MB 
GO

-----------------------------------

3.

--1.清空县志
DUMP TRANSACTION tempdb WITH NO_LOG
--2.截断事务日志:
BACKUP LOG tempdb WITH NO_LOG
--3.收缩业话库大件
dbcc shrinkfile(templog,emptyfile);

查占用大的语句

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  


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

<think>嗯,用户这次的问题非常明确,是关于SQL Server中Tempdb数据库过大的解决方法。从提供的引用资料来看,用户已经收集了相当全面的技术文档,说明这是个实际操作中遇到的棘手问题。 用户可能是个DBA或者系统管理员,正在面临生产环境中的tempdb膨胀问题。这类问题通常出现在高并发或复杂查询场景中,用户现在的情绪可能比较焦虑,因为tempdb过大会直接影响整个数据库性能。值得注意的是,用户特意强调"上述引用仅供参考",说明ta需要的是经过实践验证的系统性解决方案,而不是零散的技巧。 翻阅五个引用资料,核心要点其实集中在几个层面:存储配置优化(引用1)、空间回收技术(引用2、4)、初始化设置(引用3)和物理文件迁移(引用5)。需要把这些碎片化建议整合成可操作的工作流。 特别要注意引用4提到的DBCC FREESYSTEMCACHE命令带有风险提示,这在生产环境必须谨慎处理。用户既然能提供这么专业的引用,说明ta应该具备一定的SQL Server运维经验,所以解决方案可以适当深入技术细节。 考虑到tempdb问题通常不是单一因素导致,应该建议用户采用阶梯式排查策略:先紧急释放空间保证系统运行,再分析根本原因,最后做长期优化。在回复中需要强调监控的重要性——就像引用3提到的"持续观察"才是治本之道。 另外注意到引用5给出了物理文件迁移的完整语法,这个方案虽然有效但风险较高,应该放在最后一步建议,并且必须提醒备份的重要性。对于常见的日志收缩失败问题,要把引用2和引用4的操作说明合并成完整流程,避免用户反复尝试无效方法。 </think>针对SQL Server中TempDB过大的问题,以下是综合引用资料的系统解决方法: --- ### **一、临时空间释放(紧急处理)** 1. **手动收缩数据文件** ```sql USE tempdb; DBCC SHRINKFILE (N'tempdev', 100); -- 收缩主数据文件至100MB DBCC SHRINKFILE (N'templog', 100); -- 收缩日志文件 ``` **注意**:频繁收缩可能引发性能问题,仅作为临时手段[^2][^4]。 2. **清理系统缓存(谨慎使用)** ```sql DBCC FREESYSTEMCACHE ('ALL'); -- 释放所有系统缓存,生产环境需评估影响[^4] ``` **风险**:可能导致查询短暂性能下降,建议在非高峰时段操作。 --- ### **二、存储配置优化(根本性调整)** 1. **独立磁盘部署** - 将`tempdb`数据文件(`.mdf/.ndf`)和日志文件(`.ldf`)迁移到**专用高速SSD磁盘**,避免I/O竞争[^1][^5]: ```sql ALTER DATABASE tempdb MODIFY FILE (NAME='tempdev', FILENAME='D:\SQLData\tempdb.mdf'); ALTER DATABASE tempdb MODIFY FILE (NAME='templog', FILENAME='E:\SQLLog\templog.ldf'); ``` **重启SQL Server服务生效**。 2. **多文件配置** - 根据CPU核心数创建多个等大小的`.ndf`文件(如8核可设8个文件),减少分配争用: ```sql ALTER DATABASE tempdb ADD FILE (NAME=tempdev2, FILENAME='D:\SQLData\tempdb2.ndf', SIZE=4GB); -- 重复添加至所需数量 ``` --- ### **三、预分配合理空间(预防增长)** 1. **设置足够初始大小** - 根据历史峰值设置初始值(例:初始4GB,自动增长1GB),避免频繁扩容开销[^3]: ```sql ALTER DATABASE tempdb MODIFY FILE (NAME='tempdev', SIZE=4GB, FILEGROWTH=1GB); ``` 2. **禁用自动收缩** - 避免系统自动触发收缩操作消耗资源: ```sql ALTER DATABASE tempdb SET AUTO_SHRINK OFF; ``` --- ### **四、长期监控与维护** 1. **排查资源消耗源头** ```sql SELECT session_id, command, reads, writes, logical_reads, text FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_handle) WHERE database_id = DB_ID('tempdb'); ``` - 识别长时间运行的事务、内存溢出(`spills`)或大型排序操作[^1]。 2. **定期检查空间使用** ```sql USE tempdb; EXEC sp_spaceused; -- 查看当前空间分配 ``` --- ### **关键注意事项** 1. **禁止直接删除文件** TempDB系统文件不可手动删除或分离,仅能通过SQL命令调整[^5]。 2. **版本控制优化** 若因行版本隔离(如`READ_COMMITTED_SNAPSHOT`)导致增长,需评估事务隔离级别必要性。 3. **索引维护策略** 重构索引时使用`SORT_IN_TEMPDB=ON`会增大TempDB负载,建议分批操作。 > **引用总结**: > - 存储隔离与扩容是基础[^1][^5] > - 合理初始化大小减少碎片[^3] > - 收缩操作需配合缓存清理[^2][^4] ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值