症狀
當您在 Microsoft SQL Server 2012 或 Microsoft SQL Server 2014 中使用資料庫鏡像時,可能會遇到判斷提示條件,資料庫鏡像進入暫停狀態。
原因
發生此問題的原因是,在配置新頁面時,SQL Server 會在新頁面上取得 X 鎖定。 SQL Server會將新頁面所屬的 hobt_id (堆或 B 樹識別碼) 放入鎖定要求中。 不過,SQL Server無法將hobt_id放在鏡像記錄檔中,導致主節點和鏡像之間的鎖定行為不同。
這可以詳細解釋如下:
- T1 按住第 P1 頁上的 IX 鎖定。
- T2 在 P1 上做一個分頁,分配一個新的頁面 P2,這裡用了一個系統事務 TX,它在 P2 上持有一個 X 鎖。 這裡SQL Server沒有將hobt_id放在鏡像記錄中。
- TX 會為 T1 執行鎖定移轉,將 IX 鎖定從 P1 移至 P2。
- TX 已提交,現在 T2 可以使用頁面 P2,並且 T2 在頁面 P2 上獲得另一個 IX 鎖定。
- T1 已提交,現在 T2 是唯一一個對 P2 持有 IX 鎖定的人。
- 多次插入之後,會發生鎖定擴大,在主資料庫上,T2 會釋放 P2 上的 IX,但在鏡像上,在鎖定擴大期間,T2 不會釋放 IX 鎖定。
- 在大量刪除之後,頁面 P2 變成空白並被解除配置。
- T3 需要一個新頁面,而它恰好分配了 P2,這需要一個 X 鎖定,但在鏡像上,此步驟因步驟 6 而失敗。
在鏡像上,步驟 6 不會釋放 IX 鎖,因為鎖定區塊中的hobt_id不正確。 此不正確的hobt_id在步驟 2 中出現,因為SQL Server不會將hobt_id放入鏡像記錄檔中。
通常您不會看到任何問題,因為步驟 2 中的 TX 非常短,並且具有不正確hobt_id的鎖定塊將在認可時釋放。 不過,由於步驟 3 中的鎖定移轉,以及下列步驟 (4 和 5) ,這個具有不正確hobt_id的鎖定區塊會保留下來,並最終導致問題。
主要伺服器沒有此問題,因為它使用了步驟 2 中的正確hobt_id。 但記錄沒有正確的hobt_id。
解決方式
此問題已先在下列 SQL Server 累積更新中修正。
SQL Server 2014 累積更新 1 /zh-tw/help/2931693
SQL Server 2012 SP1 的累積更新 9 /en-us/help/2931078
關於 SQL Server 的累積更新
SQL Server 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 查看 SQL Server 的最新累積更新:
因應措施
若要解決此問題,請重新初始化鏡像以結束暫停狀態。
狀態
Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。