事务日志文件的内容更详细


11

我有一个关于事务日志(简称为LDF)内容的问题。我假设数据库具有完整的恢复模型。

我已经读到LDF文件包含(记录)对数据库的每个操作(处于完全恢复模式)。与期间记录BEGIN TRAN; COMMAND(s); COMMIT有何不同?我问是因为显然您可以回滚事务,但是您不能回滚标准命令(在完全恢复模式下)。

我猜想在事务处理期间,被记录到LDF文件中的内容与常规的完全恢复日志记录中的内容不同。那正确吗?有什么不同?难道每个动作都只包含“撤消”操作吗?

在相关说明中,我听说有使用完整恢复LDF文件来“回滚/撤消”标准查询的商业工具。他们是如何做到的呢?他们是否分析LDF内容并尝试提出逆/撤消运算?


相关:如何在SQL Server 2008中的堆栈溢出中查看事务日志
Vadzim 2015年

Answers:


11

不同之处在于您所谓的“标准命令”具有隐式事务(如“非显式”和非真正的隐式事务,这意味着有所不同),因此每次您发出INSERT不带显式事务的命令时,它都会打开一个事务,插入数据并自动提交。这称为自动提交事务。

这也是为什么您不能回滚INSERT它的原因:它已经提交了。因此,规则与显式事务相同:提交后就无法回滚

您可以直接从SQL Server内部了解我的意思。

Microsoft随SQL Server一起提供了一个称为DMF的DMF,该DMF sys.fn_dblog可用于查看给定数据库的事务日志。

对于这个简单的实验,我将使用AdventureWorks数据库:

USE AdventureWorks2008;
GO

SELECT TOP 10 *
FROM dbo.Person;
GO

INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;

BEGIN TRAN;
INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;
GO

SELECT *
FROM sys.fn_dblog(NULL, NULL);
GO

在这里,我要进行两次插入:一次插入和一次插入都不进行显式事务。

在日志文件中,您可以看到两者之间绝对没有区别:

自动提交与显式事务

红色的是INSERT自动提交事务中的,蓝色的是INSERT显式事务中的。

至于您提到的第三方工具,是的,它们分析数据库日志并生成普通的T-SQL代码以“撤消”或“重做”操作。通常,我的意思是,除了生成将与日志文件中的内容完全相反的脚本之外,它们没有执行任何其他特殊操作。


7

我将在ApexSQL Log示例中解释商业工具的工作方式

在相关说明中,我听说有一些商业工具可以使用完整恢复的LDF文件来“回滚/撤消”标准查询。他们是如何做到的呢?他们是否分析LDF内容并尝试提出逆/撤消运算?

是的,他们读取了LDF文件(在线或分离的文件)和trn文件(事务日志备份),查找发生了什么事务,并创建将执行相同或相反操作的脚本。

但是请注意,撤消和重做脚本不必与执行的脚本完全相同,但是效果将完全相同。

例如,如果执行的脚本是:

DELETE FROM [Person].[AddressType] WHERE Name  = 'New Loc22'

事务日志将记录删除表中具有列值9,“ New Loc22”,“ 41BC2FF6-F0FC-475F-8EB9-CEC1805AA0F6”和“ 2002/06/01 00:00:00.000”的行。从表结构中,该工具将读取主键为AddressType列,并将创建以下重做脚本:

DELETE FROM [Person].[AddressType] WHERE [AddressTypeID] = 9

请注意,事务绑定到“主键”列,而不是原始where子句中使用的列。同样,撤消脚本将是:

INSERT INTO [Person].[AddressType] ([AddressTypeID], [Name], [rowguid], [ModifiedDate]) VALUES (9, N'New loc22' COLLATE SQL_Latin1_General_CP1_CI_AS, '41bc2ff6-f0fc-475f-8eb9-cec1805aa0f6', '20020601 00:00:00.000')

在此处输入图片说明

免责声明:我是ApexSQL的支持工程师

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.