Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano błędy i ograniczenia bazy danych dostępności w programie Microsoft SQL Server w Recovery Pending
stanie lub Suspect
oraz sposób przywracania bazy danych do pełnej funkcjonalności w grupie dostępności.
Oryginalna wersja produktu: SQL Server
Oryginalny numer KB: 2857849
Podsumowanie
Załóżmy, że baza danych dostępności zdefiniowana w zawsze włączonej grupie dostępności przechodzi do Recovery Pending
stanu lub Suspect
w programie SQL Server. Jeśli wystąpi to w podstawowej repliki grupy dostępności, dostępność bazy danych będzie miała wpływ. W takiej sytuacji nie można uzyskać dostępu do bazy danych za pośrednictwem aplikacji klienckich. Ponadto nie można usunąć ani usunąć bazy danych z grupy dostępności.
Załóżmy na przykład, że program SQL Server jest uruchomiony, a baza danych dostępności jest ustawiona Recovery Pending
na stan lub Suspect
. Podczas wykonywania zapytań dotyczących dynamicznych widoków zarządzania (DMV) w repliki podstawowej przy użyciu następującego skryptu SQL baza danych może być zgłaszana w NOT_HEALTHY
stanie i RECOVERY_PENDING
lub w SUSPECT
stanie w następujący sposób:
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)
Ponadto ta baza danych może być zgłaszana jako w stanie Niezrównowacjonowanie/Odzyskiwanie oczekujące lub Podejrzane w programie SQL Server Management Studio.
Gdy baza danych jest zdefiniowana w grupie dostępności, nie można jej porzucić ani przywrócić. W związku z tym należy wykonać określone kroki w celu odzyskania bazy danych i zwrócenia jej do użycia w środowisku produkcyjnym.
Więcej informacji
W poniższej zawartości omówiono błędy i ograniczenia bazy danych dostępności w stanie Oczekiwanie na odzyskiwanie w różnych sytuacjach.
Stan bazy danych uniemożliwia przywracanie bazy danych
Spróbuj uruchomić następujący skrypt SQL, aby przywrócić bazę danych z parametrem
RECOVERY
:RESTORE DATABASE <DatabaseName> WITH RECOVERY
Po uruchomieniu tego skryptu zostanie wyświetlony następujący komunikat o błędzie, ponieważ baza danych jest zdefiniowana w grupie dostępności:
Msg 3104, poziom 16, stan 1, wiersz 1
Funkcja RESTORE nie może działać na bazie danych <DatabaseName> , ponieważ jest skonfigurowana do dublowania bazy danych lub dołączyła do grupy dostępności. Jeśli zamierzasz przywrócić bazę danych, użyj polecenia ALTER DATABASE, aby usunąć dublowanie lub usunąć bazę danych z jej grupy dostępności.Msg 3013, poziom 16, stan 1, wiersz 1
PRZYWRACANIE BAZY DANYCH kończy się nieprawidłowo.Stan bazy danych uniemożliwia usunięcie bazy danych
Spróbuj uruchomić następujący skrypt SQL, aby usunąć bazę danych:
DROP DATABASE <DatabaseName>
Po uruchomieniu tego skryptu zostanie wyświetlony następujący komunikat o błędzie, ponieważ baza danych jest zdefiniowana w grupie dostępności:
Msg 3752, poziom 16, stan 1, wiersz 1
Baza danych <DatabaseName> jest obecnie przyłączona do grupy dostępności. Przed usunięciem bazy danych należy usunąć ją z grupy dostępności.Stan bazy danych uniemożliwia usunięcie bazy danych z grupy dostępności
Spróbuj uruchomić następujący skrypt SQL, aby usunąć bazę danych z grupy dostępności:
ALTER DATABASE <DatabaseName> SET hadr OFF
Podczas próby uruchomienia tego skryptu zostanie wyświetlony następujący komunikat o błędzie, ponieważ baza danych dostępności należy do repliki podstawowej:
Msg 35240, poziom 16, stan 14, wiersz 1
Nie można dołączyć bazy danych DatabaseName <> do grupy <dostępności AvailabilityGroupName> ani usunąć jej z niej. Ta operacja nie jest obsługiwana w podstawowej repliki grupy dostępności.Z powodu tego komunikatu o błędzie może zostać zmuszony do przełączenia bazy danych w tryb failover. Po przełączeniu bazy danych w tryb failover replika będąca właścicielem oczekującej bazy danych jest w roli pomocniczej. W takiej sytuacji spróbujesz ponownie wykonać następujący skrypt SQL, aby usunąć bazę danych z grupy dostępności w repliki pomocniczej:
ALTER DATABASE <DatabaseName> SET hadr OFF
Jednak nadal nie można usunąć bazy danych z grupy dostępności i zostanie wyświetlony następujący komunikat o błędzie, ponieważ baza danych jest nadal w stanie Oczekiwanie na odzyskiwanie:
Msg 921, poziom 16, stan 112, wiersz 1
Baza danych DatabaseName <> nie została jeszcze odzyskana. Poczekaj i spróbuj ponownie.
Rozwiązanie, gdy baza danych znajduje się w roli pomocniczej
Aby rozwiązać ten problem, wykonaj następujące ogólne działania:
- Usuń z grupy dostępności replikę, która hostuje uszkodzoną bazę danych, gdy baza danych znajduje się w roli pomocniczej.
- Rozwiąż wszelkie problemy, które mają wpływ na system i które mogły przyczynić się do błędu bazy danych.
- Przywróć replikę do grupy dostępności.
Aby wykonać te akcje, połącz się z nową repliką podstawową, a następnie uruchom ALTER AVAILABILITY GROUP
skrypt SQL, aby usunąć replikę, która hostuje nieudaną bazę danych dostępności. W tym celu należy wykonać następujące czynności:
W tych krokach przyjęto założenie, że replika podstawowa najpierw hostuje uszkodzoną bazę danych. W związku z tym przejście w tryb failover musi najpierw nastąpić, aby przenieść replikę, która hostuje uszkodzoną bazę danych do roli pomocniczej.
Nawiąż połączenie z serwerem z uruchomionym programem SQL Server i hostuje replikę pomocniczą.
Uruchom następujący skrypt SQL:
ALTER AVAILABILITY GROUP <AvailabilityGroupName> FAILOVER
Uruchom następujący skrypt SQL, aby usunąć replikę, która hostuje uszkodzoną bazę danych z grupy dostępności:
ALTER AVAILABILITY GROUP <AvailabilityGroupName> REMOVE REPLICA ON '<SQLServerNodeName>'
Rozwiąż wszelkie problemy na serwerze, na którym działa program SQL Server i które mogą przyczynić się do niepowodzenia bazy danych.
Dodaj replikę z powrotem do grupy dostępności.
Rozwiązanie, gdy replika podstawowa jest jedyną repliką w grupie dostępności
Jeśli replika podstawowa hostuje uszkodzoną bazę danych i jest jedyną działającą repliką w grupie dostępności, należy porzucić grupę dostępności. Po usunięciu grupy dostępności można odzyskać bazę danych z kopii zapasowej lub można zastosować inne działania odzyskiwania awaryjnego w celu przywrócenia baz danych i wznowienia produkcji.
Aby usunąć grupę dostępności, użyj następującego skryptu SQL:
DROP AVAILABILITY GROUP <AvailabilityGroupName>
W tym momencie możesz spróbować odzyskać problematyczną bazę danych. Możesz też przywrócić bazę danych z ostatniej znanej dobrej kopii zapasowej.
Rozwiązanie podczas porzucania grupy dostępności
Po usunięciu grupy dostępności zasób odbiornika zostanie również porzucony i przerywa łączność aplikacji z bazami danych dostępności.
Aby zminimalizować przestoje aplikacji, użyj jednej z następujących metod, aby utrzymać łączność aplikacji za pośrednictwem odbiornika i usunąć grupę dostępności:
Metoda 1. Skojarzenie odbiornika z nową grupą dostępności (rolą) w Menedżerze klastra trybu failover
Ta metoda umożliwia utrzymanie odbiornika podczas upuszczania i ponownego tworzenia grupy dostępności.
W wystąpieniu programu SQL Server, do którego jest kierowany istniejący odbiornik grupy dostępności, utwórz nową, pustą grupę dostępności. Aby uprościć ten proces, użyj polecenia Języka Transact-SQL, aby utworzyć grupę dostępności, która nie ma pomocniczej repliki ani bazy danych:
USE master GO CREATE AVAILABILITY GROUP ag FOR REPLICA ON 'sqlnode1' WITH ( ENDPOINT_URL = 'tcp://sqlnode1:5022', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL )
Uruchom Menedżera klastra trybu failover, a następnie wybierz pozycję Role w okienku po lewej stronie. W okienku z listą ról wybierz oryginalną grupę dostępności.
W dolnym środkowym okienku na karcie Zasoby kliknij prawym przyciskiem myszy zasób grupy dostępności, a następnie wybierz pozycję Właściwości. Wybierz kartę Zależności , usuń zależność z odbiornikiem, a następnie wybierz przycisk OK.
W obszarze zasobów kliknij prawym przyciskiem myszy odbiornik, wybierz pozycję Więcej akcji, a następnie wybierz pozycję Przypisz do innej roli.
W oknie dialogowym Przypisywanie źródła do roli wybierz nową grupę dostępności, a następnie wybierz przycisk OK.
W okienku Role wybierz nową grupę dostępności. W dolnym okienku w środkowym okienku na karcie Zasoby powinny być teraz widoczne nowe grupy dostępności i zasób odbiornika. Kliknij prawym przyciskiem myszy nowy zasób grupy dostępności, a następnie wybierz pozycję Właściwości.
Kliknij kartę Zależności , wybierz zasób odbiornika z listy rozwijanej, a następnie wybierz przycisk OK.
W programie SQL Server Management Studio użyj Eksplorator obiektów, aby nawiązać połączenie z wystąpieniem programu SQL Server hostujące replikę podstawową nowej grupy dostępności. Wybierz pozycję Zawsze włączona wysoka dostępność, kliknij nową grupę dostępności, a następnie wybierz pozycję Odbiorniki grupy dostępności. Odbiornik powinien być znajdowany.
Kliknij prawym przyciskiem myszy odbiornik, wybierz pozycję Właściwości, wpisz odpowiedni numer portu dla odbiornika, a następnie wybierz przycisk OK.
Dzięki temu aplikacje korzystające z odbiornika nadal mogą używać go do łączenia się z wystąpieniem programu SQL Server hostujących produkcyjne bazy danych bez przerwy. Oryginalna grupa dostępności można teraz całkowicie usunąć i ponownie utworzyć. Można również dodać bazy danych i repliki do nowej grupy dostępności.
Jeśli ponownie utworzysz oryginalną grupę dostępności, należy ponownie przypisać odbiornik z powrotem do roli grupy dostępności, skonfigurować zależność między nowym zasobem grupy dostępności a odbiornikiem, a następnie ponownie przypisać port do odbiornika. W tym celu wykonaj następujące kroki:
- Uruchom Menedżera klastra trybu failover, a następnie wybierz pozycję Role w okienku po lewej stronie. W okienku z listą ról kliknij nową grupę dostępności, która hostuje odbiornik.
- W dolnym środkowym okienku na karcie Zasoby kliknij prawym przyciskiem myszy odbiornik, wybierz pozycję Więcej akcji, a następnie wybierz pozycję Przypisz do innej roli. W oknie dialogowym wybierz ponownie utworzoną grupę dostępności, a następnie wybierz przycisk OK.
- W okienku Role kliknij ponownie utworzoną grupę dostępności. W dolnym środkowym okienku na karcie Zasoby powinna zostać wyświetlona ponownie utworzona grupa dostępności i zasób odbiornika. Kliknij prawym przyciskiem myszy ponownie utworzony zasób grupy dostępności, a następnie wybierz pozycję Właściwości.
- Wybierz kartę Zależności , wybierz zasób odbiornika z listy rozwijanej, a następnie wybierz przycisk OK.
- W programie SQL Server Management Studio użyj Eksplorator obiektów, aby nawiązać połączenie z wystąpieniem programu SQL Server hostujące replikę podstawową ponownie utworzonej grupy dostępności. Wybierz pozycję Zawsze włączona wysoka dostępność, kliknij nową grupę dostępności, a następnie wybierz pozycję Odbiorniki grupy dostępności. Odbiornik powinien być znajdowany.
- Kliknij prawym przyciskiem myszy odbiornik, wybierz pozycję Właściwości, wpisz odpowiedni numer portu dla odbiornika, a następnie wybierz przycisk OK.
Metoda 2. Skojarzenie odbiornika z istniejącym wystąpieniem klastra trybu failover programu SQL Server (SQLFCI)
Jeśli hostujesz grupę dostępności w wystąpieniu klastra trybu failover programu SQL Server (SQLFCI), możesz skojarzyć zasób klastrowany odbiornika z grupą zasobów klastra SQLFCI podczas porzucania, a następnie ponownie utworzyć grupę dostępności.
Uruchom Menedżera klastra trybu failover, a następnie wybierz pozycję Role w okienku po lewej stronie.
W okienku z listą ról wybierz oryginalną grupę dostępności.
W dolnym środkowym okienku na karcie Zasoby kliknij prawym przyciskiem myszy zasób grupy dostępności, a następnie wybierz pozycję Właściwości.
Wybierz kartę Zależności , usuń zależność z odbiornikiem, a następnie wybierz przycisk OK.
W dolnym środkowym okienku na karcie Zasoby kliknij prawym przyciskiem myszy odbiornik, wybierz pozycję Więcej akcji, a następnie wybierz pozycję Przypisz do innej roli.
W oknie dialogowym Przypisywanie zasobu do roli kliknij wystąpienie wystąpienia wystąpienia klastra trybu failover programu SQL Server, a następnie wybierz przycisk OK.
W okienku Role wybierz grupę SQLFCI. W dolnym środkowym okienku na karcie Zasoby powinien zostać wyświetlony nowy zasób odbiornika.
Dzięki temu aplikacje korzystające z odbiornika nadal mogą używać go do nawiązywania połączenia z wystąpieniem programu SQL Server, które hostuje produkcyjne bazy danych bez przerwy. Oryginalną grupę dostępności można teraz usunąć i ponownie utworzyć. Można również dodać bazy danych i repliki do nowej grupy dostępności.
Po ponownym utworzeniu grupy dostępności ponownie przypisz odbiornik do roli grupy dostępności. Następnie skonfiguruj zależność między nowym zasobem grupy dostępności a odbiornikiem i ponownie przypisz port do odbiornika:
- Uruchom Menedżera klastra trybu failover, a następnie wybierz pozycję Role w okienku po lewej stronie.
- W okienku z listą ról kliknij oryginalną rolę SQLFCI.
- W dolnym środkowym okienku na karcie Zasoby kliknij prawym przyciskiem myszy odbiornik, wybierz pozycję Więcej akcji, a następnie wybierz pozycję Przypisz do innej roli.
- W oknie dialogowym kliknij ponownie utworzoną grupę dostępności, a następnie wybierz przycisk OK.
- W okienku Role wybierz nową grupę dostępności.
- Na karcie Zasoby powinna zostać wyświetlona nowa grupa dostępności i zasób odbiornika. Kliknij prawym przyciskiem myszy nowy zasób grupy dostępności, a następnie wybierz pozycję Właściwości.
- Wybierz kartę Zależności , wybierz zasób odbiornika z listy rozwijanej, a następnie wybierz przycisk OK.
- W programie SQL Server Management Studio użyj Eksplorator obiektów, aby nawiązać połączenie z wystąpieniem programu SQL Server hostujące replikę podstawową nowej grupy dostępności.
- Wybierz pozycję Zawsze włączona wysoka dostępność, kliknij nową grupę dostępności, a następnie wybierz pozycję Odbiorniki grupy dostępności. Odbiornik powinien być znajdowany.
- Kliknij prawym przyciskiem myszy odbiornik, wybierz pozycję Właściwości, wpisz odpowiedni numer portu dla odbiornika, a następnie wybierz przycisk OK.
Metoda 3. Usunięcie grupy dostępności, a następnie ponowne utworzenie grupy dostępności i odbiornika o tej samej nazwie odbiornika
Ta metoda spowoduje małą awarię aplikacji, które są obecnie połączone, ponieważ grupa dostępności i odbiornik zostaną porzucone, a następnie ponownie utworzone:
Usuń grupę dostępności.
Uwaga 16.
Spowoduje to również usunięcie odbiornika.
Natychmiast utwórz nową, pustą grupę dostępności zawierającą definicję odbiornika na tym samym serwerze, który hostuje produkcyjne bazy danych.
Załóżmy na przykład, że odbiornik grupy dostępności jest aglisten. Poniższa instrukcja Języka Transact-SQL tworzy grupę dostępności bez podstawowej lub pomocniczej bazy danych, ale tworzy również odbiornik o nazwie aglisten. Aplikacje mogą łączyć się za pomocą tego odbiornika.
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
Odzyskaj uszkodzoną bazę danych. Następnie dodaj ją i replikę pomocniczą z powrotem do grupy dostępności.