none
sql2008 mdf文件太大问题 RRS feed

  • 问题

  •   导入sql2008数据库大文本文件。查看数据文件实际大小为52G,但mdf占用空间360G。删除最大内容的表,约有40G文件。但mdf仍然没变化。请技术达人帮助。什么原因及如何解决。做了数据收缩但没效果
    2012年12月10日 9:54

答案

  • USE 你的库名;
    GO
    -- 数据库空间使用情况
    EXEC sp_spaceused;
    
    -- 查下文件空间使用情况
    SELECT 
    	file_id, name,
    	[文件大小(MB)] = size / 128.,
    	[未使用空间(MB)] = (size - FILEPROPERTY(name, N'SpaceUsed')) / 128.
    FROM sys.database_files
    
    -- 表空间使用情况
    DECLARE @tb_size TABLE(
    	name sysname,
    	rows int,
    	size varchar(100),
    	data_size varchar(100),
    	INDEX_size varchar(100),
    	unused_size varchar(100)
    );
    INSERT @tb_size
    EXEC sp_msforeachtable '
    sp_spaceused ''?''
    '
    SELECT * FROM @tb_size
    

    用上面的语句检查一下你的数据库中的空间使用情况

    其中,文件空间情况中的未使用空间表示你的文件可以通过 DBCC SHRINKFILE 来释放的磁盘空间

    如果可以释放的空间很小, 那么你可以通过后面的查表空间的语句来查到是那些表占用了大的空间, 对于 unused_size 列的值很大的表, 你可以通过 REBUILD 聚焦索引(一般是主键) 的方式, 重组表的数据存储, 以便能够释放空间占用

    2012年12月12日 1:26

全部回复

  • Rebuild all clustered indices then try shrink file again.
    2012年12月10日 16:01
  • 需要通过 shrink 来回收文件占用的空间

    界面操作通过 右键数据库--收缩 来进行

    也可以使用 dbcc shrinkfile 来做

    2012年12月11日 0:53
  •     能否指出具体如何操作,比如步骤。

       

    2012年12月11日 8:32
  •    按照你的建议,我是通过界面操作的,右键数据库--任务--收缩---数据库/文件,2种都没起到任何效果

       dbcc shrinkfile 的方法是否就是界面操作本质一样,求帮助

    2012年12月11日 8:34
  • 我还做了 dbcc shrinkdatabase (userdb,10) 的操作,但消息提示,因为该文件没有足够的可用空间可以回收
    2012年12月11日 8:47
  • 我还做了 dbcc shrinkdatabase (userdb,10) 的操作,但消息提示,因为该文件没有足够的可用空间可以回收

    按照rmiao的建议先REBUILD INDEX然后再收缩,使用shrink file指定Target. 如果还不可以,可能要找到最大的表,然后考虑重建新表导入数据然后删除旧表重新收缩,这样一定可以。
    2012年12月11日 9:19
  • 我还做了 dbcc shrinkdatabase (userdb,10) 的操作,但消息提示,因为该文件没有足够的可用空间可以回收

    按照rmiao的建议先REBUILD INDEX然后再收缩,使用shrink file指定Target. 如果还不可以,可能要找到最大的表,然后考虑重建新表导入数据然后删除旧表重新收缩,这样一定可以。

         重建索引后,碎片文件比例确实有减少,但shrinkfile 依然没有效果 mdf文件大小没变化多少。最大的数据表已经重复删除,导入多次,真心没办法了吗?
    2012年12月11日 9:44
  • Tried run 'dbcc shrinkfile (1, nnnn)' under the db? Replace nnnn with target file size (in mb) you like.
    2012年12月11日 13:53
  • USE 你的库名;
    GO
    -- 数据库空间使用情况
    EXEC sp_spaceused;
    
    -- 查下文件空间使用情况
    SELECT 
    	file_id, name,
    	[文件大小(MB)] = size / 128.,
    	[未使用空间(MB)] = (size - FILEPROPERTY(name, N'SpaceUsed')) / 128.
    FROM sys.database_files
    
    -- 表空间使用情况
    DECLARE @tb_size TABLE(
    	name sysname,
    	rows int,
    	size varchar(100),
    	data_size varchar(100),
    	INDEX_size varchar(100),
    	unused_size varchar(100)
    );
    INSERT @tb_size
    EXEC sp_msforeachtable '
    sp_spaceused ''?''
    '
    SELECT * FROM @tb_size
    

    用上面的语句检查一下你的数据库中的空间使用情况

    其中,文件空间情况中的未使用空间表示你的文件可以通过 DBCC SHRINKFILE 来释放的磁盘空间

    如果可以释放的空间很小, 那么你可以通过后面的查表空间的语句来查到是那些表占用了大的空间, 对于 unused_size 列的值很大的表, 你可以通过 REBUILD 聚焦索引(一般是主键) 的方式, 重组表的数据存储, 以便能够释放空间占用

    2012年12月12日 1:26
  • 感谢 楼上热心人孜孜不倦的帮助,经过各种方法的测试,原因在于,我没有对我的数据库表做唯一索引(我只创建了非聚集索引),导致mdf文件比数据文件大许多。,问题已经解决,再次感谢大家!!!
    2012年12月13日 4:52