Rozwiązywanie problemów z błędami dziennika transakcji w usłudze Azure SQL Managed Instance

Dotyczy:Azure SQL Managed Instance

Mogą wystąpić błędy 9002 lub 40552, gdy dziennik transakcji jest pełny i nie może zaakceptować nowych transakcji. Te błędy występują, gdy dziennik transakcji bazy danych zarządzany przez usługę Azure SQL Managed Instance przekracza progi miejsca i nie może nadal akceptować transakcji. Te błędy są podobne do problemów z pełnym dziennikiem transakcji w programie SQL Server, ale mają różne rozwiązania w programie SQL Server, usłudze Azure SQL Database i usłudze Azure SQL Managed Instance.

Uwaga

Ten artykuł koncentruje się na usłudze Azure SQL Managed Instance. Usługa Azure SQL Managed Instance jest oparta na najnowszej stabilnej wersji aparatu bazy danych programu Microsoft SQL Server, więc większość zawartości jest podobna, chociaż opcje rozwiązywania problemów i narzędzia mogą różnić się od programu SQL Server.

Aby uzyskać więcej informacji na temat rozwiązywania problemów z dziennikiem transakcji w usłudze Azure SQL Database, zobacz Rozwiązywanie problemów z błędami dziennika transakcji w usłudze Azure SQL Database.

Aby uzyskać więcej informacji na temat rozwiązywania problemów z dziennikiem transakcji w programie SQL Server, zobacz Rozwiązywanie problemów z pełnym dziennikiem transakcji (błąd programu SQL Server 9002).

Automatyczne kopie zapasowe i dziennik transakcji

W usłudze Azure SQL Managed Instance kopie zapasowe dziennika transakcji są wykonywane automatycznie. Aby uzyskać informacje o częstotliwości, przechowywaniu i innych informacjach, zobacz Automatyczne kopie zapasowe. Aby śledzić, kiedy automatyczne kopie zapasowe zostały wykonane w wystąpieniu zarządzanym SQL, zapoznaj się z artykułem Monitorowanie działania tworzenia kopii zapasowych.

Nie można zarządzać lokalizacją i nazwą plików bazy danych, ale administratorzy mogą zarządzać plikami bazy danych i ustawieniami automatycznego zwiększania plików. Typowe przyczyny i rozwiązania problemów z dziennikami transakcji są podobne do programu SQL Server.

Podobnie jak w przypadku programu SQL Server dziennik transakcji dla każdej bazy danych jest obcinany po pomyślnym zakończeniu tworzenia kopii zapasowej dziennika. Obcięcie dziennika usuwa nieaktywne pliki dziennika wirtualnego (VLFs) z dziennika transakcji, zwalniając miejsce wewnątrz pliku, ale nie zmieniając rozmiaru pliku na dysku. Puste miejsce w pliku dziennika może być następnie używane dla nowych transakcji. Gdy plik dziennika nie może być obcięty przez kopie zapasowe dziennika, plik dziennika rośnie, aby pomieścić nowe transakcje. Jeśli plik dziennika osiągnie maksymalny limit w usłudze Azure SQL Managed Instance, nowe transakcje zapisu kończą się niepowodzeniem.

W usłudze Azure SQL Managed Instance możesz zakupić magazyn dodatków niezależnie od zasobów obliczeniowych do limitu. Aby uzyskać więcej informacji, zobacz Zarządzanie plikami, aby zwolnić więcej miejsca.

Zapobieganie obcinaniu dziennika transakcji

Aby dowiedzieć się, co uniemożliwia obcięcie dziennika w danym przypadku, zapoznaj się z log_reuse_wait_desc artykułem .sys.databases Ponowne użycie dziennika informuje o tym, jakie warunki lub przyczyny uniemożliwiają obcięcie dziennika transakcji przez zwykłą kopię zapasową dziennika. Aby uzyskać więcej informacji, zobacz sys.databases (Transact-SQL).

SELECT [name], log_reuse_wait_desc FROM sys.databases;

