通常,当数据库在线时,我使用以下查询并获取每个文件内有多少可用空间:
SELECT CONVERT (decimal(12,2) ,
(CONVERT(decimal(12,2), size)/128)/1024.00)
- CONVERT(decimal(12,2),
ROUND(fileproperty(a.name,'SpaceUsed')/128.000,2)/1024.00) as [FREESPACE GB],
*
FROM sys.database_files a WITH(NOLOCK)
您需要位于要查看的数据库中。
但是,当数据库离线时如何做到这一点呢?
我还没有找到办法。
我正在尝试这个,但没有成功:
select object_name,counter_name,instance_name,cntr_value,
case cntr_type
when 65792 then 'Absolute Meaning'
when 65536 then 'Absolute Meaning'
when 272696576 then 'Per Second counter and is Cumulative in Nature'
when 1073874176 then 'Bulk Counter. To get correct value, this value needs to be divided by Base Counter value'
when 537003264 then 'Bulk Counter. To get correct value, this value needs to be divided by Base Counter value'
else 'I don"t know'
end as counter_comments
from sys.dm_os_performance_counters with(nolock)
where cntr_type not in (1073939712)
and counter_name in ('Data File(s) Size (KB) ',
'Database pages ')
有没有办法找出脱机数据库文件内的可用空间?
实际上没有内置选项可以执行此操作,因为分配管理项位于数据库中。必须安装数据库(在 SQL Server 中打开)以便引擎代码能够处理它。引擎可以从当前不在线的数据库中获取此信息吗?当然,除了它从未被编程为这样做之外,没有任何技术原因可以解释为什么它不能这样做。
这是完全有可能的,尽管我不知道有什么可以为你做到这一点,尽管它可能是一个有趣的小项目。您想要模拟存储引擎,本质上就是它会做的事情,即找到分配位图(在本例中是页面
GAM
,位于文件内非常特定的位置,并且有详细记录),然后进行计数通过位图分配的盘区数量。如果您将其编写为 .net 代码,则它可以由 PowerShell 调用或作为 CLR 模块加载到 SQL Server 中(恶心)并从 T-SQL 调用。