Delen via


Bekende beperkingen, problemen en fouten met CDC

van toepassing op:SQL ServerAzure SQL Managed Instance

In dit artikel worden bekende beperkingen, problemen en fouten met het vastleggen van wijzigingengegevens (CDC) voor SQL Server- en Azure SQL Managed Instance-uitgelegd.

Zie Bekende problemen met CDC in Azure SQL Databasevoor Azure SQL Database.

Metagegevens wijzigen

Voor een goede werking van CDC moet u geen CDC-metagegevens zoals CDC schema, tabellen wijzigen, opgeslagen procedures van cdc user het CDC-systeem, standaardmachtigingen (sys.database_principals) wijzigen of de naam van de cdc userwijzigen.

Objecten in sys.objects met is_ms_shipped eigenschap ingesteld op 1 mogen niet worden gewijzigd.

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'

Sorteringsverschillen

Het is belangrijk dat u rekening moet houden met een situatie waarin u verschillende sorteringen hebt tussen de database en de kolommen van een tabel die is geconfigureerd voor het vastleggen van wijzigingsgegevens. CDC maakt gebruik van tussentijdse opslag om zijtabellen te vullen. Als een tabel char- of varchar-kolommen heeft met sorteringen die verschillen van de sortering van de database, en als deze kolommen niet-ASCII-tekens opslaan (zoals dubbele byte DBCS-tekens), dan kan CDC mogelijk de veranderde gegevens niet consistent bewaren met de gegevens in de basistabellen. Dit komt doordat aan de tussentijdse opslagvariabelen geen sorteringen kunnen worden gekoppeld.

Overweeg een van de volgende methoden om ervoor te zorgen dat vastgelegde wijzigingsgegevens consistent zijn met basistabellen:

  • Gebruik nchar of nvarchar gegevenstype voor kolommen die niet-ASCII-gegevens bevatten.

  • Of gebruik dezelfde sortering voor kolommen en voor de database.

Als u bijvoorbeeld een database hebt die gebruikmaakt van een sortering van SQL_Latin1_General_CP1_CI_AS, kunt u de volgende tabel overwegen:

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

CDC kan de binaire gegevens voor kolom C2 niet vastleggen, omdat de sortering anders is (Chinese_PRC_CI_AI). Gebruik nvarchar- om dit probleem te voorkomen:

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
     )

Versneld databaseherstel (ADR) en vastleggen van datawijzigingen (CDC)

Op dit moment wordt het inschakelen van zowel change data capture (CDC) als versneld databaseherstel (ADR) niet ondersteund in SQL Server.

Wanneer u CDC inschakelt, wordt de agressieve logboekafkappingsfunctie van ADR uitgeschakeld. Dit komt doordat de CDC-scan toegang heeft tot het transactielogboek van de database. Actieve transacties blijven de afkapping van het transactielogboek tegenhouden totdat de transactie wordt voltooid en de CDC-scan is bijgewerkt, of de transactie wordt afgebroken. Als u CDC inschakelt voor een database waarvoor ADR is ingeschakeld, ziet u mogelijk een hoger gebruik van transactielogboeken. Zorg ervoor dat er voldoende ruimte voor transactielogboeken beschikbaar is voor de behoeften van al uw workloads.

Bij het inschakelen van CDC wordt u aangeraden de optie Hervatbare index te gebruiken. Hervatbare index hoeft geen langlopende transactie te openen om een index te maken of opnieuw te bouwen, waardoor logboekafkapping tijdens deze bewerking en beter beheer van logboekruimte mogelijk is. Zie Richtlijnen voor online indexbewerkingen - Overwegingen voor hervatbare indexenvoor meer informatie.

Online DDL-instructies worden niet ondersteund

Online DDL-instructies worden niet ondersteund wanneer capture van wijzigingsgegevens is ingeschakeld voor een database.

Het inschakelen van CDC mislukt als het schema of de gebruiker met de naam cdc al bestaat

Wanneer u CDC inschakelt voor een database, wordt er een nieuw schema en een nieuwe gebruiker met de naam cdcgemaakt. Het handmatig maken van een aangepast schema of een aangepaste gebruiker met de naam cdc wordt daarom niet aanbevolen, omdat het is gereserveerd voor systeemgebruik.