Następujące wartości parametru log_reuse_wait_desc in sys.databases mogą wskazywać przyczynę, dla którego obcinanie dziennika transakcji bazy danych jest blokowane:

Log_reuse_wait_desc Diagnoza Wymagana odpowiedź
NIC Typowy stan. Dziennik nie blokuje obcięcia. Nie
PUNKT KONTROLNY Do obcinania dziennika jest wymagany punkt kontrolny. Rzadko. Nie jest wymagana żadna odpowiedź, chyba że nie zostanie to utrzymane. Jeśli jest to trwałe, prześlij wniosek o pomoc techniczną platformy Azure.
KOPIA ZAPASOWA DZIENNIKA Wymagana jest kopia zapasowa dziennika. Nie jest wymagana żadna odpowiedź, chyba że nie zostanie to utrzymane. Jeśli jest to trwałe, prześlij wniosek o pomoc techniczną platformy Azure.
AKTYWNA KOPIA ZAPASOWA LUB PRZYWRACANIE Trwa tworzenie kopii zapasowej bazy danych. Nie jest wymagana żadna odpowiedź, chyba że nie zostanie to utrzymane. Jeśli jest to trwałe, prześlij wniosek o pomoc techniczną platformy Azure.
AKTYWNA TRANSAKCJA Bieżąca transakcja uniemożliwia obcięcie dziennika. Nie można obcinać pliku dziennika z powodu aktywnych i/lub niezatwierdzonych transakcji. Zobacz następną sekcję.
REPLIKACJI W usłudze Azure SQL Managed Instance może wystąpić, jeśli włączono replikację lub usługę CDC. Jeśli jest to trwałe, zbadaj agentów związanych z usługą CDC lub replikacją. Aby rozwiązać problemy z usługą CDC, wykonaj zapytania dotyczące zadań w msdb.dbo.cdc_jobs. Jeśli nie istnieje, dodaj za pośrednictwem sys.sp_cdc_add_job. Aby uzyskać informacje na temat replikacji, zobacz Rozwiązywanie problemów z replikacją transakcyjną. Jeśli nie można rozwiązać, prześlij wniosek o pomoc techniczną przy użyciu pomocy technicznej platformy Azure.
AVAILABILITY_REPLICA Trwa synchronizacja z repliką pomocniczą. Nie jest wymagana żadna odpowiedź, chyba że nie zostanie to utrzymane. Jeśli jest to trwałe, prześlij wniosek o pomoc techniczną platformy Azure.

Obcinanie dziennika uniemożliwione przez aktywną transakcję

Najczęstszym scenariuszem dziennika transakcji, który nie może zaakceptować nowych transakcji, jest długotrwała lub zablokowana transakcja.

Uruchom to przykładowe zapytanie, aby znaleźć niezatwierdzone lub aktywne transakcje oraz ich właściwości.

  • Zwraca informacje o właściwościach transakcji z sys.dm_tran_active_transactions.
  • Zwraca informacje o połączeniu sesji z sys.dm_exec_sessions.
  • Zwraca informacje o żądaniach (dla aktywnych żądań) z sys.dm_exec_requests. To zapytanie może również służyć do identyfikowania zablokowanych sesji, wyszukania elementu request_blocked_by. Aby uzyskać więcej informacji, zobacz Zbieranie informacji blokujących.
  • Zwraca tekst lub tekst buforu wejściowego bieżącego żądania przy użyciu widoków DMV sys.dm_exec_sql_text lub sys.dm_exec_input_buffer . Jeśli dane zwrócone przez text pole polecenia sys.dm_exec_sql_text to NULL, żądanie nie jest aktywne, ale ma zaległą transakcję. W takim przypadku event_info pole zawiera sys.dm_exec_input_buffer ostatnią instrukcję przekazaną do aparatu bazy danych.
