Sdílet prostřednictvím


Známá omezení, problémy a chyby cdc

platí pro:SQL Serverazure SQL Managed Instance

Tento článek vysvětluje známá omezení, problémy a chyby při zachytávání dat změn (CDC) pro SQL Server a azure SQL Managed Instance.

Informace o službě Azure SQL Database najdete v tématu známé problémy se službou CDC ve službě Azure SQL Database.

Úprava metadat

Aby CDC fungoval správně, neměli byste ručně upravovat žádná metadata CDC, jako je CDC schema, změna tabulek, uložené procedury systému CDC, výchozí oprávnění cdc user (sys.database_principals) nebo přejmenování cdc user.

Všechny objekty v sys.objects s vlastností is_ms_shipped nastavenou na 1 by neměly být změněny.

SELECT    name AS object_name   
        ,SCHEMA_NAME(schema_id) AS schema_name  
        ,type_desc  
        ,is_ms_shipped  
FROM sys.objects 
WHERE is_ms_shipped= 1 AND SCHEMA_NAME(schema_id) = 'cdc'

Rozdíly třídění

Je důležité vědět o situaci, kdy máte různé kolace mezi databází a sloupci tabulky nakonfigurované pro zachytávání dat změn. CDC používá dočasné úložiště k naplnění bočních tabulek. Pokud tabulka obsahuje znakové nebo varchar sloupce s kolacemi, které se liší od kolace databáze, a pokud tyto sloupce ukládají jiné než ASCII znaky (například znaky s dvojitým bajtem DBCS), CDC nemusí být schopno zachovat změněná data konzistentní s daty v základních tabulkách. Důvodem je to, že meziskladové proměnné nemohou mít přidružené kolace.

Zvažte jeden z následujících přístupů, abyste zajistili, že zachycená data změn jsou konzistentní se základními tabulkami:

  • Pro sloupce obsahující ne-ASCII data použijte datový typ nchar nebo nvarchar.

  • Nebo také použijte stejnou kolaci pro sloupce a databázi.

Pokud máte například jednu databázi, která používá kolaci SQL_Latin1_General_CP1_CI_AS, zvažte následující tabulku:

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 VARCHAR(10) collate Chinese_PRC_CI_AI)

CDC může selhat v zachycení binárních dat pro sloupec C2 kvůli odlišné kolaci (Chinese_PRC_CI_AI). Pokud se chcete vyhnout tomuto problému, použijte nvarchar:

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 NVARCHAR(10) collate Chinese_PRC_CI_AI --Unicode data type, CDC works well with this data type
     )

Zrychlené obnovení databáze (ADR) a zachytávání dat změn (CDC)

Povolení zachytávání dat změn (CDC) i zrychleného obnovení databáze (ADR) v současné době není na SQL Serveru podporované.

Když povolíte CDC, funkce agresivního zkrácení protokolu ADR je vypnutá. Důvodem je to, že skenování CDC (Change Data Capture) přistupuje k transakčnímu logu databáze. Aktivní transakce nadále uchovávají zkrácení transakčního protokolu, dokud transakce potvrzení a kontrola CDC nezachytí nebo transakce přeruší. Pokud cdC povolíte v databázi, ve které je povolené ADR, můžete sledovat vyšší využití transakčního protokolu. Ujistěte se, že je pro všechny vaše úlohy k dispozici dostatek prostoru transakčního protokolu.

Při povolování CDC doporučujeme použít možnost Obnovitelný index. Indikátor obnovitelnosti nevyžaduje udržovat otevřenou dlouhodobou transakci při vytváření nebo opětovném sestavení indexu, což umožňuje během této operace zkracování protokolu a lepší správu prostoru protokolu. Další informace naleznete v dokumentu Pokyny pro online operace indexu – úvahy o obnovitelných indexech.

Online příkazy DDL nejsou podporovány.

Online příkazy DDL nejsou podporovány, když je v databázi povolen zachytávání změn dat.

Povolení CDC selže, pokud již existuje schéma nebo uživatel s názvem cdc

Když pro databázi povolíte CDC, vytvoří se nové schéma a uživatel s názvem cdc. Ruční vytvoření vlastního schématu nebo uživatele s názvem cdc se tedy nedoporučuje, protože je vyhrazené pro použití systému.