Als u handmatig een aangepast schema of een aangepaste gebruiker met de naam cdc hebt gedefinieerd in uw database die niet is gerelateerd aan CDC, kan de door het systeem opgeslagen procedure sys.sp_cdc_enable_db CDC niet inschakelen in de database met het volgende foutbericht.

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.

Ga als volgt te werk om dit probleem op te lossen:

  • Verwijder handmatig het lege cdc schema en cdc gebruiker. Daarna kan CDC met succes op de database worden ingeschakeld.

CDC mislukt na ALTER COLUMN naar varchar en varbinary

Wanneer het gegevenstype van een kolom in een tabel met CDC ingeschakeld wordt gewijzigd van tekst naar nvarcharof van afbeelding naar varbinary, en een bestaande rij wordt bijgewerkt naar een waarde buiten de rij. Na de update resulteert de CDC-scan in fouten.

DDL-wijzigingen in brontabellen

Als u de grootte van kolommen van een tabel met CDC wijzigt met behulp van DDL-instructies, kan dit problemen veroorzaken met het volgende CDC-opnameproces, wat resulteert in fout 2628 of fout 8115. Houd er rekening mee dat gegevens in CDC-wijzigingstabellen worden bewaard op basis van door de gebruiker geconfigureerde instellingen. Voordat u wijzigingen aanbrengt in de kolomgrootte, moet u dus beoordelen of de wijziging compatibel is met de bestaande gegevens in CDC-wijzigingstabellen.

Als de sys.dm_cdc_errors aangeven dat scans mislukken vanwege de fout 2628 of fout 8115 voor wijzigingstabellen, dient u eerst de gewijzigde gegevens in de betrokken wijzigingstabellen te consumeren. Daarna moet u CDC uitschakelen en vervolgens opnieuw inschakelen op de tabel om het probleem effectief op te lossen.

Het inschakelen van CDC mislukt wanneer er triggers voor CREATE OBJECT bestaan

Wanneer u CDC inschakelt, wordt er een cdc user gemaakt om het CDC-creatieproces te beheren. De cdc user voert een aantal opgeslagen procedures uit om CDC in te schakelen en sommige van deze opgeslagen procedures maken objecten die bestaande CREATE OBJECT triggers activeren. Omdat de cdc user niet gemachtigd is om naar de master-database te schrijven, mislukken deze opgeslagen CDC-procedures met fout 22830.

Schakel CREATE OBJECT triggers uit voordat u CDC inschakelt voor een database. Deze triggers kunnen opnieuw worden geactiveerd nadat CDC is geconfigureerd.

Database importeren met gegevenslaag import-/export- en extract-/publicatiebewerkingen

Voor SQL-databases met CDC ingeschakeld, wanneer u SqlPackage, SSDT of andere SQL-hulpprogramma's gebruikt om te importeren/exporteren of te extraheren/publiceren, worden het cdc-schema en de gebruiker uitgesloten in de nieuwe database. Andere CDC-objecten die niet zijn opgenomen in de bewerkingen Import/Export en Extract/Deploy, bevatten de tabellen die zijn gemarkeerd als is_ms_shipped=1 in sys.objects.

Zelfs als CDC niet is ingeschakeld en u een aangepast schema of een aangepaste gebruiker met de naam cdc hebt gedefinieerd in uw database, die ook wordt uitgesloten bij import-/export- en extract-/implementatiebewerkingen om een nieuwe database te importeren/instellen.

Partitiewisseling met variabelen

Het gebruik van variabelen met het schakelen tussen partities in databases of tabellen met CDC (Change Data Capture) wordt niet ondersteund voor de instructie ALTER TABLE ... SWITCH TO ... PARTITION .... Zie beperkingen voor het schakelen van partities voor meer informatie.

Fouten oplossen

Dit onderdeel behandelt probleemoplossing van fouten in verband met CDC op SQL Server en Azure SQL Managed Instance. CDC-gerelateerde fouten kunnen de goede werking van het opnameproces belemmeren en leiden tot de uitbreiding van het databasetransactielogboek.

Als u deze fouten wilt onderzoeken, kunt u een query uitvoeren op de dynamische beheerweergave sys.dm_cdc_errors. Als de dynamische beheerweergave sys.dm_cdc_errors fouten retourneert, raadpleegt u de onderstaande sectie om de risicobeperkingsstappen te begrijpen.

Notitie

Zie Database Engine-gebeurtenissen en -foutenvoor meer informatie over een bepaalde foutcode.

