当前位置:   article > 正文

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

sqlserver tempdb

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

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

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

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

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

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

  1. use tempdb
  2. dbcc shrinkfile('tempdev')
  3. use tempdb
  4. dbcc shrinkfile('templog'

或者

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

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

  1. USE tempdb
  2. GO
  3. DBCC FREESYSTEMCACHE (‘ALL’)
  4. GO
  5. DBCC SHRINKFILE (N’tempdb.mdf’ , 500)
  6. GO

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

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

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

  1. use tempdb
  2. go
  3. select db_name() as dbname,
  4. name as filename,
  5. size/128.0 as CurrentSizeMB,
  6. size/128.0 - cast(fileproperty(name,'spaceUsed') as int)/128.0 as FreeSpaceMB
  7. 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)

  1. use tempdb
  2. go
  3. SELECT top 10 t1.session_id,
  4. t1.internal_objects_alloc_page_count, t1.user_objects_alloc_page_count,
  5. t1.internal_objects_dealloc_page_count , t1.user_objects_dealloc_page_count,
  6. t3.login_name,t3.status,t3.total_elapsed_time
  7. from sys.dm_db_session_space_usage t1
  8. inner join sys.dm_exec_sessions as t3
  9. on t1.session_id = t3.session_id
  10. where (t1.internal_objects_alloc_page_count>0
  11. or t1.user_objects_alloc_page_count >0
  12. or t1.internal_objects_dealloc_page_count>0
  13. or t1.user_objects_dealloc_page_count>0)
  14. order by t1.internal_objects_alloc_page_count desc

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

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

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

--5.删掉进程
kill 55

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/915879
推荐阅读
相关标签
  

闽ICP备14008679号