以编程方式确定数据库上的可用空间?

时间:2009-05-29 13:33:44

标签: sql-server-2005 shrink

好的,我已经尝试过寻找这个答案,但没有运气。我工作的SQL Server上有大约50个数据库,我几乎每天都要检查一下,看看是否可以通过缩小来释放任何空间。我们的驱动器往往会填满很多,所以这就是为什么它几乎是日常工作的原因。

有没有快速的方法来检查哪些数据库实际上有可用的可用空间?有谁知道系统/自定义存储过程或系统视图可以生成每个数据库的列表以及可以在该数据库上缩小多少可用空间?

顺便说一下,使用sql server 2005。

4 个答案:

答案 0 :(得分:5)


为每个数据库运行 sp_spacedused

--temporary table to hold database names
CREATE TABLE #Databases (name varchar(255))

INSERT INTO #Databases
SELECT name FROM master..sysdatabases

DECLARE abc CURSOR FOR
   SELECT name FROM #Databases

DECLARE @name varchar(255)
DECLARE @sql nvarchar(1024)

OPEN abc

FETCH NEXT FROM abc INTO @name

WHILE @@FETCH_STATUS = 0 
BEGIN
   --build sql to switch to that database...
   SET @sql = 'USE '+@name
   PRINT @sql
   EXECUTE (@sql)

   --and run spaceused on it
   SET @sql = 'EXECUTE sp_spaceused @UpdateUsage=True'
   PRINT @sql
   EXECUTE (@sql)

   FETCH NEXT FROM ABC INTO @name
END

CLOSE abc
DEALLOCATE abc
DROP TABLE #Databases

样本单数结果

执行T-SQL:

USE Contoso
EXECUTE sp_spaceused @UpdateUsage=True

<强>结果:

database_name: Contoso
database_size:     85.13 MB
unallocated_space: 15.41 MB

reserved:         70,368 KB (68.7 MB)
data:             42,944 KB (41.9 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,224 KB ( 3.1 MB)

<强>收缩:

DBCC SHRINKDATABASE (Contoso)

再次检查空间:

EXECUTE sp_spaceused @UpdateUsage=True

<强>结果:

database_name: Contoso
database_size:     69.81 MB
unallocated_space:  0.20 MB

reserved:         70,256 KB (68.6 MB)
data:             43,024 KB (42.0 MB)
index_size:       24,200 KB (23.6 MB)
unused:            3,032 KB ( 3.0 MB)

答案 1 :(得分:3)

答案是不要担心数据库中有多少可用空间,而是运行每晚或每周维护任务来执行压缩。可能你没有压缩你的日志文件(这是我通常增长最快的地方)。

运行完整备份,然后使用TRUNCATE_ONLY运行事务日志备份,完成后,在日志文件和数据库上运行DBCC SHRINKFILE()。

然后,您只需要监控总可用磁盘空间,而不是单个数据库的增长。

SQL Server Shrink Database。您必须先执行完整备份和事务日志备份,然后才能生效。

您可以通过运行'select * from master.dbo.sysdatabases'和运行'select * from [dbname] .. sysfiles'来获取有关加载的单个文件的信息。我不是100%,我近一年没有触及SQL Server实例,sysfiles可能在'master'数据库中。

答案 2 :(得分:1)

可能是WMI或SQL视图中的某些内容。但是我得问一下 - 与购买一些磁盘驱动器相比,你每天花费时间的成本是多少?

答案 3 :(得分:0)

您可以使用sp_spaceused并使用其结果,或者您可以查看自己的sys.allocations_units表并计算总使用的页数。您不应该在文件级别查看“数据库”级别,因为某些级别可能有多个NDF。从sys.database_files开始,查看数据库文件中的所有文件。 size列将包含数据库中的总页数。将sys.allocation_units中的总页数相加以获取已使用的页面:

with sum_au as (
select data_space_id
    , sum(total_pages) as total_pages
    from sys.allocation_units au 
    group by data_space_id)
select ds.name
    , df.size
    , total_pages as in_use 
    from sys.database_files df
    join sys.data_spaces ds on df.data_space_id = ds.data_space_id
    join sum_au au on au.data_space_id = ds.data_space_id