Dit zijn de verschillende categorieën voor probleemoplossing die in deze sectie zijn opgenomen:

Categorie Beschrijving
Gewijzigde metagegevens Bevat informatie over het beperken van problemen met betrekking tot CDC wanneer de bijgehouden tabel is gewijzigd of verwijderd.
databaseruimtebeheer Bevat informatie over het beperken van problemen wanneer de databaseruimte is uitgeput.
CDC-beperking Bevat informatie over het beperken van problemen die worden veroorzaakt door CDC-beperkingen.

Gewijzigde metagegevens

Fout 200/208 - Ongeldige objectnaam

  • Oorzaak: de fout kan optreden wanneer CDC-metagegevens zijn verwijderd. Voor een goede werking van CDC moet u geen CDC-metagegevens zoals CDC schema, tabellen wijzigen, opgeslagen procedures van cdc user het CDC-systeem, standaardmachtigingen (sys.database_principals) wijzigen of de naam van de cdc userwijzigen.

  • aanbeveling: om dit probleem op te lossen, moet u CDC uitschakelen en opnieuw inschakelen voor uw database. Wanneer u het vastleggen van wijzigingsgegevens voor een database inschakelt, worden het cdc-schema, de cdc-gebruiker, de metagegevenstabellen en andere systeemobjecten voor de database gemaakt.

Notitie

Objecten in de sys.objects systeemcatalogusweergave met is_ms_shipped=1 en schema_name='cdc' mogen niet worden gewijzigd of verwijderd.

Fout 1202: de database-principal bestaat niet of de gebruiker is geen lid

  • Oorzaak: de fout kan optreden wanneer cdc user is verwijderd. Voor een goede werking van CDC moet u geen CDC-metagegevens zoals CDC schemahandmatig wijzigen, tabellen wijzigen, opgeslagen procedures van cdc user het CDC-systeem, standaardmachtigingen (sys.database_principals) of de naam van de cdc userwijzigen.

  • Aanbeveling: zorg ervoor dat de cdc gebruiker in uw database bestaat en of er ook de db_owner rol is toegewezen. Als u de cdc gebruiker wilt maken, raadpleegt u het voorbeeld Cdc-gebruiker maken en roltoewijzen.

Fout 15517: kan niet worden uitgevoerd als de database-principal omdat de principal niet bestaat

  • Oorzaak: dit type principal kan niet worden geïmiteerd, of u hebt geen toestemming. De fout kan optreden wanneer CDC-metagegevens zijn verwijderd of niet meer deel uitmaken van de db_owner rol. Voor een goede werking van CDC moet u geen CDC-metagegevens zoals CDC schema, tabellen wijzigen, opgeslagen procedures van cdc user het CDC-systeem, standaardmachtigingen (sys.database_principals) wijzigen of de naam van de cdc userwijzigen.

  • Aanbeveling: zorg ervoor dat de cdc gebruiker in uw database bestaat en of er ook de db_owner rol is toegewezen. Als u de cdc gebruiker wilt maken, raadpleegt u het voorbeeld Cdc-gebruiker maken en roltoewijzen.

Fout 18807 : kan geen object-id vinden voor de tabel van het replicatiesysteem

  • Oorzaak: deze fout treedt op wanneer SQL Server de%svan de replicatiesysteemtabel niet kan vinden of openen. Dit kan komen doordat de tabel ontbreekt of niet bereikbaar is. Voor CDC om correct te functioneren, moet u geen CDC-metagegevens zoals CDC schema, wijzigingstabellen, opgeslagen procedures van het CDC-systeem zoals cdc user, standaardmachtigingen (sys.database_principals) wijzigen of de naam van de cdc userwijzigen.

  • Aanbeveling: controleer of de systeemtabel bestaat en toegankelijk is door rechtstreeks een query uit te voeren op de tabel. Voer een query uit op de sys.objects systeemcatalogus, stel predicaatcomponent in met is_ms_shipped=1 en schema_name='cdc' om alle CDC-gerelateerde objecten weer te geven. Als de query geen objecten retourneert, moet u CDC uitschakelen en vervolgens opnieuw inschakelen voor uw database. Als u wijzigingsgegevens vastleggen inschakelt voor een database, worden het cdc-schema, cdc-gebruiker, metagegevenstabellen en andere systeemobjecten voor de database gemaakt.

