Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:Azure SQL Managed Instance
Můžou se zobrazit chyby 9002 nebo 40552, pokud je transakční protokol plný a nemůže přijímat 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ů nejde spravovat, ale správci můžou spravovat soubory databáze a nastavení automatického zvětšování 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. Krácení protokolu odstraní neaktivní soubory virtuálních protokolů (VLF) z transakčního protokolu, čímž uvolní místo uvnitř souboru, aniž by změnilo jeho velikost 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 log_reuse_wait_desc v sys.databases. Informace o čekání na opakované použití protokolu vás upozorňuje na podmínky nebo důvody, které brání zkrácení transakčního protokolu při pravidelném zálohování. Další informace naleznete v sys.databases (Transact-SQL).
SELECT [name], log_reuse_wait_desc FROM sys.databases;
Následující hodnoty log_reuse_wait_desc v sys.databases 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. Nic nebrání zkrácení protokolu. | Ne. |
| KONTROLNÍ BOD | Kontrolní bod je potřebný pro zkrácení protokolu. Vzácný. | Na odpověď není třeba reagovat, pokud není trvalý. Pokud problém přetrvává, vytvořte žádost o podporu u Azure Support. |
| LOG ZÁLOHY | Vyžaduje se záloha protokolu. | Není vyžadována žádná odpověď, pokud to není trvalé. Pokud potíže přetrvávají, podejte žádost o podporu u Azure Support. |
| AKTIVNÍ ZÁLOHOVÁNÍ NEBO OBNOVENÍ | Probíhá zálohování databáze. | Není vyžadována žádná odpověď, pokud situace nevytrvá. Pokud problémy přetrvávají, vytvořte žádost o podporu u Azure Support. |
| AKTIVNÍ TRANSAKCE | Probíhající transakce brání zkrácení protokolu. | Soubor protokolu nelze zkrátit kvůli aktivním nebo nepotvrzeným transakcím. 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 přetrvává, prozkoumejte agenzy zapojené do CDC nebo replikace. Pro řešení potíží s CDC dotazujte úlohy v msdb.dbo.cdc_jobs. 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. |
| DOSTUPNOST_REPLIKA | Probíhá synchronizace se sekundární replikou. | Není vyžadována žádná odpověď, pokud přetrvává. Pokud problém přetrvává, podejte žádost o podporu u Azure Support. |
Zkrácení protokolu znemožněno aktivní transakcí
Nejběžnějším scénářem transakčního protokolu, který nemůže přijímat 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í, k jejichž vyhledání slouží
request_blocked_by. Další informace naleznete v tématu Shromáždění blokujících informací. - Vrátí text aktuálního požadavku nebo text vyrovnávací paměti vstupu pomocí zobrazení dynamické správy sys.dm_exec_sql_text nebo sys.dm_exec_input_buffer. Pokud data vrácená polem
textentitysys.dm_exec_sql_textodpovídajíNULL, požadavek není aktivní, ale má dosud nevyřízenou transakci. V takovém případěevent_infopolesys.dm_exec_input_bufferobsahuje 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í. Nicméně klíčem k řešení problému blokujícího zkrácení souboru transakčního protokolu je odstranění kořenové příčiny. 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ší.
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áloh se neodečítá z úložného prostoru 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 není zkracován a nyní vyplňuje veškeré dostupné místo.
- Vzhledem k tomu, že zálohy transakčních protokolů ve službě Azure SQL Managed Instance jsou automatické, něco jiného musí bránit zkrácení aktivity transakčního protokolu. Neúplná replikace, CDC nebo synchronizace skupin pro dostupnost může bránit ořezání transakčního logu, viz Zabránění ořezání transakčního logu.
- Rezervovaná velikost úložiště spravované instance SQL je plná a transakční protokol nemůže růst.
- Přidejte místo k limitu prostředků, viz Správa souborů, abyste uvolnili více místa.
- 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.
- Viz vlastnosti MAXSIZE a FILEGROWTH v souborech ALTER DATABASE a souborových skupinách.
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ů, na které se operuje okamžitě, implementací zpracování po dávkách 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.exenástroje neboSqlBulkCopytřídy (dostupné v obouMicrosoft.Data.SqlClientaSystem.Data.SqlClient), zkuste použít-b batchsizeneboBatchSizemožnosti omezit počet řádků zkopírovaných na server v každé transakci. Další informace naleznete v nástroji bcp. - Pokud znovu sestavujete index pomocí příkazu
ALTER INDEX, použijte možnostiSORT_IN_TEMPDB = ON,ONLINE = ONaRESUMABLE=ON. U přerušitelných indexů je zkracování protokolu častější. Další informace naleznete v tématu ALTER INDEX (Transact-SQL).