Pokud jste ručně definovali vlastní schéma nebo uživatele s názvem cdc ve své databázi, která nesouvisí s CDC, systémová uložená procedura sys.sp_cdc_enable_db selže při povolování CDC v databázi s následující chybovou zprávou.

The database <database_name> cannot be enabled for change data capture because a database user named 'cdc' or a schema named 'cdc' already exists in the current database. These objects are required exclusively by CDC. Drop or rename the user or schema and retry the operation.

Pokud chcete tento problém vyřešit:

  • Ručně odstraňte prázdné schéma cdc a uživatele cdc. CdC je pak možné úspěšně povolit v databázi.

CDC selže po použití ALTER COLUMN na varchar a varbinary

Pokud se datový typ sloupce v tabulce s podporou CDC změní z textu na nvarchar, nebo obrázku na varbinary, a existující řádek se aktualizuje na hodnotu uloženou mimo řádek. Po aktualizaci bude kontrola CDC vést k chybám.

Změny DDL ve zdrojových tabulkách

Změna velikosti sloupců tabulky s podporou CDC pomocí příkazů DDL může způsobit problémy s následným procesem zachytávání CDC, což vede k chybě 2628 nebo chybě 8115. Mějte na paměti, že data v tabulkách změn CDC se uchovávají na základě uživatelsky nakonfigurovaných nastavení. Před provedením jakýchkoli změn velikosti sloupce proto musíte posoudit, jestli je změna kompatibilní s existujícími daty v tabulkách změn CDC.

Pokud sys.dm_cdc_errors značí, že skeny selhávají kvůli chybě 2628 nebo chybě 8115 pro tabulky změn, měli byste nejprve zpracovat data změn v dotčených tabulkách změn. Potom je potřeba zakázat a pak znovu zapnout CDC na tabulce, aby se problém efektivně vyřešil.

Povolení CDC selže, když existují triggery CREATE OBJECT

Když povolíte CDC, vytvoří se cdc user, které bude řídit proces vytváření CDC. cdc user spouští řadu uložených procedur, které umožňují CDC, a některé z těchto uložených procedur vytvářejí objekty, které aktivují existující triggery CREATE OBJECT. Vzhledem k tomu, že cdc user nemá oprávnění k zápisu do databáze master, tyto uložené procedury CDC selžou s chybou 22830.

Před povolením CDC v databázi zakažte všechny triggery CREATE OBJECT. Po nakonfigurování CDC je možné tyto triggery znovu aktivovat.

Import databáze pomocí operací importu/ exportu a extrakce/publikování dat

Pokud pro databáze SQL s podporou CDC použijete sqlPackage, SSDT nebo jiné nástroje SQL k importu, exportu nebo extrahování nebo publikování, schéma cdc a uživatel se v nové databázi vyloučí. Mezi další objekty CDC, které nejsou zahrnuté v operacích Import/Export a Extrakce/Nasazení, patří tabulky označené jako is_ms_shipped=1 v sys.objects.

I když není povolené CDC a definovali jste ve své databázi vlastní schéma nebo uživatele s názvem cdc, budou také vyloučeni z operací importu, exportu a extrakce/nasazení pro import a nastavení nové databáze.

Přepínání oddílů s proměnnými

Příkaz ALTER TABLE ... SWITCH TO ... PARTITION ... nepodporuje použití proměnných při přepínání oddílů v databázích nebo tabulkách se zachytáváním dat změn (CDC). Další informace najdete v tématu omezení přepínání oddílů.

Řešení chyb

Tato část popisuje řešení chyb souvisejících s CDC na SQL Serveru a službou Azure SQL Managed Instance. Chyby související s CDC mohou bránit řádnému fungování procesu zachycení a vést k rozšíření databázového transakčního protokolu.

Pokud chcete tyto chyby prozkoumat, můžete provést dotaz na zobrazení dynamické správy sys.dm_cdc_errors. Pokud zobrazení dynamické správy sys.dm_cdc_errors vrátí nějaké chyby, podívejte se na následující oddíl, abyste se seznámili s kroky pro zmírnění chyb.

Poznámka

Další informace o konkrétním kódu chyby naleznete v tématu události databázového stroje a chyby.

V této části jsou uvedené různé kategorie řešení potíží:

Kategorie Popis
Metadata změněna Obsahuje informace o tom, jak odstranit problémy související s CDC, když byla sledovaná tabulka změněna nebo vyřazena.
správa místa v databázi Obsahuje informace o tom, jak zmírnit problémy při vyčerpání prostoru databáze.
Omezení CDC Obsahuje informace o tom, jak zmírnit problémy způsobené omezeními CDC.

Změněná metadata

Chyba 200/208 – Neplatný název objektu

  • příčina: K chybě může dojít, když dojde k vyřazení metadat CDC. Aby CDC fungoval správně, neměli byste ručně upravovat žádná metadata CDC, jako je CDC schema, změna tabulek, uložené procedury systému CDC, výchozí oprávnění cdc user (sys.database_principals) nebo přejmenování cdc user.

  • doporučení: Chcete-li tento problém vyřešit, je nutné zakázat a znovu povolit CDC pro vaši databázi. Při povolení zachytávání dat změn pro databázi vytvoří schéma cdc, uživatele cdc, tabulky metadat a další systémové objekty pro databázi.

Poznámka

Objekty nalezené v zobrazení sys.objects systémovém katalogu s is_ms_shipped=1 a schema_name='cdc' by neměly být změněny ani vynechány.

Chyba 1202 – Entita databáze neexistuje nebo uživatel není členem

  • Příčina: K chybě může dojít, když dojde k odpojení cdc user. Aby CDC fungoval správně, neměli byste ručně upravovat žádná metadata CDC, jako jsou CDC schema, měnit tabulky, systémové uložené procedury CDC, výchozí oprávnění cdc user (sys.database_principals) nebo přejmenovat cdc user.

  • doporučení: Ujistěte se, že ve vaší databázi existuje cdc uživatel a má přiřazenou roli db_owner. Pokud chcete vytvořit cdc uživatele, přečtěte si příklad Vytvoření uživatele cdc a přiřazení role.

Chyba 15517 – Nejde spustit jako objekt zabezpečení databáze, protože objekt zabezpečení neexistuje

  • Příčina: Tento typ správce nelze zosobnit, nebo nemáte oprávnění. K chybě může dojít, když dojde k vyřazení metadat CDC nebo už není součástí role db_owner. Aby CDC fungoval správně, neměli byste ručně upravovat žádná metadata CDC, jako je CDC schema, změna tabulek, uložené procedury systému CDC, výchozí oprávnění cdc user (sys.database_principals) nebo přejmenování cdc user.

  • doporučení: Ujistěte se, že ve vaší databázi existuje cdc uživatel a má přiřazenou roli db_owner. Pokud chcete vytvořit cdc uživatele, přečtěte si příklad Vytvoření uživatele cdc a přiřazení role.

Chyba 18807 – Nejde najít ID objektu pro systémovou tabulku replikace

  • Příčina: K této chybě dochází v případě, že SQL Server nemůže najít systémovou tabulku replikace nebo získat přístup k systémové tabulce%s. Důvodem může být chybějící nebo nedostupná tabulka. Aby CDC fungoval správně, neměli byste ručně upravovat žádná metadata CDC, jako je CDC schema, změna tabulek, uložené procedury systému CDC, výchozí oprávnění cdc user (sys.database_principals) nebo přejmenování cdc user.

  • doporučení: Ověřte, zda systémová tabulka existuje a je přístupná dotazováním tabulky přímo. Proveďte dotaz na sys.objects systémový katalog, nastavte predikátovou klauzuli s is_ms_shipped=1 a schema_name='cdc' pro výpis všech objektů souvisejících s CDC. Pokud dotaz nevrací žádné objekty, měli byste zakázat a znovu povolit CDC pro vaši databázi. Povolení zachytávání dat změn pro databázi vytvoří schéma cdc, uživatele cdc, tabulky metadat a další systémové objekty pro databázi.

Chyba 21050 – Tuto operaci můžou provést pouze členové role správce systému nebo db_owner pevné role serveru.

  • Příčina: cdc user byla odebrána z databázové role db_owner nebo z role serveru sysadmin.

  • doporučení: Ujistěte se, že cdc user má přiřazenou roli db_owner. Pokud chcete vytvořit cdc uživatele, přečtěte si příklad Vytvoření uživatele cdc a přiřazení role.

Chyba 22830 – Metadata, která indikují, že databáze <database name> je povolená pro funkci Change Data Capture, se nepovedlo aktualizovat. K chybě došlo při provádění příkazu <CDC stored procedure name>.

  • Příčina: K této chybě dochází, když v databázi nebo na serveru existuje aktivační událost CREATE OBJECT. Když povolíte CDC, vytvoří se cdc user pro řízení procesu vytváření CDC. cdc user spouští řadu uložených procedur, které umožňují CDC, a některé z těchto uložených procedur vytvářejí objekty, které aktivují existující triggery CREATE OBJECT. Vzhledem k tomu, že cdc user nemá oprávnění k zápisu do databáze master, tyto uložené procedury CDC selžou s chybou 22830.

  • doporučení: Před povolením CDC v databázi zakažte všechny triggery CREATE OBJECT. Po nakonfigurování CDC je možné tyto triggery znovu obnovit.

Správa prostoru databáze

Chyba 1105 – Nepodařilo se přidělit prostor pro objekt v databázi, protože skupina souborů je plná

  • Příčina: K této chybě dochází, když primární skupina souborů databáze vyčerpá místo a SQL Server nemůže přidělit více místa pro objekt (například tabulku nebo index) v této skupině souborů.

  • doporučení: Pokud chcete tento problém vyřešit, odstraňte všechna nepotřebná data v databázi, abyste uvolnili místo. Identifikujte nepoužívané tabulky, indexy nebo jiné objekty ve skupině souborů, které je možné bezpečně odebrat. Podrobné monitorování využití místa najdete v tématu Správa prostoru souborů pro databáze ve službě Azure SQL Database

    V případě, že vyřazení nepotřebných dat nebo objektů není možnost, zvažte přidělení více místa pro váš databázový transakční protokol. Další informace o správě transakčních protokolů najdete v tématu průvodce architekturou a správou transakčních protokolů SQL Serveru

Omezení CDC

Chyba 2628 – řetězcová nebo binární data by se v tabulce zkrátila

  • Příčina: Změna velikosti sloupců tabulky s podporou CDC pomocí příkazů DDL může způsobit problémy s následným procesem zachycení CDC. Zobrazení dynamické správy (DMV) "sys.dm_cdc_errors" je užitečné pro kontrolu jakýchkoli nahlášených problémů v rámci CDC, jako jsou chyby číslo 2628 a 8115.

  • doporučení: Před provedením jakýchkoli změn velikosti sloupce je nutné posoudit, zda je změna kompatibilní se stávajícími daty v tabulkách změn CDC. Chcete-li tento problém vyřešit, je nutné zakázat a znovu povolit CDC pro vaši databázi. Další informace o povolení CDC pro databázi nebo tabulku naleznete v tématu Povolení CDC pro databázi a Povolení CDC pro tabulku.

Chyba 913 – Úloha zachytávání CDC selže při zpracování změn pro tabulku se systémovým datovým typem CLR

  • Příčina: K této chybě dochází při povolování CDC v tabulce se systémovým datovým typem CLR, provádění změn DML a následné provádění změn DDL ve stejné tabulce, zatímco úloha zachytávání CDC zpracovává změny související s jinými tabulkami.

  • doporučení: Doporučeným postupem je pozastavit DML na tabulce, spustit úlohu zachycení ke zpracování změn, provést DDL na tabulce, spustit úlohu zachycení ke zpracování změn DDL a poté znovu povolit zpracování DML. Pro více informací se podívejte na , kde selhává úloha zachytávání CDC při zpracování změn pro tabulku se systémovým datovým typem CLR (geometry, geography nebo hierarchyid).

Vytvoření uživatele a přiřazení role

Pokud cdc user byl odebrán, můžete uživatele přidat zpět ručně.

Pomocí následujícího skriptu T-SQL vytvořte uživatele (cdc) a přiřaďte stejnou roli (db_owner).

IF NOT EXISTS 
(
    SELECT * 
    FROM sys.database_principals 
    WHERE NAME = 'cdc'
)
BEGIN
    CREATE USER [cdc] 
    WITHOUT LOGIN WITH DEFAULT_SCHEMA = [cdc];
END

EXEC sp_addrolemember 'db_owner', 'cdc';

Kontrola a přidání členství v rolích

Pokud chcete ověřit, jestli cdc uživatel patří do role sysadmin nebo db_owner, spusťte následující dotaz T-SQL:

EXECUTE AS USER = 'cdc';

SELECT is_srvrolemember('sysadmin'), is_member('db_owner');

Pokud uživatel cdc nepatří do některé z rolí, spusťte následující dotaz T-SQL a přidejte do cdc uživatele db_owner roli.

EXEC sp_addrolemember 'db_owner' , 'cdc';