Limitazioni note, problemi ed errori con CDC
Si applica a: SQL Server Istanza gestita di SQL di Azure
Questo articolo illustra limitazioni note, problemi ed errori relativi a Change Data Capture (CDC) per SQL Server e Istanza gestita di SQL di Azure.
Per il database SQL di Azure, vedere Problemi noti con CDC nel database SQL di Azure.
Modifica dei metadati
Affinché CDC funzioni correttamente, non è consigliabile modificare manualmente i metadati CDC, come CDC schema
, tabelle di modifica, stored procedure di sistema CDC, autorizzazioni cdc user
predefinite (sys.database_principals
) o rinominare l'cdc user
.
Gli oggetti in sys.objects con la proprietà is_ms_shipped
impostata su 1
non devono essere modificati.
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'
Differenze tra regole di confronto
È importante sapere che può accadere che alcune regole di confronto siano diverse tra il database e le colonne di una tabella configurata per Change Data Capture. CDC usa l'archiviazione provvisoria per popolare tabelle laterali. Se una tabella contiene colonne CHAR o VARCHAR con regole di confronto diverse dalle regole di confronto del database e se tali colonne archiviano caratteri non ASCII (ad esempio caratteri DBCS), è possibile che CDC non salvi in modo permanente i dati modificati coerentemente con i dati nelle tabelle di base. Ciò è dovuto al fatto che alle variabili dell'archiviazione provvisoria non possono essere associate regole di confronto.
Considerare uno degli approcci seguenti per verificare che i dati della modifica acquisiti siano coerenti con le tabelle di base:
Usare il tipo di dati NCHAR o NVARCHAR per colonne contenenti dati non ASCII.
In alternativa, usare le stesse regole di confronto per le colonne e per il database.
Ad esempio, se un database usa le regole di confronto di SQL_Latin1_General_CP1_CI_AS, considerare la tabella seguente:
CREATE TABLE T1(
C1 INT PRIMARY KEY,
C2 VARCHAR(10) collate Chinese_PRC_CI_AI)
CDC potrebbe non acquisire i dati binari per la colonna C2, perché le regole di confronto sono diverse (Chinese_PRC_CI_AI). Per evitare questo problema, usare 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
)
Ripristino accelerato del database (ADR) e Change Data Capture (CDC)
Attualmente, l'abilitazione di Change Data Capture (CDC) e di Ripristino accelerato del database (ADR) non è supportata. Durante l'abilitazione di Change Data Capture (CDC) in SQL Server, tenere presente che la funzionalità di troncamento aggressivo del log di Ripristino accelerato del database (ADR) è disabilitata. Ciò è dovuto al fatto che l'analisi di CDC accede al log delle transazioni del database. Le transazioni attive continueranno a mantenere il troncamento del log delle transazioni fino a quando la transazione non esegue il commit e la scansione CDC non si aggiorna, oppure la transazione termina inaspettatamente. Ciò può causare diversi problemi, tra cui il log delle transazioni che si riempie più del solito oppure operazioni sui dati registrate nella tabella laterale anomale.
Quando si abilita CDC, quando si crea o ricompila un indice è consigliabile usare l'opzione dell'indice ripristinabile. Per un indice ripristinabile non è necessario tenere aperta una transazione con esecuzione prolungata per creare o ricompilare un indice, consentendo in questo modo il troncamento del log durante l'operazione e una migliore gestione dello spazio del log. Per altre informazioni vedere Linee guida per le operazioni sugli indici online - Considerazioni sugli indici ripristinabili.
Le istruzioni DDL online non sono supportate
Le istruzioni DDL online non sono supportate quando change data capture è abilitato in un database.
L'abilitazione di CDC ha esito negativo se lo schema o l'utente denominato cdc
esiste già
Quando si abilita CDC in un database, viene creato un nuovo schema e un nuovo utente denominato cdc
. Pertanto, non è consigliabile creare manualmente uno schema personalizzato o un utente denominato cdc
, perché è riservato per l'uso del sistema.
Se è stato definito manualmente uno schema personalizzato o un utente denominato cdc
in un database che non è correlato a CDC, la stored procedure di sistema sys.sp_cdc_enable_db
non riesce ad abilitare CDC nel database con il messaggio di errore seguente.
Il database
<database_name>
non può essere abilitato per Change Data Capture perché nel database corrente esiste già un utente di database denominato 'cdc' o uno schema denominato 'cdc'. Questi oggetti sono richiesti in modo esclusivo da CDC. Eliminare o rinominare l'utente o lo schema e ripetere l'operazione.
Per risolvere il problema:
- Eliminare manualmente lo schema
cdc
e l'utentecdc
vuoti. Quindi, CDC potrà essere abilitato correttamente nel database.
CDC ha esito negativo dopo l'istruzione ALTER COLUMN in VARCHAR e VARBINARY
Quando il tipo di dati di una colonna in una tabella abilitata per CDC viene modificato da TEXT
a VARCHAR
o da IMAGE
a VARBINARY
e una riga esistente viene aggiornata a un valore fuori riga. Dopo l'aggiornamento, l'analisi CDC restituirà degli errori.
Modifiche DDL alle tabelle di origine
La modifica delle dimensioni delle colonne di una tabella abilitata per CDC tramite istruzioni DDL potrebbe causare problemi con il processo di acquisizione CDC successivo, restituendo l'errore 2628 o l'errore 8115. Tenere presente che i dati nelle tabelle delle modifiche CDC vengono conservati in base alle impostazioni configurate dall'utente. Pertanto, prima di apportare modifiche alle dimensioni delle colonne, è necessario valutare se la modifica è compatibile con i dati esistenti nelle tabelle delle modifiche CDC.
Se sys.dm_cdc_errors
indica che le analisi non riescono a causa dell'errore 2628 o dell'errore 8115 per le tabelle delle modifiche, è necessario utilizzare prima i dati delle modifiche nelle tabelle delle modifiche interessate. Successivamente, sarà necessario disabilitare e quindi riabilitare CDC nella tabella per risolvere il problema in modo efficace.
Importare un database usando le operazioni di Importazione/Esportazione e estrazione/pubblicazione del livello dati
Per i database SQL abilitati per CDC, quando si usa SqlPackage, SSDT o altri strumenti SQL per le operazioni di importazione/esportazione o estrazione/pubblicazione, lo schema e l'utente cdc
vengono esclusi nel nuovo database. Altri oggetti CDC non inclusi nelle operazioni di importazione/esportazione ed estrazione/distribuzione includono le tabelle contrassegnate come is_ms_shipped=1
in sys.objects.
Anche se CDC non è abilitato ed è stato definito uno schema personalizzato o un utente denominato cdc
nel database, verrà escluso anche nelle operazioni di importazione/esportazione ed estrazione/distribuzione per importare/configurare un nuovo database.
Cambio della partizione con variabili
L'uso di variabili con il cambio della partizione nei database o nelle tabelle con Change Data Capture (CDC) non è supportato per l'istruzione ALTER TABLE ... SWITCH TO ... PARTITION ...
. Per altre informazioni, vedere Limitazioni del cambio della partizione.
Risoluzione degli errori
Questa sezione illustra come risolvere gli errori associati a CDC in SQL Server e Istanza gestita di SQL di Azure. Gli errori correlati a CDC possono impedire il corretto funzionamento del processo di acquisizione e portare all'espansione del log delle transazioni del database.
Per esaminare questi errori, è possibile eseguire una query sulla DMV sys.dm_cdc_errors. Se la DMV sys.dm_cdc_errors restituisce errori, fare riferimento alla sezione seguente per comprendere i passaggi di mitigazione.
Nota
Per altre informazioni su un codice di errore specifico vedere Eventi ed errori del motore di database.
Le seguenti sono le diverse categorie di risoluzione dei problemi incluse nella presente sezione:
Categoria | Descrizione |
---|---|
Metadati modificati | Include informazioni su come attenuare i problemi relativi a CDC quando la presentazione rilevata viene modificata o eliminata. |
Gestione dello spazio nel database | Include informazioni su come attenuare i problemi quando lo spazio del database si esaurisce. |
Limitazione CDC | Include informazioni su come attenuare i problemi causati dalle limitazioni in CDC. |
Metadati modificati
Errore 200/208: nome dell'oggetto non valido
Causa: l'errore potrebbe verificarsi quando i metadati CDC vengono eliminati. Affinché CDC funzioni correttamente, non è consigliabile modificare manualmente i metadati CDC, come
CDC schema
, tabelle di modifica, stored procedure di sistema CDC, autorizzazionicdc user
predefinite (sys.database_principals
) o rinominare l'cdc user
.Consiglio: per risolvere questo problema è necessario disabilitare e riabilitare CDC per il database. Quando si abilita Change Data Capture per un database, vengono creati lo schema CDC, l'utente CDC, le tabelle dei metadati e altri oggetti di sistema.
Nota
Gli oggetti trovati nella vista del catalogo di sistema sys.objects con is_ms_shipped=1 and schema_name='cdc' non devono essere modificati o eliminati.
Errore 1202: l'entità di database non esiste o l'utente non è un membro
Causa: l'errore potrebbe verificarsi quando gli utenti CDC vengono eliminati. Affinché CDC funzioni correttamente, non è consigliabile modificare manualmente i metadati CDC, come
CDC schema
, tabelle di modifica, stored procedure di sistema CDC, autorizzazionicdc user
predefinite (sys.database_principals
) o rinominare l'cdc user
.Consiglio: assicurarsi che l'utente
cdc
esista nel database e disponga del ruolodb_owner
assegnato. Per creare l'utentecdc
vedere l'esempio Creare un utente CDC e assegnarvi il ruolo.
Errore 15517: non è possibile effettuare l’esecuzione come entità di database poiché l'entità di sicurezza non esiste
Causa: questo tipo di entità non può essere rappresentato o non si dispone dell'autorizzazione necessaria. L'errore può verificarsi quando i metadati CDC sono stati eliminati o non fanno più parte del ruolo
db_owner
. Affinché CDC funzioni correttamente, non è consigliabile modificare manualmente metadati CDC, comeCDC schema
, tabelle di modifica, procedure memorizzate di sistema CDC, autorizzazioni predefinitecdc user
(sys.database_principals
) o rinominarecdc user
.Consiglio: assicurarsi che l'utente
cdc
esista nel database e disponga del ruolodb_owner
assegnato. Per creare l'utentecdc
vedere l'esempio Creare un utente CDC e assegnarvi il ruolo.
Errore 18807: impossibile trovare un ID di oggetto per la tabella del sistema di replica
Causa: l’errore si verifica quando SQL Server non riesce a trovare o accedere alla tabella di sistema di replica '%s'. Ciò potrebbe essere dovuto al fatto che la tabella è mancante oppure non raggiungibile. Affinché CDC funzioni correttamente, non è consigliabile modificare manualmente i metadati CDC, come
CDC schema
, tabelle di modifica, stored procedure di sistema CDC, autorizzazionicdc user
predefinite (sys.database_principals
) o rinominare l'cdc user
.Consiglio: verificare che la tabella di sistema esista e sia accessibile interrogandola direttamente. Eseguire una query sul catalogo di sistema sys.objects e impostare la clausola predicato con is_ms_shipped=1 and schema_name='cdc' per elencare tutti gli oggetti correlati a CDC. Se la query non restituisce oggetti, è necessario disabilitare, quindi riabilitare CDC per il database. L'abilitazione di Change Data Capture per un database crea lo schema CDC, l'utente CDC, le tabelle dei metadati e altri oggetti di sistema.
Errore 21050: questa operazione può essere eseguita solo dai membri del ruolo predefinito del server sysadmin o db_owner
Causa: l'utente
cdc
è stato rimosso dal ruolodb_owner
del database o dal ruolosysadmin
del server.Consiglio: assicurarsi che all'utente
cdc
sia assegnato il ruolodb_owner
. Per creare l'utentecdc
vedere l'esempio Creare un utente CDC e assegnarvi il ruolo.
Gestione dello spazio nel database
Errore 1105: non è stato possibile allocare spazio per l'oggetto nel database perché il filegroup è pieno
Causa: questo errore si verifica quando il filegroup primario di un database esaurisce lo spazio e SQL Server non è in grado di allocare più spazio per un oggetto (ad esempio una tabella o un indice) all'interno del filegroup.
Consiglio: per risolvere questo problema, eliminare eventuali dati non necessari all'interno del database per liberare spazio. Identificare tabelle, indici oppure altri oggetti inutilizzati nel filegroup che possono essere rimossi in modo sicuro. Monitorare attentamente l'utilizzo dello spazio. Per altre informazioni, vedere Gestire lo spazio file nel database SQL di Azure.
Se l'eliminazione di dati/oggetti non necessari non è un'opzione, è consigliabile allocare più spazio per il log delle transazioni del database. Per altre informazioni sulla gestione dei log delle transazioni, vedere Guida all'architettura e alla gestione del log delle transazioni di SQL Server
Limitazione CDC
Errore 2628: i dati di tipo string o binary verrebbero troncati nella tabella
Causa: la modifica delle dimensioni delle colonne di una tabella abilitata per CDC tramite istruzioni DDL potrebbe causare problemi con il processo di acquisizione CDC successivo. La DMV (Dynamic Management View) 'sys.dm_cdc_errors' è utile per controllare eventuali problemi segnalati da CDC, ad esempio gli errori 2628 e 8115.
Consiglio: prima di apportare modifiche alle dimensioni delle colonne, è necessario valutare se la modifica è compatibile con i dati esistenti nelle tabelle delle modifiche CDC. Per risolvere questo problema è necessario disabilitare e riabilitare CDC per il database. Per altre informazioni sull'abilitazione di CDC per un database o una tabella, vedere le sezioni Abilitare CDC per un database e Abilitare CDC per una tabella.
Errore 913: processo di acquisizione CDC non riuscito durante l'elaborazione delle modifiche per una tabella con tipo di dati CLR di sistema
Causa: questo errore si verifica quando si abilita CDC in una tabella con il tipo di dati CLR di sistema, si apportano modifiche DML, quindi si apportano modifiche DDL nella stessa tabella mentre il processo di acquisizione CDC elabora le modifiche correlate ad altre tabelle.
Consiglio: la procedura consigliata consiste nel disattivare DML nella tabella, eseguire un processo di acquisizione per elaborare le modifiche, eseguire DDL per la tabella, eseguire un processo di acquisizione per elaborare le modifiche DDL, quindi riabilitare l'elaborazione DML. Per altre informazioni, si veda Processo di acquisizione CDC non riuscito durante l'elaborazione delle modifiche.
Creare un utente e assegnare ruoli
Se cdc user
è stato rimosso, è possibile aggiungere di nuovo l'utente manualmente.
Usare lo script T-SQL seguente per creare un utente (cdc
) e assegnarvi il ruolo appropriato (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';
Controllare e aggiungere l'appartenenza ai ruoli
Per verificare se l’utente cdc
appartiene al ruolo sysadmin
o db_owner
, eseguire la query T-SQL seguente:
EXECUTE AS USER = 'cdc';
SELECT is_srvrolemember('sysadmin'), is_member('db_owner');
Se l'utente cdc
non appartiene a nessuno dei due ruoli, eseguire la query T-SQL seguente per aggiungere un ruolo db_owner
all'utente cdc
.
EXEC sp_addrolemember 'db_owner' , 'cdc';
Passaggi successivi
- Per una panoramica di CDC per SQL Server, vedere Che cos'è Change Data Capture (CDC)?
- Per altre informazioni su problemi noti e limitazioni per CDC con database SQL di Azure, vedere Problemi noti e limitazioni di CDC con database SQL di Azure
- Per altre informazioni su come abilitare e disabilitare CDC, vedere Abilitare e disabilitare Change Data Capture