V druhé části této série jsem popsal strukturní hierarchii transakčního protokolu. Vzhledem k tomu, že se tento příspěvek týká hlavně virtuálních protokolových souborů (VLF), které jsem popsal, doporučuji vám přečíst si druhou část, než budete pokračovat.
Když je vše v pořádku, protokol transakcí se bude nekonečně opakovat a znovu používat existující VLF. Tomuto chování říkám kruhová povaha protokolu . Občas se však stane něco, co tomu zabrání, a transakční protokol roste a roste a přidává další a další VLF. V tomto příspěvku vysvětlím, jak to všechno funguje nebo někdy nefunguje.
VLF a zkrácení protokolu
Všechny VLF mají strukturu záhlaví obsahující metadata o VLF. Jedním z nejdůležitějších polí ve struktuře je stav VLF a hodnoty, které nás zajímají, jsou nula, což znamená, že VLF je neaktivní , a dva, což znamená, že VLF je aktivní . Je to důležité, protože neaktivní VLF lze znovu použít, ale aktivní nikoli. Všimněte si, že VLF je zcela aktivní nebo zcela neaktivní.
VLF zůstane aktivní, dokud v něm budou požadované záznamy protokolu, takže jej nelze znovu použít a přepsat (příště se budu věnovat samotným záznamům). Příklady důvodů, proč mohou být vyžadovány záznamy protokolu, zahrnují:
- Existuje dlouhotrvající transakce, jejíž součástí jsou záznamy protokolu, takže je nelze uvolnit, dokud se transakce neschválí nebo nedokončí vrácení zpět
- Záloha protokolu ještě tyto záznamy nezazálohovala
- Tato část protokolu ještě nebyla zpracována agentem Log Reader Agent pro transakční replikaci nebo Change Data Capture
- Tato část protokolu ještě nebyla odeslána do asynchronního zrcadla databáze nebo repliky skupiny dostupnosti
Je důležité si uvědomit, že pokud neexistují žádné důvody pro to, aby VLF zůstal aktivní, nepřepne se znovu do stavu neaktivního, dokud neproběhne proces nazvaný zkrátení protokolu dojde – více o tom níže.
Pomocí jednoduchého hypotetického transakčního protokolu s pouze pěti VLF a sekvenčními čísly VLF začínajícími na 1 (pamatujte si, že ve skutečnosti nikdy nedělají), když je transakční protokol vytvořen, VFL 1 je okamžitě označen jako aktivní, jako vždy být alespoň jeden aktivní VLF v protokolu transakcí – VLF, do kterého se aktuálně zapisují bloky protokolu. Náš příklad scénáře je znázorněn na obrázku 1 níže.
Obrázek 1:Hypotetický, zcela nový protokol transakcí s 5 VLF, pořadovými čísly 1 až 5.
Jak je vytvořeno více záznamů protokolu a více bloků protokolu je zapsáno do protokolu transakcí, VLF 1 se zaplní, takže VLF 2 musí být aktivní, aby bylo možné zapsat více bloků protokolu, jak je znázorněno na obrázku 2 níže.
Obrázek 2:Aktivita se pohybuje v protokolu transakcí.
SQL Server sleduje začátek nejstarší nepotvrzené (aktivní) transakce a toto LSN je uchováno na disku pokaždé, když dojde k operaci kontrolního bodu. LSN nejnovějšího záznamu protokolu zapsaného do transakčního protokolu je také sledováno, ale je sledováno pouze v paměti, protože neexistuje způsob, jak jej uchovat na disku, aniž by došlo k různým podmínkám závodu. Na tom nezáleží, protože se používá pouze během zotavení po havárii a SQL Server může zjistit LSN „konce“ transakčního protokolu během zotavení z havárie. Kontrolní body a zotavení po havárii jsou témata pro budoucí příspěvky v seriálu.
Nakonec se VLF 2 zaplní a VLF 3 se stane aktivním a tak dále. Jádrem kruhové povahy transakčního protokolu je, že dřívější VLF v transakčním protokolu se stanou neaktivními, takže je lze znovu použít. To se provádí procesem zvaným zkrácení protokolu , kterému se také běžně říká čištění protokolu . Bohužel oba tyto termíny jsou hrozná nesprávná pojmenování, protože ve skutečnosti není nic zkráceno ani vymazáno.
Zkrácení protokolu je jednoduše proces prozkoumání všech VLF v protokolu transakcí a určení, které aktivní VLF lze nyní znovu označit jako neaktivní, protože žádný z jejich obsahu SQL Server stále nevyžaduje. Když se provede zkrácení protokolu, není zaručeno, že aktivní VLF budou deaktivovány – zcela záleží na tom, co se děje s databází.
O zkrácení protokolu existují dvě běžné mylné představy:
- Protokol transakcí se zmenšuje (chybná představa o „zkrácení“). Ne, není – nedochází k žádné změně velikosti od zkrácení protokolu. Jediná věc, která dokáže zmenšit transakční protokol, je explicitní DBCC SHRINKFILE.
- Neaktivní VLF jsou nějakým způsobem vynulovány (chybná představa o „čištění“). Ne – do VLF se nic nezapisuje, když je deaktivován, kromě několika polí v záhlaví VLF.
Obrázek 3 níže ukazuje náš protokol transakcí, kde jsou aktivní VLF 3 a 4 a zkrácení protokolu dokázalo označit VLF 1 a 2 jako neaktivní.
Obrázek 3:Zkrácení protokolu označuje dřívější VLF jako neaktivní.
Kdy dojde ke zkrácení protokolu, závisí na tom, který model obnovy se pro databázi používá:
- Jednoduchý model:ke zkrácení protokolu dojde po dokončení operace kontrolního bodu
- Úplný model nebo model s hromadným protokolem:ke zkrácení protokolu dojde po dokončení zálohy protokolu (pokud není spuštěna souběžná plná nebo rozdílová záloha, v takovém případě je zkrácení protokolu odloženo, dokud nebude záloha dat dokončena)
V tomto neexistují žádné výjimky.
Kruhový charakter protokolu
Aby se zabránilo tomu, že se protokol transakcí bude muset zvětšovat, musí být zkrácení protokolu schopné označit VLF jako neaktivní. První fyzický VLF v protokolu musí být neaktivní, aby protokol transakcí měl kruhový charakter.
Zvažte níže uvedený obrázek 4, který ukazuje, že se VLF 4 a 5 používají a zkrácení protokolu označilo VLF 1 až 3 jako neaktivní. Generuje se více záznamů protokolu, do VLF 5 se zapisuje více bloků protokolu a nakonec se zaplní.
Obrázek 4:Aktivita zaplňuje nejvyšší fyzický VLF v transakčním protokolu.
V tomto okamžiku se správce protokolu pro databázi podívá na stav prvního fyzického VLF v protokolu transakcí, což je v našem příkladu VLF 1 s pořadovým číslem 1. VLF 1 je neaktivní, takže protokol transakcí se může zabalit a začněte plnit znovu od začátku. Správce protokolu změní první VLF na aktivní a zvýší jeho pořadové číslo o jedno vyšší, než je aktuální nejvyšší pořadové číslo VLF. Stane se tedy VLF 6 a protokolování pokračuje zápisem bloku protokolu do tohoto VLF. Toto je kruhový charakter logu, jak je znázorněno níže na obrázku 5.
Obrázek 5:Kruhová povaha protokolu transakcí a opětovné použití VLF.
Když se něco pokazí
Když není první fyzický VLF v transakčním protokolu neaktivní, transakční protokol se nemůže obtékat, takže poroste (pokud je k tomu nakonfigurován a na disku je dostatek místa). To se často stává, protože existuje něco, co brání zkrácení protokolu v deaktivaci VLF. Pokud zjistíte, že protokol transakcí pro databázi roste, můžete dotazem SQL Server zjistit, zda došlo k problému se zkrácením protokolu, pomocí tohoto jednoduchého kódu níže:
SELECT [log_reuse_wait_desc] FROM [master].[sys].[databases] WHERE [name] = N'MyDatabase';
Pokud zkrácení protokolu dokázalo deaktivovat jeden nebo více VLF, výsledkem bude NIC. Jinak , dostanete důvod, proč zkrácení protokolu nemohlo deaktivovat žádné VLF. Existuje dlouhý seznam možných důvodů popsaných zde v části Faktory, které mohou zpozdit zkrácení protokolu.
Je důležité porozumět sémantice toho, co je výsledkem:to je důvod, proč zkrácení protokolu nemohlo nic udělat při posledním pokusu o spuštění . Výsledek může být například ACTIVE_BACKUP_OR_RESTORE ale víte, že tato dlouhotrvající plná záloha skončila. To jen znamená, že při posledním pokusu o zkrácení protokolu záloha stále běžela.
Podle mých zkušeností je nejčastějším důvodem, proč se brání zkrácení protokolu, LOG_BACKUP; tj. běžte provést zálohu protokolu! SLOG_BACKUP je ale také zajímavé, zvláštní chování . Pokud neustále vidíte výsledek LOG_BACKUP ale víte, že zálohy protokolů probíhají úspěšně, je to proto, že v databázi je velmi malá aktivita a aktuální VLF je stejný jako při posledním provedení zálohy protokolu. Takže LOG_BACKUP znamená „provést zálohu protokolu“ nebo „všechny zálohované záznamy protokolu jsou z aktuálního VLF, takže jej nelze deaktivovat.“ Když se stane to druhé, může to být matoucí.
Kroužení zpět…
Udržování kruhového charakteru transakčního protokolu je velmi důležité, aby se zabránilo nákladnému nárůstu protokolu a nutnosti přijmout nápravná opatření. Obvykle to znamená zajistit pravidelné zálohování protokolů, aby se usnadnilo ořezávání protokolů a dimenzování protokolu transakcí tak, aby byl schopen pojmout jakékoli velké, dlouhotrvající operace, jako je přestavba indexu nebo operace ETL, aniž by došlo k nárůstu protokolu.
V další části seriálu se budu zabývat záznamy protokolů, jejich fungováním a několika zajímavými příklady.