Partilhar via


Limitações, problemas e erros conhecidos com o CDC

Aplica-se a:SQL ServerAzure SQL Managed Instance

Este artigo explica as limitações conhecidas, problemas e erros com a captura de dados de alterações (CDC) para o SQL Server e a Azure SQL Managed Instance.

Para a Base de Dados SQL do Azure, consulte Problemas conhecidos com CDC na Base de Dados SQL do Azure.

Modificar metadados

Para que o CDC funcione corretamente, você não deve modificar manualmente nenhum metadados CDC, como CDC schema, alterar tabelas, procedimentos armazenados do sistema CDC, permissões de cdc user padrão (sys.database_principals) ou renomear o cdc user.

Todos os objetos em sys.objects com is_ms_shipped propriedade definida como 1 não devem ser modificados.

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'

Diferenças de agrupamento

É importante estar ciente de uma situação em que você tem agrupamentos diferentes entre o banco de dados e as colunas de uma tabela configurada para captura de dados de alteração. O CDC usa armazenamento provisório para preencher tabelas laterais. Se uma tabela tiver char ou varchar colunas com agrupamentos diferentes do agrupamento de banco de dados e se essas colunas armazenarem caracteres não-ASCII (como caracteres DBCS de byte duplo), o CDC pode não conseguir manter os dados alterados consistentes com os dados nas tabelas base. Isso ocorre porque as variáveis de armazenamento provisório não podem ter agrupamentos associados a elas.

Considere uma das seguintes abordagens para garantir que os dados de alteração capturados sejam consistentes com as tabelas base:

  • Para colunas que contenham dados não-ASCII, utilize o tipo de dados nchar ou nvarchar .

  • Ou, Use o mesmo agrupamento para colunas e para o banco de dados.

Por exemplo, se você tiver um banco de dados que usa um agrupamento de SQL_Latin1_General_CP1_CI_AS, considere a tabela a seguir:

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 VARCHAR(10) collate Chinese_PRC_CI_AI)

O CDC pode falhar ao capturar os dados binários para a coluna C2, porque seu agrupamento é diferente (Chinese_PRC_CI_AI). Use nvarchar para evitar esse 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
     )

Recuperação acelerada de banco de dados (ADR) e captura de dados de alteração (CDC)

Não há suporte para habilitar a captura de dados de alteração (CDC) e a recuperação acelerada de banco de dados (ADR) para o mesmo banco de dados no SQL Server 2019 (15.x). A habilitação do CDC e do ADR é suportada em versões posteriores do SQL Server a partir da Atualização Cumulativa 18 do SQL Server 2022 (16.x).

Quando ativa o CDC, a funcionalidade de truncamento agressivo de logs do ADR é desativada. Isso ocorre porque a verificação CDC acede ao log de transações do banco de dados. As transações ativas continuam a manter o truncamento do log de transações até que a transação seja confirmada e a verificação CDC seja recuperada ou a transação seja anulada. Se você habilitar o CDC em um banco de dados onde o ADR está habilitado, poderá observar uma maior utilização do log de transações. Certifique-se de que haja espaço suficiente no log de transações disponível para as necessidades de todas as suas cargas de trabalho.

Ativar CDC falhará se o esquema ou o usuário nomeado cdc já existir

Quando você habilita o CDC em um banco de dados, ele cria um novo esquema e um usuário chamado cdc. Portanto, a criação manual de um esquema personalizado ou usuário chamado cdc não é recomendada, pois é reservada para uso do sistema.

Se definir manualmente um esquema personalizado ou um utilizador chamado cdc no seu banco de dados que não esteja relacionado ao CDC, o procedimento armazenado do sistema sys.sp_cdc_enable_db não consegue habilitar o CDC na base de dados com a seguinte mensagem de erro.

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.

Para resolver esse problema:

  • Solte manualmente o esquema vazio cdc e o usuário cdc. Em seguida, o CDC pode ser ativado com êxito no banco de dados.

CDC falha após ALTER COLUMN

Quando o tipo de dados de uma coluna numa tabela habilitada para CDC é alterado para uma conversão sem suporte, a análise CDC pode resultar em erros após a atualização.

