KB2938828 - 修正:在 SQL Server 2012 或 SQL Server 2014 中,資料庫鏡像點擊判斷提示且鏡像工作階段顯示暫停狀態

套用到
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

症狀

當您在 Microsoft SQL Server 2012 或 Microsoft SQL Server 2014 中使用資料庫鏡像時,可能會遇到判斷提示條件,資料庫鏡像進入暫停狀態。

原因

發生此問題的原因是,在配置新頁面時,SQL Server 會在新頁面上取得 X 鎖定。 SQL Server會將新頁面所屬的 hobt_id (堆或 B 樹識別碼) 放入鎖定要求中。 不過,SQL Server無法將hobt_id放在鏡像記錄檔中,導致主節點和鏡像之間的鎖定行為不同。

這可以詳細解釋如下:

  1. T1 按住第 P1 頁上的 IX 鎖定。
  2. T2 在 P1 上做一個分頁,分配一個新的頁面 P2,這裡用了一個系統事務 TX,它在 P2 上持有一個 X 鎖。 這裡SQL Server沒有將hobt_id放在鏡像記錄中。
  3. TX 會為 T1 執行鎖定移轉,將 IX 鎖定從 P1 移至 P2。
  4. TX 已提交,現在 T2 可以使用頁面 P2,並且 T2 在頁面 P2 上獲得另一個 IX 鎖定。
  5. T1 已提交,現在 T2 是唯一一個對 P2 持有 IX 鎖定的人。
  6. 多次插入之後,會發生鎖定擴大,在主資料庫上,T2 會釋放 P2 上的 IX,但在鏡像上,在鎖定擴大期間,T2 不會釋放 IX 鎖定。
  7. 在大量刪除之後,頁面 P2 變成空白並被解除配置。
  8. 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 產品中的問題。