Sdílet prostřednictvím


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

Platí pro: Azure SQL Managed Instance

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 Managed Instance překročí prahové hodnoty místa 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 spravovanou instanci Azure SQL. Spravovaná instance Azure SQL 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 Database najdete v tématu Řešení chyb transakčního protokolu ve službě Azure SQL Database.

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 Managed Instance 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. Pokud chcete sledovat, kdy se ve spravované instanci SQL provedly automatizované zálohování, zkontrolujte aktivitu monitorování zálohování.

Umístění a název databázových souborů nelze spravovat, ale správci můžou spravovat nastavení automatického zvětšování souborů a souborů. Typické příčiny a řešení problémů s transakčním protokolem jsou podobné 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í protokolu odstraní neaktivní soubory virtuálních protokolů (VLF) z transakčního protokolu, uvolní místo v souboru, ale nezmění velikost souboru na disku. Prázdné místo v souboru protokolu 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 soubor protokolu roste na maximální limit ve službě Azure SQL Managed Instance, nové transakce zápisu selžou.

Ve službě Azure SQL Managed Instance si můžete zakoupit doplňkové úložiště nezávisle na výpočetních prostředcích až do limitu. Další informace najdete v tématu Správa souborů, abyste uvolnili více místa.

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;

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 Ve službě Azure SQL Managed Instance může dojít v případě, že je povolená replikace nebo CDC. Pokud je to trvalé, prozkoumejte agenty zapojené do CDC nebo replikace. Úlohy dotazů v msdb.dbo.cdc_jobs pro řešení potíží s CDC. Pokud není k dispozici, přidejte přes sys.sp_cdc_add_job. Informace o replikaci najdete v tématu Řešení potíží s transakční replikací. 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 jsou 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
, 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 Azure SQL Managed Instance znemožní zkrácení transakčního protokolu, může být uvolnění místa 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.

Ve službě Azure SQL Managed Instance si můžete zakoupit doplňkové úložiště nezávisle na výpočetních prostředcích až do limitu. Například na webu Azure Portal přejděte na stránku Výpočty a úložiště , abyste zvýšili velikost úložiště v GB. Informace o limitech velikosti transakčního protokolu najdete v tématu Omezení prostředků pro službu SQL Managed Instance. Další informace najdete v tématu Správa prostoru souborů pro databáze ve službě Azure SQL Managed Instance.

Úložiště zálohování se neodečítá z prostoru úložiště spravované instance SQL. Úložiště zálohování je nezávislé na prostoru úložiště instance a není omezené velikostí.

Chyba 9002: Transakční protokol databáze je plný

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.

K chybě 9002 dochází na SQL Serveru a ve službě Azure SQL Managed Instance ze stejných důvodů.

Odpovídající odpověď na úplný transakční protokol závisí na tom, jaké podmínky způsobily vyplnění protokolu.

Pokud chcete vyřešit chybu 9002, vyzkoušejte následující metody:

  • Transakční protokol se nezkrátí a roste tak, aby vyplnil veškeré dostupné místo.
    • Vzhledem k tomu, že zálohy transakčních protokolů ve službě Azure SQL Managed Instance jsou automatické, je potřeba, aby se aktivita transakčního protokolu nezkrátil. Neúplná replikace, CDC nebo synchronizace skupin dostupnosti může bránit zkrácení, viz Zabránění zkrácení transakčního protokolu.
  • Rezervovaná velikost úložiště spravované instance SQL je plná a transakční protokol se nemůže zvětšit.
  • Velikost transakčního protokolu je nastavená na pevnou maximální hodnotu nebo je zakázaná možnost automatického zvětšování, takže se nedá zvětšit.

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.

I když je chyba 9002 častější než chyba 40552 ve službě Azure SQL Managed Instance, může dojít k obojímu.

Pokud chcete vyřešit chybu 40552, vyzkoušejte následující metody:

  • 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.
  • 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ů.
  • 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.
  • 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).

Další kroky