Problembehandlung für AlwaysOn-verfügbarkeitsdatenbanken in der Wiederherstellung ausstehende oder verdächtige Status in SQL Server

In diesem Artikel werden die Fehler und Einschränkungen einer verfügbarkeitsdatenbank in Microsoft SQL Server, die sich in einem Status befinden, Recovery Pending Suspect und Informationen zum Wiederherstellen der Datenbank in voller Funktionalität in einer verfügbarkeitsgruppe beschrieben.

Original Version des Produkts:   SQL Server 2012
Ursprüngliche KB-Nummer:   2857849

Zusammenfassung

Es wird davon ausgegangen, dass eine verfügbarkeitsdatenbank, die in einer AlwaysOn-verfügbarkeitsgruppe definiert ist, Recovery Pending in SQL Server in a oder Suspect State wechselt. Wenn dies im primären Replikat der verfügbarkeitsgruppe auftritt, ist die Verfügbarkeit der Datenbank 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 entfernen.

Nehmen Sie beispielsweise an, dass SQL Server aktiv ist und eine verfügbarkeitsdatenbank auf den Status "or" festgelegt ist Recovery Pending Suspect . Wenn Sie die dynamischen Verwaltungssichten (Dynamic Management Views, DMVs) im primären Replikat mithilfe des folgenden SQL-Skripts Abfragen, wird die Datenbank möglicherweise in a NOT_HEALTHY und RECOVERY_PENDING State 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 Skript zum Überprüfen der Datenbankintegrität und des Synchronisierungsstatus.

Darüber hinaus kann diese Datenbank in SQL Server Management Studio im Status nicht synchronisiert/Wiederherstellung ausstehend oder verdächtig gemeldet werden.

Screenshot der Datenbank, für die der Status nicht synchronisiert/Wiederherstellung aussteht.

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 an die Produktions Verwendung zurückzugeben.

Weitere Informationen

Im folgenden finden Sie Informationen zu den Fehlern und Einschränkungen einer verfügbarkeitsdatenbank, die sich in verschiedenen Situationen in einem Zustand der Wiederherstellung ausstehend befindet.

  • Datenbankstatus verhindert die Wiederherstellung der Datenbank

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

    RESTORE DATABASE <DatabaseName> WITH RECOVERY
    

    Wenn Sie dieses Skript ausführen, wird die folgende Fehlermeldung angezeigt, da die Datenbank in einer verfügbarkeitsgruppe definiert ist:

    Msg 3104, Ebene 16, Status 1, Reihe 1
    Die Wiederherstellung kann nicht auf Datenbank DatabaseName ausgeführt werden, da Sie für die Datenbankspiegelung konfiguriert ist oder einer verfügbarkeitsgruppe beigetreten ist. Wenn Sie die Datenbank wiederherstellen möchten, verwenden Sie ALTER DATABASE, um die Spiegelung zu entfernen oder die Datenbank aus ihrer verfügbarkeitsgruppe zu entfernen.

    Msg 3013, Ebene 16, Status 1, Reihe 1
    Die Wiederherstellungsdatenbank wird ungewöhnlich beendet.

  • Datenbankstatus verhindert das Löschen von Datenbanken

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

    DROP DATABASE <DatabaseName>
    

    Wenn Sie dieses Skript ausführen, wird die folgende Fehlermeldung angezeigt, da die Datenbank in einer verfügbarkeitsgruppe definiert ist:

    Msg 3752, Ebene 16, Status 1, Reihe 1
    Die Datenbank DatabaseName ist derzeit einer verfügbarkeitsgruppe beigetreten. Bevor Sie die Datenbank löschen können, müssen Sie Sie aus der verfügbarkeitsgruppe entfernen.

  • Datenbankstatus verhindert das Entfernen der Datenbank aus der verfügbarkeitsgruppe

    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, wird die folgende Fehlermeldung angezeigt, da die verfügbarkeitsdatenbank zum primären Replikat gehört:

    Msg 35240, Ebene 16, Status 14, Reihe 1
    Database DatabaseName kann nicht mit der verfügbarkeitsgruppe AvailabilityGroupName verknüpft oder nicht verbunden werden. Dieser Vorgang wird für das primäre Replikat der verfügbarkeitsgruppe nicht unterstützt.

    Aufgrund dieser Fehlermeldung werden Sie möglicherweise gezwungen, ein Failover der Datenbank durchzuführen. Nachdem die Datenbank fehlgeschlagen ist, befindet sich das Replikat, das die Datenbank für die Wiederherstellung aussteht, in der sekundären Rolle. In diesem Fall versuchen Sie erneut, das folgende SQL-Skript auszuführen, um die Datenbank aus der verfügbarkeitsgruppe im 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 die folgende Fehlermeldung wird angezeigt, da sich die Datenbank noch im Status "Wiederherstellung steht für" befindet:

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

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

