数据是不是每次都写入日志文件,但是并不一定写入到数据文件呀?
-------------------------
通过看书,好象是这个意思,不知对不对。
如果最近的数据操作没有写入数据文件mdf,只是写入了日志文件ldf,假如此时关机了,下次开机时,sql服务器启动后,会将日志中的信息写入到数据文件mdf中,是这样吗?另外,活动日志,是不是就是指还没有写入到mdf文件中的信息呢?如果这样的话,这意味着,日志文件比数据文件更重要呀。

解决方案 »

  1.   

    这个MM很好学 学习 不过谈谈我的看法 
    将用要写入数据库的记录放入到文本文件中,然后用bcp导入.可以加快写入的速度另外转点高手的东西:
    完全不记录日志是不可能的,但可以尽量少记录日志:   
        
      转小黑的   
        
      一   sql中列出的最小日志记录操作:   
      SELECT   INTO   
        
      大容量装载操作(bcp   和   BULK   INSERT)   
      CREATE   INDEX(包括索引视图)   
        
      text   和   image   操作(WRITETEXT   和   UPDATETEXT)     
        
      二   三种恢复模型对这些操作记录日志情况比较   
        
      1   简单恢复模型   
      use   master   
      go   
      create   database   test   
      on   (   name='test',   
                filename='f:\test.mdf',   
                size=5MB)   
      log   on     
            (   name='test_log',   
                filename='f:\test_log.ldf',   
                size=3MB)   
      go   
        
      use   test   
      go   
        
      alter   database   test   set   recovery   simple   
        
      select   top   10000   a.*   into   testtable   from   master..sysobjects   a   ,   master..syscolumns   b   
        
      select   count(*)   from   ::fn_dblog(null,null)       
        
      --一个未公开的table-valued   funtion   可以看日志文件的记录数   
        
      --result   :406   
        
      dbcc   sqlperf(logspace)   
      --   
      --Databasename       LogSize(MB)           Log   Space   Used(%)   
      --test               2.9921875 12.5   
        
      use   master   
      go   
        
      drop   database   test   
        
      2   大容量日志记录恢复模型   
          这些大容量复制操作的数据丢失程度要比完全恢复模型严重,   
          不允许恢复部分的BULK操作,只能全部恢复   
      use   master   
      go   
        
      create   database   test   
      on   (   name='test',   
                filename='f:\test.mdf',   
                size=5MB)   
      log   on     
            (   name='test_log',   
                filename='f:\test_log.ldf',   
                size=3MB)   
      go   
        
      use   test   
      go   
        
      alter   database   test   set   recovery   BULK_LOGGED     
        
      select   top   10000   a.*   into   testtable   from   master..sysobjects   a   ,   master..syscolumns   b   
        
      select   count(*)   from   ::fn_dblog(null,null)       
        
      --result   :422   
        
      dbcc   sqlperf(logspace)   
        
      --   
      --Databasename       LogSize(MB)           Log   Space   Used(%)   
      --test               2.9921875 12.548956   
        
        
      use   master   
      go   
        
      drop   database   test   
        
      3   完全恢复模型   
          记录的日志数要比大容量日志记录恢复模型多,   
          将记录每一条BCP   or   BULK   insert,create   index   的每一条index   row,   
          对image,text字段   WRITETEXT   or   UPDATETEXT的所有操作   
        
      use   master   
      go   
        
      create   database   test   
      on   (   name='test',   
                filename='f:\test.mdf',   
                size=5MB)   
      log   on     
            (   name='test_log',   
                filename='f:\test_log.ldf',   
                size=3MB)   
      go   
        
      use   test   
      go   
        
      alter   database   test   set   recovery   full     
        
      select   top   10000   a.*   into   testtable   from   master..sysobjects   a   ,   master..syscolumns   b   
        
      select   count(*)   from   ::fn_dblog(null,null)       
        
      --result:   582   
        
      dbcc   sqlperf(logspace)   
        
      --   
      --Databasename       LogSize(MB)           Log   Space   Used(%)   
      --test               2.9921875 57.996082   
        
      三   总结   
        
          以上语句在不同模式下的比较   
        
                        FULL模式                           BULK_LOGGED   模式   
      速度               慢                                         快   
      日志大小       大                                         小   
     
      

  2.   

    缓存管理器保证日志的写入优于数据的写入的,这两个文件的写入两个异步的,在提交时写操作线程必须等到日志记录写入结束,而对于数据页完全异步,只要通知OS,不需要立刻完成,SQL SERVER可以稍后检查这些改动是否完成。缓冲区的数据有相应的置换策略,惰性写入器线程在特定时间间隔后根据脏页指示器才进行写入操作。所以日志是必须写入的,而数据是可能滞后的。但不是一定等到重启时才写入数据文件的。
    如果在提交事务时被中止,数据未写入数据页码,这时数据库重启并运行恢复,事务检查点之前写入数据,检查点后面事务进行分析->重做->撤销。