SQLSERVER tempdb 数据库异常增大解决方法及原因查找

--SQLSERVER tempdb 数据库异常增大,导致服务器卡顿,最简单的方法就是重启系统.tempdb 会自动重新创建恢复到初始大小(比如8M).

--1.tempdb  文件过大,可以通过重新启动系统,tempdb数据文件及Log会释放空间到初始大小(比如8M).

--2.tempdb 在系统默认的C盘,自动扩展过大可能导致系统盘C盘空间问题,需要迁移到数据盘 。

     Use master
     Alter   database tempdb modify file (NAME='TEMPDEV',FILENAME='D:\SQLDATA\TEMPDB.MDF'); GO 

     Alter database tempdb modify file
     (NAME='TEMPLOG',FILENAME='D:\SQLDATA\TEMPLOG.LDF'); GO 

上面命令会将Tempdb库对应的数据文件及Log文件指向新的物理路径下的新文件。 但是需要重新启动后才会生效 。

--3.如何在线缩小tempdb,最好在非生产时间或周末进行。

use tempdb
dbcc shrinkfile('tempdev')
use tempdb
dbcc shrinkfile('templog') 

或者

use tempdb
go
DBCC SHRINKFILE (N’tempdb.mdf’ , 0, TRUNCATEONLY) –释放所有可用空间
go
DBCC SHRINKFILE (N’tempdb.mdf’ , 500) — 收缩datafile到 500MB
go
DBCC SHRINKFILE (N’templog.ldf’ , 10) — 收缩日志到 10MB
go

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

USE tempdb
GO
DBCC FREESYSTEMCACHE (‘ALL’)
GO
DBCC SHRINKFILE (N’tempdb.mdf’ , 500)
GO

如果要查询原因可以按以下方法查找.

0.--获取实例中每个数据库日志文件大小及使用情况
DBCC SQLPERF(LOGSPACE)

--1.查看数据库日志文件大小和使用情况

use tempdb
go
select db_name() as dbname,
name as filename,
size/128.0 as CurrentSizeMB,
size/128.0 - cast(fileproperty(name,'spaceUsed') as int)/128.0 as FreeSpaceMB
from sys.database_files;

--2.查看数据库中有无长时间运行的事务
dbcc opentran(tempdb);

--3.由于数据库开启了快照,可通过快照信息查找耗时的查询:

SELECT * FROM sys.dm_tran_active_snapshot_database_transactions order by elapsed_time_seconds desc

--4.#查出最大的spid(session_id)

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

--5.#看是哪条sql导致的比如查到的session_id 55

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

或者获取该session_id对应的sql查询语句
功能:显示从客户端发送到 Microsoft SQL Server实例的最后一个语句
格式:dbcc inputbuffer(session_id);
如:dbcc inputbuffer(55);

--5.删掉进程
kill 55

你可能感兴趣的:(数据,系统,数据库,sqlserver,tempdb,sql数据库异常增大,数据库日志初始化,数据库日志清空)