Gejala
Saat Anda menggunakan pencerminan database di Microsoft SQL Server 2012 atau Microsoft SQL Server 2014, Anda mungkin mengalami kondisi menegaskan dan pencerminan pangkalan data masuk ke status ditangguhkan.
Penyebab
Masalah ini terjadi karena saat mengalokasikan halaman baru, SQL Server mendapatkan kunci X pada halaman baru. SQL Server akan meletakkan hobt_id (timbunan atau ID pohon B) tempat halaman baru tersebut berada di dalam permintaan kunci. Namun, SQL Server tidak bisa meletakkan hobt_id dalam mirroring log dan hasil dalam perilaku kunci yang berbeda antara utama dan cermin. Ini bisa dijelaskan secara mendetail sebagai berikut:
-
T1 tahan kunci IX pada halaman P1.
-
T2 melakukan pembagian halaman pada P1, mengalokasikan halaman baru P2, sebuah sistem transaksi TX digunakan di sini, ia memegang kunci X di P2. Di sini SQL Server tidak menempatkan hobt_id di mirroring log.
-
TX melakukan migrasi kunci untuk T1 guna memindahkan kunci IX dari P1 ke P2.
-
TX berkomitmen, sekarang T2 dapat menggunakan halaman P2, dan T2 mendapatkan kunci IX lain di halaman P2.
-
T1 berkomitmen, kini T2 adalah satu-satunya yang memegang kunci IX di P2.
-
Setelah menyisipkan, eskalasi kunci terjadi, di utama, T2 merilis IX di P2, tapi pada cermin, selama eskalasi Lock, T2 tidak melepaskan kunci IX.
-
Setelah menghapus, halaman P2 menjadi kosong dan deallocated.
-
T3 memerlukan halaman baru, dan hal ini terjadi untuk mengalokasikan P2, ini memerlukan kunci X, tapi pada cermin, langkah ini gagal karena langkah 6.
Pada cermin, langkah 6 tidak melepaskan kunci IX karena hobt_id dalam blok kunci salah. Hobt_id yang salah ini terjadi selama langkah 2 dan karena SQL Server tidak memasukkan hobt_id dalam log pencerminan. biasanya Anda tidak melihat masalah apa pun karena TX dalam langkah 2 sangat singkat, dan blok kunci dengan hobt_id yang tidak tepat akan dilepaskan saat ia melakukannya. Namun, karena kunci migrasi di Step3 dan langkah-langkah berikut ini (4 dan 5), blok kunci ini dengan kesalahan hobt_id dipertahankan dan akhirnya menyebabkan masalah. Utama tidak memiliki masalah ini karena menggunakan hobt_id yang benar di langkah 2. Tapi catatan log tidak memiliki hobt_id yang benar.
Pemecahan Masalah
Masalah ini pertama kali diperbaiki dalam pembaruan kumulatif SQL Server berikut ini.
Pembaruan kumulatif 1 untuk SQL Server 2014 /en-us/help/2931693
Pembaruan kumulatif 9 untuk SQL Server 2012 SP1 /en-us/help/2931078
Setiap pembaruan kumulatif baru untuk SQL Server berisi semua hotfix dan semua perbaikan keamanan yang disertakan dengan pembaruan kumulatif sebelumnya. Lihat pembaruan kumulatif terbaru untuk SQL Server:
Penyelesaian Masalah
Untuk mengatasi masalah ini, reinitialize cermin untuk mengakhiri status ditangguhkan.
Status
Microsoft telah mengonfirmasi bahwa ini adalah masalah pada produk Microsoft yang tercantum di bagian "Berlaku untuk".