假设我正在运行日志备份,并且该日志备份需要 10 分钟才能完成。在这 10 分钟的窗口中,将运行更多事务。鉴于以下示例,日志备份实际包含哪些事务?
- 事务 A 提交
- 交易 B 打开
- 日志备份开始
- 交易 C 开启
- 事务 B 提交
- 日志备份完成
- 事务 C 提交
假设我正在运行日志备份,并且该日志备份需要 10 分钟才能完成。在这 10 分钟的窗口中,将运行更多事务。鉴于以下示例,日志备份实际包含哪些事务?
- 事务 A 提交
- 交易 B 打开
- 日志备份开始
- 交易 C 开启
- 事务 B 提交
- 日志备份完成
- 事务 C 提交
日志备份文件应包含备份完成运行之前的所有事务(包括尚未提交的事务),您可以按如下方式对其进行验证:
一旦创建了将在测试中使用的数据库和表,请进行第一次完整备份,以便以后可以进行日志备份。
现在进行了完整备份,让我们在表中插入一些数据:
请注意,第二个插入位于
BEGIN TRAN
尚未提交的 a 下。接下来我们将使用函数 [fn_dblog 来检查日志文件的内容,然后再进行日志备份。在图片上我们可以看到与第一个和第二个相关的 LSN
INSERT
进行了日志备份,我们可以使用以下查询使用函数fn_dump_dblog读取其内容:
正如我们所见,那些与未完成事务相关的 LSN 实际上在事务日志备份中,即使它们没有被提交。问题是正如微软所说
因此,在执行该日志备份的还原后,与那些未完成事务相关的数据将被回滚以使数据库保持一致状态(请参阅恢复和事务日志)。
您可以考虑安全(可以恢复)所有已提交的事务。可以通过删除数据库 MyDB 并恢复使用上述步骤生成的备份来验证它。
事务日志包含在事务日志完成时已完全提交的所有事务。
使用上面的示例,事务日志包含 A 和 B。这类似于完整备份,其中包含备份完成时提交的所有事务的尾日志备份。
这个网站是很好的进一步阅读。 https://sqlbak.com/academy/transaction-log-backup