Condividi tramite


Limitazioni note, problemi ed errori con CDC

Si applica a:SQL ServerIstanza 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'utente cdc. 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, come CDC schema, tabelle di modifica, stored procedure di sistema CDC, autorizzazioni cdc user predefinite (sys.database_principals) o rinominare l'cdc user.

  • Consiglio: assicurarsi che l'utente cdc esista nel database e disponga del ruolo db_owner assegnato. Per creare l'utente cdc 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 come cdc user (sys.database_principals) o rinominare il cdc user.

  • Consiglio: assicurarsi che l'utente cdc esista nel database e disponga del ruolo db_owner assegnato. Per creare l'utente cdc 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 rinominare cdc 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 del db_owner database o dal ruolo del sysadmin server.

  • Raccomandazione: assicurarsi che abbia cdc user il db_owner ruolo assegnato. Per creare l'utente cdc 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 database master, 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';