0

我需要为用户提供准确的数据完整性时间,以防强制服务可能导致数据丢失。

我想我可以使用以下方法找到最后一个 LSN:

SELECT [mirroring_failover_lsn] 
FROM [master].[sys].[database_mirroring]

但这不会给我确切的时间。

4

1 回答 1

1

阅读如何阅读和解释 SQL Server 日志。您会看到 LOP_BEGIN_XACT 包含一个时间戳。给定一个 LSN,您可以分析日志并找到所有待处理的事务(即在给定 LSN 之前没有记录提交或回滚的所有 xact_id)。在故障转移的情况下,所有待处理的事务都将回滚。如果发生强制故障转移,这将是丢失的数据。将有许多待处理的交易将被撤消,并且这些不同的交易已经在不同的时间开始。如果您想附加“数据完整性的确切时间”,那么您可以说在最早的未决 lop_begin_xact 之前不会发生任何数据丢失。例如。给定以下日志流:

+-----+-----------+---------+------------+
| LSN | Operation | xact_id | timestampt |
+-----+-----------+---------+------------+
|  1  |INSERT     |  1      |            |
|  2  |BEGIN_XACT |  2      | 12:00      |
|  3  |INSERT     |  1      |            |
|  4  |BEGIN_XACT |  3      | 12:02      |
|  5  |COMMIT_XACT|  1      |            |
|  6  |INSERT     |  2      |            |
|  7  |INSERT     |  3      |            |
|  8  |COMMIT_XACT|  3      |            |
|  9  |COMMIT_XACT|  2      |            |

假设镜像故障转移 LSN 为 8。在这种情况下,您可以说在 12:00 之前不会发生数据丢失,因为 xact_id 2 未在 LSN 8 处提交,因此它将被回滚。请注意,xact_id 3LSN 8 提交,因此它不会丢失,即使它具有较晚的时间戳。因此,您的时间戳不是绝对的,这就是为什么我说“在...之前不会发生数据丢失”而不是“...之后的数据将丢失”。

于 2014-10-28T11:35:01.170 回答