Ř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:
- Omezení prostředků virtuálních jader pro jednu databázi najdete v tématu Omezení prostředků pro izolované databáze využívající nákupní model virtuálních jader.
- Omezení prostředků virtuálních jader pro elastické fondy najdete v tématu Limity prostředků pro elastické fondy pomocí nákupního modelu virtuálních jader.
- Omezení prostředků DTU pro jednu databázi najdete v tématu Omezení prostředků pro izolované databáze pomocí nákupního modelu DTU.
- Limity prostředků DTU pro elastické fondy najdete v tématu Limity prostředků pro elastické fondy pomocí nákupního modelu DTU.
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.databases
té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
polesys.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:
- 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.
- 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 neboSystem.Data.SqlClient.SqlBulkCopy
třídy, zkuste použít-b batchsize
neboBatchSize
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říkazSORT_IN_TEMPDB = ON
,ONLINE = ON
aRESUMABLE=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
- Vysvětlení a řešení problémů s blokováním služby Azure SQL Database
- Řešení potíží s připojením a dalších chyb ve službách Azure SQL Database a Azure SQL Managed Instance
- Řešení přechodných chyb připojení ve službě Azure SQL Database a spravované instanci SQL
- Video: Osvědčené postupy načítání dat ve službě Azure SQL Database