确定能够释放空间的SQL Server数据库文件的脚本

时间:2010-07-31 12:36:00 

问题

作为一个负责几个服务器的数据库管理员,我接到许多电话是关于磁盘空间的。我所做的第一件事是找到可以缩小的数据文件来释放一些磁盘上的空间。我所负责的一些服务器上具有几个数据库,要指出哪个数据文件能够立即释放空间需要花费些时间,专家能否介绍一种捷径解决此问题?

专家解答

你需要的第一个东西是驱动盘信息。你可以从扩展的存储过程xp_fixeddrives获得这个信息,它返回驱动盘字母和这个驱动盘上有多少空闲空间。接下来你需要知道在每个数据文件中有多少空间是可用的。当你在SSMS中使用这个信息的时候,Microsoft使用两个不同的DBCC调用;一个用于数据文件而另一个用于日志文件。要替代使用单独的DBCC调用,你可以调用fileproperty函数并传递数据文件的名称和SpaceUsed参数。这是从数据文件所在数据库的上下文环境中运行的,所以你可以使用sp_msforeachdb存储过程来返回所有数据库的结果。

既然你已经有了驱动盘信息和所用的空间,那么你就可以将它连接到sys.databases和sys.master_files表来返回对所有数据的视图。现在它可以快速地确定具有最多空闲空间的文件和它们的所在位置。

USEMASTER
  GO
  CREATETABLE#TMPFIXEDDRIVES(
  DRIVECHAR(1),
  MBFREEINT)
  INSERTINTO#TMPFIXEDDRIVES
  EXECxp_FIXEDDRIVES
  CREATETABLE#TMPSPACEUSED(
  DBNAMEVARCHAR(50),
  FILENMEVARCHAR(50),
  SPACEUSEDFLOAT)
  INSERTINTO#TMPSPACEUSED
  EXEC('sp_msforeachdb''use?;Select''''?''''DBName,NameFileNme,fileproperty(Name,''''SpaceUsed'''')SpaceUsedfromsysfiles''')
  SELECTC.DRIVE,
  CASE
  WHEN(C.MBFREE)>1000THENCAST(CAST(((C.MBFREE)/1024.0)ASDECIMAL(18,2))ASVARCHAR(20))+'GB'
  ELSECAST(CAST((C.MBFREE)ASDECIMAL(18,2))ASVARCHAR(20))+'MB'
  ENDASDISKSPACEFREE,
  A.NAMEASDATABASENAME,
  B.NAMEASFILENAME,
  CASEB.TYPE
  WHEN0THEN'DATA'
  ELSETYPE_DESC
  ENDASFILETYPE,
  CASE
  WHEN(B.SIZE*8/1024.0)>1000THENCAST(CAST(((B.SIZE*8/1024)/1024.0)ASDECIMAL(18,2))ASVARCHAR(20))+'GB'
  ELSECAST(CAST((B.SIZE*8/1024.0)ASDECIMAL(18,2))ASVARCHAR(20))+'MB'
  ENDASFILESIZE,
  CAST((B.SIZE*8/1024.0)-(D.SPACEUSED/128.0)ASDECIMAL(15,2))SPACEFREE,
  B.PHYSICAL_NAME
  FROMSYS.DATABASESA
  JOINSYS.MASTER_FILESB
  ONA.DATABASE_ID=B.DATABASE_ID
  JOIN#TMPFIXEDDRIVESC
  ONLEFT(B.PHYSICAL_NAME,1)=C.DRIVE
  JOIN#TMPSPACEUSEDD
  ONA.NAME=D.DBNAME
  ANDB.NAME=D.FILENME
  ORDERBYDISKSPACEFREE,
  SPACEFREEDESC
  DROPTABLE#TMPFIXEDDRIVES
  DROPTABLE#TMPSPACEUSED

在将上面的内容拷贝和黏贴到一个SQL Server 2005查询窗口中并运行所有的代码之后,得到的结果集将如下所示:

 

标签:sql,server,脚本,空间,数据库
0
投稿

猜你喜欢

  • 正计时JS代码

    2008-05-25 14:53:00
  • asp如何建立MYSQL数据库的连接?

    2009-11-26 20:30:00
  • JavaScript加密解密终级指南

    2008-01-03 12:25:00
  • 用asp给网站添加rss聚合功能

    2007-11-05 19:08:00
  • 不同浏览器的兼容一些写法

    2009-03-26 12:58:00
  • MySQL应用技巧之存取权限

    2010-08-08 09:10:00
  • SQL Server命令行导数据的2种方式

    2010-07-26 14:48:00
  • 如何处理包含JavaScript语句时的间隔符?

    2009-11-14 20:39:00
  • asp下用fso和ado.stream写xml文件的方法

    2011-04-07 10:55:00
  • 带你深入了解Access数据库的4种安全方式

    2008-11-28 14:34:00
  • 函数式编程让JS更优美

    2008-06-10 12:40:00
  • PHP实现异步定时多任务消息推送

    2023-05-25 09:51:29
  • SQL Server 2000中生成XML的小技巧

    2009-02-13 17:12:00
  • 使用Title提升可访问性

    2009-04-04 17:06:00
  • 用js实现用户输入密码的强度

    2007-11-22 21:41:00
  • 网页代码更清晰高效的一些经验

    2008-05-19 12:23:00
  • XML入门教程:XML CDATA的作用

    2007-11-07 14:08:00
  • 正则 global 属性介绍

    2008-03-18 20:50:00
  • SQL Server asp.net 数据提供程序连接池

    2009-09-18 08:18:00
  • set rs=server.CreateObject("adodb.recordset") 的中文详细说明

    2011-03-06 11:21:00
  • asp之家 网络编程 m.aspxhome.com