Как найти точное время последней полученной транзакции на асинхронном зеркале (SQL Server 2005)?
Мне нужно предоставить пользователям точное время целостности данных в случае принудительного обслуживания с возможной потерей данных.
Я думаю, что я могу найти последний LSN, используя:
SELECT [mirroring_failover_lsn]
FROM [master].[sys].[database_mirroring]
Но это не даст мне точное время.
1 ответ
Прочтите Как читать и интерпретировать журнал SQL Server. Вы увидите, что LOP_BEGIN_XACT содержит метку времени. Имея номер LSN, вы можете проанализировать журнал и найти все ожидающие транзакции (то есть все xact_ids, для которых не зафиксировано принятие или откат до указанного номера LSN). Все ожидающие преобразования будут отменены в случае сбоя. Это будет потеря данных, если произойдет принудительное переключение при сбое. Будет несколько ожидающих транзакций, которые будут отменены, и эти различные транзакции начались в разное время. Если вы хотите прикрепить "точное время целостности данных", то вы можете сказать, что потеря данных не произойдет ни для чего раньше, чем самый ранний ожидающий 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, поэтому он не будет потерян, даже если у него есть более поздняя отметка времени. Таким образом, ваша временная метка не является абсолютной, поэтому я говорю "потеря данных не произойдет раньше, чем...", а не "данные после... будут потеряны".