事务日志如何记录事务?

use*_*285 3 sql-server transaction-log

我们都知道 SQL Server 的事务日志记录了有关事务的信息。但是,在完整恢复模型中,事务日志中实际记录的是什么?你会说:交易!

啊,但是 SQL Server 可以有多种方法来记录事务。那么问题来了,它是如何记录交易的呢?

以下是我设想的工作方式:

  1. 它只是记录运行了哪个语句。在这种情况下,事务日志包含 DML 语句的实际文本,如下所示:

    "插入 test_database.dbo.Test_People (FirstName, LastName) VALUES ('James' ,'Smith')"

在这种情况下,事务日志包含上面引用的全部内容。

然后,在事务日志还原中(在完整备份还原之后),SQL Server 将针对数据库实际执行事务日志中包含的语句以更新它。

  1. 它存储整行数据的记录,包括其所有值(甚至那些未更新的值),以及该行被修改/插入的日期。

然后,在事务日志还原中(在完全备份还原之后),SQL Server 将事务日志中包含的行数据复制到数据库中,插入它或用事务日志中的数据覆盖表中的同一行。

  1. 它存储整个数据页的记录,包括其所有值(甚至那些未更新的值),以及数据页被修改/更新/删除的日期。

然后,在事务日志还原中(在完全备份还原之后),SQL Server 将事务日志中包含的行数据复制到数据库中,插入页面或覆盖具有相同 pageID 的页面。

或者,也许以上都不是。有人知道吗?

Sha*_*nky 5

我不能把它作为评论,所以这里是给你的。这不是您问题的竞争答案,因为您的问题可以由在 Microsoft 或 Paul Randal 工作的人正确回答(我猜)。我只能说出于所有实际目的,每个信息都被记录下来。

您可以使用未记录的命令读取日志文件的内容

select * from fn_dblog(Null,Null)
Run Code Online (Sandbox Code Playgroud)

如果你运行它,你可以看到很多与数据库、页面、范围、锁等相关的信息。但是您很难从中提取信息,因为它需要一定程度的专业知识来破译输出。

如果您阅读联机丛书文档SQL Server 事务日志架构和管理,它会说

许多类型的操作都记录在事务日志中。这些操作包括:

• 每笔交易的开始和结束。

• 每次数据修改(插入、更新或删除)。这包括系统存储过程或数据定义语言 (DDL) 语句对任何表(包括系统表)所做的更改。

• 每个范围和页面分配或解除分配。

• 创建或删除表或索引。

数据修改的日志记录要么记录执行的逻辑操作,要么记录修改数据的前后图像。之前的图像是执行操作之前的数据的副本;后映像是执行操作后的数据副本。

AFAIK 没有关于被触发的查询的信息,但查询所做的更改写在事务日志中。对页面、范围、所采取的锁、被锁定的资源所做的更改。