代码之家  ›  专栏  ›  技术社区  ›  ryanulit

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

  •  6
  • ryanulit  · 技术社区  · 16 年前

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

    4 回复  |  直到 16 年前
        1
  •  5
  •   Ian Boyd    9 年前

    对于每个数据库:

    --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)
    
        2
  •  3
  •   Chris K    16 年前

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

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

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

    SQL Server Shrink Database . 您必须先执行完整备份和事务日志备份,然后才能正常工作。

        3
  •  1
  •   n8wrl    16 年前

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

        4
  •  0
  •   Remus Rusanu    16 年前

    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