Problembehandlung bei Always On-Verfügbarkeitsdatenbanken im Status „Wiederherstellung ausstehend“ oder „Suspekt“ in SQL Server
In diesem Artikel werden die Fehler und Einschränkungen einer Verfügbarkeitsdatenbank in Microsoft SQL Server beschrieben, die sich in einem oder Suspect
dem Recovery Pending
Zustand befindet und wie Sie die Datenbank in einer Verfügbarkeitsgruppe auf volle Funktionalität wiederherstellen.
Ursprüngliche Produktversion: SQL Server 2012
Ursprüngliche KB-Nummer: 2857849
Zusammenfassung
Gehen Sie davon aus, dass eine Verfügbarkeitsdatenbank, die in einer AlwaysOn-Verfügbarkeitsgruppe definiert ist, zu einem oder Suspect
zu einem Recovery Pending
Zustand in SQL Server übergeht. Wenn dies für das primäre 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 ablegen oder daraus entfernen.
Gehen Sie beispielsweise davon aus, dass SQL Server ausgeführt wird und eine Verfügbarkeitsdatenbank auf den Recovery Pending
Oder-Zustand Suspect
festgelegt ist. Wenn Sie die dynamischen Verwaltungsansichten (DYNAMIC Management Views, DMVs) im primären Replikat mithilfe des folgenden SQL-Skripts abfragen, wird die Datenbank möglicherweise in einem NOT_HEALTHY
Und-Zustand RECOVERY_PENDING
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 als in SQL Server Management Studio im Zustand "Nicht synchronisieren/Wiederherstellung ausstehend " oder "Verdächtiger Zustand" 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 unternehmen, um die Datenbank wiederherzustellen und sie wieder produktiv nutzen zu können.
Weitere Informationen
In den folgenden Inhalten werden die Fehler und Einschränkungen einer Verfügbarkeitsdatenbank erläutert, die sich in verschiedenen Situationen im Zustand "Ausstehend" befindet.
Datenbankstatus verhindert das Wiederherstellen 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, Zustand 1, Zeile 1
RESTORE kann nicht auf Datenbankdatenbankname <> 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 der Verfügbarkeitsgruppe zu entfernen.Meldung "3013", Ebene "16", Status "1", Zeile 1
RESTORE DATABASE wird nicht ordnungsgemäß beendet.Datenbankstatus verhindert das Ablegen der Datenbank
Sie versuchen, das folgende SQL-Skript auszuführen, um die Datenbank abzulegen:
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, Zustand 1, Zeile 1
Der Datenbankdatenbankname <> ist derzeit mit einer Verfügbarkeitsgruppe verknüpft. Bevor Sie die Datenbank ablegen können, müssen Sie sie aus der Verfügbarkeitsgruppe entfernen.Datenbankstatus verhindert, dass die Datenbank aus der Verfügbarkeitsgruppe entfernt wird
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, Bundesland 14, Zeile 1
Datenbankdatenbankname <> kann nicht mit der Verfügbarkeitsgruppe <AvailabilityGroupName> verknüpft oder nicht verknüpft werden. Dieser Vorgang wird für das primäre Replikat der Verfügbarkeitsgruppe nicht unterstützt.Aufgrund dieser Fehlermeldung sind Sie möglicherweise gezwungen, die Datenbank zu überschreiben. Nachdem die Datenbank fehlgeschlagen ist, befindet sich das Replikat, das die ausstehende Wiederherstellungsdatenbank besitzt, in der sekundären Rolle. In diesem Fall versuchen Sie, das folgende SQL-Skript erneut 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 Sie erhalten die folgende Fehlermeldung, da sich die Datenbank noch im Status "Wiederherstellung ausstehend" befindet:
Msg 921, Ebene 16, Bundesland 112, Zeile 1
Datenbankname <> wurde noch nicht wiederhergestellt. Warten Sie, und wiederholen Sie dann den Vorgang.
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 hosten soll, 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.
Um diese Aktionen auszuführen, stellen Sie 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 hosten soll. Gehen Sie hierzu wie folgt vor.
Bei diesen Schritten wird davon ausgegangen, dass das primäre Replikat zuerst die beschädigte Datenbank hosten soll. Daher muss zunächst ein Failover auftreten, um das Replikat, das die beschädigte Datenbank hosten, in eine sekundäre Rolle zu übertragen.
Stellen Sie eine Verbindung mit dem Server her, auf dem SQL Server ausgeführt wird, und hosten Sie das sekundäre Replikat.
Führen Sie das folgende SQL-Skript aus:
ALTER AVAILABILITY GROUP <AvailabilityGroupName> FAILOVER
Führen Sie das folgende SQL-Skript aus, um das Replikat zu entfernen, das die beschädigte Datenbank aus der Verfügbarkeitsgruppe hosten soll:
ALTER AVAILABILITY GROUP <AvailabilityGroupName> REMOVE REPLICA ON '<SQLServerNodeName>'
Beheben Sie alle Probleme auf dem Server, auf dem SQL Server ausgeführt wird, und die möglicherweise zu einem Datenbankfehler beitragen.
Fügen Sie das Replikat wieder zur Verfügbarkeitsgruppe hinzu.
Auflösung, wenn das primäre Replikat das einzige Replikat in der Verfügbarkeitsgruppe ist
Wenn das primäre Replikat die beschädigte Datenbank hostt 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 andere Notfallwiederherstellungsbemühungen können angewendet werden, um die Datenbanken wiederherzustellen und die Produktion fortzusetzen.
Verwenden Sie zum Ablegen der Verfügbarkeitsgruppe das folgende SQL-Skript:
DROP AVAILABILITY GROUP <AvailabilityGroupName>
An diesem Punkt können Sie versuchen, die problematische Datenbank wiederherzustellen. Sie können die Datenbank auch aus der zuletzt bekannten sicherungskopie wiederherstellen.
Lösung beim Ablegen der Verfügbarkeitsgruppe
Wenn Sie eine Verfügbarkeitsgruppe ablegen, wird die Listenerressource ebenfalls verworfen und die Anwendungskonnektivität mit den Verfügbarkeitsdatenbanken unterbrochen.
Um Die Ausfallzeiten der Anwendung zu minimieren, verwenden Sie eine der folgenden Methoden, um die Anwendungskonnektivität über den Listener aufrechtzuerhalten und die Verfügbarkeitsgruppe abzulegen:
Methode 1: Zuordnen des Listeners zu einer neuen Verfügbarkeitsgruppe (Rolle) im Failovercluster-Manager
Mit dieser Methode können Sie den Listener beim Ablegen verwalten und die Verfügbarkeitsgruppe erneut erstellen.
Erstellen Sie in der Instanz von SQL Server, mit der der vorhandene Verfügbarkeitsgruppenlistener Verbindungen leitet, eine neue, leere Verfügbarkeitsgruppe. Verwenden Sie zum Vereinfachen dieses Prozesses den Transact-SQL-Befehl, um eine Verfügbarkeitsgruppe zu erstellen, die kein sekundäres Replikat oder keine sekundäre Datenbank enthält:
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 wählen Sie dann "Rollen " im linken Bereich aus. Wählen Sie im Bereich, in dem die Rollen aufgelistet sind, die ursprüngliche Verfügbarkeitsgruppe aus.
Klicken Sie im unteren mittleren Bereich unter 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 für den Listener, und wählen Sie dann "OK" aus.
Klicken Sie unter den Ressourcen mit der rechten Maustaste auf den Listener, wählen Sie "Weitere Aktionen" aus, und wählen Sie dann "Zu einer anderen Rolle zuweisen" aus.
Wählen Sie im Dialogfeld "Quelle zu Rolle zuweisen" die neue Verfügbarkeitsgruppe und dann "OK" aus.
Wählen Sie im Rollenbereich die neue Verfügbarkeitsgruppe aus. Im unteren mittleren Bereich unter der Registerkarte "Ressourcen " sollte 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.
Klicken Sie auf die Registerkarte "Abhängigkeiten", wählen Sie die Listenerressource aus dem Dropdownfeld aus, und wählen Sie dann "OK" aus.
Verwenden Sie in SQL Server Management Studio Objekt-Explorer, um eine Verbindung mit der Instanz von SQL Server herzustellen, die das primäre Replikat der neuen Verfügbarkeitsgruppe hostt. Wählen Sie "Immer bei hoher Verfügbarkeit" aus, klicken Sie auf die neue Verfügbarkeitsgruppe, und wählen Sie dann "Verfügbarkeitsgruppenlistener" aus. Sie sollten den Listener finden.
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.
Dadurch wird sichergestellt, dass Anwendungen, die den Listener verwenden, weiterhin eine Verbindung mit der Instanz von SQL Server herstellen können, die die Produktionsdatenbanken ohne Unterbrechung hosten. Die ursprüngliche Verfügbarkeitsgruppe kann jetzt 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 Verfügbarkeitsgruppenrolle zuweisen, die Abhängigkeit zwischen der neuen Verfügbarkeitsgruppenressource und dem Listener einrichten und dann den Port erneut dem Listener zuweisen. Gehen Sie dazu wie folgt vor:
- Starten Sie den Failovercluster-Manager, und wählen Sie dann "Rollen " im linken Bereich aus. Klicken Sie im Bereich, in dem die Rollen aufgelistet sind, auf die neue Verfügbarkeitsgruppe, in der der Listener gehostet wird.
- Klicken Sie im unteren mittleren Bereich unter der Registerkarte "Ressourcen" mit der rechten Maustaste auf den Listener, wählen Sie "Weitere Aktionen" aus, und wählen Sie dann "Zu einer anderen Rolle zuweisen" aus. Wählen Sie im Dialogfeld die neu erstellte Verfügbarkeitsgruppe und dann "OK" aus.
- Klicken Sie im Rollenbereich auf die neu erstellte Verfügbarkeitsgruppe. Im unteren mittleren Bereich unter der Registerkarte "Ressourcen " sollte 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.
- Wählen Sie die Registerkarte "Abhängigkeiten " aus, wählen Sie die Listenerressource aus dem Dropdownfeld und dann "OK" aus.
- Verwenden Sie in SQL Server Management Studio Objekt-Explorer, um eine Verbindung mit der Sql Server-Instanz herzustellen, die das primäre Replikat der neu erstellten Verfügbarkeitsgruppe hostt. Wählen Sie "Immer bei hoher Verfügbarkeit" aus, klicken Sie auf die neue Verfügbarkeitsgruppe, und wählen Sie dann "Verfügbarkeitsgruppenlistener" aus. Sie sollten den Listener finden.
- 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-Failoverclustered-Instanz (SQLFCI)
Wenn Sie Ihre Verfügbarkeitsgruppe in einer SQL Server-Failoverclustered Instance (SQLFCI) hosten, können Sie die gruppierte Listenerressource der SQLFCI-Gruppierten Ressourcengruppe zuordnen, während Sie die Verfügbarkeitsgruppe ablegen und dann erneut erstellen.
Starten Sie den Failovercluster-Manager, und wählen Sie dann "Rollen " im linken Bereich aus.
Wählen Sie im Bereich, in dem die Rollen aufgelistet sind, die ursprüngliche Verfügbarkeitsgruppe aus.
Klicken Sie im unteren mittleren Bereich unter 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 für den Listener, und wählen Sie dann "OK" aus.
Klicken Sie im unteren mittleren Bereich unter der Registerkarte "Ressourcen" mit der rechten Maustaste auf den Listener, wählen Sie "Weitere Aktionen" aus, und wählen Sie dann "Zu einer anderen Rolle zuweisen" aus.
Klicken Sie im Dialogfeld "Ressource zu Rolle zuweisen" auf die SQL Server-FCI-Instanz, und wählen Sie dann "OK" aus.
Wählen Sie im Rollenbereich die SQLFCI-Gruppe aus. Im unteren mittleren Bereich unter der Registerkarte "Ressourcen " sollte nun die neue Listenerressource angezeigt werden.
Dadurch wird sichergestellt, dass Anwendungen, die den Listener verwenden, weiterhin eine Verbindung mit der Instanz von SQL Server herstellen können, die die Produktionsdatenbanken ohne Unterbrechung hosten. Die ursprüngliche Verfügbarkeitsgruppe kann jetzt 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 wieder 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:
- Starten Sie den Failovercluster-Manager, und wählen Sie dann "Rollen " im linken Bereich aus.
- Klicken Sie im Bereich, in dem die Rollen aufgelistet sind, auf die ursprüngliche SQLFCI-Rolle.
- Klicken Sie im unteren mittleren Bereich unter der Registerkarte "Ressourcen" mit der rechten Maustaste auf den Listener, wählen Sie "Weitere Aktionen" aus, und wählen Sie dann "Zu einer anderen Rolle zuweisen" aus.
- Klicken Sie im Dialogfeld auf die neu erstellte Verfügbarkeitsgruppe, und wählen Sie dann "OK" aus.
- Wählen Sie im Rollenbereich die neue Verfügbarkeitsgruppe aus.
- Auf der Registerkarte "Ressourcen " sollte 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.
- Wählen Sie die Registerkarte "Abhängigkeiten " aus, wählen Sie die Listenerressource aus dem Dropdownfeld und dann "OK" aus.
- Verwenden Sie in SQL Server Management Studio Objekt-Explorer, um eine Verbindung mit der Instanz von SQL Server herzustellen, die das primäre Replikat der neuen Verfügbarkeitsgruppe hostt.
- Wählen Sie "Immer bei hoher Verfügbarkeit" aus, klicken Sie auf die neue Verfügbarkeitsgruppe, und wählen Sie dann "Verfügbarkeitsgruppenlistener" aus. Sie sollten den Listener finden.
- 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: Legen Sie die Verfügbarkeitsgruppe ab, und erstellen Sie dann die Verfügbarkeitsgruppe und den Listener mit demselben Listenernamen erneut.
Diese Methode führt zu einem kleinen Ausfall für Anwendungen, die derzeit verbunden sind, da die Verfügbarkeitsgruppe und der Listener verworfen und dann neu erstellt werden:
Legen Sie die Verfügbarkeitsgruppe ab.
Notiz
Dadurch wird auch der Listener abgehört.
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, 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
Stellen Sie die beschädigte Datenbank wieder her. Fügen Sie es dann und das sekundäre Replikat wieder zur Verfügbarkeitsgruppe hinzu.