SELECT [database_name] = db_name(s.database_id)
, tat.transaction_id, tat.transaction_begin_time, tst.session_id 
, session_open_transaction_count = tst.open_transaction_count
, transaction_duration_s = datediff(s, tat.transaction_begin_time, sysdatetime())
, input_buffer = ib.event_info
, request_text = CASE  WHEN r.statement_start_offset = 0 and r.statement_end_offset= 0 THEN left(est.text, 4000)
                       ELSE    SUBSTRING ( est.[text],    r.statement_start_offset/2 + 1, 
                                           CASE WHEN r.statement_end_offset = -1 THEN LEN (CONVERT(nvarchar(max), est.[text])) 
                                                ELSE r.statement_end_offset/2 - r.statement_start_offset/2 + 1
                                           END  )  END
, request_status = r.status
, request_blocked_by = r.blocking_session_id
, transaction_state = CASE tat.transaction_state    
                     WHEN 0 THEN 'The transaction has not been completely initialized yet.'
                     WHEN 1 THEN 'The transaction has been initialized but has not started.'
                     WHEN 2 THEN 'The transaction is active - has not been committed or rolled back.'
                     WHEN 3 THEN 'The transaction has ended. This is used for read-only transactions.'
                     WHEN 4 THEN 'The commit process has been initiated on the distributed transaction. This is for distributed transactions only. The distributed transaction is still active but further processing cannot take place.'
                     WHEN 5 THEN 'The transaction is in a prepared state and waiting resolution.'
                     WHEN 6 THEN 'The transaction has been committed.'
                     WHEN 7 THEN 'The transaction is being rolled back.'
                     WHEN 8 THEN 'The transaction has been rolled back.' END 
, transaction_name = tat.name
, transaction_type = CASE tat.transaction_type    WHEN 1 THEN 'Read/write transaction'
                                             WHEN 2 THEN 'Read-only transaction'
                                             WHEN 3 THEN 'System transaction'
                                             WHEN 4 THEN 'Distributed transaction' END
, tst.is_user_transaction
, local_or_distributed = CASE tst.is_local WHEN 1 THEN 'Local transaction, not distributed' WHEN 0 THEN 'Distributed transaction or an enlisted bound session transaction.' END
, transaction_uow    --for distributed transactions. 
, s.login_time, s.host_name, s.program_name, s.client_interface_name, s.login_name, s.is_user_process
, session_cpu_time = s.cpu_time, session_logical_reads = s.logical_reads, session_reads = s.reads, session_writes = s.writes
, observed = sysdatetimeoffset()
FROM sys.dm_tran_active_transactions AS tat 
INNER JOIN sys.dm_tran_session_transactions AS tst  on tat.transaction_id = tst.transaction_id
INNER JOIN Sys.dm_exec_sessions AS s on s.session_id = tst.session_id 
LEFT OUTER JOIN sys.dm_exec_requests AS r on r.session_id = s.session_id
CROSS APPLY sys.dm_exec_input_buffer(s.session_id, null) AS ib 
OUTER APPLY sys.dm_exec_sql_text (r.sql_handle) AS est;

Zarządzanie plikami w celu zwolnienia większej ilości miejsca

Jeśli dziennik transakcji nie może zostać obcięty w usłudze Azure SQL Managed Instance, wolne miejsce może być częścią rozwiązania. Jednak rozpoznawanie katalogu głównego warunku blokującego obcinanie pliku dziennika transakcji jest kluczem. W niektórych przypadkach tymczasowe utworzenie większej ilości miejsca na dysku umożliwia ukończenie długotrwałych transakcji, usunięcie warunku blokującego obcięcie pliku dziennika transakcji z normalną kopią zapasową dziennika transakcji. Jednak zwolnienie miejsca może zapewnić tylko tymczasową ulgę do czasu ponownego wzrostu dziennika transakcji.

W usłudze Azure SQL Managed Instance możesz zakupić magazyn dodatków niezależnie od zasobów obliczeniowych do limitu. Na przykład w witrynie Azure Portal uzyskaj dostęp do strony Obliczenia i magazyn , aby zwiększyć rozmiar magazynu w GB. Aby uzyskać informacje na temat limitów rozmiaru dziennika transakcji, zobacz Limity zasobów dla usługi SQL Managed Instance. Aby uzyskać więcej informacji, zobacz Zarządzanie miejscem na pliki dla baz danych w usłudze Azure SQL Managed Instance.

