Symptomy
Załóżmy, że jest używana grupa dostępność zawsze w bazie danych programu Microsoft SQL Server 2012 lub SQL Server 2014, a duża otwarta aktywna transakcja wymaga dodatkowego miejsca do logowania. Jeśli nie można zwiększyć pliku dziennika z jednego z poniższych powodów, transakcja nie powiedzie się.
-
Brak dodatkowego miejsca na pliki
-
Plik dziennika jest skonfigurowany do niezwiększania
-
Plik dziennika osiągnął skonfigurowany maksymalny rozmiar
Ponadto wyświetlany zostanie następujący komunikat o błędzie:
Błąd: 9002; ważność: 17; stan: 9. dziennik transakcji bazy danych "<Nazwa bazy danych>" jest pełna ze względu na "log_backup".
Po uruchomieniu kopii zapasowej dziennika zostanie wyświetlony kolejny komunikat o błędzie 9002:
Błąd: 9002; ważność: 17; stan: 9. dziennik transakcji bazy danych "<Nazwa bazy danych>" jest pełna ze względu na "ACTIVE_TRANSACTION".
Po wykonaniu kolejnej kopii zapasowej dziennika zostanie wyświetlony kolejny komunikat o błędzie 9002, a po nim komunikat o błędzie 5901:
Błąd: 9002; ważność: 17; stan: 9. dziennik transakcji bazy danych "<Nazwa bazy danych>" jest pełna ze względu na "AVAILABILITY_REPLICA".
Nie można zapisać rekordu punktu kontrolnego w bazie danych <Nazwa bazy danych>, ponieważ w dzienniku brakuje miejsca. Skontaktuj się z administratorem bazy danych, aby obciąć dziennik lub przydzielić więcej miejsca do plików dziennika bazy danych. Błąd: 5901; ważność: 16; stan: 1. co najmniej jedna jednostka odzyskiwania należąca do bazy danych "<Nazwa bazy danych>" nie może wygenerować punktu kontrolnego. Jest to zwykle spowodowane brakiem zasobów systemowych, takich jak dysk lub pamięć, lub w przypadku nieobecności spowodowanych uszkodzeniem bazy danych. Sprawdź poprzednie wpisy w dzienniku błędów, aby uzyskać bardziej szczegółowe informacje na temat tego błędu.
Gdy kolejne punkty kontrolne lub kopie zapasowe dziennika zostaną pobrane podczas wycofywania transakcji, może zostać wyświetlony następujący komunikat o błędzie:
Msg 3052, poziom 16, stan 1, 4BACKUP wiersz dziennika nie mógł zarejestrować aktualizacji bazy danych "<Nazwa bazy danych>". Kolejne kopie zapasowe dziennika będą wymagane do przeprowadzenia punktu kopii zapasowej z <o identyfikatorze LSN 1> "do" <numeru LSN 2> "po udostępnieniu miejsca w dzienniku na potrzeby rejestrowania.
Gdy otrzymasz te wiadomości, nie będziesz już mieć możliwości przesyłania żadnych nowych transakcji do bazy danych i nie możesz powiększyć pliku dziennika ani dodać kolejnego pliku dziennika.
Rozwiązanie
Problem został po raz pierwszy rozwiązany w następującej zbiorczej aktualizacji programu SQL Server:
Każda nowa Zbiorcza aktualizacja programu SQL Server zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji zbiorczej. Zalecamy pobranie i zainstalowanie najnowszych aktualizacji zbiorczych programu SQL Server:
Obejście
Możesz użyć poniższego obejścia, aby obciąć dzienniki i działanie wznowienia.
-
Zaznacz poszczególne repliki pomocnicze, aby sprawdzić, czy last_hardened_lsn repliki pomocniczej (zobacz sys.dm_hadr_database_replica_states) jest zgodna z last_hardened_lsnrepliki podstawowej. Możesz to zrobić, uruchamiając następujące zapytanie, które jest połączone z podstawowym wystąpieniem repliki.
SELECT ags.name as AGGroupName, ar.replica_server_name as InstanceName, hars.role_desc, db_name(drs.database_id)as DBName, drs.last_hardened_lsn, drs.log_send_queue_size, drs.synchronization_state_desc as SyncState, ar.availability_mode_desc as SyncMode, CASE drs.is_local WHEN 1 THEN drs.database_id ELSE NULL END as database_id FROM sys.dm_hadr_database_replica_states drs LEFT JOIN sys.availability_replicas ar ON drs.replica_id = ar.replica_id LEFT JOIN sys.availability_groups ags ON ar.group_id = ags.group_id LEFT JOIN sys.dm_hadr_availability_replica_states hars ON ar.group_id = hars.group_id and ar.replica_id = hars.replica_id WHERE db_name(drs.database_id) = '<database name>'
-
W replice podstawowej
-
Usuń bazę danych z grupy dostępności.
-
Dodaj ponownie bazę danych do grupy dostępności.
-
-
W każdej replice pomocniczej
-
Dodaj ponownie bazę danych do grupy dostępności.
-
Usunięcie bazy danych z grupy dostępności powoduje natychmiastowe obcięcie dziennika i zwolnienia miejsca do logowania. Jeśli last_hardened_lsn w każdej replice pomocniczej jest identyczna z repliką podstawową, a żadne kopie zapasowe dziennika nie zostaną pobrane w czasie usuwania bazy danych z grupy dostępności i ponownego dodania tej bazy danych do poszczególnych elementów pomocniczych, replika pomocnicza zostanie ponownie dodana bez żadnych błędów ani nie będzie mogła przywrócić kopii zapasowych dziennika na pomocniczym. Jeśli replika pomocnicza nie jest obecna w replice podstawowej i musisz usunąć bazę danych z grupy dostępności, zanim pomocnicza będzie mogła przeprowadzić przekierowanie, może być konieczne przywrócenie kopii zapasowej dziennika w celu jej przechwycenia przed ponownym dodaniem do grupy dostępności lub usunięcie bazy danych w replice pomocniczej i ponowne dopełnienie jej kopii zapasowej bazy danych dziennika transakcji.
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".