Wir verwenden SQL Server mit vollständigem Wiederherstellungsmodus. Bei einer vollständigen Sicherung und einer Reihe von Protokollsicherungen möchten wir überprüfen können, ob die Protokollkette von der letzten vollständigen Sicherung bis zum aktuellen Endprotokoll vollständig ist. (Ohne diese Sicherungen tatsächlich wiederherzustellen. Der Zweck hier besteht darin, die Konsistenz der Sicherungen zu testen.)
Ich weiß bereits, wie dies für die vorhandenen Sicherungen gemacht wird: Mit RESTORE HEADERONLY erhalte ich den FirstLSN und LastLSN jeder Datei, die für aufeinanderfolgende Dateien verglichen werden können, um festzustellen, ob sie kompatibel sind.
Ich weiß jedoch nicht, wie ich überprüfen soll, ob das Endprotokoll der letzten Protokollsicherung folgt.
Wenn ich den FirstLSN des Endprotokolls hätte, könnte ich ihn mit dem LastLSN der letzten Protokollsicherung vergleichen. Aber wie kann ich den FirstLSN des Endprotokolls erhalten?
Ich benötige eine Lösung, die ab SQL Server 2005 funktioniert (idealerweise mit t-sql). Bisher habe ich vergeblich bei Google gesucht. Übrigens. Ich habe dies zuerst auf stackoverflow gepostet. aber migrierte es hierher, da es dort als Off-Topic markiert wurde.
BEARBEITEN
Ich habe die beiden bereitgestellten Lösungen anhand eines kleinen Beispiels ausprobiert (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
Es scheint also, dass der erste um mehrere Größenordnungen abweicht.
Ich habe dann den gleichen Test mit SQL 2008 SP1 (10.00.2531) durchgeführt, wobei beide Abfragen die richtige Antwort ergaben.
quelle
Antworten:
Ich habe mich an meine Kopie von SQL Server 2008 Internals gewandt, und auf die DMV sys.database_recovery_status wurde hingewiesen, um die erste LSN der nächsten Protokollsicherung zu finden. Welche von BOL die Spalte
last_log_backup_lsn
bietet Ihnen:Um nur zu erwähnen, dass Kalen auch den Punkt anspricht, dass Sie einen NULL-Wert erhalten, wenn sich die Datenbank im EINFACHEN Wiederherstellungsmodus (Autotruncate-Modus) befindet oder wenn keine Protokollsicherung vorhanden ist.
Ohne das Endprotokoll einer Datenbank tatsächlich zu sichern (Sie haben keine Testinstanz, um dies anzuprobieren), könnten Sie logischerweise den Schluss ziehen, dass der in der genannten Spalte zurückgegebene Wert die erste LSN der nächsten Protokollsicherung ist, in Ihrem Fall die Schwanz.
Wenn Sie also Folgendes ausführen, wird der Wert zurückgegeben, nach dem Sie meiner Meinung nach suchen:
Diese DMV ist ab SQL 2005 verfügbar.
BEARBEITEN
Wenn Sie den BOL-Link nicht lesen, beachten Sie bitte, dass diese DMV nur Werte an Datenbanken zurückgibt, die online sind oder geöffnet werden, wenn BOL darauf verweist. Wenn ein Fehler auftritt, bei dem Sie eine Endprotokollsicherung einer Datenbank durchführen müssen, können Sie diesen Wert nur anhand des obigen Codes überprüfen, wenn auf die Datenbank zugegriffen werden kann. was bei einem Ausfall wahrscheinlich nicht der Fall wäre.
quelle
So etwas wie das Folgende sollte es tun.
Verwenden des Konvertierungscodes zur Dezimalstelle aus diesem Artikel .
Der
ORDER BY [Current LSN]
Aufwand kann durchaus völlig unnötig sein. Ich bin mir nicht sicher. Das Ergebnis dieser Funktion scheint immer in LSN-Reihenfolge zu sein, und ich denke, sie liest das Protokoll nur nacheinander, aber nur für den Fall ...quelle
fn_dblog
scheint nicht sehr gut dokumentiert zu sein. Ich gehe davon aus, dass die Ergebnisse immer für die aktuelle Datenbank gelten (daWHERE DbName = 'XXX'
das Snippet keine enthält ).CONVERT
Parameter with style2
könnte das Problem sein.