【问题标题】:Question about database transaction log关于数据库事务日志的问题
【发布时间】:2011-08-02 23:48:51
【问题描述】:

我阅读了以下声明:

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

还有几个问题:

  1. 如果电源故障发生之后 SQL Server 发出一个 检查点和之前缓冲区缓存实际写入 磁盘?缓冲区缓存中的内容不是永久丢失了吗?

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

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

【问题讨论】:

    标签: sql-server database


    【解决方案1】:

    该语句是正确的,因为数据可以写入缓存,但忽略了 SQL Server 使用称为预写日志 (WAL) 的技术的关键点。对日志的写入不会被缓存,只有将事务记录写入日志后才认为事务完成。

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

    如果发生故障,日志会如您所述重播,但数据页仍在内存中且未写入磁盘的情况无关紧要,因为它们修改的日志已存储并可检索.

    没有真正的事务是不正确的,但是如果您在简单的日志记录模式下操作,那么就没有重放的能力。

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

    【讨论】:

    • +1 很好的解释安德鲁。还需要注意的是,由于 WAL,日志通常是执行删除、更新和插入 (DUI) 时的瓶颈。
    • 谢谢安德鲁。根据 MSDN 页面,“WAL 保证在关联日志记录写入磁盘之前,不会将任何数据修改写入磁盘。”但在我看来,只要有可能写入的数据修改和日志记录不是一致/同步,那么事务是不可能的。
    • 在这种情况下,日志为王,如果在失败前没有命中日志,则事务不会被标记为完成并在回放期间回滚。如果命中日志,数据页状态无关紧要,可以重放。
    • 还有一些保护机制来防止脏页(已修改但正在写入日志记录)进入磁盘上的数据文件 - 它确实是日志第一,数据第二。
    • 正确,尽管在重播日志时,数据库备份知道备份时的日志序列号 (LSN) 是什么,并且只需要从那里重播。
    【解决方案2】:

    如果在 SQL Server 发出检查点之后、缓冲区缓存实际写入磁盘之前发生电源故障怎么办?缓冲区缓存中的内容不是永久丢失了吗?

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

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

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

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

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

    如果有人窃取了您的服务器上的数据和日志文件,您的交易就会丢失。

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2013-07-14
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      相关资源
      最近更新 更多