Um dieses Problem zu beheben, führen Sie die folgenden allgemeinen Aktionen aus:

  • 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 möglicherweise zum Datenbankfehler beigetragen haben.
  • Stellen Sie das Replikat in der verfügbarkeitsgruppe wieder her.

Um diese Aktionen auszuführen, stellen Sie eine Verbindung mit dem neuen primären Replikat her, und führen Sie dann das SQL-Skript aus, ALTER AVAILABILITY GROUP 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 für den Übergang des Replikats erfolgen, das die beschädigte Datenbank in eine sekundäre Rolle hostet.

  1. Stellen Sie eine Verbindung mit dem Server her, auf dem SQL Server läuft 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 läuft und die möglicherweise zum Daten Bank Ausfall beitragen.

  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 funktionierende Replikat in der verfügbarkeitsgruppe ist, muss die verfügbarkeitsgruppe gelöscht werden. Nachdem die verfügbarkeitsgruppe gelöscht wurde, kann die Datenbank aus einer Sicherung wiederhergestellt werden, oder es können weitere Notfall Wiederherstellungs Bemühungen 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 dieser Stelle können Sie versuchen, die problematische Datenbank wiederherzustellen. Oder Sie können die Datenbank aus der zuletzt bekannten guten Sicherungskopie wiederherstellen.

Auflösung beim Löschen der verfügbarkeitsgruppe

Wenn Sie eine verfügbarkeitsgruppe löschen, wird auch die Listener-Ressource gelöscht, und die Anwendungskonnektivität zu den verfügbarkeitsdatenbanken wird unterbrochen.

Verwenden Sie eine der folgenden Methoden, um die Anwendungskonnektivität über den Listener zu erhalten 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 beibehalten, während Sie die verfügbarkeitsgruppe löschen und neu erstellen.

  1. Erstellen Sie in der Instanz von SQL Server, für die der vorhandene Verfügbarkeitsgruppen-Listener Verbindungen anweist, eine neue leere verfügbarkeitsgruppe. Um diesen Vorgang zu vereinfachen, erstellen Sie mit dem Transact-SQL-Befehl eine verfügbarkeitsgruppe, die kein sekundäres Replikat oder keine sekundäre Datenbank aufweist:

    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 klicken Sie dann im linken Bereich auf Rollen . Wählen Sie im Bereich, in dem die Rollen aufgeführt 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ügbarkeitsgruppen Ressource, und klicken Sie dann auf Eigenschaften. Klicken Sie auf die Registerkarte Abhängigkeiten , löschen Sie die Abhängigkeit für den Listener, und klicken Sie dann auf OK.

    Screenshot der Registerkarte Abhängigkeiten der verfügbarkeitsgruppeneigenschaften.

  4. Klicken Sie unter den Ressourcen mit der rechten Maustaste auf den Listener, klicken Sie auf Weitere Aktionen, und klicken Sie dann auf einer anderen Rolle zuweisen.

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

    Screenshot von zuzuweisender Quelle zur Rolle, die zeigt, dass eine neue verfügbarkeitsgruppe hinzugefügt werden soll.

  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 Listener-Ressource angezeigt werden. Klicken Sie mit der rechten Maustaste auf die neue Verfügbarkeitsgruppen Ressource, und klicken Sie dann auf Eigenschaften.

  7. Klicken Sie auf die Registerkarte Abhängigkeiten , wählen Sie die Listener-Ressource aus dem Dropdownfeld aus, und klicken Sie dann auf OK.

    Screenshot der Registerkarte Abhängigkeiten der neuen verfügbarkeitsgruppeneigenschaften.

  8. Verwenden Sie in SQL Server Management Studio den Objekt-Explorer , um eine Verbindung mit der Instanz von SQL Server herzustellen, die das primäre Replikat der neuen verfügbarkeitsgruppe hostet. Klicken Sie auf AlwaysOn hohe Verfügbarkeit, klicken Sie auf die neue verfügbarkeitsgruppe, und klicken Sie dann auf Listener für verfügbare Gruppen. Sie sollten den Listener finden.

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

    Screenshot der Listener-Eigenschaften von Verfügbarkeitsgruppen, die die Konfiguration des Listener anzeigen

