Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Istanza gestita di SQL di Azure
Questo articolo illustra limitazioni, problemi ed errori noti 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 si deve modificare manualmente i metadati CDC, come ad esempio le tabelle di modifica, le stored procedure di sistema CDC, le autorizzazioni predefinite cdc user
(sys.database_principals) o rinominare 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 di collazione
È importante essere consapevoli di una situazione in cui le regole di confronto siano diverse tra il database e le colonne di una tabella configurata per il Change Data Capture. CDC usa l'archiviazione provvisoria per popolare tabelle ausiliarie. Se una tabella include 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 a byte doppio), CDC potrebbe non essere in grado di rendere persistenti i dati modificati coerenti 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 le 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). Usare nvarchar per evitare questo problema:
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 acquisizione dei dati modificati (CDC)
L'abilitazione di Change Data Capture (CDC) e del ripristino accelerato del database (ADR) per lo stesso database non è supportata in SQL Server 2019 (15.x). L'abilitazione di CDC e ADR è supportata nelle versioni successive di SQL Server a partire dall'aggiornamento cumulativo 18 di SQL Server 2022 (16.x).
Quando si abilita CDC, la funzionalità di troncamento aggressivo del log di AdR è disabilitata. Ciò è dovuto al fatto che l'analisi di CDC accede al log delle transazioni del database. Le transazioni attive continuano a contenere il troncamento del log delle transazioni fino a quando non viene eseguito il commit della transazione e l'analisi CDC viene interrotta o la transazione viene interrotta. Se si abilita CDC in un database in cui è abilitato ADR, è possibile osservare un utilizzo più elevato del log delle transazioni. Assicurarsi che lo spazio sufficiente del log delle transazioni sia disponibile per le esigenze di tutti i carichi di lavoro.
Quando si abilita CDC, è consigliabile usare l'opzione di indice riprendibile. 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 sull'indice ripristinabili.
Le istruzioni DDL online non sono supportate
Le istruzioni DDL online ALTER TABLE non sono supportate quando Change Data Capture è abilitato su 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
nel database che non è correlato a CDC, la stored procedure sys.sp_cdc_enable_db
di sistema non riesce ad abilitare CDC nel database con il messaggio di errore seguente.
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.
Per risolvere il problema:
- Eliminare manualmente lo schema vuoto
cdc
e l'utentecdc
. Quindi, CDC potrà essere abilitato correttamente nel database.
CDC fallisce 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 testo a nvarchar o 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.
L'abilitazione di CDC ha esito negativo quando esistono trigger 'CREATE OBJECT'
Quando si abilita CDC, viene creato un cdc user
per gestire il processo di creazione CDC.
cdc user
esegue una serie di stored procedure per abilitare CDC e alcune di queste stored procedure creano oggetti che attivano i trigger esistentiCREATE OBJECT
. Poiché cdc user
non ha l'autorizzazione per scrivere nel database master
, queste stored procedure CDC hanno esito negativo con errore 22830.
Disabilitare tutti CREATE OBJECT
i trigger prima di abilitare CDC in un database. Riabilita questi trigger dopo la configurazione di CDC.
Importare un database usando le operazioni di Importazione/Esportazione ed 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 potrebbero 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 vista di gestione dinamica sys.dm_cdc_errors. Se la vista di gestione dinamica (DMV) sys.dm_cdc_errors restituisce errori, fare riferimento alla sezione seguente per comprendere le fasi 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 | Includere informazioni su come attenuare i problemi relativi a CDC quando la tabella tracciata è stata 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 dovresti modificare manualmente alcun metadato CDC, come le tabelle di modifica, le stored procedure di sistema CDC, le autorizzazioni predefinite (sys.database_principals) o rinominare il
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 e 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
cdc user
è stato eliminato. Affinché CDC funzioni correttamente, non è consigliabile modificare manualmente i metadati CDC, comeCDC 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: impossibile eseguire come principale del database perché il principale 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 dovresti modificare manualmente metadati CDC, ad esempio modificare tabelle di modifica, stored procedure di sistema CDC, autorizzazioni predefinite comecdc user
(sys.database_principals) o rinominare ilcdc 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 dovresti modificare manualmente metadati CDC come
CDC schema
, modificare tabelle di modifica, stored procedure di sistema CDC, autorizzazioni predefinite CDC (sys.database_principals) o rinominarecdc user
.Consiglio: verificare che la tabella di sistema esista e sia accessibile interrogandola direttamente. Eseguire una query sul catalogo di sistema sys.objects , impostare la clausola predicato con is_ms_shipped=1 e 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'oggetto
cdc user
è stato rimosso dal ruolo deldb_owner
database o dal ruolo delsysadmin
server.Raccomandazione: assicurarsi che abbia
cdc user
ildb_owner
ruolo assegnato. Per creare l'utentecdc
vedere l'esempio Creare un utente CDC e assegnarvi il ruolo.
Errore 22830: non è stato possibile aggiornare i metadati che indicano che il database <database name>
è abilitato per Change Data Capture. Errore durante l'esecuzione del comando <CDC stored procedure name>
.
Causa: questo errore si verifica quando esiste un trigger 'CREATE OBJECT' nel database o nel server. Quando si abilita il CDC, viene creato un oggetto
cdc user
per gestire il processo di creazione del CDC.cdc user
Esegue una serie di stored procedure per abilitare CDC e alcune di queste stored procedure creano oggetti che attivano trigger esistentiCREATE OBJECT
. Poichécdc user
non ha l'autorizzazione per scrivere nel databasemaster
, le procedure memorizzate CDC falliscono con l'errore 22830.Raccomandazione: prima di abilitare CDC in un database, disabilitare eventuali
CREATE OBJECT
trigger. Riattivare questi trigger dopo la configurazione di CDC.
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 del CDC
Errore 241 - Conversione non riuscita durante la conversione di data e/o ora dalla stringa di caratteri
Causa: questo errore si verifica quando l'istruzione ALTER COLUMN viene eseguita in un tipo di dati DATE e la tabella ha attivato CDC. Ad esempio, se una tabella ha una colonna nvarchar e si modifica il tipo di dati in DATE (ALTER TABLE table_name ALTER COLUMN [column_name] DATE NULL), è possibile che venga visualizzato questo errore nella tabella sys.dm_cdc_errors a causa di una conversione dei dati non supportata, anche se il comando ALTER ha esito positivo.
Raccomandazione: Per risolvere questo problema, disabilitare e riabilitare CDC per la tabella dopo aver modificato la colonna. In alternativa, disabilitare CDC prima di modificare la colonna e quindi riattivare CDC dopo la modifica di ALTER COLUMN.
Errore 245 - Conversione non riuscita durante la conversione del valore
Causa: questo errore si verifica quando viene eseguito il comando ALTER COLUMN per modificare il tipo di dati di una colonna quando la tabella è abilitata per CDC. Ad esempio, se una tabella ha una colonna nvarchar e si modifica il tipo di dati in INT (ALTER TABLE table_name ALTER COLUMN [column_name] INT NULL), è possibile che venga visualizzato questo errore nella tabella sys.dm_cdc_errors a causa di una conversione dei dati non supportata, anche se il comando ALTER ha esito positivo.
Raccomandazione: per risolvere questo problema, disabilita e riabilita CDC per la tua tabella, una volta modificata la colonna. In alternativa, disabilitare CDC prima di modificare la colonna e quindi riattivare CDC dopo la modifica di ALTER COLUMN.
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 ulteriori informazioni, vedere il processo di acquisizione CDC fallisce durante l'elaborazione delle modifiche per una tabella con tipo di dati CLR di sistema (geometry, geography o hierarchyid).
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 Abilitare CDC per un database e Abilitare CDC per una tabella.
Errore 8115 - Errore di overflow aritmetico durante la conversione del tipo di dati
Causa: questo errore si verifica quando viene eseguito un DDL ALTER COLUMN in una tabella abilitata per CDC che determina una diminuzione della precisione della colonna, ad esempio la modifica del tipo di dati della colonna da bigint a int. La colonna di precisione ridotta non è in grado di contenere i valori presenti nella tabella delle modifiche.
Raccomandazione: per risolvere questo problema, disabilitare e riabilitare CDC per la tabella dopo aver modificato la colonna. In alternativa, disabilitare CDC prima di modificare la colonna e quindi riattivare CDC dopo la modifica di ALTER COLUMN.
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';