Seguem-se exemplos de alterações de tipo de dados que não são suportadas ALTER COLUMN quando o CDC está ativado numa tabela:

  • bigint para int
  • char(x), nvarchar(x) ou uniqueidentifier, DATE ou INT

Alterar o tipo de dados de uma coluna em uma tabela habilitada para CDC pode resultar nos seguintes erros:

  • Erro 241 - A conversão falhou ao converter data e/ou hora da cadeia de caracteres.
  • Erro 245 - Falha na conversão ao converter o valor.
  • Erro 8169 - Falha na conversão ao converter de uma cadeia de caracteres para uniqueidentifier.

Alterar o tamanho das colunas de uma tabela habilitada para CDC usando instruções DDL pode causar problemas com o processo de captura CDC subsequente e pode resultar nos seguintes erros:

  • Erro 2628 - Cadeia de caracteres ou dados binários seriam truncados numa tabela.
  • Erro 8115 - Erro de estouro aritmético convertendo o tipo de dados de bigint para int

Lembre-se de que os dados nas tabelas de alteração CDC são retidos com base nas configurações configuradas pelo usuário. Portanto, antes de fazer qualquer alteração no tamanho da coluna, você deve avaliar se a alteração é compatível com os dados existentes nas tabelas de alteração CDC.

Se as sys.dm_cdc_errors indicam que os scans estão falhando devido ao Erro 2628 ou Erro 8115 para tabelas de alterações, deve primeiro consumir os dados de alterações nas tabelas de alteração afetadas. Depois disso, você precisa desativar e, em seguida, reativar o CDC na mesa para resolver o problema de forma eficaz.

A ativação do CDC falha quando existem triggers de CREATE OBJECT

Quando o CDC é ativado, uma cdc user é criada para gerir o processo de criação do CDC. O cdc user executa vários procedimentos armazenados para habilitar o CDC, e alguns desses procedimentos armazenados criam objetos que disparam gatilhos de CREATE OBJECT existentes. Como o cdc user não tem permissão para gravar no banco de dados master, esses procedimentos armazenados CDC falham com o erro 22830.

Desative todos os gatilhos CREATE OBJECT antes de ativar o CDC num banco de dados. Reative esses gatilhos depois que o CDC for configurado.

Importar banco de dados usando operações de importação/exportação e extração/publicação da camada de dados

Para bancos de dados SQL habilitados para CDC, quando você usa SqlPackage, SSDT ou outras ferramentas SQL para Importar/Exportar ou Extrair/Publicar, o esquema cdc e o usuário são excluídos no novo banco de dados. Outros objetos CDC que não estão incluídos nas operações de Importação/Exportação e Extração/Configuração incluem tabelas marcadas como is_ms_shipped=1 em sys.objects.

Mesmo que o CDC não esteja habilitado e você tenha definido um esquema personalizado ou um usuário chamado cdc em seu banco de dados, isso também será excluído nas operações Importar/Exportar e Extrair/Implantar para importar/configurar um novo banco de dados.

Comutação de partições com variáveis

O uso de variáveis com troca de partição em bancos de dados ou em tabelas com captura de dados de alteração (CDC) não é suportado para a instrução ALTER TABLE ... SWITCH TO ... PARTITION .... Consulte limitações de comutação de partições para saber mais.

Operações online

As instruções DDL online não são suportadas

No Azure SQL Managed Instance e nas versões do SQL Server anteriores ao SQL Server 2025 (17.x), as instruções DDL online ALTER TABLE não são suportadas quando a captura de dados de alteração está ativada numa base de dados.

As operações de índice online não são suportadas

As operações de índice online não são suportadas quando a captura de dados de alteração está habilitada em um banco de dados. Você pode encontrar o erro 18773, "Não foi possível localizar registros de informações de texto para a coluna "%.*ls", ID %d durante a construção do comando.".

Restrições padrão em colunas adicionadas

Quando o CDC é habilitado em uma tabela e uma coluna não anulável com uma restrição padrão é adicionada, os dados de linha existentes terão o valor da restrição padrão. No entanto, o CDC usará NULL em vez do valor padrão para linhas existentes . Isto aplica-se apenas aos dados presentes antes da aplicação da DDL. Como solução alternativa, emita instruções inalteráveis UPDATE para linhas existentes ou execute uma ALTER INDEX ... REBUILD no índice clusterizado da tabela. Use ALTER TABLE ... REBUILD no heap se nenhum índice agrupado estiver presente.