Dadurch wird sichergestellt, dass Anwendungen, die den Listener verwenden, diese weiterhin verwenden können, um eine Verbindung mit der Instanz von SQL Server herzustellen, die die Produktionsdatenbanken ohne Unterbrechung hostet. Die ursprüngliche verfügbarkeitsgruppe kann nun vollständig entfernt und neu erstellt werden. Oder die Datenbanken und Replikate können der neuen verfügbarkeitsgruppe hinzugefügt werden.

Wenn Sie die ursprüngliche verfügbarkeitsgruppe neu erstellen, sollten Sie den Listener wieder der Rolle "verfügbarkeitsgruppe" zuweisen, die Abhängigkeit zwischen der neuen Verfügbarkeitsgruppen Ressource 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 klicken Sie dann im linken Bereich auf Rollen . Klicken Sie im Bereich, in dem die Rollen aufgeführt 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, klicken Sie auf Weitere Aktionen, und klicken Sie dann auf einer anderen Rolle zuweisen. Wählen Sie im Dialogfeld die erneut erstellte verfügbarkeitsgruppe aus, und klicken Sie dann auf OK.
  3. Klicken Sie im Bereich Rollen auf die neu erstellte verfügbarkeitsgruppe. Im unteren mittleren Bereich auf der Registerkarte Ressourcen sollten nun die erneut erstellte verfügbarkeitsgruppe und die Listener-Ressource angezeigt werden. Klicken Sie mit der rechten Maustaste auf die neu erstellte Verfügbarkeitsgruppen Ressource, und klicken Sie dann auf Eigenschaften.
  4. Klicken Sie auf die Registerkarte Abhängigkeiten , wählen Sie die Listener-Ressource aus dem Dropdownfeld aus, und klicken Sie dann auf OK.
  5. Verwenden Sie in SQL Server Management Studio den Objekt-Explorer , um eine Verbindung mit der Instanz von SQL Server herzustellen, die das primäre Replikat der neu erstellten verfügbarkeitsgruppe hostet. Klicken Sie auf AlwaysOn hohe Verfügbarkeit, klicken Sie auf die neue verfügbarkeitsgruppe, und klicken Sie dann auf Listener für verfügbare Gruppen. Sie sollten den Listener finden.
  6. Klicken Sie mit der rechten Maustaste auf den Listener, klicken Sie auf Eigenschaften, geben Sie die entsprechende Portnummer für den Listener ein, und klicken Sie dann auf OK.

Methode 2: Zuordnen des Listeners zu einer vorhandenen SQL Server Failover-Clusterinstanz (SQLFCI)

