Cadangan mendeteksi korupsi, tetapi CHECKDB tidak

12

Saya memiliki database di mana ketika saya menjalankan perintah cadangan

BACKUP DATABASE [MyDatabase] TO     
DISK =  'G:\Backup\MyDatabase_01_01_2018.bak'   
WITH    NOFORMAT, NOSKIP, COMPRESSION, INIT, BUFFERCOUNT = 100

Saya mendapatkan pesan kesalahan

Msg 3043, Level 16, Negara 1, Baris 8
CADANGAN 'MyDatabase' mendeteksi kesalahan pada halaman (1: 745345) dalam file 'F: \ Data \ MyDatabase_1.ndf'.
Msg 3013, Level 16, Negara 1, Jalur 8
DATABASE CADANGAN diakhiri secara tidak normal.

Saya menjalankan CHECKDB penuh tetapi kembali bersih. Saya memperhatikan bahwa opsi Verifikasi Halaman telah disetel ke NONE (bukan pekerjaan saya) jadi saya mengubahnya menjadi CHECKSUM dan membangun kembali semua indeks dalam DB untuk membuatnya menulis ke semua halaman dan menghasilkan checksum. Setelah ini cadangan masih gagal dan checkdb masih menunjukkan bersih (jadi tidak ada perubahan).

DBCC CHECKDB('MyDatabase') WITH NO_INFOMSGS, ALL_ERRORMSGS,
DATA_PURITY, EXTENDED_LOGICAL_CHECKS;

dari log SQL:

DBCC CHECKDB (MyDatabase) DENGAN all_errormsgs, no_infomsgs, data_purity yang dieksekusi oleh xxx menemukan 0 kesalahan dan memperbaiki 0 kesalahan. Waktu yang berlalu: 0 jam 21 menit 46 detik. Database snapshot internal memiliki titik perpecahan LSN = 000ab776: 0000112f: 0001 dan LSN pertama = 000ab776: 0000112d: 0001.

Saya menjalankan PAGE DBCC tetapi kesalahan (sepertinya tidak mengembalikan halaman yang tepat di tempat pertama). Saya BISA menjalankannya dengan opsi cetak 2 dan kembali tetapi jujur ​​saya tidak tahu apa yang saya cari di sana.

DBCC PAGE ('MyDatabase',1,745345,3)
HALAMAN: (3: 513793)

PENYANGGA:


BUF @ 0x00000003811F8280

bpage = 0x00000000F2D70000 bhash = 0x0000000000000000 bpageno = (1: 745345)
bdbid = 5 pelanggaran = 0 bcputicks = 0
bsampleCount = 0 bUse1 = 44283 bstat = 0x809
blog = 0x5adb215a bnext = 0x000000000000000000          

KEPALA HALAMAN:


Halaman @ 0x00000000F2D70000

m_pageId = (3: 513793) m_headerVersion = 1 m_type = 2
m_typeFlagBits = 0x4 m_level = 0 m_flagBits = 0x0
m_objId (AllocUnitId.idObj) = 1075937538 m_indexId (AllocUnitId.idInd) = 2
Metadata: AllocUnitId = 633462595911680 Metadata: PartitionId = 0
Metadata: IndexId = -1 Metadata: ObjectId = 0 m_prevPage = (3: 513795)
m_nextPage = (3: 513820) pminlen = 17 m_slotCnt = 426
m_freeCnt = 2 m_freeData = 7338 m_reservedCnt = 0
m_lsn = (608841: 643611: 411) m_xactReserved = 0 m_xdesId = (0: 0)
m_ghostRecCnt = 0 m_tornBits = 0 DB Frag ID = 1

Status Alokasi

GAM (1: 511232) = SGAM ALOKASI (1: 511233) = TIDAK DIALOKASI     
PFS (1: 744096) = 0x40 ALLOCATED 0_PCT_FULL DIFF (1: 511238) = TIDAK BERUBAH
ML (1: 511239) = TIDAK MIN_LOGGED      

Msg 2514, Level 16, Negara 8, Baris 20
Terjadi kesalahan PAGE DBCC: Metadata halaman tidak valid - dump style 3 tidak dimungkinkan.

Adakah ide yang bisa saya coba selanjutnya? Versi server adalah

select @@version
Microsoft SQL Server 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (X64) 
    21 Februari 2018 12:19:47 
    Hak Cipta (c) Microsoft Corporation
    Edisi Pengembang (64-bit) pada Windows NT 6.3 (Build 9600:) (Hypervisor)

Tingkat kompatibilitas DB adalah 100 (SQL 2008).

Elemen Nol
sumber
Komentar untuk pertanyaan ini telah dipindahkan ke obrolan .
Paul White 9

Jawaban:

9

Jawaban ini diambil dari masalah buletin SQLskills.com yang ditulis oleh Paul Randal, tentang "database yang akan gagal membuat cadangan dengan kesalahan halaman checksum, tetapi melewati DBCC CHECKDB".

Satu-satunya waktu ini dapat terjadi adalah ketika suatu tingkat adalah tingkat campuran (di mana 8 halaman dalam batas tersebut dapat dialokasikan ke berpotensi 8 unit alokasi yang berbeda - lihat di sini ) dan beberapa halaman secara keliru ditandai sebagai dialokasikan oleh halaman PFS yang relevan.

Ketika itu terjadi, DBCC CHECKDBtidak akan mencoba untuk membaca halaman-halaman itu, karena ia memperoleh halaman apa untuk dibaca dari halaman IAM unit alokasi (yang pertama berisi daftar halaman yang dialokasikan dari tingkat campuran). Kasus ini adalah celah dalam DBCC CHECKDBlogika deteksi korupsi.

[Karena] DBCC CHECKDBtidak bisa mendeteksi korupsi, itu tidak mungkin untuk melakukan perbaikan yang diperlukan untuk memperbaikinya. Jadi menggunakanDBCC WRITEPAGE , saya menghitung perubahan yang diperlukan dalam status alokasi untuk halaman yang dialokasikan secara salah, langsung di halaman PFS, dan berhasil!

Ini adalah kasus yang sangat jarang - jauh lebih umum bahwa DBCC CHECKDB gagal tetapi cadangan akan berhasil.

Menurut pendapat saya, resolusi Paul jauh di atas dan di luar mengekspor dan mengimpor data seperti yang Anda lakukan, jadi saya pikir Anda melakukan hal yang benar.

Randolph Barat
sumber