Bekende beperkingen, problemen en fouten met CDC
van toepassing op:SQL Server
Azure 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 user
wijzigen.
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 cdc
gemaakt. 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 encdc
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 vancdc user
het CDC-systeem, standaardmachtigingen (sys.database_principals) wijzigen of de naam van decdc user
wijzigen.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 zoalsCDC schema
handmatig wijzigen, tabellen wijzigen, opgeslagen procedures vancdc user
het CDC-systeem, standaardmachtigingen (sys.database_principals
) of de naam van decdc user
wijzigen.Aanbeveling: zorg ervoor dat de
cdc
gebruiker in uw database bestaat en of er ook dedb_owner
rol is toegewezen. Als u decdc
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 zoalsCDC schema
, tabellen wijzigen, opgeslagen procedures vancdc user
het CDC-systeem, standaardmachtigingen (sys.database_principals) wijzigen of de naam van decdc user
wijzigen.Aanbeveling: zorg ervoor dat de
cdc
gebruiker in uw database bestaat en of er ook dedb_owner
rol is toegewezen. Als u decdc
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 zoalscdc user
, standaardmachtigingen (sys.database_principals) wijzigen of de naam van decdc user
wijzigen.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 dedb_owner
databaserol of uit desysadmin
-serverfunctie.aanbeveling: zorg ervoor dat aan de
cdc user
dedb_owner
rol is toegewezen. Als u decdc
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. Decdc user
voert een aantal opgeslagen procedures uit om CDC in te schakelen en sommige van deze opgeslagen procedures maken objecten die bestaandeCREATE OBJECT
triggers activeren. Omdat decdc user
niet gemachtigd is om naar demaster
-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
Oorzaak: deze fout treedt op wanneer de primaire bestandsgroep van een database onvoldoende ruimte heeft en SQL Server geen ruimte kan toewijzen voor een object (zoals een tabel of index) binnen die bestandsgroep.
aanbeveling: verwijder overbodige gegevens in uw database om ruimte vrij te maken om dit probleem op te lossen. Identificeer ongebruikte tabellen, indexen of andere objecten in de bestandsgroep die veilig kunnen worden verwijderd. Bewaak het ruimtegebruik nauwkeurig voor meer informatie Bestandsruimte beheren voor databases in Azure SQL Database
Als onnodige gegevens/objecten worden verwijderd, is geen optie, kunt u overwegen om meer ruimte toe te wijzen voor uw databasetransactielogboek. Zie architectuur en beheerhandleiding voor SQL Server-transactielogboeken voor meer informatie over transactielogboekbeheer
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';