检查数据库大小及摘要






2.33/5 (2投票s)
此脚本计算每个用户数据库的大小及摘要。
引言
此脚本计算 SQL Server 上每个用户数据库使用的磁盘空间。 在服务器上拥有大量数据库且磁盘空间有限的情况下,它特别有用。 它还在顶部提供摘要。
从脚本输出中,可以了解到以下内容:
- 数据库大小(以兆字节为单位)
- 日志文件大小(以兆字节为单位)
- 数据库在服务器上的物理位置
- 服务器上所有数据库使用的总磁盘空间
理解脚本
在创建此脚本期间遇到的问题是:
问题 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 行代码……
以下是来自我网站的示例输出
