Share via


針對 Always On 處於復原擱置或可疑狀態的可用性資料庫進行疑難解答 SQL Server

本文說明 Microsoft SQL Server 中Recovery Pending處於 或 Suspect 狀態之可用性資料庫的錯誤和限制,以及如何將資料庫還原為可用性群組中的完整功能。

原始產品版本:SQL Server 2012 年
原始 KB 編號: 2857849

摘要

假設 Always On 可用性群組中定義的可用性資料庫會轉換為 Recovery Pending SQL Server 中的 或 Suspect 狀態。 如果在可用性群組的主要複本上發生這種情況,則會影響資料庫可用性。 在此情況下,您無法透過用戶端應用程式存取資料庫。 此外,您無法從可用性群組中卸除或移除資料庫。

例如,假設 SQL Server 正在執行,且可用性資料庫設定為 Recovery PendingSuspect 狀態。 當您使用下列 SQL 腳本查詢主要複本 (DMV) 的動態管理檢視時,資料庫可能會以 NOT_HEALTHYRECOVERY_PENDING 狀態或狀態 SUSPECT 報告,如下所示:

SELECT
    dc.database_name,
    d.synchronization_health_desc,
    d.synchronization_state_desc,
    d.database_state_desc
FROM
    sys.dm_hadr_database_replica_states d
    JOIN sys.availability_databases_cluster dc ON d.group_database_id = dc.group_database_id
    AND d.is_local = 1
database_name          synchronization_health_desc     synchronization_state_desc   database_state_desc
-------------------- ------------------------------ ------------------------------ ---------------------
<DatabaseName>                         NOT_HEALTHY              NOT SYNCHRONIZING      RECOVERY_PENDING
(1 row(s) affected)

用於檢查資料庫健康情況和同步狀態之腳本的執行結果螢幕快照。

此外,此資料庫可能在 SQL Server Management Studio 中回報為「未同步處理/復原擱置中」或「可疑」狀態。

處於 [未同步處理/ 復原擱置中] 狀態的資料庫螢幕快照。

在可用性群組中定義資料庫時,無法卸除或還原資料庫。 因此,您必須採取特定步驟來復原資料庫,並將其傳回生產環境使用。

其他相關資訊

下列內容討論在各種情況下處於復原擱置狀態之可用性資料庫的錯誤和限制。

  • 資料庫狀態防止還原資料庫

    您試著執行下列 SQL 腳本來還原具有 參數的 RECOVERY 資料庫:

    RESTORE DATABASE <DatabaseName> WITH RECOVERY
    

    當您執行此文稿時,您會收到下列錯誤訊息,因為資料庫定義於可用性群組中:

    Msg 3104, Level 16, State 1, Line 1
    RESTORE 無法在資料庫 <DatabaseName> 上運作,因為它已針對資料庫鏡像進行設定,或已加入可用性群組。 如果您想要還原資料庫,請使用 ALTER DATABASE 移除鏡像,或從其可用性群組中移除資料庫。

    Msg 3013, Level 16, State 1, Line 1
    RESTORE DATABASE 異常終止。

  • 資料庫狀態可防止卸除資料庫

    您試著執行下列 SQL 腳本來卸除資料庫:

    DROP DATABASE <DatabaseName>
    

    當您執行此文稿時,您會收到下列錯誤訊息,因為資料庫定義於可用性群組中:

    Msg 3752, Level 16, State 1, Line 1
    資料庫 <DatabaseName> 目前已聯結至可用性群組。 您必須先從可用性群組中移除資料庫,才能卸除資料庫。

  • 資料庫狀態可防止從可用性群組移除資料庫

    您試著執行下列 SQL 文稿,以從可用性群組中移除資料庫:

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    當您嘗試執行此文稿時,您會收到下列錯誤訊息,因為可用性資料庫屬於主要復本:

    Msg 35240, Level 16, State 14, Line 1
    資料庫 <DatabaseName> 無法聯結至可用性群組 <AvailabilityGroupName> 或取消加入。 可用性群組的主要復本不支援此作業。

    由於此錯誤訊息,您可能會被迫故障轉移資料庫。 資料庫故障轉移之後,擁有復原暫止資料庫的複本會是次要角色。 在此情況下,您會再次嘗試執行下列 SQL 文稿,以從次要複本的可用性群組中移除資料庫:

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    不過,您仍然無法從可用性群組中移除資料庫,而且您會收到下列錯誤訊息,因為資料庫仍處於復原擱置狀態:

    Msg 921、Level 16、State 112、Line 1
    <資料庫 DatabaseName> 尚未復原。 請稍候再試一次。

資料庫處於次要角色時的解決方式

若要解決此問題,請採取下列一般動作:

  • 當資料庫處於次要角色時,從可用性群組中移除裝載損毀資料庫的複本。
  • 解決影響系統且可能造成資料庫失敗的任何問題。
  • 將復本還原至可用性群組。

若要採取這些動作,請連線到新的主要複本,然後執行 ALTER AVAILABILITY GROUP SQL 腳本來移除裝載失敗可用性資料庫的複本。 若要執行這項操作,請依照下列步驟執行。

這些步驟假設主要復本會先裝載損毀的資料庫。 因此,必須先進行故障轉移,才能將裝載損毀資料庫的複本轉換成次要角色。

  1. 線上到執行 SQL Server 且裝載次要複本的伺服器。

  2. 執行下列 SQL 文稿:

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> FAILOVER
    
  3. 執行下列 SQL 文稿,從可用性群組中移除裝載損毀資料庫的複本:

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> REMOVE REPLICA ON '<SQLServerNodeName>'
    
  4. 解決伺服器上執行 SQL Server,且可能導致資料庫失敗的任何問題。

  5. 將復本新增至可用性群組。

當主要復本是可用性群組中唯一的複本時的解決方式

如果主要復本裝載損毀的資料庫,而且是可用性群組中唯一可運作的複本,則必須卸除可用性群組。 卸除可用性群組之後,您的資料庫可以從備份復原,或者可以套用其他緊急復原工作來還原資料庫並繼續生產。

若要卸除可用性群組,請使用下列 SQL 腳本:

DROP AVAILABILITY GROUP <AvailabilityGroupName>

此時,您可以嘗試復原有問題的資料庫。 或者,您可以從上次已知的良好備份複本還原資料庫。

卸除可用性群組時的解決方式

當您卸除可用性群組時,接聽程序資源也會遭到捨棄,並中斷應用程式對可用性資料庫的連線。

若要將應用程式停機時間降至最低,請使用下列其中一種方法來維持透過接聽程式的應用程式連線能力,並卸除可用性群組:

方法 1:在故障轉移叢集管理員中建立接聽程式與新可用性群組 (角色) 的關聯

