65.9K
CodeProject 正在变化。 阅读更多。
Home

检查数据库大小及摘要

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.33/5 (2投票s)

2009 年 6 月 22 日

CPOL

2分钟阅读

viewsIcon

22193

此脚本计算每个用户数据库的大小及摘要。

引言

此脚本计算 SQL Server 上每个用户数据库使用的磁盘空间。 在服务器上拥有大量数据库且磁盘空间有限的情况下,它特别有用。 它还在顶部提供摘要。

从脚本输出中,可以了解到以下内容:

  1. 数据库大小(以兆字节为单位)
  2. 日志文件大小(以兆字节为单位)
  3. 数据库在服务器上的物理位置
  4. 服务器上所有数据库使用的总磁盘空间

理解脚本

在创建此脚本期间遇到的问题是:

问题 1:如何动态查询服务器上的每个数据库

解决方案:使用“Exec”动态构建每个数据库的查询,并使用游标循环它们,从而解决了问题。

Declare C1 cursor For select  [name] from master..sysdatabases with (nolock) where _
		[name] not in ('master', 'model', 'msdb', 'Capabilities_Grid', _
		'CDWINNT', 'dbatools', 'alert_db','distribution', 'gdmgaudit', _
		'mssecurity')  Order By [name] 
Open C1
Fetch Next From  C1 InTo @DatabaseName
While @@Fetch_Status <>-1
Begin
	-----Query each Database now
	Execute ('Insert Into ##tempValue select Groupid, [name], _
		[filename], cast((Size*8)/1024 as float) as [size] from  ' + _
		@DatabaseName + '..sysfiles with (nolock)  ')

	Select @dbName= [name], @DBPath = [filename], @DbSize = _
		[TotalSize] From ##tempValue where groupid = 1
	Select @LogSize = [TotalSize] From ##tempValue where groupid = 0

End
Close C1
Deallocate C1

注意:需要记住的一点是,对于数据库文件,groupid 应为 1(在我的情况下!),对于 Log 文件,应为 0

问题 2:使用“Exec”创建了另一个问题 - 在哪里存储从查询返回的值

解决方案:由于“Exec”用于动态查询执行会创建不同的会话,因此本地会话变量不可用。 使用 ##GlobalTable 存储值解决了问题,因为这些表对服务器中创建的每个会话都可用。

Execute ('Insert Into ##tempValue select Groupid, [name], _
	[filename], cast((Size*8)/1024 as float) as [size] from  ' + _
	@DatabaseName + '..sysfiles with (nolock)  ')

问题 3:如何获取数据库和日志大小

解决方案:获取数据库的大小确实是一个简单的查找。 数据库和日志大小可以从表 sysfiles(在每个数据库中找到的系统表)中收集。 该表为我们提供 DB 和日志文件的物理位置、大小和其他有用的信息。

select [name], cast((Size*8)/1024 as float) as [size] from sysfiles

注意:表中的大小以 SQL Server 页(1 页 = 8 KB)存储。 因此,将大小乘以 8 将给出数据库使用的 KB 数。

我相信“一图胜千言”这句话,对于编码来说,OUTPUT 胜过 1000 行代码……

以下是来自我网站的示例输出

DBCheckSize.JPG - Click to enlarge image
© . All rights reserved.