关于数据库事务日志的问题

时间:2011-08-02 15:37:54

标签: sql-server database

我读了以下声明:

  

SQL Server不会立即将数据写入磁盘。它保存在一个   缓冲区缓存,直到此缓存已满或直到SQL Server发出   检查点,然后写出数据。如果停电   当缓存仍然填满时发生,然后该数据丢失。   但是,一旦电源恢复,SQL Server就会从它开始   最后一个检查点状态,以及最后一个检查点之后的任何更新   被记录为成功的交易将从   交易日志。

出现了几个问题:

  1. 如果发生电源故障发生 SQL Server发出后,该怎么办? 检查点和之前缓冲区缓存被执行写入 磁盘?缓冲区缓存中的内容是否永久丢失?

  2. 事务日志也存储为磁盘文件,否则为 与实际的数据库文件不同。那我们怎么能保证 日志文件的完整性?

  3. 那么,真的没有真正的交易存在吗?这只是概率的问题。

2 个答案:

答案 0 :(得分:8)

该陈述是正确的,因为数据可以写入缓存,但是错过了SQL Server使用称为“预先记录(WAL)”技术的关键点。对日志的写入不会被缓存,只有在将事务记录写入日志后才会认为事务已完成。

http://msdn.microsoft.com/en-us/library/ms186259.aspx

如果发生故障,则会按照您的提及重播日志,但数据页仍然在内存中而不写入磁盘的情况无关紧要,因为修改日志已存储并可以检索

没有真正的交易是不正确的,但如果你在简单的日志记录模式下运行,那么重播的能力就不存在了。

对于日志文件的完整性/与数据文件相同 - 正确的备份计划和适当的恢复测试计划 - 不要只备份数据/日志并假设它们有效。

答案 1 :(得分:2)

  

如果在SQL Server发出检查点之后和缓冲区缓存被执行写入磁盘之前发生电源故障怎么办?缓冲区缓存中的内容是否永久丢失?

检查点的开始和结束是事务日志中的不同记录。

只有在检查点结束写入日志并且最旧的生活事务(包括检查点本身)的LSN被写入数据库之后,检查点才会被标记为成功。

如果检查点未能完成,则数据库将回滚到先前的LSN,并根据需要从事务日志中获取数据。

  

事务日志也存储为磁盘文件,与实际的数据库文件没有区别。那么我们怎样才能保证日志文件的完整性呢?

我们做不到。只是数据存储在两个地方而不是一个地方。

如果某人窃取了包含数据和日志文件的服务器,则您的交易将丢失。