Transakcje odroczone (SQL Server)
Dotyczy:programu SQL Server
W programie SQL Server Enterprise uszkodzona transakcja może zostać odroczona, jeśli dane wymagane przez wycofanie (cofnięcie) są w trybie offline podczas uruchamiania bazy danych. Transakcja odroczona to transakcja, która pozostaje niezatwierdzona po zakończeniu fazy odtwarzania i napotkała błąd uniemożliwiający jej wycofanie. Ponieważ nie można wycofać transakcji, jest ona odroczona.
Notatka
Uszkodzone transakcje są odroczone tylko w programie SQL Server Enterprise. W innych wersjach programu SQL Server uszkodzona transakcja powoduje niepowodzenie uruchamiania.
Ogólnie rzecz biorąc, transakcja odroczona występuje, ponieważ podczas przywracania bazy danych błąd wejścia/wyjścia uniemożliwił odczytanie strony, która była wymagana przez transakcję. Jednak błąd na poziomie pliku może również spowodować odroczone transakcje. Transakcja odroczona może również wystąpić, gdy sekwencja przywracania częściowego zatrzymuje się w punkcie, w którym konieczne jest wycofanie transakcji, a transakcja wymaga danych, które są w trybie offline.
Transakcje użytkownika, które są cofane i napotykają błąd we/wy, powodują, że cała baza danych przechodzi do trybu offline. Gdy baza danych zostanie przywrócona w trybie online, redo odzyskuje wszystkie blokady, które miała, i próbuje wycofać wszystkie niezatwierdzone transakcje. Wszystkie dane zmodyfikowane przez transakcję pozostają odpowiednio zablokowane, dopóki transakcja nie zostanie wycofana. Transakcje, których nie można wycofać, zwalniają swoje blokady, gdy uszkodzenie zostanie naprawione i baza danych zostanie ponownie uruchomiona, lub po przywróceniu online, gdy odroczone transakcje zostaną rozwiązane, a baza danych pozostanie online. Do tego momentu transakcja odroczona może przechowywać blokady, które uniemożliwiają wykonywanie pewnych operacji w bazie danych jako całości. Jeśli na przykład transakcja odroczona zawiera instrukcję CREATE TABLE, żaden użytkownik nie może utworzyć tabeli do momentu rozwiązania transakcji odroczonej.
Transakcja odroczona może również wystąpić, ponieważ przywracanie częściowe przywraca bazę danych do punktu, w którym co najmniej jedna aktywna transakcja ma wpływ na grupę plików, która nie została jeszcze przywrócona i jest w trybie offline. Ponieważ transakcje nie mogą zostać wycofane, stają się odroczone.
W poniższej tabeli wymieniono czynności, które powodują wykonanie odzyskiwania bazy danych i wynik, jeśli wystąpi problem z I/O.
Akcja | Rozwiązanie (jeśli wystąpią problemy we/wy lub wymagane dane są w trybie offline) |
---|---|
Uruchamianie serwera | Transakcja odroczona |
Przywrócić | Transakcja odroczona |
Przymocować | Dołączanie kończy się niepowodzeniem |
Automatyczny restart | Transakcja odroczona |
Utwórz bazę danych lub migawkę bazy danych | Tworzenie kończy się niepowodzeniem |
Wykonaj ponownie dublowanie bazy danych | Transakcja odroczona |
Grupa plików jest w trybie offline | Transakcja odroczona |
Wymagania i ograniczenia
- Baza danych musi używać modelu pełnego lub BULK-LOGGED odzyskiwania.
- Co najmniej jedna kopia zapasowa bazy danych lub kopia zapasowa dziennika muszą zostać ukończone dla bazy danych
- Transakcje odroczone nie mają zastosowania do błędów napotkanych podczas wycofywania transakcji po tym, jak baza danych jest w trybie online. (np. błąd środowiska uruchomieniowego)
- Nie można odroczyć transakcji z powodu niepowodzeń w odzyskiwaniu podczas dołączania bazy danych.
- Nie można odroczyć niektórych transakcji, takich jak transakcje systemowe (np. alokacja strony)
Przenoszenie transakcji ze stanu odroczonego
Ważny
Odroczone transakcje utrzymują dziennik transakcji w aktywnym stanie. Nie można obcinać pliku dziennika wirtualnego zawierającego jakiekolwiek odroczone transakcje, dopóki te transakcje nie zostaną przeniesione ze stanu odroczonego. Aby uzyskać więcej informacji na temat przycinania dziennika, zobacz Dziennik transakcji (SQL Server).
Aby przenieść transakcję ze stanu odroczonego, baza danych musi rozpocząć się czysto bez żadnych błędów we/wy. Jeśli istnieją transakcje odroczone, należy naprawić źródło błędów we/wy. Dostępne rozwiązania wymienione w kolejności, w której są zwykle wypróbowane, są następujące:
Uruchom ponownie bazę danych. Jeśli problem był przejściowy, baza danych powinna zostać uruchomiona bez odroczonych transakcji.
Jeśli transakcje zostały odroczone, ponieważ grupa plików była w trybie offline, przełącz grupę plików z powrotem do trybu online.
Aby przywrócić grupę plików z trybu offline do trybu online, użyj następującej instrukcji Transact-SQL:
RESTORE DATABASE database_name FILEGROUP=<filegroup_name>
Przywróć bazę danych. Po przywróceniu online wszystkie odroczone transakcje zostaną rozwiązane.
W ramach pełnego lub zarejestrowanego zbiorczo modelu odzyskiwania, jeśli odroczone transakcje zostały spowodowane tylko przez kilka uszkodzonych stron, przywracanie strony online może rozwiązać błędy (jeśli są obsługiwane).
Jeśli nie potrzebujesz już grupy plików, której stan offline powoduje odroczone transakcje, oznacz tę grupę plików jako nieaktywną. Transakcje, które zostały odroczone, ponieważ grupa plików była w trybie offline, są przenoszone ze stanu odroczonego po tym, jak grupa plików przestanie działać.
Ważny
Nie można odzyskać nieistniejącej grupy plików.
Aby uzyskać więcej informacji, zobacz Remove Defunct Filegroups (SQL Server).
Jeśli transakcje zostały odroczone z powodu nieprawidłowej strony i jeśli dobra kopia zapasowa bazy danych nie istnieje, użyj następującego procesu, aby naprawić bazę danych:
Najpierw umieść bazę danych w trybie awaryjnym, wykonując następującą instrukcję Transact-SQL:
ALTER DATABASE <database_name> SET EMERGENCY
Aby uzyskać informacje na temat trybu awaryjnego, zobacz Database States.
Następnie napraw bazę danych, używając opcji DBCC REPAIR_ALLOW_DATA_LOSS w jednej z następujących instrukcji DBCC: DBCC CHECKDB, DBCC CHECKALLOClub DBCC CHECKTABLE.
Gdy funkcja DBCC napotka złą stronę, funkcja DBCC cofnie jej przydział i naprawi wszelkie powiązane błędy. Takie podejście umożliwia przywrócenie bazy danych w trybie online w stanie fizycznie spójnym. Jednak dodatkowe dane mogą również zostać utracone; w związku z tym takie podejście powinno być stosowane w ostateczności.
Zobacz też
usuwanie nieistnienych grup plików (SQL Server)
Przywracanie plików (tryb pełnego odzyskiwania)
Przywracanie plików (Prosty model odzyskiwania)
Przywracanie Stron (SQL Server)
Odtworzenia częściowe (SQL Server)
ALTER DATABASE (Transact-SQL)
RESTORE (Transact-SQL)