我需要为用户提供准确的数据完整性时间,以防强制服务可能导致数据丢失。
我想我可以使用以下方法找到最后一个 LSN:
SELECT [mirroring_failover_lsn]
FROM [master].[sys].[database_mirroring]
但这不会给我确切的时间。
我需要为用户提供准确的数据完整性时间,以防强制服务可能导致数据丢失。
我想我可以使用以下方法找到最后一个 LSN:
SELECT [mirroring_failover_lsn]
FROM [master].[sys].[database_mirroring]
但这不会给我确切的时间。
阅读如何阅读和解释 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 3由LSN 8 提交,因此它不会丢失,即使它具有较晚的时间戳。因此,您的时间戳不是绝对的,这就是为什么我说“在...之前不会发生数据丢失”而不是“...之后的数据将丢失”。