Kami menggunakan SQL Server dengan mode pemulihan penuh. Dengan cadangan lengkap dan serangkaian cadangan log, kami ingin dapat memeriksa apakah rantai log selesai dari cadangan penuh terakhir hingga log ekor saat ini. (Tanpa benar-benar mengembalikan cadangan ini; tujuannya di sini adalah untuk menguji konsistensi cadangan.)
Saya sudah tahu bagaimana melakukan ini untuk cadangan yang ada: menggunakan RESTORE HEADERONLY Saya mendapatkan FirstLSN dan LastLSN dari setiap file, yang dapat dibandingkan untuk file yang berurutan, untuk menentukan apakah mereka kompatibel.
Namun, saya tidak tahu bagaimana memeriksa apakah log ekor mengikuti cadangan log terakhir.
Jika saya memiliki FirstLSN dari log ekor, saya bisa membandingkannya dengan LastLSN dari cadangan log terakhir. Tetapi bagaimana saya bisa mendapatkan FirstLSN dari log ekor?
Saya memerlukan solusi yang bekerja dari SQL Server 2005 ke atas (idealnya menggunakan t-sql). Sejauh ini, saya telah mencari Google tetapi tidak berhasil. Btw. Saya pertama kali memposting ini di stackoverflow; tetapi bermigrasi di sini karena ditandai di luar topik di sana.
EDIT
Saya mencoba dua solusi yang diberikan pada contoh kecil (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
Jadi tampaknya yang pertama dimatikan oleh beberapa urutan besarnya.
Saya kemudian melakukan tes yang sama pada SQL 2008 SP1 (10.00.2531), di mana kedua kueri menghasilkan jawaban yang benar.
sumber
Jawaban:
Saya menoleh ke salinan SQL Server 2008 Internal dan DMV sys.database_recovery_status ditunjukkan untuk menemukan LSN pertama dari cadangan log berikutnya. Yang terjadi dengan BOL, kolom
last_log_backup_lsn
memberi Anda:Hanya untuk menyebutkan juga bahwa Kalen juga memunculkan poin bahwa Anda akan mendapatkan nilai NULL jika database berada dalam mode pemulihan SEDERHANA (mode autotruncate) atau jika tidak ada cadangan log.
Tanpa benar-benar mencadangkan log ekor dari database (tidak memiliki contoh uji untuk mencoba ini), Anda dapat menyimpulkan bahwa nilai yang dikembalikan pada kolom yang disebutkan akan menjadi LSN pertama dari cadangan log berikutnya, dalam kasus Anda ekor.
Jadi, mengeksekusi yang berikut ini akan mengembalikan nilai yang saya yakin Anda cari:
DMV ini tersedia mulai dari SQL 2005.
EDIT
Kecuali Anda membaca tautan BOL, harap perhatikan bahwa DMV ini hanya akan mengembalikan nilai ke database yang sedang online, atau dibuka sebagai referensi BOL. Jika terjadi kegagalan yang mengharuskan Anda untuk mengambil cadangan log ekor dari database Anda tidak akan dapat memverifikasi nilai ini melalui kode di atas kecuali database dapat diakses; yang dalam kegagalan itu mungkin tidak akan terjadi.
sumber
Sesuatu seperti yang berikut ini harus melakukannya.
Menggunakan kode konversi ke desimal dari artikel ini .
The
ORDER BY [Current LSN]
juga mungkin overhead yang sama sekali tidak perlu. Saya tidak yakin. Hasil dari fungsi ini sepertinya selalu dalam urutan LSN dan saya kira itu hanya membaca log secara berurutan tetapi untuk berjaga-jaga ...sumber
fn_dblog
sepertinya tidak didokumentasikan dengan sangat baik. Saya menganggap hasilnya selalu berlaku untuk database saat ini (karena tidak adaWHERE DbName = 'XXX'
dalam cuplikan)?CONVERT
dengan gaya parameter2
mungkin menjadi masalahnya.