我有个数据库,mdf文件已经达到40多G,可是实际数据才23G。现在想把mdf收缩到接近实际数据空间。
我通过首先设置为简单模式,然后右键数据库-任务-收缩-数据文件,在收缩操作,选择在释放未使用的空间前重新组织页,将文件收缩到:我输入25G。然后确定,收缩很久最后还是失败了。想请教下应该怎么操作!数据库

解决方案 »

  1.   

    mdf文件收缩跟日志模型无关呢(改为简单模式只是会重用日志空间而已,跟mdf内部完全无关)
      

  2.   

    mdf文件已经达到40多G,可是实际数据才23G, 很想知道楼主这个实际数据大小怎么算出来的。 
      

  3.   

    找个最早的数据库,把变大的数据库里的文件都插入最早的那个数据库里,插入之前记得把触发器干掉!
    可能是你的服务器经常断电!注意一下!
    用这个生成插入语句
    SELECT TOP 100 Percent
    'truncate table 新数据库..'+sysobjects.name+
    ' insert into 新数据库..'+sysobjects.name+' select * from 变大的数据库..'+sysobjects.name,
    sysindexes.rows
    FROM sysindexes with(nolock)
    JOIN sysobjects with(nolock)
    ON sysindexes.id = sysobjects.id AND sysobjects.xtype = 'u'
    WHERE sysindexes.indid in(0, 1) and sysindexes.rows<>0
    ORDER By sysobjects.name ASC
    用这个查询没有插入的数据
    ----------------------------------------
    select isnull(a.name,b.name) name ,isnull (a.rows,0) as rows,isnull (b.rows,0) as rows
    from 
    (SELECT TOP 100 Percent
    b.name,
    a.rows
    FROM 变大的数据库.dbo.sysindexes a with(nolock)
    JOIN 变大的数据库.dbo.sysobjects b with(nolock)
    ON a.id = b.id AND b.xtype = 'u'
    WHERE a.indid in(0, 1)
    ) a FULL JOIN 
    (SELECT TOP 100 Percent
    sysobjects.name,
    sysindexes.rows
    FROM sysindexes with(nolock)
    JOIN sysobjects with(nolock)
    ON sysindexes.id = sysobjects.id AND sysobjects.xtype = 'u'
    WHERE sysindexes.indid in(0, 1) ) b
    ON a.name=b.name 
    order by isnull (a.rows,0) desc
      

  4.   

    你那个估计是IO跟不上,改成100M试试,另外不要在繁忙时间执行
      

  5.   

    这个问题也不是经常出现的,我模拟了一个库,再收缩。总共收缩10G,第一次2G,20分钟;3G,30分钟;5G,一小时10分钟。都没报错。周末做的时候,我把所有事务都断了,单独做收缩操作!很感谢各位的建议。