Wenn Sie Ihre verfügbarkeitsgruppe in einer SQL Server Failoverclusterinstanz (SQLFCI) hosten, können Sie die Listener-gruppierte Ressource der geclusterten SQLFCI-Ressourcengruppe zuordnen, während Sie die verfügbarkeitsgruppe löschen und dann neu erstellen.

  1. Starten Sie den Failovercluster-Manager, und klicken Sie dann im linken Bereich auf Rollen .

  2. Wählen Sie im Bereich, in dem die Rollen aufgeführt 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ügbarkeitsgruppen Ressource, und klicken Sie dann auf Eigenschaften.

  4. Klicken Sie auf die Registerkarte Abhängigkeiten , löschen Sie die Abhängigkeit für den 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, klicken Sie auf Weitere Aktionen, und klicken Sie dann auf einer anderen Rolle zuweisen.

  6. Klicken Sie im Dialogfeld Ressource auf Rolle zuordnen auf die SQL Server FCI-Instanz, und klicken Sie dann auf OK.

    Screenshot des Dialogfelds Ressource zu Rolle zuordnen.

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

Dadurch wird sichergestellt, dass Anwendungen, die den Listener verwenden, diese weiterhin verwenden können, um eine Verbindung mit der Instanz von SQL Server herzustellen, die die Produktionsdatenbanken ohne Unterbrechung hostet. Die ursprüngliche verfügbarkeitsgruppe kann nun entfernt und neu erstellt werden. Oder die Datenbanken und Replikate können der neuen verfügbarkeitsgruppe hinzugefügt werden.

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

  1. Starten Sie den Failovercluster-Manager, und klicken Sie dann im linken Bereich auf Rollen .
  2. Klicken Sie im Bereich, in dem die Rollen aufgeführt 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, klicken Sie auf Weitere Aktionen, und klicken Sie dann auf einer anderen Rolle zuweisen.
  4. Klicken Sie im Dialogfeld auf die neu erstellte verfügbarkeitsgruppe, und klicken Sie dann auf OK.
  5. Wählen Sie im Bereich Rollen die neue verfügbarkeitsgruppe aus.
  6. Auf der Registerkarte Ressourcen sollte die neue verfügbarkeitsgruppe und die Listener-Ressource angezeigt werden. Klicken Sie mit der rechten Maustaste auf die neue Verfügbarkeitsgruppen Ressource, und klicken Sie dann auf Eigenschaften.
  7. Klicken Sie auf die Registerkarte Abhängigkeiten , wählen Sie die Listener-Ressource aus dem Dropdownfeld aus, und klicken Sie dann auf OK.
  8. Verwenden Sie in SQL Server Management Studio den Objekt-Explorer , um eine Verbindung mit der Instanz von SQL Server herzustellen, die das primäre Replikat der neuen verfügbarkeitsgruppe hostet.
  9. Klicken Sie auf AlwaysOn hohe Verfügbarkeit, klicken Sie auf die neue verfügbarkeitsgruppe, und klicken Sie dann auf Listener für verfügbare Gruppen. Sie sollten den Listener finden.
  10. Klicken Sie mit der rechten Maustaste auf den Listener, klicken Sie auf Eigenschaften, geben Sie die entsprechende Portnummer für den Listener ein, und klicken Sie dann auf OK.

Methode 3: Löschen der verfügbarkeitsgruppe und anschließendes erneutes Erstellen der verfügbarkeitsgruppe und des Listeners mit dem gleichen Listener-Namen

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. Legen Sie die verfügbarkeitsgruppe ab.

    Hinweis

    Dadurch wird auch der Listener gelöscht.

  2. Erstellen Sie sofort eine neue, leere verfügbarkeitsgruppe, die die Listener-Definition enthält, auf dem gleichen Server, der die Produktionsdatenbanken hostet.

    Nehmen Sie beispielsweise an, dass der Listener der verfügbarkeitsgruppe aglisten ist. Die folgende Transact-SQL-Anweisung erstellt eine verfügbarkeitsgruppe ohne primäre oder sekundäre Datenbank, erstellt 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. Wiederherstellen der beschädigten Datenbank. Fügen Sie es dann und das sekundäre Replikat wieder der verfügbarkeitsgruppe hinzu.