Fout 21050- Alleen leden van de sysadmin of db_owner vaste serverfunctie kunnen deze bewerking uitvoeren

  • Oorzaak: de cdc user is verwijderd uit de db_owner databaserol of uit de sysadmin-serverfunctie.

  • aanbeveling: zorg ervoor dat aan de cdc user de db_owner rol is toegewezen. Als u de cdc gebruiker wilt maken, raadpleegt u het voorbeeld Cdc-gebruiker maken en roltoewijzen.

Fout 22830: kan de metagegevens niet bijwerken die aangeeft dat database-<database name> is ingeschakeld voor Change Data Capture. De fout is opgetreden bij het uitvoeren van de opdracht <CDC stored procedure name>.

  • Oorzaak: deze fout treedt op wanneer er een TRIGGER CREATE OBJECT bestaat in de database of op de server. Wanneer u CDC inschakelt, wordt er een cdc user gemaakt om het CDC-creatieproces te beheren. De cdc user voert een aantal opgeslagen procedures uit om CDC in te schakelen en sommige van deze opgeslagen procedures maken objecten die bestaande CREATE OBJECT triggers activeren. Omdat de cdc user niet gemachtigd is om naar de master-database te schrijven, mislukken deze opgeslagen CDC-procedures met fout 22830.

  • Aanbeveling: Voordat u CDC inschakelt voor een database, schakelt u alle CREATE OBJECT triggers uit. Heractiveer deze triggers nadat CDC is geconfigureerd.

Databaseruimtebeheer

Fout 1105: kan geen ruimte toewijzen voor object in de database omdat de bestandsgroep vol is

CDC-beperking

Fout 2628: tekenreeks- of binaire gegevens worden afgekapt in tabel

  • Oorzaak: als u de grootte van kolommen van een tabel met CDC wijzigt met behulp van DDL-instructies, kan dit problemen veroorzaken met het volgende CDC-opnameproces. De dynamische beheerweergave (DMV) sys.dm_cdc_errors is handig voor het controleren van CDC op gemelde problemen, zoals foutennummer 2628 en 8115.

  • aanbeveling: voordat u wijzigingen aanbrengt in de kolomgrootte, moet u beoordelen of de wijziging compatibel is met de bestaande gegevens in CDC-wijzigingstabellen. U kunt dit probleem oplossen door CDC uit te schakelen en opnieuw in te schakelen voor uw database. Zie CDC inschakelen voor een database en CDC inschakelen voor een tabelvoor meer informatie over het inschakelen van CDC voor een database of tabel.

Fout 913 - CDC-opnametaak mislukt bij het verwerken van wijzigingen voor een tabel met systeem-CLR-gegevenstype

  • Oorzaak: deze fout treedt op bij het inschakelen van CDC in een tabel met gegevenstype van het systeem CLR, het aanbrengen van DML-wijzigingen en het aanbrengen van DDL-wijzigingen in dezelfde tabel terwijl de CDC-opnametaak wijzigingen verwerkt die betrekking hebben op andere tabellen.

  • Aanbeveling: de aanbevolen stappen zijn om DML-activiteiten naar de tabel tijdelijk te beëindigen, een capturetaak uit te voeren om wijzigingen te verwerken, DDL op de tabel uit te voeren, een capturetaak uit te voeren om DDL-wijzigingen te verwerken, en vervolgens de DML-verwerking opnieuw in te schakelen. Zie CDC-opnametaak mislukt bij het verwerken van wijzigingen voor een tabel met het clr-gegevenstype van het systeem (geometrie, geografie of hiërarchie-id) voor meer informatie.

Gebruiker maken en rol toewijzen

Als de cdc user is verwijderd, kunt u de gebruiker handmatig opnieuw toevoegen.

Gebruik het volgende T-SQL-script om een gebruiker (cdc) te maken en de juiste rol toe te wijzen voor dezelfde (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';

Rol controleren en leden toevoegen

Als u wilt controleren of cdc gebruiker deel uitmaakt van de sysadmin of db_owner rol, voert u de volgende T-SQL-query uit:

EXECUTE AS USER = 'cdc';

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

Als de cdc gebruiker geen deel uitmaakt van een van beide rollen, voert u de volgende T-SQL-query uit om db_owner rol toe te voegen aan de cdc gebruiker.

EXEC sp_addrolemember 'db_owner' , 'cdc';