解決sqlserver數據庫表空間不自動釋放問題


在項目中遇到了sql server數據庫經過頻繁地刪減數據后,查詢變慢的問題。

我把數據導到另一個庫中,發現查詢就很快。

查了下原因,根本原因是刪除數據並不釋放表空間,日志文件太過巨大的原因。

網上查了查,解決方案如下:

 

第一步, 在收縮前先查看日志的大小:
SELECT *
FROM sysfiles
WHERE name LIKE '%LOG%'
GO
 
第二步, 把數據庫的恢復模式設成”簡單”:
ALTER DATABASE [數據庫名] SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE [數據庫名] SET RECOVERY SIMPLE
GO
 
第三步, 運行checkpoint指令, 把dirty page寫進數據庫:
CHECKPOINT
GO
  
第四步, 截斷日志: 
BACKUP LOG 庫名 WITH NO_LOG
GO
 
第五步, 記錄一下日志名為下一步做准備:
 
SELECT Name
FROM sysfiles
WHERE name LIKE '%LOG'
GO
  
第六步, 收縮日志文件, 把不用的空間釋放給操作系統:
DBCC SHRINKFILE (文件名, 所需大小)
GO
 
第七步, 驗證一下日志大小是否達到所需大小了:
SELECT *
FROM sysfiles
WHERE name LIKE '%LOG%'
GO

第八步,將模式設置回去
ALTER DATABASE [數據庫名] SET RECOVERY FULL WITH NO_WAIT 
GO
ALTER DATABASE [數據庫名] SET RECOVERY FULL
GO


--查詢指定數據庫的日志文件名稱 
USE [數據庫名] 
GO 
SELECT name FROM SYS.database_files WHERE type_desc='LOG'



 后續步驟:
 1)查看你的主要數據庫, 看看日志增長是否失控;
 2)查看上面的代碼, 並進行必要修改和測試以適應你的數據庫要求;
 3)定期收縮數據庫 ----(注: 慎用!! 不建議用在production環境里.)
 4)繼續監控數據庫大小和服務器上的可用空間大小. 

  

 

釋放表空間:

DBCC SHRINKDATABASE (庫名,所需大小);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM