Problembehandlung bei Always On Verfügbarkeitsdatenbanken im Zustand "Wiederherstellung ausstehend" oder "Verdacht" in SQL Server

In diesem Artikel werden die Fehler und Einschränkungen einer Verfügbarkeitsdatenbank in Microsoft SQL Server beschrieben, die sich in einem Recovery Pending - oder Suspect -Zustand befindet, und wie Sie die Vollständige Funktionalität der Datenbank in einer Verfügbarkeitsgruppe wiederherstellen.

Ursprüngliche Produktversion: SQL Server 2012
Ursprüngliche KB-Nummer: 2857849

Zusammenfassung

Angenommen, eine Verfügbarkeitsdatenbank, die in einer Always On Verfügbarkeitsgruppe definiert ist, wechselt in den Recovery Pending Zustand oder Suspect in SQL Server. Wenn dies auf dem primären Replikat der Verfügbarkeitsgruppe auftritt, ist die Datenbankverfügbarkeit betroffen. In diesem Fall können Sie nicht über die Clientanwendungen auf die Datenbank zugreifen. Darüber hinaus können Sie die Datenbank nicht aus der Verfügbarkeitsgruppe löschen oder daraus entfernen.

Angenommen, SQL Server ausgeführt wird und eine Verfügbarkeitsdatenbank auf den Recovery Pending Zustand oder Suspect festgelegt ist. Wenn Sie die dynamischen Verwaltungssichten (Dynamic Management Views, DMVs) am primären Replikat mithilfe des folgenden SQL-Skripts abfragen, wird die Datenbank möglicherweise in einem NOT_HEALTHY - und RECOVERY_PENDING -Zustand oder in einem SUSPECT Zustand wie folgt gemeldet:

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)

Screenshot des Ausführungsergebnisses für das Skript zum Überprüfen der Datenbankintegrität und des Synchronisierungsstatus.

Darüber hinaus kann gemeldet werden, dass sich diese Datenbank in SQL Server Management Studio im Zustand Nicht synchronisiert/Wiederherstellung ausstehend oder verdächtig befindet.

Screenshot der Datenbank, die sich im Zustand

Wenn die Datenbank in einer Verfügbarkeitsgruppe definiert ist, kann die Datenbank nicht gelöscht oder wiederhergestellt werden. Daher müssen Sie bestimmte Schritte ausführen, um die Datenbank wiederherzustellen und sie in die Produktion zurückzugeben.

Weitere Informationen

Im folgenden Inhalt werden die Fehler und Einschränkungen einer Verfügbarkeitsdatenbank erläutert, die sich in verschiedenen Situationen im Zustand Wiederherstellungs ausstehend befindet.

  • Datenbank status verhindert die Wiederherstellung der Datenbank.

    Sie versuchen, das folgende SQL-Skript auszuführen, um die Datenbank mit dem RECOVERY Parameter wiederherzustellen:

    RESTORE DATABASE <DatabaseName> WITH RECOVERY
    

    Wenn Sie dieses Skript ausführen, erhalten Sie die folgende Fehlermeldung, da die Datenbank in einer Verfügbarkeitsgruppe definiert ist:

    Msg 3104, Ebene 16, Status 1, Zeile 1
    RESTORE kann nicht für Die Datenbank <DatabaseName> ausgeführt werden, da sie für die Datenbankspiegelung konfiguriert ist oder einer Verfügbarkeitsgruppe beigetreten ist. Wenn Sie beabsichtigen, die Datenbank wiederherzustellen, verwenden Sie ALTER DATABASE, um die Spiegelung zu entfernen oder die Datenbank aus ihrer Verfügbarkeitsgruppe zu entfernen.

    Msg 3013, Ebene 16, Status 1, Zeile 1
    RESTORE DATABASE wird nicht ordnungsgemäß beendet.

  • Datenbank status verhindert das Löschen der Datenbank

    Sie versuchen, das folgende SQL-Skript auszuführen, um die Datenbank zu löschen:

    DROP DATABASE <DatabaseName>
    

    Wenn Sie dieses Skript ausführen, erhalten Sie die folgende Fehlermeldung, da die Datenbank in einer Verfügbarkeitsgruppe definiert ist:

    Msg 3752, Ebene 16, Status 1, Zeile 1
    Die Datenbank <DatabaseName> ist derzeit mit einer Verfügbarkeitsgruppe verknüpft. Bevor Sie die Datenbank löschen können, müssen Sie sie aus der Verfügbarkeitsgruppe entfernen.

  • Datenbank status verhindert das Entfernen einer Datenbank aus verfügbarkeitsgruppen

    Sie versuchen, das folgende SQL-Skript auszuführen, um die Datenbank aus der Verfügbarkeitsgruppe zu entfernen:

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    Wenn Sie versuchen, dieses Skript auszuführen, erhalten Sie die folgende Fehlermeldung, da die Verfügbarkeitsdatenbank zum primären Replikat gehört:

    Msg 35240, Ebene 16, Status 14, Zeile 1
    Database <DatabaseName> kann nicht mit verfügbarkeitsgruppenverknüpft <>oder nicht verknüpft werden. Dieser Vorgang wird auf dem primären Replikat der Verfügbarkeitsgruppe nicht unterstützt.

    Aufgrund dieser Fehlermeldung sind Sie möglicherweise gezwungen, ein Failover für die Datenbank durchzuführen. Nachdem für die Datenbank ein Failover ausgeführt wurde, befindet sich das Replikat, das besitzer der ausstehenden Wiederherstellungsdatenbank ist, in der sekundären Rolle. In diesem Fall versuchen Sie erneut, das folgende SQL-Skript auszuführen, um die Datenbank aus der Verfügbarkeitsgruppe auf dem sekundären Replikat zu entfernen:

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    Sie können die Datenbank jedoch immer noch nicht aus der Verfügbarkeitsgruppe entfernen, und Sie erhalten die folgende Fehlermeldung, da sich die Datenbank noch im Status Wiederherstellung ausstehend befindet:

    Msg 921, Ebene 16, Status 112, Zeile 1
    Database <DatabaseName> wurde noch nicht wiederhergestellt. Warten Sie, und versuchen Sie es erneut.

Lösung, wenn sich die Datenbank in der sekundären Rolle befindet

Führen Sie die folgenden allgemeinen Aktionen aus, um dieses Problem zu beheben:

  • Entfernen Sie aus der Verfügbarkeitsgruppe das Replikat, das die beschädigte Datenbank hostet, wenn sich die Datenbank in der sekundären Rolle befindet.
  • Beheben Sie alle Probleme, die sich auf das System auswirken und die möglicherweise zum Datenbankfehler beigetragen haben.
  • Stellen Sie das Replikat in der Verfügbarkeitsgruppe wieder her.

Stellen Sie zum Ausführen dieser Aktionen eine Verbindung mit dem neuen primären Replikat her, und führen Sie dann das ALTER AVAILABILITY GROUP SQL-Skript aus, um das Replikat zu entfernen, das die fehlerhafte Verfügbarkeitsdatenbank hostet. Gehen Sie hierzu wie folgt vor.

Bei diesen Schritten wird davon ausgegangen, dass das primäre Replikat zuerst die beschädigte Datenbank hostet. Daher muss zunächst ein Failover erfolgen, um das Replikat, das die beschädigte Datenbank hostet, in eine sekundäre Rolle zu überstellen.

  1. Stellen Sie eine Verbindung mit dem Server her, auf dem SQL Server ausgeführt wird und der das sekundäre Replikat hostet.

  2. Führen Sie das folgende SQL-Skript aus:

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> FAILOVER
    
  3. Führen Sie das folgende SQL-Skript aus, um das Replikat, das die beschädigte Datenbank hostet, aus der Verfügbarkeitsgruppe zu entfernen:

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> REMOVE REPLICA ON '<SQLServerNodeName>'
    
  4. Beheben Sie alle Probleme auf dem Server, auf dem SQL Server ausgeführt wird und die zum Datenbankfehler beitragen können.

  5. Fügen Sie das Replikat wieder der Verfügbarkeitsgruppe hinzu.

Lösung, wenn das primäre Replikat das einzige Replikat in der Verfügbarkeitsgruppe ist

Wenn das primäre Replikat die beschädigte Datenbank hostet und das einzige funktionsfähige Replikat in der Verfügbarkeitsgruppe ist, muss die Verfügbarkeitsgruppe gelöscht werden. Nachdem die Verfügbarkeitsgruppe gelöscht wurde, kann Ihre Datenbank aus einer Sicherung wiederhergestellt werden, oder es können andere Notfallwiederherstellungsmaßnahmen angewendet werden, um die Datenbanken wiederherzustellen und die Produktion fortzusetzen.

Verwenden Sie das folgende SQL-Skript, um die Verfügbarkeitsgruppe zu löschen:

DROP AVAILABILITY GROUP <AvailabilityGroupName>

An diesem Punkt können Sie versuchen, die problematische Datenbank wiederherzustellen. Alternativ können Sie die Datenbank aus der letzten bekannten fehlerfreien Sicherungskopie wiederherstellen.

Lösung beim Löschen der Verfügbarkeitsgruppe

Wenn Sie eine Verfügbarkeitsgruppe löschen, wird auch die Listenerressource gelöscht, und die Anwendungskonnektivität mit den Verfügbarkeitsdatenbanken wird unterbrochen.

Verwenden Sie eine der folgenden Methoden, um die Anwendungskonnektivität über den Listener aufrechtzuerhalten und die Verfügbarkeitsgruppe zu löschen, um die Ausfallzeit der Anwendung zu minimieren:

Methode 1: Zuordnen des Listeners zu einer neuen Verfügbarkeitsgruppe (Rolle) im Failovercluster-Manager

Mit dieser Methode können Sie den Listener verwalten, während Sie die Verfügbarkeitsgruppe löschen und neu erstellen.

  1. Erstellen Sie instance SQL Server, zu dem der vorhandene Verfügbarkeitsgruppenlistener Verbindungen leitet, eine neue, leere Verfügbarkeitsgruppe. Verwenden Sie zur Vereinfachung dieses Prozesses den Transact-SQL-Befehl, um eine Verfügbarkeitsgruppe zu erstellen, die weder über ein sekundäres Replikat noch über eine sekundäre Datenbank verfügt:

    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. Starten Sie den Failovercluster-Manager, und wählen Sie dann im linken Bereich Rollen aus. Wählen Sie in dem Bereich, in dem die Rollen aufgelistet sind, die ursprüngliche Verfügbarkeitsgruppe aus.

  3. Klicken Sie im unteren mittleren Bereich auf der Registerkarte Ressourcen mit der rechten Maustaste auf die Verfügbarkeitsgruppenressource, und wählen Sie dann Eigenschaften aus. Wählen Sie die Registerkarte Abhängigkeiten aus , löschen Sie die Abhängigkeit vom Listener, und klicken Sie dann auf OK.

    Screenshot der Registerkarte

  4. Klicken Sie unter den Ressourcen mit der rechten Maustaste auf den Listener, wählen Sie Weitere Aktionen und dann Zu einer anderen Rolle zuweisen aus.

  5. Wählen Sie im Dialogfeld Quelle zu Rolle zuweisen die neue Verfügbarkeitsgruppe und dann OK aus.

    Screenshot: Dialogfeld

  6. Wählen Sie im Bereich Rollen die neue Verfügbarkeitsgruppe aus. Im unteren mittleren Bereich auf der Registerkarte Ressourcen sollten nun die neue Verfügbarkeitsgruppe und die Listenerressource angezeigt werden. Klicken Sie mit der rechten Maustaste auf die neue Verfügbarkeitsgruppenressource, und wählen Sie dann Eigenschaften aus.

  7. Klicken Sie auf die Registerkarte Abhängigkeiten , wählen Sie im Dropdownfeld die Listenerressource aus, und wählen Sie dann OK aus.

    Screenshot: Registerkarte

  8. Verwenden Sie SQL Server Management Studio Objekt-Explorer, um eine Verbindung mit dem instance SQL Server herzustellen, der das primäre Replikat der neuen Verfügbarkeitsgruppe hostet. Wählen Sie Always On Hochverfügbarkeit aus, klicken Sie auf die neue Verfügbarkeitsgruppe, und wählen Sie dann Verfügbarkeitsgruppenlistener aus. Sie sollten den Listener finden.

  9. Klicken Sie mit der rechten Maustaste auf den Listener, wählen Sie Eigenschaften aus, geben Sie die entsprechende Portnummer für den Listener ein, und wählen Sie dann OK aus.

    Screenshot der Eigenschaften des Verfügbarkeitsgruppenlisteners mit der Konfiguration des Listeners.

Dadurch wird sichergestellt, dass Anwendungen, die den Listener verwenden, diesen weiterhin verwenden können, um eine Verbindung mit dem instance von SQL Server herzustellen, die die Produktionsdatenbanken ohne Unterbrechung hosten. Die ursprüngliche Verfügbarkeitsgruppe kann jetzt vollständig entfernt und neu erstellt werden. Alternativ können die Datenbanken und Replikate der neuen Verfügbarkeitsgruppe hinzugefügt werden.

Wenn Sie die ursprüngliche Verfügbarkeitsgruppe neu erstellen, sollten Sie den Listener erneut der Verfügbarkeitsgruppenrolle zuweisen, die Abhängigkeit zwischen der neuen Verfügbarkeitsgruppenressource und dem Listener einrichten und dann den Port dem Listener neu zuweisen. Gehen Sie dazu wie folgt vor:

  1. Starten Sie den Failovercluster-Manager, und wählen Sie dann im linken Bereich Rollen aus. Klicken Sie in dem Bereich, in dem die Rollen aufgelistet sind, auf die neue Verfügbarkeitsgruppe, die den Listener hostet.
  2. Klicken Sie im unteren mittleren Bereich auf der Registerkarte Ressourcen mit der rechten Maustaste auf den Listener, wählen Sie Weitere Aktionen und dann Zu einer anderen Rolle zuweisen aus. Wählen Sie im Dialogfeld die neu erstellte Verfügbarkeitsgruppe und dann OK aus.
  3. Klicken Sie im Bereich Rollen auf die neu erstellte Verfügbarkeitsgruppe. Im unteren mittleren Bereich auf der Registerkarte Ressourcen sollten nun die neu erstellte Verfügbarkeitsgruppe und die Listenerressource angezeigt werden. Klicken Sie mit der rechten Maustaste auf die neu erstellte Verfügbarkeitsgruppenressource, und wählen Sie dann Eigenschaften aus.
  4. Wählen Sie die Registerkarte Abhängigkeiten aus, wählen Sie im Dropdownfeld die Listenerressource aus, und klicken Sie dann auf OK.
  5. Verwenden Sie SQL Server Management Studio Objekt-Explorer, um eine Verbindung mit dem instance SQL Server herzustellen, der das primäre Replikat der neu erstellten Verfügbarkeitsgruppe hostet. Wählen Sie Always On Hochverfügbarkeit aus, klicken Sie auf die neue Verfügbarkeitsgruppe, und wählen Sie dann Verfügbarkeitsgruppenlistener aus. Sie sollten den Listener finden.
  6. Klicken Sie mit der rechten Maustaste auf den Listener, wählen Sie Eigenschaften aus, geben Sie die entsprechende Portnummer für den Listener ein, und wählen Sie dann OK aus.

Methode 2: Zuordnen des Listeners zu einer vorhandenen SQL Server Failoverclusterinstanz (SQLFCI)

Wenn Sie Ihre Verfügbarkeitsgruppe auf einer SQL Server Failoverclusterinstanz (SQLFCI) hosten, können Sie die gruppierte Listenerressource der SQLFCI-Clusterressourcengruppe zuordnen, während Sie die Verfügbarkeitsgruppe löschen und dann neu erstellen.

  1. Starten Sie den Failovercluster-Manager, und wählen Sie dann im linken Bereich Rollen aus.

  2. Wählen Sie in dem Bereich, in dem die Rollen aufgelistet sind, die ursprüngliche Verfügbarkeitsgruppe aus.

  3. Klicken Sie im unteren mittleren Bereich auf der Registerkarte Ressourcen mit der rechten Maustaste auf die Verfügbarkeitsgruppenressource, und wählen Sie dann Eigenschaften aus.

  4. Wählen Sie die Registerkarte Abhängigkeiten aus , löschen Sie die Abhängigkeit vom Listener, und klicken Sie dann auf OK.

  5. Klicken Sie im unteren mittleren Bereich auf der Registerkarte Ressourcen mit der rechten Maustaste auf den Listener, wählen Sie Weitere Aktionen und dann Zu einer anderen Rolle zuweisen aus.

  6. Klicken Sie im Dialogfeld Ressource zu Rolle zuweisen auf die SQL Server FCI-instance, und wählen Sie dann OK aus.

    Screenshot des Dialogfelds

  7. Wählen Sie im Bereich Rollen die Gruppe SQLFCI aus. Im unteren mittleren Bereich auf der Registerkarte Ressourcen sollte nun die neue Listenerressource angezeigt werden.

Dadurch wird sichergestellt, dass Anwendungen, die den Listener verwenden, diesen weiterhin verwenden können, um eine Verbindung mit dem instance SQL Server herzustellen, der die Produktionsdatenbanken ohne Unterbrechung hostet. Die ursprüngliche Verfügbarkeitsgruppe kann jetzt entfernt und neu erstellt werden. Alternativ können die Datenbanken und Replikate der neuen Verfügbarkeitsgruppe hinzugefügt werden.

Nachdem die Verfügbarkeitsgruppe neu erstellt wurde, weisen Sie den Listener erneut der Verfügbarkeitsgruppenrolle zu. Richten Sie dann die Abhängigkeit zwischen der neuen Verfügbarkeitsgruppenressource und dem Listener ein, und weisen Sie den Port dem Listener neu zu:

  1. Starten Sie den Failovercluster-Manager, und wählen Sie dann im linken Bereich Rollen aus.
  2. Klicken Sie in dem Bereich, in dem die Rollen aufgelistet sind, auf die ursprüngliche SQLFCI-Rolle.
  3. Klicken Sie im unteren mittleren Bereich auf der Registerkarte Ressourcen mit der rechten Maustaste auf den Listener, wählen Sie Weitere Aktionen und dann Zu einer anderen Rolle zuweisen aus.
  4. Klicken Sie im Dialogfeld auf die neu erstellte Verfügbarkeitsgruppe, und wählen Sie dann OK aus.
  5. Wählen Sie im Bereich Rollen die neue Verfügbarkeitsgruppe aus.
  6. Auf der Registerkarte Ressourcen sollten die neue Verfügbarkeitsgruppe und die Listenerressource angezeigt werden. Klicken Sie mit der rechten Maustaste auf die neue Verfügbarkeitsgruppenressource, und wählen Sie dann Eigenschaften aus.
  7. Wählen Sie die Registerkarte Abhängigkeiten aus, wählen Sie im Dropdownfeld die Listenerressource aus, und klicken Sie dann auf OK.
  8. Verwenden Sie SQL Server Management Studio Objekt-Explorer, um eine Verbindung mit dem instance SQL Server herzustellen, der das primäre Replikat der neuen Verfügbarkeitsgruppe hostet.
  9. Wählen Sie Always On Hochverfügbarkeit aus, klicken Sie auf die neue Verfügbarkeitsgruppe, und wählen Sie dann Verfügbarkeitsgruppenlistener aus. Sie sollten den Listener finden.
  10. Klicken Sie mit der rechten Maustaste auf den Listener, wählen Sie Eigenschaften aus, geben Sie die entsprechende Portnummer für den Listener ein, und wählen Sie dann OK aus.

Methode 3: Löschen der Verfügbarkeitsgruppe und anschließendes erneutes Erstellen der Verfügbarkeitsgruppe und des Listeners mit demselben Listenernamen

Diese Methode führt zu einem kleinen Ausfall für Anwendungen, die derzeit verbunden sind, da die Verfügbarkeitsgruppe und der Listener gelöscht und dann neu erstellt werden:

  1. Löschen Sie die Verfügbarkeitsgruppe.

    Hinweis

    Dadurch wird auch der Listener gelöscht.

  2. Erstellen Sie sofort eine neue, leere Verfügbarkeitsgruppe, die die Listenerdefinition enthält, auf demselben Server, auf dem die Produktionsdatenbanken gehostet werden.

    Angenommen, Ihr Verfügbarkeitsgruppenlistener ist aglisten. Die folgende Transact-SQL-Anweisung erstellt eine Verfügbarkeitsgruppe ohne primäre oder sekundäre Datenbank, aber auch einen Listener mit dem Namen aglisten. Anwendungen können diesen Listener verwenden, um eine Verbindung herzustellen.

    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. Stellen Sie die beschädigte Datenbank wieder her. Fügen Sie ihn und das sekundäre Replikat dann wieder der Verfügbarkeitsgruppe hinzu.