Как найти точное время последней полученной транзакции на асинхронном зеркале (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, поэтому он не будет потерян, даже если у него есть более поздняя отметка времени. Таким образом, ваша временная метка не является абсолютной, поэтому я говорю "потеря данных не произойдет раньше, чем...", а не "данные после... будут потеряны".

Другие вопросы по тегам