Sdílet prostřednictvím


Řešení chyb transakčního protokolu ve službě Azure SQL Database

Platí pro: Azure SQL Database

Může se zobrazit chyby 9002 nebo 40552, pokud je transakční protokol plný a nemůže přijmout nové transakce. K těmto chybám dochází v případě, že protokol transakcí databáze spravovaný službou Azure SQL Database překračuje prahové hodnoty pro prostor a nemůže pokračovat v přijímání transakcí. Tyto chyby jsou podobné problémům s úplným transakčním protokolem sql Serveru, ale mají různá řešení v SQL Serveru, Azure SQL Database a Azure SQL Managed Instance.

Poznámka:

Tento článek se zaměřuje na Azure SQL Database. Azure SQL Database je založená na nejnovější stabilní verzi databázového stroje Microsoft SQL Serveru, takže většina obsahu je podobná, i když se možnosti řešení potíží a nástroje můžou lišit od SQL Serveru.

Další informace o řešení potíží s transakčním protokolem ve službě Azure SQL Managed Instance najdete v tématu Řešení chyb transakčního protokolu pomocí služby Azure SQL Managed Instance.

Další informace o řešení potíží s transakčním protokolem na SQL Serveru najdete v tématu Řešení potíží s úplným transakčním protokolem (chyba SQL Serveru 9002).

Automatizované zálohy a transakční protokol

Ve službě Azure SQL Database se zálohy transakčních protokolů provádějí automaticky. Informace o četnosti, uchovávání a dalších informacích najdete v tématu Automatizované zálohy.

Spravuje se také volné místo na disku, růst souboru databáze a umístění souboru, takže typické příčiny a řešení problémů s transakčním protokolem se liší od SQL Serveru.

Podobně jako SQL Server je transakční protokol pro každou databázi zkrácen při každém úspěšném dokončení zálohování protokolu. Zkrácení ponechá v souboru protokolu prázdné místo, které se pak dá použít pro nové transakce. Pokud soubor protokolu nelze zkrátit zálohami protokolů, soubor protokolu se zvětšuje tak, aby vyhovoval novým transakcím. Pokud se soubor protokolu v Azure SQL Database zvyšuje na maximální limit, nové transakce zápisu selžou.

Informace o velikostech transakčních protokolů najdete tady:

Zabránění zkrácení transakčního protokolu

Pokud chcete zjistit, co brání zkrácení protokolu v daném případě, přečtěte si v log_reuse_wait_desc sys.databasestématu . Čekání opakovaného použití protokolu vás informuje o tom, jaké podmínky nebo příčiny brání zkrácení transakčního protokolu pravidelným zálohováním protokolů. Další informace najdete v tématu věnovaném zobrazení sys.databases (Transact-SQL).

SELECT [name], log_reuse_wait_desc FROM sys.databases;

Pro Službu Azure SQL Database se doporučuje připojit se k konkrétní uživatelské databázi, nikoli master k databázi, aby se tento dotaz spustil.

Následující hodnoty log_reuse_wait_desc sys.databases in mohou znamenat důvod, proč je zabráněno zkrácení transakčního protokolu databáze:

log_reuse_wait_desc Diagnostika Požadovaná odpověď
NIC Typický stav. V protokolu se nic neblokuje, aby se zkrátil. Ne.
KONTROLNÍ BOD Pro zkrácení protokolu je potřeba kontrolní bod. Vzácný. Není vyžadována žádná odpověď, pokud se neudrží. Pokud je podpora trvalá, vytvořte žádost o podporu pomocí podpory Azure.
ZÁLOHOVÁNÍ PROTOKOLŮ Vyžaduje se záloha protokolu. Není vyžadována žádná odpověď, pokud se neudrží. Pokud je podpora trvalá, vytvořte žádost o podporu pomocí podpory Azure.
AKTIVNÍ ZÁLOHOVÁNÍ NEBO OBNOVENÍ Probíhá zálohování databáze. Není vyžadována žádná odpověď, pokud se neudrží. Pokud je podpora trvalá, vytvořte žádost o podporu pomocí podpory Azure.
AKTIVNÍ TRANSAKCE Probíhající transakce brání zkrácení protokolu. Soubor protokolu nelze zkrátit z důvodu aktivních nebo nepotvrzených transakcí. Viz další část.
REPLIKACE V Azure SQL Database k tomu může dojít, pokud je povolené zachytávání dat změn (CDC). Dotazování sys.dm_cdc_errors a řešení chyb Pokud není možné, vytvořte žádost o podporu pomocí podpory Azure.
AVAILABILITY_REPLICA Probíhá synchronizace se sekundární replikou. Není vyžadována žádná odpověď, pokud se neudrží. Pokud je podpora trvalá, vytvořte žádost o podporu pomocí podpory Azure.

