Kända begränsningar, problem och fel med CDC
gäller för:SQL Server
Azure SQL Managed Instance
Den här artikeln beskriver kända begränsningar, problem och fel med ändringsdatainsamling (CDC) för SQL Server och Azure SQL Managed Instance.
Information om Azure SQL Database finns i Kända problem med CDC i Azure SQL Database.
Ändra metadata
För att CDC ska fungera korrekt bör du inte manuellt ändra CDC-metadata, till exempel CDC schema
, ändra tabeller, CDC-systemlagrade procedurer, standardbehörigheter cdc user
(sys.database_principals) eller byta namn på cdc user
.
Objekt i sys.objects med egenskapen is_ms_shipped
inställd på 1
bör inte ändras.
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'
Sorteringsskillnader
Det är viktigt att vara medveten om en situation där du har olika sorteringar mellan databasen och kolumnerna i en tabell som konfigurerats för insamling av ändringsdata. CDC använder interimlagring för att fylla i sidotabeller. Om en tabell har tecken eller varchar kolumner med sortering som skiljer sig från databassortering, och om dessa kolumner lagrar icke-ASCII-tecken (till exempel dubbla DBCS-tecken), kanske CDC inte kan bevara de ändrade data som överensstämmer med data i bastabellerna. Det beror på att de mellanliggande lagringsvariablerna inte kan ha sorteringar associerade med dem.
Överväg någon av följande metoder för att säkerställa att insamlade ändringsdata är konsekventa med bastabeller:
Använd nchar eller nvarchar datatyp för kolumner som innehåller icke-ASCII-data.
Eller använd samma sortering för kolumner och för databasen.
Om du till exempel har en databas som använder en sortering av SQL_Latin1_General_CP1_CI_AS bör du överväga följande tabell:
CREATE TABLE T1(
C1 INT PRIMARY KEY,
C2 VARCHAR(10) collate Chinese_PRC_CI_AI)
CDC kan misslyckas med att samla in binära data för kolumn C2, eftersom dess sortering är annorlunda (Chinese_PRC_CI_AI). Använd nvarchar för att undvika det här problemet:
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
)
Accelererad databasåterställning (ADR) och insamling av ändringsdata (CDC)
För närvarande stöds inte aktivering av både ändringsdatainsamling (CDC) och accelererad databasåterställning (ADR) i SQL Server.
När du aktiverar CDC inaktiveras den aggressiva loggtrunkeringsfunktionen i ADR. Det beror på att CDC-genomsökningen kommer åt databastransaktionsloggen. Aktiva transaktioner fortsätter att hålla transaktionsloggens trunkering tills transaktionen bekräftas och CDC-skanningen kommer ikapp, eller avbryts. Om du aktiverar CDC på en databas där ADR är aktiverat kan du observera högre användning av transaktionsloggar. Se till att tillräckligt med transaktionsloggutrymme är tillgängligt för alla dina arbetsbelastningars behov.
När du aktiverar CDC rekommenderar vi att du använder alternativet Återuppta index. Återtagningsbart index kräver inte att du håller en långvarig transaktion öppen för att skapa eller återskapa ett index, vilket möjliggör loggtrunkering under skapandet eller återskapandet, och bättre hantering av loggutrymme. Mer information finns i Riktlinjer för onlineindexoperationer – Överväganden för återupptagbara index.
DDL-uttalanden online stöds inte
Online DDL-instruktioner stöds inte när förändringsspårning är aktiverad på en databas.
Det går inte att aktivera CDC om schemat eller användaren med namnet cdc
redan finns
När du aktiverar CDC på en databas skapas ett nytt schema och användaren med namnet cdc
. Därför rekommenderas inte manuellt att skapa ett anpassat schema eller en användare med namnet cdc
eftersom det är reserverat för systemanvändning.
Om du har definierat ett anpassat schema manuellt eller en användare med namnet cdc
i databasen som inte är relaterad till CDC, kan den system lagrade proceduren sys.sp_cdc_enable_db
inte aktivera CDC på databasen med följande felmeddelande.
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.
Så här löser du problemet:
- Ta bort det tomma
cdc
-schemat ochcdc
-användaren manuellt. CDC kan sedan aktiveras framgångsrikt på databasen.
CDC misslyckas efter "ALTER COLUMN" till varchar och varbinary
När datatypen för en kolumn i en CDC-aktiverad tabell ändras från text till nvarchareller image till varbinary, och en befintlig rad uppdateras med ett värde som lagras utanför raden. Efter uppdateringen resulterar CDC-genomsökningen i fel.
DDL-ändringar i källtabeller
Om du ändrar storleken på kolumner i en CDC-aktiverad tabell med DDL-instruktioner kan det orsaka problem med den efterföljande CDC-avbildningsprocessen, vilket resulterar i fel 2628 eller fel 8115. Kom ihåg att data i CDC-ändringstabeller behålls baserat på användarkonfigurerade inställningar. Innan du gör några ändringar i kolumnstorleken måste du därför utvärdera om ändringen är kompatibel med befintliga data i CDC-ändringstabeller.
Om sys.dm_cdc_errors
anger att genomsökningar misslyckas på grund av fel 2628 eller fel 8115 för ändringstabeller, bör du först använda ändringsdata i de berörda ändringstabellerna. Därefter måste du inaktivera och sedan återaktivera CDC- på tabellen för att lösa problemet på ett effektivt sätt.
Det går inte att aktivera CDC när "CREATE OBJECT"-utlösare finns
När du aktiverar CDC skapas en cdc user
för att hantera CDC-skapandeprocessen.
cdc user
kör ett antal lagrade procedurer för att aktivera CDC, och vissa av dessa lagrade procedurer skapar objekt som utlöser befintliga CREATE OBJECT
utlösare. Eftersom cdc user
inte har behörighet att skriva till master
databas misslyckas dessa CDC-lagrade procedurer med fel 22830.
Avaktivera alla CREATE OBJECT
-utlösare innan du aktiverar CDC på en databas. Återaktivera dessa utlösare när CDC har konfigurerats.
Importera databas med datanivååtgärderna Import/Export och Extract/Publish
För CDC-aktiverade SQL-databaser, när du använder SqlPackage, SSDT eller andra SQL-verktyg för att importera/exportera eller extrahera/publicera, undantas cdc
-schemat och användaren i den nya databasen. Andra CDC-objekt som inte ingår i åtgärderna Import/Export och Extract/Deploy innehåller tabellerna som markerats som is_ms_shipped=1
i sys.objects.
Även om CDC inte är aktiverat och du har definierat ett anpassat schema eller en användare med namnet cdc
i databasen som också kommer att undantas i åtgärderna Import/Export och Extract/Deploy för att importera/konfigurera en ny databas.
Partitionsväxling med variabler
Användning av variabler med partitionsväxling på databaser eller tabeller med CDC (Change Data Capture) stöds inte för ALTER TABLE ... SWITCH TO ... PARTITION ...
-instruktionen. Mer information finns i begränsningar för partitionsväxling.
Felsökning
Det här avsnittet beskriver hur du felsöker fel som är associerade med CDC på SQL Server och Azure SQL Managed Instance. CDC-relaterade fel kan hindra avbildningsprocessens funktion och leda till att databastransaktionsloggen utökas.
Om du vill undersöka dessa fel kan du fråga den dynamiska hanteringsvyn sys.dm_cdc_errors. Om den dynamiska hanteringsvyn sys.dm_cdc_errors returnerar några fel bör du läsa följande avsnitt för att förstå åtgärdsalternativen.
Not
Mer information om en viss felkod finns i database engine events and errors.
Det här är de olika felsökningskategorierna som ingår i det här avsnittet:
Kategori | Beskrivning |
---|---|
ändrade metadata | Innehåller information om hur du åtgärdar problem som rör CDC när den spårade tabellen har ändrats eller tas bort. |
Databasutrymme Hantering | Innehåller information om hur du åtgärdar problem när databasutrymmet har uttömts. |
CDC-begränsning | Innehåller information om hur du åtgärdar problem som orsakas av CDC-begränsningar. |
Metadata har ändrats
Fel 200/208 – Ogiltigt objektnamn
Orsak: Felet kan inträffa när CDC-metadata har tagits bort. För att CDC ska fungera korrekt bör du inte manuellt ändra CDC-metadata, till exempel
CDC schema
, ändra tabeller, CDC-systemlagrade procedurer, standardbehörighetercdc user
(sys.database_principals) eller byta namn påcdc user
.Rekommendation: För att lösa det här problemet måste du inaktivera och återaktivera CDC för databasen. När du aktiverar insamling av ändringsdata för en databas skapas cdc-schemat, cdc-användaren, metadatatabellerna och andra systemobjekt för databasen.
Notera
Objekt som finns i sys.objects systemkatalogvyn med is_ms_shipped=1 och schema_name='cdc' bör inte ändras eller tas bort.
Fel 1202 – Databasens huvudnamn finns inte eller så är användaren inte medlem
Orsak: Felet kan inträffa när
cdc user
har tagits bort. För att CDC ska fungera korrekt bör du inte manuellt ändra CDC-metadata, till exempelCDC schema
, ändra tabeller, CDC-systemlagrade procedurer, standardbehörighetercdc user
(sys.database_principals
) eller byta namn påcdc user
.Rekommendation: Kontrollera att
cdc
användaren finns i databasen och attdb_owner
rollen tilldelats. Om du vill skapacdc
användare kan du läsa exemplet Skapa cdc-användare och tilldela roll.
Fel 15517 – Kan inte utföra åtgärden som databasens huvudroll eftersom huvudrollen inte finns
Orsak: Den här typen av huvudnamn kan inte personifieras eller så har du inte behörighet. Felet kan inträffa när CDC-metadata har tagits bort, eller inte längre är en del av rollen
db_owner
. För att CDC ska fungera korrekt bör du inte manuellt ändra CDC-metadata, till exempelCDC schema
, ändra tabeller, CDC-systemlagrade procedurer, standardbehörighetercdc user
(sys.database_principals) eller byta namn påcdc user
.Rekommendation: Kontrollera att den
cdc
användaren finns i databasen och attdb_owner
rollen är tilldelad. Om du vill skapacdc
användare kan du läsa exemplet Skapa cdc-användare och tilldela roll.
Fel 18807 – Det går inte att hitta ett objekt-ID för replikeringssystemets tabell
Orsak: Det här felet inträffar när SQL Server inte kan hitta eller komma åt replikeringssystemtabellen%s. Det kan bero på att tabellen saknas eller inte kan nås. För att CDC ska fungera korrekt bör du inte manuellt ändra CDC-metadata, till exempel
CDC schema
, ändra tabeller, CDC-systemlagrade procedurer, standardbehörighetercdc user
(sys.database_principals) eller byta namn påcdc user
.Rekommendation: Kontrollera att systemtabellen finns och är tillgänglig genom att fråga tabellen direkt. Kör en fråga mot sys.objects systemkatalogen, ställ in predikatsatsen till is_ms_shipped=1 och schema_name='cdc' för att lista alla objekt relaterade till CDC. Om frågan inte returnerar några objekt bör du inaktivera och sedan återaktivera CDC för databasen. När du aktiverar insamling av ändringsdata för en databas skapas cdc-schemat, cdc-användaren, metadatatabeller och andra systemobjekt för databasen.
Fel 21050 – Endast medlemmar i sysadmin- eller db_owner fast serverroll kan utföra den här åtgärden
Orsak:
cdc user
har tagits bort fråndb_owner
-databasrollen eller frånsysadmin
-serverrollen.Rekommendation: Kontrollera att
cdc user
har tilldelatsdb_owner
roll. Om du vill skapacdc
användare kan du läsa exemplet Skapa cdc-användare och tilldela roll.
Fel 22830 – Det gick inte att uppdatera metadata som anger att databasen <database name>
är aktiverad för ändringsdatainsamling. Felet inträffade när kommandot <CDC stored procedure name>
kördes.
Orsak: Det här felet uppstår när utlösaren CREATE OBJECT finns i databasen eller på servern. När du aktiverar CDC skapas en
cdc user
för att hantera CDC-skapandeprocessen.cdc user
kör ett antal lagrade procedurer för att aktivera CDC, och vissa av dessa lagrade procedurer skapar objekt som utlöser befintligaCREATE OBJECT
utlösare. Eftersomcdc user
inte har behörighet att skriva tillmaster
databas misslyckas dessa CDC-lagrade procedurer med fel 22830.Rekommendation: Inaktivera alla
CREATE OBJECT
utlösare innan du aktiverar CDC på en databas. Återaktivera dessa utlösare igen efter att CDC har konfigurerats.
Hantering av databasutrymme
Fel 1105 – Det gick inte att allokera utrymme för objektet i databasen eftersom filgruppen är full
Orsak: Det här felet uppstår när den primära filgruppen för en databas får slut på utrymme och SQL Server inte kan allokera mer utrymme för ett objekt (till exempel en tabell eller ett index) i filgruppen.
Rekommendation: Lös problemet genom att ta bort onödiga data i databasen för att frigöra utrymme. Identifiera oanvända tabeller, index eller andra objekt i filgruppen som kan tas bort på ett säkert sätt. Övervaka utrymmesanvändningen noggrant, mer information finns i Hantera filutrymme för databaser i Azure SQL Database
Om onödiga data/objekt tas bort inte är ett alternativbör du överväga att allokera mer utrymme för databastransaktionsloggen. Mer information om hantering av transaktionsloggar finns i arkitektur och hanteringsguide för SQL Server-transaktionsloggar
CDC-begränsning
Fel 2628 – sträng- eller binärdata trunkeras i tabellen
Orsak: Om du ändrar storleken på kolumner i en CDC-aktiverad tabell med DDL-instruktioner kan det orsaka problem med den efterföljande CDC-avbildningsprocessen. Den dynamiska hanteringsvyn (DMV) "sys.dm_cdc_errors" är användbar för att kontrollera eventuella CDC-problem, till exempel felnummer 2628 och 8115.
Rekommendation: Innan du gör ändringar i kolumnstorleken måste du utvärdera om ändringen är kompatibel med befintliga data i CDC-ändringstabeller. För att lösa det här problemet måste du inaktivera och återaktivera CDC för databasen. Mer information om hur du aktiverar CDC för en databas eller en tabell finns i Aktivera CDC för en databas och Aktivera CDC för en tabell.
Fel 913 – CDC-avbildningsjobbet misslyckas när ändringar bearbetas för en tabell med systemets CLR-datatyp
Orsak: Det här felet uppstår när DU aktiverar CDC i en tabell med system-CLR-datatypen, gör DML-ändringar och sedan gör DDL-ändringar i samma tabell medan CDC-avbildningsjobbet bearbetar ändringar relaterade till andra tabeller.
Rekommendation: De rekommenderade stegen är att skicka DML till tabellen, köra ett avbildningsjobb för att bearbeta ändringar, köra DDL för tabellen, köra ett avbildningsjobb för att bearbeta DDL-ändringar och sedan återaktivera DML-bearbetning. För mer information, se CDC-capture-jobb misslyckas vid bearbetning av ändringar för en tabell med system-CLR-datatyp (geometri, geografi eller hierarkiid).
Skapa användare och tilldela roll
Om cdc user
har tagits bort kan du lägga till användaren igen manuellt.
Använd följande T-SQL-skript för att skapa en användare (cdc
) och tilldela rätt roll för samma (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';
Kontrollera och lägg till rollmedlemskap
Kontrollera om cdc
användare tillhör rollen sysadmin
eller db_owner
genom att köra följande T-SQL-fråga:
EXECUTE AS USER = 'cdc';
SELECT is_srvrolemember('sysadmin'), is_member('db_owner');
Om cdc
användaren inte tillhör någon av rollerna kör du följande T-SQL-fråga för att lägga till db_owner
roll i cdc
användaren.
EXEC sp_addrolemember 'db_owner' , 'cdc';