Jenis korupsi apa yang bisa dilewatkan oleh DBCC CheckDB?

16

Pertanyaan ini diminta oleh posting sebelumnya dan saya memiliki database yang diajukan untuk penyelidikan di masa depan yang dipulihkan berikut:

BACKUP 'BrokenDatabase' detected an error on page (1:123456) in file BrokenDatabase.mdf'.
Error: 3043, Severity: 16, State: 1.

Dalam pertanyaan terkait dan cadangan yang saya siapkan untuk investigasi PAGE DBCC, DBCC CHECKDB lulus tanpa kesalahan tetapi korupsi jelas ada.

Jenis korupsi apa yang dapat terjadi di mana CHECKDB akan lulus tetapi CADANGAN DENGAN CHECKSUM akan gagal?

Mark Storey-Smith
sumber
1
Mungkin, DBCC IND: perintah menyediakan daftar halaman yang digunakan oleh tabel atau indeks? Anda dapat melihat tabel, indeks di mana masalahnya.
garik
1
Saya melakukan analisis cepat pada halaman yang melemparkan kesalahan ketika masalah terjadi. Studi 30 menit menyimpulkan bahwa saya perlu lebih dari 30 menit untuk mencari tahu apa yang salah :) Ketika saya kembali untuk melihatnya secara lebih rinci, saya akan mengajukan pertanyaan terpisah dengan spesifik dari kasus itu.
Mark Storey-Smith

Jawaban:

10

Berikut ini adalah kompilasi hasil yang saya baca. Anda akan menemukan lebih banyak informasi di blog dan dokumen yang ditautkan.

Pertama, itu bisa terjadi yang DBCC CHECKDBtidak akan mendeteksi inkonsistensi jika Anda mematikan verifikasi checksum atau torn_page. Kutipan dari Paul Randal dalam posting ini :

Anda benar - jika sobekan halaman atau checksum tidak diaktifkan maka tidak ada yang dapat dideteksi sejauh menyangkut opsi perlindungan halaman. CHECKDB mungkin masih menemukan korupsi yang ditemukannya dari melakukan semua pemeriksaan konsistensi yang dilakukannya - tetapi tidak akan melihat korupsi di tengah nilai data, misalnya.

Ha - itu payah tentang mengaktifkan halaman checksum - tidak ada yang terjadi sampai halaman dibaca, diubah, dan ditulis kembali. Satu-satunya cara untuk memaksa halaman untuk mendapatkan checksum adalah dengan mengubahnya - misalnya dengan membangun kembali semua indeks Anda, yang mungkin tidak menyenangkan - tidak ada alat 'sentuh' di sana.

Situasi di atas dapat mengenai Anda, jika Anda memutakhirkan database dari SQL Server 2000 atau sebelum ke 2005 atau lebih baru. Anda kemudian perlu mengaktifkan checksum halaman secara manual dengan ALTER DATABASE untuk mengaktifkannya. Tetapi kemudian paragraf ke-2 dari kutipan di atas menendang dan mungkin mengganggu Anda.

BACKUP WITH CHECKSUMakan mendeteksi ketidakkonsistenan checksum, tetapi hanya jika halaman tersebut sudah memiliki checksum yang ditulis untuknya, ketika sedang didukung Biasanya DBCC CHECKDBjuga mendeteksi kesalahan ini, jadi itu bukan ide yang baik untuk menggunakan CADANGAN DENGAN CHECKSUM untuk menggantikan DBCC CHECKDB .

Sekarang ada kemungkinan kedua untuk DBCC CHECKDB tidak menunjukkan ketidakkonsistenan, bahkan jika ada beberapa. Untuk ini saya hanya mengutip lagi Paul Randal dalam Kesalahpahaman tentang korupsi: dapatkah mereka menghilang? :

Jadi bagaimana dengan korupsi yang menghilang? Ini masuk ke dalam cara kerja pemeriksaan konsistensi. Pemeriksaan konsistensi hanya berjalan di halaman dalam database yang dialokasikan. Jika halaman tidak dialokasikan untuk apa pun, maka 8192 byte itu tidak ada artinya dan tidak dapat diartikan. Jangan bingung antara dicadangkan dan dialokasikan - saya jelaskan dalam kesalahpahaman pertama posting di sini. Selama halaman dialokasikan, itu akan diperiksa konsistensi oleh DBCC CHECKDB, termasuk menguji halaman checksum, jika ada. Korupsi dapat 'menghilang' jika halaman yang rusak dialokasikan pada saat DBCC CHECKDB berjalan, tetapi kemudian dihapuskan pada saat DBCC CHECKDB berikutnya berjalan. Pertama kali akan dilaporkan sebagai korup, tetapi yang kedua tidak dialokasikan, jadi tidak diperiksa konsistensi dan tidak akan dilaporkan sebagai korup. Korupsi sepertinya menghilang secara misterius. Tetapi belum - hanya saja halaman korup tidak lagi dialokasikan. Tidak ada yang menghentikan SQL Server untuk menghapus halaman yang rusak - pada kenyataannya, itulah yang dilakukan oleh banyak perbaikan DBCC CHECKDB - membatalkan semua yang rusak, dan memperbaiki semua tautan.

Saya tidak memiliki jawaban akhir untuk pertanyaan Anda, tetapi karena DBCC CHECKDBhanya memeriksa halaman yang dialokasikan itu tidak akan menunjukkan ketidakkonsistenan dalam halaman yang tidak dialokasikan. Satu-satunya situasi yang dapat saya bayangkan sekarang adalah bahwa CADANGAN juga membuat cadangan halaman yang tidak dialokasikan yang menunjukkan potensi kesalahan checksum yang dilewati DBCC CHECKDB.

MicSim
sumber
Apakah sebagian besar artikel Paul sudah di-bookmark tetapi +1 untuk ringkasannya. Tidak satu pun dari ini berlaku untuk database yang saya sisihkan sehingga berharap orang lain dapat menambahkan pemikiran lebih lanjut.
Mark Storey-Smith