Rozwiązywanie problemu: grupa dostępności przekroczyła RTO (cel czasu odzyskiwania)

Dotyczy:SQL Server

Po automatycznym przełączeniu awaryjnym lub planowanym ręcznym przełączeniu bez utraty danych w obrębie grupy dostępności może się okazać, że czas przełączenia awaryjnego przekracza docelowy czas odzyskiwania (RTO). Lub gdy oszacujesz czas przełączania awaryjnego repliki pomocniczej z zatwierdzaniem synchronicznym (takiej jak partner automatycznego przełączania awaryjnego) przy użyciu metody opisanej w Monitor performance for Always On Availability Groups, okaże się, że przekracza on wartość RTO.

Jeśli automatyczne przełączenie awaryjne nadal nie zostało ukończone, zobacz Rozwiązywanie problemów z automatycznym przełączaniem awaryjnym w środowiskach SQL Server 2012 Always On.

Poniższe sekcje opisują typowe przyczyny czasu awarii przekraczającego RTO.

  1. Obciążenie związane z raportowaniem uniemożliwia uruchomienie wątku redo

  2. Wątek ponawiania ma opóźnienia z powodu rywalizacji o zasoby

Obciążenie związane z raportowaniem uniemożliwia działanie wątku redo

Wątek redo na wtórnej repliki jest blokowany przed wprowadzaniem zmian w języku definicji danych (DDL) przez długo działające zapytanie tylko do odczytu.

Wyjaśnienie

W replikach wtórnych zapytania tylko do odczytu uzyskują blokady stabilności schematu (Sch-S). Te Sch-S blokady mogą uniemożliwiać wątkowi redo uzyskanie blokad modyfikacji schematu (Sch-M), aby można było wprowadzać wszelkie zmiany DDL. Zablokowany wątek powtórek nie może stosować rekordów logów, dopóki nie zostanie odblokowany. Po odblokowaniu może nadal nadrobić do końca dziennika i umożliwić przeprowadzenie następującego po nim procesu cofania oraz przełączenia awaryjnego.

Diagnoza i rozwiązanie procesu

Gdy wątek redo jest zablokowany, generowane jest zdarzenie rozszerzone o nazwie sqlserver.lock_redo_blocked. Dodatkowo możesz zapytać DMV sys.dm_exec_request na drugiej replice, aby dowiedzieć się, która sesja blokuje wątek REDO, a potem możesz podjąć działania naprawcze. Następujące zapytanie zwraca identyfikator sesji zapytania tylko do odczytu, które blokuje wątek powtórek.

select session_id, command, blocking_session_id, wait_time, wait_type, wait_resource   
from sys.dm_exec_requests where command = 'DB STARTUP'  

Możesz poczekać, aż obciążenie związane z raportowaniem zakończy działanie; wtedy wątek ponawiania zostanie odblokowany. Możesz też natychmiast odblokować wątek ponawiania, wykonując polecenie KILL (Transact-SQL) dla identyfikatora sesji blokującej.

Wątek redo ma opóźnienia z powodu rywalizacji o zasoby

Duże obciążenie związane z raportowaniem na replice wtórnej spowolniło jej działanie, a wątek ponawiania pozostaje w tyle.

Wyjaśnienie

Podczas stosowania rekordów dziennika na replice wtórnej wątek redo odczytuje rekordy dziennika z dysku dziennika, a następnie dla każdego rekordu dziennika odwołuje się do stron danych, aby zastosować ten rekord dziennika. Dostęp do strony może być ograniczony I/O (dostęp do fizycznego dysku), jeśli strona nie znajduje się już w puli bufora. Jeśli jest obciążenie raportowania związane z I/O, to obciążenie raportowania konkuruje o zasoby I/O z wątkiem powtórek i może spowolnić wątek powtórek.

Diagnoza i rozwiązanie procesu

Możesz użyć poniższego zapytania DMV, aby sprawdzić, jak duże jest opóźnienie wątku redo, mierząc wartość luki między last_redone_lsn a last_received_lsn.

select recovery_lsn, truncation_lsn, last_hardened_lsn, last_received_lsn,   
   last_redone_lsn, last_redone_time  
from sys.dm_hadr_database_replica_states  
  

Jeśli wątek poprawki faktycznie pozostaje w tyle, musisz zbadać źródło pogorszenia wydajności na wtórnej replice. Jeśli wystąpi konflikt I/O w obciążeniu raportującym, możesz użyć Resource Governor do kontrolowania cykli CPU wykorzystywanych przez obciążenie raportujące do pośredniej kontroli wykonywanych cykli I/O, w pewnym stopniu. Na przykład jeśli obciążenie generowane przez raportowanie zużywa 10 procent zasobów procesora, ale jest ograniczane przez operacje we/wy, można użyć narzędzia Resource Governor, aby ograniczyć użycie procesora do 5 procent i w ten sposób zdławić obciążenie odczytem, co minimalizuje wpływ na operacje we/wy.