Membagi DBCC CHECKDB selama beberapa hari

10

Saya sedang berupaya menerapkan metode Paul Randal untuk menyebarkan DBCC CHECKDB secara manual selama beberapa hari untuk database yang sangat besar, yang pada dasarnya terdiri dari:

  • Membagi tabel dalam database kira-kira sama antara 7 ember
  • Menjalankan DBALL CHECKALLOC dua kali seminggu
  • Menjalankan CHECKCATALOG DBCC seminggu sekali
  • Menjalankan DBCC CHECKTABLE pada satu ember setiap hari dalam seminggu

Adakah yang menggunakan teknik ini? Adakah skrip yang ada di luar sana?

Saya khawatir ini mungkin tidak benar-benar mencakup semua yang dilakukan CHECKDB; dokumentasi Books Online untuk CHECKDB mengatakan bahwa selain CHECKALLOC, CHECKCATALOG dan CHECKTABLE, itu juga:

  • Memvalidasi konten setiap tampilan yang diindeks dalam database.
  • Memvalidasi konsistensi tingkat tautan antara tabel metadata dan direktori sistem file dan file saat menyimpan data varbinary (max) dalam sistem file menggunakan FILESTREAM. (Hanya SQL 2008)
  • Memvalidasi data Pialang Layanan dalam database.

Jadi inilah pertanyaanku:

  1. Apakah pemeriksaan tambahan ini penting / penting? (Pandangan yang diindeks mungkin sedikit lebih mengkhawatirkan saya, saya pikir kami belum menggunakan Broker Layanan atau FILESTREAM.)

  2. Jika demikian, adakah cara untuk melakukan pemeriksaan tambahan ini secara terpisah?

  3. CHECKALLOC dan CHECKCATALOG tampaknya berjalan sangat cepat, bahkan pada dbs besar. Adakah alasan untuk tidak menjalankan ini setiap hari?

(Catatan: ini akan menjadi rutin standar untuk ribuan database yang ada di ratusan server, atau setidaknya setiap database dengan ukuran tertentu. Ini berarti bahwa opsi seperti merestrukturisasi semua database untuk menggunakan CHECKFILEGROUP tidak terlalu praktis bagi kami.)

BradC
sumber
Paul menjawab versi pertanyaan ini di komentar di blog-nya. Dia berkata, "Jangan khawatir tentang validasi tampilan yang diindeks. Ini tidak aktif sejak 2008 dan seterusnya karena tidak menemukan masalah."
BradC
Saya bekerja untuk melakukan hal yang sama - saran / gotcha yang Anda temukan, karena Anda mungkin sudah menerapkan ini?
scsimon
1
@scsimon Saya membuatnya bekerja dengan baik, lihat pertanyaan terkait ini untuk strategi spesifik yang saya gunakan untuk membagi tabel. Saya pikir saya akhirnya membuat daftar utama semua tabel di semua (besar) database di seluruh server untuk dibagi ke dalam "ember" harian, yang memberi saya lebih banyak perpecahan daripada membagi masing-masing daftar database secara individual. Basis data yang lebih kecil Saya hanya melakukan DBCC penuh setiap hari, dan bukan bagian dari pemisahan.
BradC

Jawaban:

6

Apakah pemeriksaan tambahan ini penting / penting? (Pandangan yang diindeks mungkin sedikit lebih mengkhawatirkan saya, saya pikir kami belum menggunakan Broker Layanan atau FILESTREAM.)

Anda dapat menjalankan DBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS langsung pada tampilan yang diindeks . Memeriksa pandangan yang diindeks dapat menimbulkan masalah dalam keadaan tertentu , jadi bersiaplah untuk menyelidiki setiap kesalahan positif yang dihasilkan. (Paul Randal juga menyebutkan dalam komentar pada artikel yang dirujuk bahwa negatif palsu juga mungkin terjadi, tetapi saya tidak memiliki pengalaman langsung tentang hal itu.)

Jika demikian, adakah cara untuk melakukan pemeriksaan tambahan ini secara terpisah?

Tidak ada dukungan untuk menjalankan Pialang Layanan atau FILESTREAMmemeriksa secara terpisah, tidak.

CHECKALLOCdan CHECKCATALOGtampaknya berjalan sangat cepat, bahkan pada dbs besar. Adakah alasan untuk tidak menjalankan ini setiap hari?

Bukannya aku sadar.


Anda mungkin juga mempertimbangkan untuk berlari DBCC CHECKCONSTRAINTS. Pemeriksaan ini tidak termasuk dalam DBCC CHECKDB, terlepas dari opsi yang Anda tentukan. Anda juga mungkin ingin berpikir tentang sesekali berjalan CHECKDB, karena dan ketika keadaan mengizinkan.

