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
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é si uvědomit situaci, kdy máte různé kolace mezi databází a sloupci tabulky nakonfigurované pro sledování změn dat. 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) pro stejnou databázi se v SQL Serveru 2019 (15.x) nepodporuje. Povolení CDC i ADR je podporováno v novějších verzích SQL Serveru počínaje kumulativní aktualizací 18 pro SQL Server 2022 (16.x).
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 blokují trunkování transakčního protokolu, dokud transakce není potvrzena a kontrola CDC nedohoní, nebo když se 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.
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
cdca uživatelecdc. CdC je pak možné úspěšně povolit v databázi.
CDC selže po ALTER COLUMN
Když se datový typ sloupce v tabulce s podporou CDC změní na nepodporovaný převod, může kontrola CDC způsobit chyby po aktualizaci.
Tady jsou příklady změn datového ALTER COLUMN typu, které nejsou podporovány, když je v tabulce povolená služba CDC:
- bigint na int
- char(x), nvarchar(x) nebo uniqueidentifier, DATE nebo INT
Změna datového typu sloupce v tabulce s podporou CDC může vést k následujícím chybám:
- Chyba 241 – Převod se nezdařil při převodu data a času z řetězce znaků.
- Chyba 245 – Převod hodnoty se nezdařil.
- Chyba 8169 – Převod se nezdařil při převodu z řetězce znaků na uniqueidentifier.
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ž může vést k následujícím chybám:
- Chyba 2628 – Řetězcová nebo binární data by byla zkrácena v tabulce.
- Chyba 8115 – Aritmetická chyba při přetečení při převodu datového typu z bigintu na int
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 naznačuje, že skany selhávají kvůli chybě 2628 nebo chybě 8115 v tabulkách změn, měli byste nejprve zpracovat data v ovlivněných tabulkách. 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ů.
Online operace
Online příkazy DDL nejsou podporovány.
Ve službě Azure SQL Managed Instance a verzích SQL Serveru před SQL Serverem 2025 (17.x) nejsou příkazy ALTER TABLE online DDL podporovány , pokud je pro databázi povolené zachytávání dat změn.
Online indexovací operace nejsou podporovány.
Operace online indexu nejsou podporovány, pokud je pro databázi povolené zachytávání dat změn. Můžete narazit na chybu 18773, "Nelze najít záznamy textových informací pro sloupec "%.*ls", ID %d během vytváření příkazu."
Výchozí omezení přidaných sloupců
Pokud je v tabulce povolená hodnota CDC a přidá se sloupec bez hodnoty null s výchozím omezením, budou mít existující data řádků hodnotu výchozího omezení. CDC ale použije NULL místo výchozí hodnoty pro existující řádky. To platí jenom pro data, která jsou přítomna před uplatněním DDL. Jako alternativní řešení můžete provádět neměnné UPDATE příkazy na existující řádky nebo provést ALTER INDEX ... REBUILD na clusterovaný index tabulky. Pokud není k dispozici žádný clusterovaný index, použijte ALTER TABLE ... REBUILD na haldě.
Řešení problémů
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 sys.dm_cdc_errors zobrazení dynamické správy vrátí nějaké chyby, projděte si následující informace o řešení potíží.
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 |
|---|---|
| Změněná metadata | Obsahuje informace o tom, jak odstranit problémy související s CDC, když byla sledovaná tabulka změněna nebo vyřazena. |
| Správa prostoru databáze | 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 systémovém katalogovém zobrazení sys.objects by is_ms_shipped=1 and schema_name='cdc' neměly být změněny ani odstraně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 jsouCDC schema, změnové tabulky, systémové procedury uložené v CDC, výchozí oprávněnícdc user, nebo přejmenovatcdc user.doporučení: Ujistěte se, že ve vaší databázi existuje
cdcuživatel a má přiřazenou rolidb_owner. Pokud chcete vytvořitcdcuživatele, přečtěte si příklad Vytvoření uživatele cdc a přiřazení role.
Chyba 15517 – Nelze vykonat jako databázový hlavní objekt, protože tento objekt 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 jsouCDC schema, změnové tabulky, systémové procedury uložené v CDC, výchozí oprávněnícdc user, nebo přejmenovatcdc user.doporučení: Ujistěte se, že ve vaší databázi existuje
cdcuživatel a má přiřazenou rolidb_owner. Pokud chcete vytvořitcdcuž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 jsou
CDC schema, změnové tabulky, systémové procedury uložené v CDC, výchozí oprávněnícdc user, nebo přejmenovatcdc user.doporučení: Ověřte, zda systémová tabulka existuje a je přístupná dotazováním tabulky přímo. Proveďte dotaz na systémový katalog sys.objects, nastavte predikátovou podmínku s
is_ms_shipped=1 and schema_name='cdc'k vypsání 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 userbyla odebrána z databázové roledb_ownernebo z role serverusysadmin.doporučení: Ujistěte se, že
cdc usermá přiřazenou rolidb_owner. Pokud chcete vytvořitcdcuž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í v případě,
CREATE OBJECTže aktivační událost existuje v databázi nebo na serveru. Když povolíte CDC, vytvoří secdc user, které bude řídit proces vytváření CDC.cdc userspouš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í triggeryCREATE OBJECT. Vzhledem k tomu, žecdc usernemá oprávnění k zápisu do databázemaster, 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 241 – Převod selhal při převodu data a času z řetězce znaků
Příčina: K této chybě dochází při provedení ALTER COLUMN u datového typu datum a tabulka má povolenou funkci CDC. Pokud má například tabulka sloupec nvarchar a změníte datový typ na datum (například
ALTER TABLE table_name ALTER COLUMN [column_name] DATE NULL), může se tato chyba zobrazit v sys.dm_cdc_errors zobrazení dynamické správy. Chyba 241 je způsobená nepodporovaným převodem dat v tabulce změn, i kdyžALTERpříkaz ve zdrojové tabulce proběhne úspěšně.Doporučení: Pokud chcete tento problém vyřešit, zakažte a znovu povolte CDC pro tabulku po změně sloupce. Případně zakažte CDC před změnou sloupce a po změně
ALTER COLUMNznovu povolte CDC.
Chyba 245 – Převod selhal při převodu hodnoty z řetězce na int
Příčina: K této chybě dochází, když je příkaz ALTER COLUMN vystaven, aby se změnil datový typ sloupce, pokud je povolená tabulka CDC. Pokud má například tabulka sloupec nvarchar a změníte datový typ na int (například
ALTER TABLE table_name ALTER COLUMN [column_name] INT NULL), může se tato chyba zobrazit v sys.dm_cdc_errors zobrazení dynamické správy. Chyba 245 je způsobená nepodporovaným převodem dat v tabulce změn, i kdyžALTERpříkaz ve zdrojové tabulce proběhne úspěšně.Doporučení: Pokud chcete tento problém vyřešit, zakažte a znovu povolte CDC pro tabulku po změně sloupce. Případně zakažte CDC před změnou sloupce a po změně
ALTER COLUMNznovu povolte CDC.
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 povolení 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. Další informace najdete v tématu Selhání úlohy zachytávání CDC při zpracování změn pro tabulku se systémovým datovým typem CLR (geometry, geography nebo hierarchyid).
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é při kontrole všech nahlášených problémů 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 8115 – Chyba přetečení při převodu datového typu z bigint na int
Příčina: K této chybě dochází, když se v tabulce s podporou CDC spustí ALTER COLUMN DDL, což vede ke snížení přesnosti sloupce (například ke změně datového typu sloupce z bigintu na int). Sloupec s zmenšenou přesností nemůže uchovávat hodnoty, které jsou přítomné v tabulce změn.
Doporučení: Pokud chcete tento problém vyřešit, zakažte a znovu povolte CDC pro tabulku po změně sloupce. Případně zakažte CDC před spuštěním příkazu
ALTER COLUMN, a poté znovu povolte CDC po změněALTER COLUMN.
Chyba 8169 – Převod selhal při převodu z řetězce znaků na uniqueidentifier
Příčina: K této chybě dochází v případě, že je vydán příkaz ALTER COLUMN ke změně datového typu sloupce, pokud je povolena tabulka CDC. Pokud například tabulka obsahuje sloupec char(x), sloupec nvarchar(x), a sloupec nvarchar(x), a datový typ změníte na uniqueidentifier (například:
ALTER TABLE table_name ALTER COLUMN [column_name] uniqueidentifier), může se tato chyba zobrazit v dynamickém zobrazení správy (DMV) sys.dm_cdc_errors. Chyba 8169 značí nepodporovaný převod dat v tabulce změn, i když příkaz ALTER ve zdrojové tabulce proběhne úspěšně.Doporučení: Pokud chcete tento problém vyřešit, zakažte a znovu povolte CDC pro tabulku po změně sloupce. Případně zakažte CDC před spuštěním příkazu
ALTER COLUMN, a poté znovu povolte CDC po změněALTER COLUMN.
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 (db_owner) správnou roli.
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 db_owner uživatele cdc roli.
EXEC sp_addrolemember 'db_owner' , 'cdc';