Solução de problemas

Esta secção descreve os passos para solucionar erros associados ao CDC no SQL Server e na Instância Gerida SQL do Azure. Erros relacionados ao CDC podem obstruir o bom funcionamento do processo de captura e levar à expansão do log de transações do banco de dados.

Para examinar esses erros, pode consultar a vista de gestão dinâmica sys.dm_cdc_errors. Se a vista de gerenciamento dinâmico sys.dm_cdc_errors retornar erros, revise as seguintes informações de solução de problemas.

Observação

Para obter mais informações sobre um código de erro específico, consulte eventos e erros do Mecanismo de Banco de Dados.

Estas são as diferentes categorias de solução de problemas incluídas nesta seção:

Categoria Descrição
Metadados modificados Inclui informações sobre como mitigar problemas relacionados com o CDC quando a tabela rastreada tenha sido modificada ou eliminada.
Gerenciamento de espaço no banco de dados Inclui informações sobre como mitigar problemas quando o espaço do banco de dados tiver sido esgotado.
Limitações do CDC Inclui informações sobre como mitigar problemas causados por limitações do CDC.

Metadados modificados

Erro 200/208 - Nome do objeto inválido

  • Causa: O erro pode ocorrer quando os metadados CDC tiverem sido descartados. Para que o CDC funcione corretamente, você não deve modificar manualmente nenhum metadados CDC, como CDC schema, alterar tabelas, procedimentos armazenados do sistema CDC, permissões de cdc user padrão (sys.database_principals) ou renomear o cdc user.

  • Recomendação: Para resolver esse problema, você precisa desativar e reativar o CDC para seu banco de dados. Ao habilitar a captura de dados de alteração para um banco de dados, ele cria o esquema cdc, o usuário cdc, tabelas de metadados e outros objetos do sistema para o banco de dados.

Observação

Os objetos encontrados na exibição de catálogo do sistema sys.objects com is_ms_shipped=1 and schema_name='cdc' não devem ser alterados ou descartados.

Erro 1202 - A entidade de banco de dados não existe ou o usuário não é membro

  • Causa: O erro pode ocorrer quando cdc user foi descartado. Para que o CDC funcione corretamente, você não deve modificar manualmente nenhum metadados CDC, como CDC schema, alterar tabelas, procedimentos armazenados do sistema CDC, permissões padrão cdc user ou renomear o cdc user.

  • Recomendação: Verifique se o usuário cdc existe em seu banco de dados e também tem a função db_owner atribuída. Para criar o usuário cdc, consulte o exemplo Criar usuário cdc e atribuir função.

Erro 15517 - Não é possível executar como o principal de banco de dados porque o principal não existe

  • Causa: Este tipo de entidade não pode ser imitado ou não tens permissão. O erro pode ocorrer quando os metadados CDC foram descartados ou não fazem mais parte da função db_owner. Para que o CDC funcione corretamente, você não deve modificar manualmente nenhum metadados CDC, como CDC schema, alterar tabelas, procedimentos armazenados do sistema CDC, permissões padrão cdc user ou renomear o cdc user.

  • Recomendação: Verifique se o usuário cdc existe em seu banco de dados e também tem a função db_owner atribuída. Para criar o usuário cdc, consulte o exemplo Criar usuário cdc e atribuir função.

Erro 18807 - Não é possível encontrar um ID de objeto para a tabela do sistema de replicação

  • Causa: Este erro acontece quando o SQL Server não consegue localizar ou acessar a tabela do sistema de replicação '%s.' Isso pode ser porque a tabela está ausente ou inacessível. Para que o CDC funcione corretamente, você não deve modificar manualmente nenhum metadados CDC, como CDC schema, alterar tabelas, procedimentos armazenados do sistema CDC, permissões padrão cdc user ou renomear o cdc user.

  • Recomendação: Verifique se a tabela do sistema existe e está acessível consultando a tabela diretamente. Consulte o catálogo do sistema sys.objects , defina a cláusula de predicado com is_ms_shipped=1 and schema_name='cdc' para listar todos os objetos relacionados ao CDC. Se a consulta não retornar nenhum objeto, você deverá desabilitar e reativar o CDC para seu banco de dados. Habilitar a captura de dados de alteração para um banco de dados cria o esquema cdc, o usuário cdc, tabelas de metadados e outros objetos do sistema para o banco de dados.

