1.先写日志文件,再写数据库,为什么写了日志文件没写数据库时候好恢复呢?
3.导致三种数据不一致性的原因是不是因为事务的隔离性没有做好?谢谢

解决方案 »

  1.   

    MSSQL会把数据尽量放在内存中以提高访问速度,为防止系统意外终止或断电造成数据丢失的情况,采用先写日志,保证将更改先写入日志,但这时数据并不一定写入硬盘,如果此时断电,可以利用日志来恢复数据。
      

  2.   

    数据不一致和隔离级别有些关系。
    MSQL也有几种隔离级别,最高级别的可串行读可以做到防止以上错误,但会影响数据库的性能。其他隔离级别是不能完全防止这些情况的,俣可以通过事务和锁控制来实现。
      

  3.   

    引用 3 楼 zhangjiang264 的回复:
    没读懂,这两天也被日志文件备份困扰, 
    日志文件的能够用来还原数据库的数据。 
    学习 
    如果写了日志文件,没写数据库,如何恢复,那日志文件不是有错么?
      

  4.   

    数据文件主要是用来读,而日志文件主要是用来写,只有当数据库数据更新到一定的程度才一次性全部写进数据文件。为了避免反复往数据文件读和写,就只能放在内存中,而日志只有在还原的时候才能用到读,所以通过一个文件写,一个文件读的方式。提高IO效能。所以一旦发生数据更新首先就往日志文件写。然后才返回内存更新。最终用户才能看到更新的内容。当数据更新到一定的度时候(ORACLE 叫检查点),它就会一次性写入数据文件。
      

  5.   

    SQL SERVER 在启动数据库的时候,会自动通过日志文件来同步更新数据文件。所以当突然断电的时候然后启动实例,你会发现SQL SERVER 启动将会比较慢,特别是在繁忙的数据库服务器上。
      

  6.   

    举下面的例子说明BEGIN TRANSACTION
    INSERT INTO a 
    INSERT INTO b
    COMMIT TRANSACTIONBEGIN TRANSACTION
    INSERT INTO c
    --时间点A 断电
    INSERT INTO d
    COMMIT TRANSACTION如果时间点A 断电,下次SQL 重启的时候会首先检查日志,把已经完成的事物保存到数据库中.即a,b数据插入到数据库而c,d的数据不会插入到数据库,因为c所处的事物没有完成.
    如果没有日志,而直接插入数据库,那么c的数据插入到数据库,而d没有插入,违反了事物的原子性
      

  7.   

    日志文件的内容有  更新前数据记录,还有你更新后数据记录。日志主要用来保证 事务完整性的。事务要么做完,要么不做。
    你可以想像一下,如果有一个要 更新多张表、并且要执行半一个小时的事务。
    如果没有一个日志来记录这个事务 更新过的数据,那如果断电、或事务回滚。
    就没有办法保证事务完整性了。有了日志文件之后,sql系统自动就可以根据日志内容,回滚或前滚。
      

  8.   

    如果写了日志文件,没写数据库,这种情况很正常。下次sql系统启动时,自动去日志的最后一个检查点的是否有未完成的事务,然后对应进行事务的进滚或回滚。
    sql server自动为日志生成 检查点。  检查点也就是 系统把内存更新的数据 刷新到硬盘的时间点。
    检查点上有 记录着这个时间点未完成的事务。
      

  9.   


    恢得数据库的型式 有三种:
     1.大容量日志
       日志文件不记录大量更新的记录。比如 一条update语句更新1000条记录,这时日志文件不会有记录。
     2.简单  
       不管你做任何数据操作,日志文件都不会有记录。比如temp数据库。
     3.完全
       日志文件完全记录。