這個方法可讓您在卸除並重新建立可用性群組時維護接聽程式。

  1. 在現有可用性群組接聽程式正在導向連線的 SQL Server 實例上,建立新的空白可用性群組。 若要簡化此程式,請使用 Transact-SQL 命令來建立沒有次要復本或資料庫的可用性群組:

    USE master
    GO
    CREATE AVAILABILITY GROUP ag FOR REPLICA ON 'sqlnode1' WITH (
        ENDPOINT_URL = 'tcp://sqlnode1:5022',
        AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
        FAILOVER_MODE = MANUAL
    )
    
  2. 啟動 [故障轉移叢集管理員],然後選取左窗格中的 [ 角色 ]。 在列出角色的窗格中,選取原始可用性群組。

  3. 在 [ 資源 ] 索引標籤底下的中間窗格中,以滑鼠右鍵按兩下可用性群組資源,然後選取 [ 屬性]。 選取 [ 相依性] 索引 卷標,刪除接聽程式的相依性,然後選取 [ 確定]

    可用性群組屬性 [相依性] 索引標籤的螢幕快照。

  4. 在資源下方,以滑鼠右鍵按兩下接聽程式,選取 [ 更多動作],然後選取 [ 指派給另一個角色]

  5. 在 [ 將來源指派給角色] 對話框中,選取新的可用性群組,然後選取 [ 確定]

    [將來源指派給角色] 對話框的螢幕快照,其中顯示新增的可用性群組。

  6. 在 [ 角色] 窗格中,選取新的可用性群組。 在中間下方窗格的 [ 資源 ] 索引標籤下,您現在應該會看到新的可用性群組和接聽程序資源。 以滑鼠右鍵按下新的可用性群組資源,然後選取 [ 屬性]

  7. 按兩下 [ 相依性] 索引 標籤,從下拉式方塊中選取接聽程式資源,然後選取 [ 確定]

    新可用性群組屬性 [相依性] 索引卷標的螢幕快照。

  8. 在 SQL Server Management Studio 中,使用 物件總管 連線到裝載新可用性群組主要複本的 SQL Server 實例。 選 Always On 高可用性],按下新的可用性群組,然後選取 [可用性群組接聽程式]。 您應該會找到接聽程式。

  9. 以滑鼠右鍵按兩下接聽程式,選取 [ 屬性],輸入適當的接聽程式埠號碼,然後選取 [ 確定]

    可用性群組接聽程式屬性的螢幕快照,其中顯示接聽程序的設定。

這可確保使用接聽程式的應用程式仍然可以使用它來連線到裝載生產資料庫的 SQL Server 實例,而不會中斷。 原始可用性群組現在可以完全移除並重新建立。 或者,資料庫和複本可以新增至新的可用性群組。

如果您重新建立原始可用性群組,您應該將接聽程式重新指派回可用性群組角色、設定新可用性群組資源與接聽程式之間的相依性,然後將埠重新指派給接聽程式。 如果要執行這項操作,請依照下列步驟執行:

  1. 啟動 [故障轉移叢集管理員],然後選取左窗格中的 [ 角色 ]。 在列出角色的窗格中,按兩下裝載接聽程式的新可用性群組。
  2. 在下方中間窗格的 [ 資源] 索引標籤下,以滑鼠右鍵按兩下接聽程式,選取 [ 更多動作],然後選取 [ 指派給另一個角色]。 在對話框中,選擇重新建立的可用性群組,然後選取 [ 確定]
  3. 在 [ 角色] 窗格中,按兩下重新建立的可用性群組。 在下方中間窗格的 [ 資源 ] 索引標籤下,您現在應該會看到重新建立的可用性群組和接聽程序資源。 以滑鼠右鍵按鍵按下重新建立的可用性群組資源,然後選取 [ 屬性]
  4. 選取 [ 相依性] 索引 卷標,從下拉式方塊中選取接聽程式資源,然後選取 [ 確定]
  5. 在 SQL Server Management Studio 中,使用 物件總管 連線到裝載重新建立可用性群組之主要複本的 SQL Server 實例。 選 Always On 高可用性],按下新的可用性群組,然後選取 [可用性群組接聽程式]。 您應該會找到接聽程式。
  6. 以滑鼠右鍵按兩下接聽程式,選取 [ 屬性],輸入適當的接聽程式埠號碼,然後選取 [ 確定]

方法 2:將接聽程式與現有的 SQL Server 故障轉移叢集實例建立關聯 (SQLFCI)

