症狀
請考慮以下案例:
您在伺服器上執行 Microsoft SQL Server 2014 或 Microsoft SQL Server 2012 Service Pack 2 (SP2) ,該伺服器裝載可用性群組的次要複本,做為輪流升級的一部分。
您已將下列其中一個更新套用至 SQL Server 安裝:
- SQL Server 2014 累積更新 5
- SQL Server 2012 Service Pack 2 累積更新 4
- SQL Server 2012 Service Pack 2 累積更新 3
重要:本文中提及的 Hotfix 會取代這些累積更新。 如果您尚未安裝這些更新,請勿安裝此操作。
若要完成累積更新的安裝,請重新啟動此次要副本。
您可以容錯移轉正在將更新的次要複本轉換為主要角色的可用性群組。
在此案例中,您可能會在執行 SQL Server 且現在裝載可用性群組主要複本的伺服器上遇到下列一或多個徵兆:
次要副本會報告為「不同步」。
當您查詢sys.dm_exec_requests時,您會注意到使用者工作階段與命令回報為 “DB_STARTUP” 的工作階段之間間歇性鎖定封鎖。 您可能也會注意到 CHECKPOINT 與 DB_STARTUP 命令之間發生封鎖。
涉及復原其中一個可用性資料庫之工作階段的鎖死會在 SQL Server 錯誤記錄檔中報告。 這些記錄類似下列:
<日期/時間 spid<xx> 復原正在資料庫<中寫入檢查點 dbname/dbid>>。 這是
僅提供資訊訊息。 不需要使用者動作。
<日期/時間 spid<xx> 資料庫 dbname/dbid> 在 <x> 秒 (秒內<完成>復原) (分析
<x> ms、重做 <x> ms、復原 <x> ms.) 這是一則資訊訊息。 不需要使用者動作。
…
<日期/時間> SPID<xx> 錯誤:1205,嚴重性:13,狀態:28。
<日期/時間> spid<xx> 交易 (處理序識別碼 <xx>) 與另一個程序的鎖定資源時死結
處理序,並已被選為鎖死受害者。 重新執行交易。如果您的可用性資料庫已啟用 Microsoft SQL Server Service Broker,則可用性資料庫中的訊息可能無法順利處理。 如果您啟動 Profiler 追蹤工具,然後擷取 “Broker:Message Classify” 事件,則會擷取下列事件:
9791,寄件者的資料庫中已停用代理程式
注意:這不是系統性問題。 您可以在 AlwaysOn 設定上套用這些累積更新,而不會遇到此問題。 如果您已經套用這些累積更新,並且沒有註意到此問題,則您的系統不受影響,此資訊不適用於您。
原因
之所以發生此問題,是因為系統執行緒和使用者連線之間有時會發生競爭條件。 這可防止累積更新的修補邏輯取得完成更新程序所需的鎖定。
解決方式
若要解決此問題,請套用下列 重大隨選 (COD) Hotfix:
3034679 修正:AlwaysOn 可用性群組可能回報為未同步
重要您必須套用此 COD Hotfix,而不是下列累積更新:
- SQL Server 2014 累積更新 5
- SQL Server 2012 Service Pack 2 累積更新 4
- SQL Server 2012 Service Pack 2 累積更新 3
注意:如果您已經套用這些累積更新,則必須使用下列因應措施來解決此問題。
因應措施
由於此問題是由使用者工作階段和升級工作階段之間與可用性資料庫之間的爭用所造成,同時資料庫轉換至主要角色,您必須消除此爭用,才能讓資料庫從此狀態復原。
若要解決此問題,請依照下列步驟執行:
請依照指定的順序嘗試下列方法。
方法 1:消除資料庫存取當資料庫遇到「症狀」一節中提及的症狀時,請視需要使用下列一或兩個步驟來消除鎖定封鎖條件:
- 查詢sys.dm_exec_requests,以尋找可用性資料庫中發生鎖定封鎖的工作階段。 使用 KILL 語句來結束這些工作階段。
- 停用或停止正在存取可用性資料庫的應用程式。
如果方法 1 無法解決該問題,請進行方法 2。
方法 2:重新啟動 SQL Server 主機伺服器當應用程式存取和使用者存取權仍處於停用狀態時,請重新啟動裝載受影響可用性資料庫的 SQL Server 執行個體。 若要這麼做,請按照下列步驟進行:
- 停用可用性群組的自動容錯移轉。
- 重新啟動裝載主要複本的受影響 SQL Server 執行個體。
- 啟用可用性群組的自動容錯移轉。
受影響的資料庫完全復原後,請重新建立應用程式和使用者連線。
狀態
Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。
參考資料
如需有關此問題影響之累積更新的詳細資訊,請參閱下列 Microsoft 知識庫文章: