CHECKPOINT 或 COMMIT 写入磁盘?

Pat*_*tor 12 sql-server

假设,对于 SQLServer2008R2 及更高版本,具有完整恢复模式数据库。

我一直认为:

  1. 当一个事务被提交 (COMMIT) 时,该事务被写入 RAM 中的事务日志。

  2. 当 CHECKPOINT 发生时(在一段时间和/或一些事务和其他条件之后),最后一个 CHECKPOINT 和当前事务之间的事务被写入磁盘。

  3. 当 BACKUP LOG 发生时,数据将写入 MDF 文件。

我对么?我的一些同事说我错了,即使有 BOL 也很难找到正确的答案。

谢谢!

Rem*_*anu 22

不幸的是,到目前为止,关于 COMMIT 的工作原理,答案中存在许多错误,因此我将添加另一个错误。有关详细信息SQL Server 2000 I/O 基础知识,请参阅工作原理:Bob Dorr 的 SQL Server I/O 演示文稿。下面是它的工作原理:

  • 所有完全记录的数据写入(更改)都按照以下顺序发生(请参阅了解 SQL Server 如何执行查询:写入数据):

    • 数据页被独占锁存
    • 描述更改的日志记录被添加到日志中,在内存中。新日志记录生成新的 LSN,请参阅什么是 LSN:日志序列号
    • 数据页被修改(数据记录和页上的last_update_lsn)。这是现在修改('脏')页面。
    • 数据页锁存器被释放
    • 更新后没有任何内容直接写入磁盘
  • COMMIT 执行以下操作

    • 在内存中向日志添加描述 COMMIT 的新日志记录
    • 所有未刷新到磁盘的日志记录,包括上面生成的日志记录,都被刷新(写入磁盘)
    • 线程阻塞,直到操作系统报告上述写入为持久(IO 完成)
    • COMMIT 语句(或带有隐式提交的 DML 语句)完成
  • A CHECKPOINT 执行以下操作(简化),请参阅检查点如何工作以及记录的内容

    • 内存中的所有脏页都写入磁盘
      • 对于每个脏页,在开始写入磁盘之前,会刷新(写入磁盘)直到并包括该页上 last_update_lsn 的 LSN 的日志。请注意,刷新任何 LSN 意味着所有先前的 LSN 也被刷新,因此对于最脏的页面,这是一个空操作,因为它自己的 last_update 可能已经被刷新。
    • 描述检查点的日志记录被写入日志并刷新
    • 数据库启动页面使用上面生成的记录的 LSN 更新

对于最少记录的操作,写入的工作方式不同,请参阅可以最少记录的操作。粗略地,最少记录的操作如下(简化):

  • 在作为最小日志操作的一部分在页面中插入行之前,正在生成描述页面参与最小日志操作的事实的日志记录并将其附加到日志(在内存中)
  • 最少记录的页面正在更新,因为它适合写入许多插入内容。没有记录任何内容,也没有写入磁盘。
  • 当最小日志操作提交时,在提交之前,要求将参与该事务中最小日志操作的所有页面写入磁盘。Onyl 在此写入完成后,可以将 COMMIT 日志记录附加到日志(在内存中),并且日志(包括此新添加的提交日志记录)将刷新(写入)到磁盘。


Sha*_*nky 8

当一个事务被提交 (COMMIT) 时,该事务被写入 RAM 中的事务日志。

在查询请求更改页面或数据之前,事务已写入事务日志。这称为预写日志记录 (WAL)。如果在内存中更新页面时 SQL Server 崩溃,WAL 可确保数据库引擎可以读取事务日志并回滚事务。这是 RDBMS 的 ACID 属性。

当 CHECKPOINT 发生时(在一段时间和/或一些事务和其他条件之后),最后一个 CHECKPOINT 和当前事务之间的事务被写入磁盘。

检查点将脏页从缓冲区刷新到磁盘。tempdb 的行为略有不同。脏页是自从磁盘读取后发生更改的页。此检查点过程在事务日志中创建一个标记,直到事务已提交。失败后,恢复知道该标记之前的所有事务都已提交。您可以使用 TSQL 命令手动发出检查点。

当 BACKUP LOG 发生时,数据将写入 MDF 文件。

不,当备份日志发生时,SQL Server 会将事务日志信息从数据库日志文件复制到您正在写入备份的磁盘。备份操作从磁盘读取数据并将数据写入磁盘。

我希望您阅读以下链接

了解 SQL Server 中的日志记录和恢复Mark 已经指出

SQL Server 2008 内部原理和故障排除手册

事务日志架构和管理