Magazyn kopii zapasowych nie jest odejmowany z miejsca do magazynowania wystąpienia zarządzanego SQL. Magazyn kopii zapasowych jest niezależny od miejsca do magazynowania wystąpienia i nie jest ograniczony.

Błąd 9002: Dziennik transakcji bazy danych jest pełny

9002: The transaction log for database '%.*ls' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases.

Błąd 9002 występuje w programie SQL Server i usłudze Azure SQL Managed Instance z tych samych powodów.

Odpowiednia odpowiedź na pełny dziennik transakcji zależy od warunków, które spowodowały wypełnienie dziennika.

Aby rozwiązać problem z błędem 9002, wypróbuj następujące metody:

  • Dziennik transakcji nie jest obcinany i zwiększa się, aby wypełnić wszystkie dostępne miejsce.
    • Ponieważ kopie zapasowe dziennika transakcji w usłudze Azure SQL Managed Instance są automatyczne, należy zachować działanie dziennika transakcji przed obcięciem. Niepełna replikacja, cdC lub synchronizacja grup dostępności może uniemożliwiać obcięcie, zobacz Zapobieganie obcinaniu dziennika transakcji.
  • Rozmiar magazynu zarezerwowanego wystąpienia zarządzanego SQL jest pełny, a dziennik transakcji nie może rosnąć.
  • Rozmiar dziennika transakcji jest ustawiony na stałą wartość maksymalną lub autogrow jest wyłączony i dlatego nie można go zwiększyć.

Błąd 40552: Sesja została zakończona z powodu nadmiernego użycia miejsca w dzienniku transakcji

40552: The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Błąd 9002 jest częściej spotykany niż błąd 40552 w usłudze Azure SQL Managed Instance, ale oba te elementy mogą wystąpić.

Aby rozwiązać problem z błędem 40552, wypróbuj następujące metody:

  • Problem może wystąpić w dowolnej operacji DML, takiej jak wstawianie, aktualizowanie lub usuwanie. Przejrzyj transakcję, aby uniknąć niepotrzebnych zapisów. Spróbuj zmniejszyć liczbę wierszy, które są obsługiwane natychmiast, implementując przetwarzanie wsadowe lub dzielenie na wiele mniejszych transakcji. Aby uzyskać więcej informacji, zobacz How to use batching to improve application performance (Jak używać przetwarzania wsadowego w celu zwiększenia wydajności aplikacji).
  • Problem może wystąpić z powodu operacji ponownego kompilowania indeksu. Aby uniknąć tego problemu, upewnij się, że następująca formuła jest prawdziwa: (liczba wierszy, których dotyczy tabela) pomnożona przez (średni rozmiar pola zaktualizowanego w bajtach + 80) < 2 gigabajtów (GB). W przypadku dużych tabel rozważ utworzenie partycji i przeprowadzenie konserwacji indeksu tylko na niektórych partycjach tabeli. Aby uzyskać więcej informacji, zobacz Create Partitioned Tables and Indexes (Tworzenie partycjonowanych tabel i indeksów).
  • Jeśli wykonujesz operacje zbiorcze wstawiania przy użyciu bcp.exe narzędzia lub System.Data.SqlClient.SqlBulkCopy klasy, spróbuj użyć -b batchsize opcji lub BatchSize , aby ograniczyć liczbę wierszy skopiowanych do serwera w każdej transakcji. Aby uzyskać więcej informacji, zobacz narzędzie bcp.
  • Jeśli ponownie kompilujesz indeks za pomocą instrukcji ALTER INDEX , użyj SORT_IN_TEMPDB = ONopcji , ONLINE = ONi RESUMABLE=ON . W przypadku indeksów z możliwością wznowienia obcinanie dzienników jest częstsze. Aby uzyskać więcej informacji, zobacz ALTER INDEX (Transact-SQL).

Następne kroki