Używamy programu SQL Server z pełnym trybem odzyskiwania. Biorąc pod uwagę pełną kopię zapasową i serię kopii zapasowych dziennika, chcielibyśmy móc sprawdzić, czy łańcuch dziennika jest kompletny od ostatniej pełnej kopii zapasowej do bieżącego dziennika ogona. (Bez faktycznego przywracania tych kopii zapasowych; celem jest przetestowanie spójności kopii zapasowych).
Wiem już, jak to zrobić dla istniejących kopii zapasowych: używając PRZYWRACANIA HEADERONLY otrzymuję FirstLSN i LastLSN każdego pliku, który można porównać dla kolejnych plików, w celu ustalenia, czy są one kompatybilne.
Nie wiem jednak, jak sprawdzić, czy dziennik ogona następuje po ostatniej kopii zapasowej dziennika.
Gdybym miał FirstLSN dziennika ogona, mógłbym porównać go do LastLSN ostatniej kopii zapasowej dziennika. Ale jak mogę uzyskać FirstLSN dziennika ogona?
Potrzebuję rozwiązania, które działa od SQL Server 2005 w górę (najlepiej przy użyciu t-sql). Do tej pory szukałem Google bezskutecznie. Btw. Po raz pierwszy opublikowałem to na stackoverflow; ale migrowałem go tutaj, ponieważ został tam oznaczony jako nie na temat.
EDYTOWAĆ
Wypróbowałem dwa dostarczone rozwiązania na małym przykładzie (SQL Server 2005, 9.0.5057):
BACKUP DATABASE TestDb TO DISK = 'C:\temp\backup test\Full.bak'
-- fire some update queries
BACKUP LOG TestDb TO DISK = 'C:\temp\backup test\Log1.bak'
-- fire both queries from the provided answers:
-- Martin Smith's answer yields: 838886656088920652852608
-- Shawn Melton's answer yields: 46000000267600001
RESTORE HEADERONLY FROM DISK = 'C:\temp\backup test\Log1.bak'
-- yields: 46000000267600001
Wygląda na to, że pierwszy jest wyłączony o kilka rzędów wielkości.
Następnie wykonałem ten sam test na SQL 2008 SP1 (10.00.2531), gdzie oba zapytania dały poprawną odpowiedź.
źródło
Odpowiedzi:
Zwróciłem się do mojej kopii SQL Server 2008 Wewnętrzne i DMV sys.database_recovery_status został wskazany, aby znaleźć pierwszą LSN następnej kopii zapasowej dziennika. Które przechodząc przez BOL kolumna
last_log_backup_lsn
zapewnia:Wystarczy wspomnieć, że Kalen również podnosi kwestię, że otrzymasz wartość NULL, jeśli baza danych jest w trybie odzyskiwania SIMPLE (tryb automatycznego wyłączania) lub jeśli nie ma kopii zapasowej dziennika.
Bez faktycznego tworzenia kopii zapasowej dziennika ogona bazy danych (nie ma instancji testowej do wypróbowania tego), można logicznie stwierdzić, że wartość zwrócona w wymienionej kolumnie byłaby pierwszą LSN kolejnej kopii zapasowej dziennika, w twoim przypadku ogon.
Wykonanie następującego zwróci wartość, której według mnie szukasz:
Ten DMV jest dostępny począwszy od SQL 2005.
EDYCJA
O ile nie przeczytasz linku BOL, pamiętaj, że ten DMV zwróci tylko wartości do baz danych, które są w trybie online, lub otwarte, gdy BOL odwołuje się do niego. Jeśli wystąpi awaria, która wymaga wykonania kopii zapasowej dziennika bazy danych bazy danych, nie będzie można zweryfikować tej wartości za pomocą powyższego kodu, chyba że baza danych jest dostępna; co w przypadku awarii prawdopodobnie nie byłoby.
źródło
Powinno to zrobić coś takiego.
Używanie kodu konwersji dziesiętnej z tego artykułu .
ORDER BY [Current LSN]
Może okazać się całkowicie niepotrzebne koszty. Nie jestem pewny. Wynik tej funkcji zawsze wydaje się być w kolejności LSN i myślę, że po prostu czyta dziennik sekwencyjnie, ale na wszelki wypadek ...źródło
fn_dblog
nie wydaje się być zbyt dobrze udokumentowany. Zakładam, że jego wyniki zawsze zachowują się dla bieżącej bazy danych (ponieważ nie ma jejWHERE DbName = 'XXX'
we fragmencie)?CONVERT
Stylu parametr2
może być problem.