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:SQL Server
azure SQL Managed Instance
Toto téma popisuje, jak spravovat a monitorovat zachytávání dat změn pro SQL Server a spravovanou instanci Azure SQL.
Informace o službě Azure SQL Database, která používá jiný mechanismus úloh, najdete v tématu CDC se službou Azure SQL Database.
Úloha zachytávání
Úloha zachycení je inicializována spuštěním uložené procedury bez parametrů sp_MScdc_capture_job
. Tato uložená procedura začíná extrahováním nakonfigurovaných hodnot pro maxtrans
, maxscans
, continuous
a pollinginterval
úlohy zachycení z msdb.dbo.cdc_jobs
. Tyto nakonfigurované hodnoty se pak předávají jako parametry uložené procedury sp_cdc_scan
. Slouží ke spuštění sp_replcmds
k provedení skenování protokolu.
Zachytávání parametrů úlohy
Chcete-li pochopit chování úlohy zachycení, musíte pochopit, jak sp_cdc_scan
používá konfigurovatelné parametry.
parametr maxtrans
Parametr maxtrans
určuje maximální počet transakcí, které lze zpracovat v jednom cyklu prohledávání protokolu. Pokud během kontroly počet transakcí, které se mají zpracovat, dosáhne tohoto limitu, nejsou do aktuální kontroly zahrnuty žádné další transakce. Po dokončení cyklu kontroly bude počet zpracovaných transakcí vždy menší nebo roven maxtrans
.
parametr maxscans
Parametr maxscans
určuje maximální počet cyklů kontroly, které se pokusí vyprázdnit protokol před vrácením (continuous = 0) nebo spuštěním waitfor (continuous = 1).
parametr continuous
Parametr continuous
určuje, jestli sp_cdc_scan
odevzdá kontrolu po vyprázdnění protokolu nebo po spuštění maximálního počtu cyklů kontroly (režim jedné operace). Určuje také, zda sp_cdc_scan
nadále poběží, dokud se explicitně nezastaví (nepřetržitý režim).
Režim s jedním snímkem
V režimu jednorázového zachycení úloha sp_cdc_scan
požádá, aby se provedlo až maxtrans
skenů ve snaze vyprázdnit protokol a vrátit se. Jakékoli transakce navíc k maxtrans
, které jsou přítomné v protokolu, budou zpracovány v pozdějších skenováních.
Režim s jedním snímkem se používá v kontrolovaných testech, kde je známý objem transakcí, které se mají zpracovat, a existují výhody faktu, že se úloha po dokončení automaticky zavře. Režim s jedním snímkem se nedoporučuje pro produkční použití. Důvodem je to, že se spoléhá na plán úloh pro správu četnosti spuštění kontrolního cyklu.
Při spuštění v režimu s jedním snímkem můžete vypočítat horní mez očekávané propustnosti úlohy zachycení vyjádřenou v transakcích za sekundu pomocí následujícího výpočtu:
(maxtrans * maxscans) / number of seconds between scans
I kdyby se doba potřebná ke kontrole protokolu a aktualizaci tabulek změn výrazně nelišila od nuly, průměrná propustnost úlohy by nemohla překročit hodnotu, která se vypočítá vydělením maximálního počtu povolených transakcí pro jeden sken, vynásobeného maximálním počtem povolených skenů, počtem sekund oddělujících zpracování protokolu.
Pokud by byl režim jednorázového snímku použit k regulaci prohledávání protokolů, počet sekund mezi zpracováním protokolu by se musel řídit plánem úlohy. Pokud je tento druh chování žádoucí, spuštění úlohy zachytávání v nepřetržitém režimu je lepší způsob, jak přeplánovat prohledávání protokolu.
Průběžný režim a interval dotazování
V nepřetržitém režimu požaduje úloha zachycení, aby sp_cdc_scan
běželo nepřetržitě. Díky tomu může uložená procedura spravovat vlastní smyčku čekání tím, že poskytuje nejen maxtrans
a maxscans
, ale také hodnotu pro počet sekund mezi zpracováním protokolu (interval dotazování). V nepřetržitém režimu zůstane úloha zachytávání aktivní a spustí WAITFOR
mezi prohledáváním protokolu.
Poznámka
Pokud je hodnota intervalu dotazování větší než 0, platí stejný horní limit propustnosti pro opakovanou jednorázovou úlohu také pro operaci úlohy v průběžném režimu. To znamená, že (maxtrans
* maxscans
) vydělený nenulovým intervalem dotazování umístí horní mez průměrného počtu transakcí, které lze zpracovat úlohou zachycení.
Zachycení přizpůsobení úlohy
Pro úlohu zachycení můžete použít další logiku, abyste zjistili, jestli se nová kontrola spustí okamžitě nebo jestli se režim spánku uloží před spuštěním nové kontroly místo toho, aby se spoléhal na pevný interval dotazování. Volba by mohla být založena pouze na čase dne, možná vynucování velmi dlouhých spánků během špičkové aktivity, a dokonce i přechod na interval dotazování 0 na konci dne, kdy je důležité dokončit denní zpracování a připravit se na noční běhy. Průběh procesu zachytávání lze také monitorovat, aby bylo možné určit, kdy byly všechny transakce potvrzené o půlnoci zkontrolovány a uloženy v tabulkách změn. To umožňuje ukončit úlohu zachycení, která bude automaticky restartována při plánovaném denním restartu. Chcete-li přizpůsobit chování, můžete nahradit krok úlohy, který volá sp_cdc_scan
, voláním uživatelsky napsaného obalu pro sp_cdc_scan
.
Úloha vyčištění
Tato část obsahuje informace o tom, jak funguje úloha čištění zachytávání dat změn.
Struktura úlohy vyčištění
Funkce Change Data Capture používá strategii čištění založenou na uchovávání ke správě velikosti tabulky změn. V SQL Serveru a službě Azure SQL Managed Instance se mechanismus čištění skládá z úlohy agenta SQL Serveru Transact-SQL, která se vytvoří při povolení první databázové tabulky. Jedna úloha čištění zpracovává vyčištění pro všechny tabulky změn databáze a použije stejnou hodnotu uchovávání pro všechny definované instance zachycení.
Úloha vyčištění je inicializována spuštěním bezparametrové uložené procedury sp_MScdc_cleanup_job
. Tato uložená procedura začíná extrahováním nakonfigurovaných hodnot uchovávání a prahových hodnot pro úlohu čištění z msdb.dbo.cdc_jobs
. Hodnota uchovávání se používá k výpočtu nového nízkého vodoznaku pro tabulky změn. Zadaný počet minut se odečte od maximální hodnoty tran_end_time
z tabulky cdc.lsn_time_mapping
, aby se získal nový dolní limit vyjádřený jako časové datum. Tabulka CDC.lsn_time_mapping se pak použije k převodu této hodnoty datetime na odpovídající hodnotu lsn
. Pokud je stejná doba potvrzení sdílena více položkami v tabulce, lsn
, která odpovídá položce, která má nejmenší lsn
, je zvolena jako nový nízký vodoznak. Tato hodnota lsn
se přenese k sp_cdc_cleanup_change_tables
pro odebrání položek z databázových tabulek změn.
Poznámka
Výhodou použití doby potvrzení nedávné transakce jako základ pro výpočet nového nízkého vodoznaku je, že umožňuje změny zůstat v tabulkách změn pro zadaný čas. K tomu dochází i v případě, že proces zachycení má zpoždění. Všechny položky, které mají stejný čas potvrzení jako aktuální dolní mez, budou nadále reprezentovány v tabulkách změn výběrem nejmenšího lsn
, který má sdílený čas potvrzení pro skutečnou dolní mez.
Když se provede vyčištění, nízký vodoznak pro všechny instance zachycení se zpočátku aktualizuje v jedné transakci. Potom se pokusí odebrat zastaralé položky z tabulek změn a tabulky cdc.lsn_time_mapping. Konfigurovatelná prahová hodnota omezuje počet položek, které se odstraní v libovolném příkazu. Selhání odstranění z kterékoliv individuální tabulky nezabrání pokusům o provedení operace na zbývajících tabulkách.
Přizpůsobení úlohy čištění
U úlohy čištění je možnost přizpůsobení ve strategii, která slouží k určení položek tabulky změn, které se mají zahodit. Jedinou podporovanou strategií v rámci úlohy vyčištění je časová. V takovém případě se nový nízký vodoznak vypočítá odečtením povolené doby uchovávání od doby potvrzení poslední zpracované transakce. Vzhledem k tomu, že základní postupy čištění jsou založené na lsn
místo času, lze použít různé strategie k určení nejmenšího lsn
, které se má zachovat v tabulkách změn. Pouze některé z nich jsou výhradně založené na čase. Znalost klientů by například mohla být použita k zajištění bezpečnosti, pokud podřízené procesy, které vyžadují přístup k tabulkám změn, se nedají spustit. Ačkoli výchozí strategie používá stejný proces lsn
k vyčištění všech tabulek změn databází, základní postup čištění lze také zavolat k vyčištění na úrovni instance zachytávání.
Monitorování procesu
Monitorování procesu zachytávání dat změn vám umožní určit, jestli se změny správně zapisují, a s rozumnou latencí v tabulkách změn. Monitorování vám také může pomoct identifikovat případné chyby, ke kterým může dojít. SQL Server obsahuje dvě zobrazení dynamické správy, která vám pomůžou monitorovat zachytávání dat změn: sys.dm_cdc_log_scan_sessions a sys.dm_cdc_errors.
Identifikujte relace s prázdnými sadami výsledků
Každý řádek v sys.dm_cdc_log_scan_sessions
představuje relaci prohledávání protokolu (s výjimkou řádku s ID 0). Sezení prohledávání protokolu je ekvivalentní jednomu spuštění sp_cdc_scan. Během relace může sken vrátit změny nebo vrátit výsledek neobsahující žádné změny. Pokud je sada výsledků prázdná, je sloupec empty_scan_count v sys.dm_cdc_log_scan_sessions
nastaven na hodnotu 1. Pokud jsou po sobě jdoucí prázdné sady výsledků, například pokud úloha zachycení běží nepřetržitě, empty_scan_count v posledním existujícím řádku se zvýší. Pokud například sys.dm_cdc_log_scan_sessions
již obsahuje 10 řádků pro vyhledávání, které vrátily změny, a v řádku je pět prázdných výsledků, zobrazení obsahuje 11 řádků. Poslední řádek má ve sloupci empty_scan_count hodnotu 5. Pokud chcete určit relace s prázdným skenem, spusťte následující dotaz:
SELECT * from sys.dm_cdc_log_scan_sessions where empty_scan_count <> 0
Určení latence
Zobrazení správy sys.dm_cdc_log_scan_sessions
obsahuje sloupec, který zaznamenává latenci každé relace zachycení. Latence je definována jako uplynulý čas mezi potvrzenou transakcí ve zdrojové tabulce a poslední zachycenou transakcí potvrzenou v tabulce změn. Sloupec latence se vyplní pouze pro aktivní relace. U relací s hodnotou větší než 0 ve sloupci empty_scan_count je sloupec latence nastaven na hodnotu 0. Následující dotaz vrátí průměrnou hodnotu latence pro poslední relace.
SELECT latency FROM sys.dm_cdc_log_scan_sessions WHERE session_id = 0
Pomocí dat latence můžete určit, jak rychle nebo pomalu proces zachycení zpracovává transakce. Tato data jsou nejužitečnější, když proces zachytávání běží nepřetržitě. Pokud proces zachycení běží podle plánu, může být latence vysoká kvůli prodlevě mezi transakcemi potvrzenými ve zdrojové tabulce a procesem zachycení spuštěným v naplánovaném čase.
Další důležitou mírou efektivity procesu zachycení je propustnost. Toto je průměrný počet příkazů za sekundu, které se zpracovávají během každé relace. Pokud chcete určit propustnost relace, vydělte hodnotu ve sloupci command_count hodnotou ve sloupci doba trvání. Následující dotaz vrátí průměrnou propustnost pro poslední relace:
SELECT command_count/duration AS [Throughput] FROM sys.dm_cdc_log_scan_sessions WHERE session_id = 0
Použijte kolektor dat ke sběru vzorků dat
Kolektor dat SQL Serveru umožňuje shromažďovat snímky dat z libovolné tabulky nebo zobrazení dynamické správy a vytvářet datový sklad výkonu. Pokud je u databáze povolené zachytávání dat změn, je vhodné pořizovat snímky zobrazení sys.dm_cdc_log_scan_sessions
a zobrazení sys.dm_cdc_errors v pravidelných intervalech pro pozdější analýzu. Následující postup nastaví kolektor dat pro shromažďování ukázkových dat ze zobrazení správy sys.dm_cdc_log_scan_sessions
.
Konfigurace shromažďování dat
Povolte kolektor dat a nakonfigurujte datový sklad pro správu. Další informace naleznete v tématu Správa shromažďování dat.
Spuštěním následujícího kódu vytvořte vlastní kolektor pro zachytávání dat změn.
USE msdb; DECLARE @schedule_uid uniqueidentifier; -- Collect and upload data every 5 minutes SELECT @schedule_uid = ( SELECT schedule_uid from sysschedules_localserver_view WHERE name = N'CollectorSchedule_Every_5min') DECLARE @collection_set_id int; EXEC dbo.sp_syscollector_create_collection_set @name = N' CDC Performance Data Collector', @schedule_uid = @schedule_uid, @collection_mode = 0, @days_until_expiration = 30, @description = N'This collection set collects CDC metadata', @collection_set_id = @collection_set_id output; -- Create a collection item using statistics from -- the change data capture dynamic management view. DECLARE @parameters xml; DECLARE @collection_item_id int; SELECT @parameters = CONVERT(xml, N'<TSQLQueryCollector> <Query> <Value>SELECT * FROM sys.dm_cdc_log_scan_sessions</Value> <OutputTable>cdc_log_scan_data</OutputTable> </Query> </TSQLQueryCollector>'); EXEC dbo.sp_syscollector_create_collection_item @collection_set_id = @collection_set_id, @collector_type_uid = N'302E93D1-3424-4BE7-AA8E-84813ECF2419', @name = ' CDC Performance Data Collector', @frequency = 5, @parameters = @parameters, @collection_item_id = @collection_item_id output; GO
V aplikaci SQL Server Management Studio rozbalte Managementa poté rozbalte Data Collection. Klepněte pravým tlačítkem myši CDC Performance Data Collectora potom klepněte na tlačítko Spustit sadu shromažďování dat.
V datovém skladu, který jste nakonfigurovali v kroku 1, vyhledejte tabulku custom_snapshots.cdc_log_scan_data. Tato tabulka poskytuje historický snímek dat z relací skenování protokolů. Tato data se dají použít k analýze latence, propustnosti a dalších měr výkonu v průběhu času.
Režim upgradu skriptu
Pokud na instanci použijete kumulativní aktualizace nebo aktualizace Service Pack, při restartování může instance vstoupit v režimu upgrade skriptu. V tomto režimu může SQL Server spustit krok pro analýzu a upgrade interních tabulek CDC, což může vést k opětovnému vytvoření objektů, jako jsou indexy v tabulkách zachycení. V závislosti na množství zahrnutých dat může tento krok nějakou dobu trvat nebo způsobit vysoké využití transakčních protokolů pro povolené databáze CDC.