环境: SQL 2008
场景: 在load data 的过程中, log file 的size 会逐渐的增长,最后占满磁盘空间,最后的size都15G了,汗……,导致我
       N多数据没有导进数据库办法: 1: 设置auto shrink = True  , Recovery Model = Simple, Enable Atuo growth = Ture ,Max File Size = 50M
       2:  设置auto shrink = True  , Recovery Model = Simple, Enable Atuo growth = False结果: 1,2 都fail了P.S: 对于办法 1, 我以为在 log file size 到达 50M的时候,会自动收缩的,但实际上还是报错,说 log file is full
     对不办法 2, 报错信息同 办法1我实在没办法了,恳请大家办忙,全部散分 

解决方案 »

  1.   

    办法1:
    BACKUP LOG 库名 WITH NO_LOG
    DBCC SHRINKFILE( '日志文件名',新的大小数值型如1)办法2:
    先分享数据库,然后直接把日志文件删除,再附加数据库文件上去,因为日志文件已经删除,它会自动创建一个新的日志文件。这样是OK的。如果你还觉得不保险,那可以先做个备份
      

  2.   

    对于办法1 , SQL 2008 不支持 语句 ,BACKUP LOG 库名 WITH NO_LOG
    对于办法2 , 如果确保生成的log file ,它将来还是有可能会不断增长,有可能还会占满磁盘空间吧
      

  3.   

    回复3楼
    设置手动收缩了一次,我已经设置Recovery Model = Simple了,还是不行,比较崩溃,不过还是谢谢大家
      

  4.   

    停掉数据库 找到数据库文件和日志文件,删除日志ldf文件,然后在附加上去,有关单mdf的文件附加,可以在精华贴里找到 
      

  5.   

    场景: 在load data 的过程中, 你是怎么load的? 设置了每次的batchsize没有?
      

  6.   

    加多一个日志文件在其他盘.如果你将整个导入都作为一个事物的话,日志数会比较大。
    --add log file
    alter database xx add log file(name=log1,filename='c:\log.ldf',maxsize=unlimited);
      

  7.   

    回复9楼
    请问batchsize如何设计,我是利用loader往数据库里导入信息,信息量很大,我们刚导入4个period,log file就增长了5G,我们有100多个period,呵呵
      

  8.   

    回复8楼
    我删除了原来的日志,生成了新的日志,但是还是说我log size is full。不过我这次的设置是auto shrink = True , Recovery Model = Simple, Enable Atuo growth = False
    如果可以的话,请给出详细的步骤,谢谢
      

  9.   

    回复6,8,9,10楼
    谢谢大家,及时的给我回复。
    我现在比较担心的是,新生成的log file,它也会自动的增长,因为的我数据量实在太大,我担心新生成的log file,最后还是会占满空间,导致我的数据不能全部导入。我的设想是,能不能把log file的size ,控制在一定的大小之内,譬如500M-1G之间,或者说让它达到一定的范围内,可以auto-shrink(自动收缩)
      

  10.   

    没有办法,只能把日志size设置大些,导入完成后在shrink。
      

  11.   


    这个没有用,它把一次导入作为一个工作单元,这个期间的事务日志是不能收shrink的。看你能不能分几批导入了,一次导入一些文件,多做几次。
      

  12.   

    aaa为数据库名
    backup log aaa with no_log
    dbcc shrinkdatabase (aaa,truncateonly)
      

  13.   

    回复16楼
    SQL 2008不支持 backup log aaa with no_log
    但是还是很谢谢
      

  14.   

    回复14,15楼
    综合2位的意见,我可以把我的步骤说的细致些,我是通过我们的软件,软件通过调用工具读取Excel的内容,来对数据库操作的,我能想到的比较笨的方法就是,把原先在一页的Transcaction的交易,分成几个sheet,然后再导入,没导入一个sheet,做一次shrink。不过我现在发现了一个新的问题,数据文件增长的也很快,如果可以对log进行shrink的话,也应该能对data进行shrink,那我担心就是,对data进行shrink之后,会不会对数据造成损毁或者破坏?
      

  15.   

    为什么不等到全部导入完了在shrink?非要中间就shrink,growth需要成本的?再说,你中间shrink之后又会在growth,又有什么意义呢?数据文件增长快,说明有那么多的数据被load了, 为了优化这个操作,还是把数据库数据/日志文件设置成足够大,然后把一下索引/触发器能禁用的禁用。这样会提高导入的效率。
      

  16.   

    1 设置数据库到SIMPLE2USE [AdventureWorks]
    GO
    DBCC SHRINKFILE (N'AdventureWorks_Data' , 0, TRUNCATEONLY)
    GO3 设置数据库回到 FULL模式
      

  17.   

    试试数据库的恢复模式:bulk-logged,这个好像就是专门针对大量的数据导入的情况的
      

  18.   

    回复20楼
    就是因为数据太多,一次导不进去,才想到要shrink的
      

  19.   

    回复23楼
    我用的是SQL2008,我没太明白,你的意思应该是,先设置成simple,在shrink(收缩),然后再回调到full模式吧,但是这样会使日志缩小吗?