Zkrácení protokolu znemožněno aktivní transakcí

Nejběžnějším scénářem transakčního protokolu, který nemůže přijmout nové transakce, je dlouhotrvající nebo blokovaná transakce.

Spuštěním tohoto ukázkového dotazu vyhledejte nepotvrzené nebo aktivní transakce a jejich vlastnosti.

  • Vrátí informace o vlastnostech transakce z sys.dm_tran_active_transactions.
  • Vrátí informace o připojení relace z sys.dm_exec_sessions.
  • Vrátí informace o požadavku (pro aktivní požadavky) z sys.dm_exec_requests. Tento dotaz lze použít také k identifikaci blokovaných relací, vyhledání request_blocked_by. Další informace naleznete v tématu Shromáždění blokujících informací.
  • Vrátí text nebo vstupní vyrovnávací paměť aktuálního požadavku pomocí sys.dm_exec_sql_text nebo sys.dm_exec_input_buffer zobrazení dynamické správy. Pokud data vrácená polem text sys.dm_exec_sql_text null, požadavek není aktivní, ale má nevyrovnanou transakci. V takovém případě event_info pole sys.dm_exec_input_buffer obsahuje poslední příkaz předaný databázovému stroji.
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
, azure_dtc_state    --Applies to: Azure SQL Database only
             =    CASE tat.dtc_state 
                 WHEN 1 THEN 'ACTIVE'
                 WHEN 2 THEN 'PREPARED'
                 WHEN 3 THEN 'COMMITTED'
                 WHEN 4 THEN 'ABORTED'
                 WHEN 5 THEN 'RECOVERED' END
, 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;

Správa souborů, aby se uvolnilo více místa

Pokud se v elastických fondech Azure SQL Database znemožní zkrácení transakčního protokolu, může být uvolnění místa pro elastický fond součástí řešení. Překlad kořenové podmínky blokující zkrácení souboru transakčního protokolu je však klíčem. V některých případech umožňuje dočasně vytvořit více místa na disku, aby se dokončily dlouhotrvající transakce, čímž se odebere podmínka blokující zkrácení souboru transakčního protokolu v normálním zálohování transakčního protokolu. Uvolnění místa však může poskytnout pouze dočasnou úlevu, dokud se transakční protokol znovu nezvětšuje.

Další informace o správě prostoru souborů databází a elastických fondů najdete v tématu Správa prostoru souborů pro databáze ve službě Azure SQL Database.

Chyba 40552: Relace byla ukončena kvůli nadměrnému využití místa v protokolu transakcí

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

Při řešení tohoto problému zkuste použít následující metody:

  1. K problému může dojít v jakékoli operaci DML, jako je vložení, aktualizace nebo odstranění. Zkontrolujte transakci, abyste se vyhnuli zbytečným zápisům. Pokuste se snížit počet řádků, které jsou provozovány okamžitě implementací dávkování nebo rozdělením na několik menších transakcí. Další informace naleznete v tématu Použití dávkování ke zlepšení výkonu aplikace SQL Database.
  2. K tomuto problému může dojít kvůli operacím opětovného sestavení indexu. Pokud se chcete tomuto problému vyhnout, ujistěte se, že platí následující vzorec: (počet řádků ovlivněných v tabulce) vynásobený (průměrná velikost pole, které se aktualizuje v bajtech + 80) < 2 gigabajty (GB). U velkých tabulek zvažte vytváření oddílů a provádění údržby indexů pouze u některých oddílů tabulky. Další informace najdete v tématu Vytváření dělených tabulek a indexů.
  3. Pokud provádíte hromadné vkládání pomocí bcp.exe nástroje nebo System.Data.SqlClient.SqlBulkCopy třídy, zkuste použít -b batchsize nebo BatchSize možnosti omezit počet řádků zkopírovaných na server v každé transakci. Další informace naleznete v nástroji bcp.
  4. Pokud znovu sestavíte index pomocí ALTER INDEX příkazu, použijte příkaz SORT_IN_TEMPDB = ON, ONLINE = ONa RESUMABLE=ON možnosti. U opakovaně použitelných indexů je zkrácení protokolu častější. Další informace naleznete v tématu ALTER INDEX (Transact-SQL).

Poznámka:

Další informace o dalších chybách zásad správného řízení prostředků najdete v tématu Chyby zásad správného řízení prostředků.

Další kroky