解决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