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)
Darüber hinaus kann diese Datenbank in SQL Server Management Studio im Status nicht synchronisiert/Wiederherstellung ausstehend oder verdächtig gemeldet werden.
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.
Stellen Sie eine Verbindung mit dem Server her, auf dem SQL Server läuft und der das sekundäre Replikat hostet.
Führen Sie das folgende SQL-Skript aus:
ALTER AVAILABILITY GROUP <AvailabilityGroupName> FAILOVER
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>'
Beheben Sie alle Probleme auf dem Server, auf dem SQL Server läuft und die möglicherweise zum Daten Bank Ausfall beitragen.
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.
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 )
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.
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.
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.
Wählen Sie im Dialogfeld Quelle zu Rolle zuweisen die neue verfügbarkeitsgruppe aus, und klicken Sie dann auf OK.
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.
Klicken Sie auf die Registerkarte Abhängigkeiten , wählen Sie die Listener-Ressource aus dem Dropdownfeld aus, und klicken Sie dann auf OK.
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.
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.
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:
- 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.
- 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.
- 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.
- Klicken Sie auf die Registerkarte Abhängigkeiten , wählen Sie die Listener-Ressource aus dem Dropdownfeld aus, und klicken Sie dann auf OK.
- 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.
- 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.
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.
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.
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.
Klicken Sie im Dialogfeld Ressource auf Rolle zuordnen auf die SQL Server FCI-Instanz, und klicken Sie dann auf OK.
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:
- 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 ursprüngliche SQLFCI-Rolle.
- 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.
- Klicken Sie im Dialogfeld auf die neu erstellte verfügbarkeitsgruppe, und klicken Sie dann auf OK.
- Wählen Sie im Bereich Rollen die neue verfügbarkeitsgruppe aus.
- 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.
- Klicken Sie auf die Registerkarte Abhängigkeiten , wählen Sie die Listener-Ressource aus dem Dropdownfeld aus, und klicken Sie dann auf OK.
- 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.
- 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:
Legen Sie die verfügbarkeitsgruppe ab.
Hinweis
Dadurch wird auch der Listener gelöscht.
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
Wiederherstellen der beschädigten Datenbank. Fügen Sie es dann und das sekundäre Replikat wieder der verfügbarkeitsgruppe hinzu.