Erro 21050 - Somente membros da função de servidor fixa sysadmin ou db_owner podem executar esta operação

  • Causa: O cdc user foi removido da função de banco de dados db_owner ou da função de servidor sysadmin.

  • Recomendação: Certifique-se de que o cdc user tem a função db_owner atribuída. Para criar o usuário cdc, consulte o exemplo Criar usuário cdc e atribuir função.

Erro 22830 - Não foi possível atualizar os metadados que indicam que o banco de dados <database name> está habilitado para a Captura de Dados de Alteração. A falha ocorreu ao executar o comando <CDC stored procedure name>.

  • Causa: Este erro ocorre quando existe um CREATE OBJECT gatilho no banco de dados ou no servidor. Quando o CDC é ativado, uma cdc user é criada para gerir o processo de criação do CDC. O cdc user executa vários procedimentos armazenados para habilitar o CDC, e alguns desses procedimentos armazenados criam objetos que disparam gatilhos de CREATE OBJECT existentes. Como o cdc user não tem permissão para gravar no banco de dados master, esses procedimentos armazenados CDC falham com o erro 22830.

  • Recomendação: Antes de ativar o CDC num banco de dados, desative quaisquer gatilhos CREATE OBJECT. Reative esses gatilhos novamente depois que o CDC for configurado.

Gerenciamento de espaço no banco de dados

Erro 1105 - Não foi possível alocar espaço para o objeto no banco de dados porque o grupo de arquivos está cheio

  • causa: Este erro ocorre quando o grupo de arquivos primário de um banco de dados fica sem espaço e o SQL Server não consegue alocar mais espaço para um objeto (como uma tabela ou índice) dentro desse grupo de arquivos.

  • Recomendação: Para resolver esse problema, exclua todos os dados desnecessários em seu banco de dados para liberar espaço. Identifique tabelas, índices ou outros objetos não utilizados no grupo de arquivos que podem ser removidos com segurança. Monitore a utilização do espaço de perto, para obter mais informações, consulte Gerenciar espaço de arquivo para bancos de dados no Banco de Dados SQL do Azure

    Caso a eliminação de dados/objetos desnecessários não seja uma opção, considere alocar mais espaço para o log de transações do banco de dados. Para obter mais informações sobre o gerenciamento de log de transações, consulte guia de arquitetura e gerenciamento de log de transações do SQL Server

Limitações do CDC

Erro 241 - Falha na conversão ao converter data e/ou hora da cadeia de caracteres

  • Causa: Este erro ocorre quando o ALTER COLUMN é executado em um tipo de dados 'date' e a tabela tem o CDC ativado. Por exemplo, se uma tabela tiver uma coluna nvarchar e você alterar o tipo de dados para a data (por exemplo, ALTER TABLE table_name ALTER COLUMN [column_name] DATE NULL), você poderá ver esse erro no sys.dm_cdc_errors DMV. O erro 241 é devido a uma conversão de dados sem suporte na tabela de alterações, mesmo que o ALTER comando na tabela de origem seja bem-sucedido.

  • Recomendação: Para resolver esse problema, desative e reative o CDC para sua tabela depois de alterar a coluna. Como alternativa, desative o CDC antes de alterar a coluna e, em seguida, reative o CDC após a ALTER COLUMN alteração.

Erro 245 - Falha na conversão ao converter o valor de string para int

  • Causa: Este erro ocorre quando o comando ALTER COLUMN é emitido para alterar o tipo de dados de uma coluna quando a tabela tem CDC ativado. Por exemplo, se uma tabela tiver uma coluna nvarchar e você alterar o tipo de dados para int (por exemplo, ALTER TABLE table_name ALTER COLUMN [column_name] INT NULL), poderá ver esse erro no sys.dm_cdc_errors DMV. O erro 245 deve-se a uma conversão de dados sem suporte na tabela de alterações, mesmo que o ALTER comando na tabela de origem seja bem-sucedido.

  • Recomendação: Para resolver esse problema, desative e reative o CDC para sua tabela depois de alterar a coluna. Como alternativa, desative o CDC antes de alterar a coluna e, em seguida, reative o CDC após a ALTER COLUMN alteração.