如果您將可用性群組裝載在 #DD88430D0E4A6425E816081C7424216CE 故障轉移叢集實例 (SQLFCI) 上,您可以在卸載時將接聽程式叢集資源與 SQLFCI 叢集資源群組產生關聯,然後重新建立可用性群組。

  1. 啟動 [故障轉移叢集管理員],然後選取左窗格中的 [ 角色 ]。

  2. 在列出角色的窗格中,選取原始可用性群組。

  3. 在下方中間窗格的 [ 資源] 索引標籤下,以滑鼠右鍵按兩下可用性群組資源,然後選取 [ 屬性]

  4. 選取 [ 相依性] 索引 卷標,刪除接聽程式的相依性,然後選取 [ 確定]

  5. 在下方中間窗格的 [ 資源] 索引標籤下,以滑鼠右鍵按兩下接聽程式,選取 [ 更多動作],然後選取 [ 指派給另一個角色]

  6. 在 [將資源指派給角色] 對話框中,按兩下 [SQL Server FCI 實例],然後選取 [確定]

    [將資源指派給角色] 對話框的螢幕快照。

  7. 在 [ 角色] 窗格中,選取 SQLFCI 群組。 在下方中間窗格的 [ 資源 ] 索引標籤下,您現在應該會看到新的接聽程序資源。

這可確保使用接聽程式的應用程式仍然可以使用它來連線到裝載生產資料庫的 SQL Server 實例,而不會中斷。 原始可用性群組現在可以移除並重新建立。 或者,資料庫和複本可以新增至新的可用性群組。

重新建立可用性群組之後,請將接聽程式重新指派回可用性群組角色。 然後設定新可用性群組資源與接聽程式之間的相依性,並將埠重新指派給接聽程式:

  1. 啟動 [故障轉移叢集管理員],然後選取左窗格中的 [ 角色 ]。
  2. 在列出角色的窗格中,單擊原始 SQLFCI 角色。
  3. 在中間下方窗格的 [ 資源] 索引標籤下,以滑鼠右鍵按兩下接聽程式,選取 [ 更多動作],然後選取 [ 指派給另一個角色]
  4. 在對話框中,按兩下重新建立的可用性群組,然後選取 [ 確定]
  5. 在 [ 角色] 窗格中,選取新的可用性群組。
  6. 在 [ 資源] 索引標籤下,您應該會看到新的可用性群組和接聽程序資源。 以滑鼠右鍵按下新的可用性群組資源,然後選取 [ 屬性]
  7. 選取 [ 相依性] 索引 卷標,從下拉式方塊中選取接聽程式資源,然後選取 [ 確定]
  8. 在 SQL Server Management Studio 中,使用 物件總管 連線到裝載新可用性群組主要複本的 SQL Server 實例。
  9. Always On 高可用性],按下新的可用性群組,然後選取 [可用性群組接聽程式]。 您應該會找到接聽程式。
  10. 以滑鼠右鍵按兩下接聽程式,選取 [ 屬性],輸入適當的接聽程式埠號碼,然後選取 [ 確定]

方法 3:卸除可用性群組,然後使用相同的接聽程式名稱重新建立可用性群組和接聽程式

這個方法會導致目前已連線的應用程式發生小規模中斷,因為可用性群組和接聽程式已卸除,然後重新建立:

  1. 卸除可用性群組。

    注意事項

    這也會卸除接聽程式。

  2. 在裝載生產資料庫的相同伺服器上,立即建立包含接聽程式定義的新空白可用性群組。

    例如,假設您的可用性群組接聽程式會變小。 下列 Transact-SQL 語句會建立沒有主要或輔助資料庫的可用性群組,但也會建立名為 aglisten 的接聽程式。 應用程式可以使用此接聽程式進行連線。

    USE master
    GO
        CREATE AVAILABILITY GROUP ag FOR REPLICA ON 'sqlnode1' WITH (
            ENDPOINT_URL = 'tcp://sqlnode1:5022',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            FAILOVER_MODE = MANUAL
        ) LISTENER 'aglisten' (
            WITH IP ((N'11.0.0.25', N'255.0.0.0')),
            PORT = 1433
        )
    GO
    
  3. 復原損毀的資料庫。 然後將它和次要複本新增至可用性群組。