Problemi noti ed errori con CDC

Si applica a:SQL ServerIstanza gestita di SQL di Azure

In questo articolo sono illustrati i problemi noti e gli 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 Capure (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.

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'utente cdc 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: il 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, autorizzazioni cdc 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, autorizzazioni cdc user predefinite (sys.database_principals) o rinominare l'cdc user.

  • Consiglio: assicurarsi che l'utente cdc esista nel database e abbia anche il ruolo db_owner assegnato. Per creare l'utente cdc 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 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 abbia anche il 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 oggetto per la tabella di sistema della 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, autorizzazioni cdc 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 ruolo db_owner del database o dal ruolo sysadmin del server.

  • Consiglio: assicurarsi che all'utente cdc sia assegnato il ruolo db_owner. Per creare l'utente cdc 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 il ruolo

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