Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Azure 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
cdce o usuáriocdc. 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 decdc userpadrão (sys.database_principals) ou renomear ocdc 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 userfoi descartado. Para que o CDC funcione corretamente, você não deve modificar manualmente nenhum metadados CDC, comoCDC schema, alterar tabelas, procedimentos armazenados do sistema CDC, permissões padrãocdc userou renomear ocdc user.Recomendação: Verifique se o usuário
cdcexiste em seu banco de dados e também tem a funçãodb_owneratribuída. Para criar o usuáriocdc, 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, comoCDC schema, alterar tabelas, procedimentos armazenados do sistema CDC, permissões padrãocdc userou renomear ocdc user.Recomendação: Verifique se o usuário
cdcexiste em seu banco de dados e também tem a funçãodb_owneratribuída. Para criar o usuáriocdc, 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ãocdc userou renomear ocdc 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 userfoi removido da função de banco de dadosdb_ownerou da função de servidorsysadmin.Recomendação: Certifique-se de que o
cdc usertem a funçãodb_owneratribuída. Para criar o usuáriocdc, 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 OBJECTgatilho no banco de dados ou no servidor. Quando o CDC é ativado, umacdc useré criada para gerir o processo de criação do CDC. Ocdc userexecuta vários procedimentos armazenados para habilitar o CDC, e alguns desses procedimentos armazenados criam objetos que disparam gatilhos deCREATE OBJECTexistentes. Como ocdc usernão tem permissão para gravar no banco de dadosmaster, 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 oALTERcomando 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 COLUMNalteraçã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 oALTERcomando 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 COLUMNalteraçã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 COLUMNe, em seguida, reative o CDC após a alteraçãoALTER 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 COLUMNe, em seguida, reative o CDC após a alteraçãoALTER 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';