Paul White 9
sumber
6

DBCC CHECKDB sangat penting untuk database SQL Server agar 100% yakin bahwa tidak ada korupsi. Namun, karena basis data bertambah besar, sangat sulit untuk menemukan jendela pemeliharaan saat Anda mengklaim 24x7 ke atas. Selama bertahun-tahun, tim SQL Server telah menerapkan berbagai mekanisme yang akan mendeteksi bentuk paling umum dari korupsi terutama terkait dengan korupsi fisik yang disebabkan oleh perangkat keras.

SQL Server 2005 dan yang lebih baru memiliki PAGE_VERIFY = CHECKSUM yang dapat membantu Anda secara proaktif mendeteksi korupsi fisik di halaman database sehingga menambahkan checksum ke setiap halaman seperti yang ditulis ke sistem I / O dan memvalidasi checksum saat itu dibaca dari disk.

Juga, pencadangan (penuh atau diferensial) dengan CHECKSUM akan menjamin untuk mendeteksi korupsi I / O yang disebabkan oleh perangkat keras.

Oleh karena itu, dari sisi perangkat keras korupsi, SQL Server melakukan pekerjaan yang baik untuk mendeteksi dan melaporkannya. (Pastikan juga untuk mengatur Peringatan terkait korupsi yang penting ).

Bahwa sedang dikatakan, masih logis korupsi , kesalahan yang disebabkan scribbler - di mana halaman dalam memori rusak baik oleh kode pihak ketiga yang berjalan di dalam proses SQL Server atau oleh driver atau perangkat lunak lain dengan hak istimewa yang cukup mengeksekusi dalam mode kernel Windows dan / atau SQL Server Bug , dll tidak terdeteksi menggunakan metode di atas dan karenanya CHECKDB muncul.

DBCC CHECKDB melakukan pemeriksaan yang lebih menyeluruh yang mencakup memeriksa header halaman untuk kemungkinan korupsi yang tidak dapat dideteksi dengan cara lain.

Adakah skrip yang ada di luar sana?

Alih-alih menciptakan kembali roda, saya akan sangat menyarankan Anda untuk melihat solusi SQL Server Integrity Check

Menjalankan DBCC CHECKDB secara efisien:

Anda hanya perlu kreatif ketika Anda berada dalam jendela pemeliharaan yang ketat yang memiliki basis data sangat besar atau jumlah basis data yang tinggi untuk menjalankan CHECKDB.

Setelah mengikuti pelatihan SQLSkills, apa yang telah saya terapkan di lingkungan saya adalah:

  • memprioritaskan tabel apa yang penting untuk diperiksa.
  • pisahkan tabel menjadi kelompok dengan prioritas yang berbeda dan kemudian jalankan DBCC CHECKTABLEbersama dengan menjalankan DBCC CHECKALLOCdanDBCC CHECKCATALOG
  • Buat tabel pekerja yang akan menyimpan nama tabel dengan prioritas. Pastikan saja semua tabel prioritas tinggi (yang sangat besar) tidak berada dalam satu grup lagi, CHECKDB Anda tidak akan selesai sama sekali.
  • Anda bahkan dapat memiliki kolom batas waktu di tabel pekerja Anda yang akan mengatur kapan CHECKDB Anda akan terbunuh begitu telah melewati jendela pemeliharaan
  • Tambahkan berapa lama per tabel untuk dijalankan DBCC CHECKTABLE, DBCC CHECKALLOCdan DBCC CHECKCATALOG. Sehingga Anda bisa merasakan berapa lama biasanya untuk menjalankan cek Anda.
  • Anda bahkan dapat menjalankan dengan NOINDEXopsi karena akan mempercepat operasi karena tidak memeriksa Indeks Non-Clustered pada tabel pengguna. Ini memiliki beberapa keuntungan karena tidak sepenting korupsi data karena tidak ada data yang hilang dan Anda dapat menjatuhkan dan membuat ulang Indeks jika perlu.

Jelas, edisi Enterprise dapat mengambil keuntungan dari eksekusi Paralel pernyataan DBCC, tetapi perhatikan pengaturan MAXDOP karena mungkin akan berakhir dengan mengambil semua CPU Anda. Ini bisa sulit dibatasi oleh Gubernur Sumber Daya.

Catatan: Jika Anda memiliki kolom SPARSE, maka CHECKDB Anda akan mati lambat seperti dijelaskan di sini .

Akhirnya, ini adalah cara mencegah korupsi basis data dengan memanfaatkan semua set alat yang tersedia + keyakinan Anda pada sistem perangkat keras server basis data Anda dan yang paling penting nilai data Anda.

Beberapa referensi bagus:

Kin Shah
sumber