Normalmente quando o banco de dados está online eu uso a seguinte consulta e obtenho quanto espaço há livre dentro de cada arquivo:
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)
você precisa estar no banco de dados que deseja consultar.
No entanto, como você pode fazer isso quando o banco de dados está offline?
Eu não encontrei uma maneira.
Eu estava tentando isso, mas não deu certo:
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 ')
Existe uma maneira de descobrir espaço livre dentro de arquivos de bancos de dados offline?
Na verdade, não existe uma opção incorporada para fazer isso, pois os itens de gerenciamento de alocação estão no banco de dados. Os bancos de dados teriam que ser montados (abertos no SQL Server) para que o código do mecanismo os processasse. O mecanismo poderia obter essas informações de um banco de dados que não está online no momento? Claro, não há nenhuma razão técnica para que isso não aconteça, exceto pelo fato de que nunca foi programado para isso.
É perfeitamente possível, embora eu não saiba de nada que faça isso por você, embora possa ser um pequeno projeto divertido. Você gostaria de emular o mecanismo de armazenamento e fazer, essencialmente, o que ele faria, que é encontrar os bitmaps de alocação (nesse caso, as
GAM
páginas, que estão em locais muito específicos dentro do arquivo que está bem documentado) e depois contar o número de extensões alocadas por meio do bitmap.Se você escreveu isso como código .net, ele poderia ser chamado pelo PowerShell ou carregado no SQL Server como um módulo CLR (eca) e chamado pelo T-SQL.