Erro 913 - O trabalho de captura CDC falha ao processar alterações para uma tabela com o tipo de dados CLR do sistema

  • Causa: Este erro ocorre ao ativar o CDC em uma tabela com o tipo de dados CLR do sistema, fazer alterações no DML e, em seguida, fazer alterações DDL na mesma tabela enquanto o trabalho de captura do CDC está processando alterações relacionadas a outras tabelas.

  • Recomendação: As etapas recomendadas são desativar o DML na tabela, executar um trabalho de captura para processar alterações, executar DDL para a tabela, executar um trabalho de captura para processar alterações DDL e, em seguida, reativar o processamento DML. Para obter mais informações, consulte O trabalho de captura CDC falha ao processar alterações para uma tabela com o tipo de dados CLR do sistema (geometria, geografia ou hierarchyid).

Erro 2628 - dados de texto ou binários seriam truncados na tabela

  • Causa: Alterar o tamanho das colunas de uma tabela habilitada para CDC usando instruções DDL pode causar problemas com o processo de captura CDC subsequente. A sys.dm_cdc_errors Dynamic Management View (DMV) é útil para verificar qualquer CDC em busca de problemas reportados, como os erros número 2628 e 8115.

  • Recomendação: Antes de fazer qualquer alteração no tamanho da coluna, você deve avaliar se a alteração é compatível com os dados existentes nas tabelas de alteração CDC. Para resolver esse problema, você precisa desabilitar e reativar o CDC para seu banco de dados. Para obter mais informações sobre como habilitar o CDC para um banco de dados ou uma tabela, consulte Habilitar CDC para um banco de dados e Habilitar CDC para uma tabela.

Erro 8115 - Erro de excesso aritmético ao converter o tipo de dados de bigint para int

  • Causa: Este erro ocorre quando um ALTER COLUMN DDL é executado em uma tabela habilitada para CDC que resulta em uma diminuição na precisão da coluna (como alterar o tipo de dados da coluna de bigint para int). A coluna de precisão reduzida não consegue manter os valores presentes na tabela de alterações.

  • Recomendação: Para resolver esse problema, desative e reative o CDC para sua tabela depois de alterar a coluna. Como alternativa, desative o CDC antes de executar o comando ALTER COLUMN e, em seguida, reative o CDC após a alteração ALTER COLUMN.

Erro 8169 - Falha na conversão ao converter de uma cadeia de caracteres para uniqueidentifier

  • Causa: Este erro ocorre quando um comando ALTER COLUMN é emitido para alterar o tipo de dados de uma coluna quando a tabela tem CDC ativado. Por exemplo, se uma tabela tiver uma coluna char(x), nvarchar(x), nvarchar(x) e você alterar o tipo de dados para uniqueidentifier (como: ALTER TABLE table_name ALTER COLUMN [column_name] uniqueidentifier), poderá ver esse erro no sys.dm_cdc_errors Dynamic Management View (DMV). O erro 8169 indica uma conversão de dados sem suporte na tabela de alterações, mesmo que o comando ALTER na tabela de origem seja bem-sucedido.

  • Recomendação: Para resolver esse problema, desative e reative o CDC para sua tabela depois de alterar a coluna. Como alternativa, desative o CDC antes de executar o comando ALTER COLUMN e, em seguida, reative o CDC após a alteração ALTER COLUMN.

Criar usuário e atribuir função

Se o cdc user foi removido, você pode adicionar manualmente o usuário de volta.

Use o seguinte script T-SQL para criar um usuário (cdc) e atribuir a função adequada para o mesmo (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';

Verificar e adicionar associação de função

Para verificar se cdc usuário pertence à função sysadmin ou db_owner, execute a seguinte consulta T-SQL:

EXECUTE AS USER = 'cdc';

SELECT is_srvrolemember('sysadmin'), is_member('db_owner');

Se o usuário cdc não pertencer a nenhuma das funções, execute a seguinte consulta T-SQL para adicionar db_owner função ao usuário cdc.

EXEC sp_addrolemember 'db_owner' , 'cdc';