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.
Modificando 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)
Atualmente, não há suporte para habilitar a captura de dados de alteração (CDC) e a recuperação acelerada de banco de dados (ADR) no SQL Server.
Quando ativa o CDC, a funcionalidade de truncamento agressivo de logs do ADR é desativada. Isso ocorre porque a verificação CDC acessa o 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.
Ao habilitar o CDC, recomendamos o uso da opção Índice retomável. O índice retomável não requer manter aberta uma transação de longa duração para criar ou reconstruir um índice, permitindo o truncamento de log durante essa operação e um melhor gerenciamento do espaço de log. Para obter mais informações, consulte Diretrizes para operações de índice online - Considerações sobre índice retomável.
As instruções DDL online não são suportadas
de instruções DDL online não são suportadas quando a captura de dados de alteração é habilitada em um banco de dados.
A ativação do 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áriocdc
. Em seguida, o CDC pode ser ativado com êxito no banco de dados.
CDC falha após o comando ALTER COLUMN para varchar e varbinary
Quando o tipo de dados de uma coluna numa tabela habilitada para CDC é alterado de de texto para nvarcharou de imagem para varbinary, e uma linha existente é atualizada para um valor de fora da linha. Após a atualização, a verificação CDC resultará em erros.
Alterações DDL nas tabelas de origem
Alterar o tamanho das colunas de uma tabela habilitada para CDC utilizando instruções DDL pode causar problemas com o processo de captura subsequente do CDC, resultando no erro 2628 ou no erro 8115. 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 os sys.dm_cdc_errors
indicarem que as verificações estão falhando devido ao erro de 2628 ou erro 8115 para tabelas de alteração, você deve primeiro consumir os dados de alteração 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 há gatilhos “CREATE OBJECT” existentes.
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 não incluídos nas operações Import/Export e Extract/Deploy incluem as 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.
Resolução de erros
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 gestão dinâmica sys.dm_cdc_errors retornar erros, consulte a seção a seguir para entender as etapas de mitigação.
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 de Banco de Dados | Inclui informações sobre como mitigar problemas quando o espaço do banco de dados tiver sido esgotado. |
Limitação 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 user
padrã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 vista do catálogo do sistema sys.objects com is_ms_shipped=1 e 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, comoCDC schema
, alterar tabelas, procedimentos armazenados do sistema CDC, permissões decdc user
padrão (sys.database_principals
) ou renomear ocdc user
.Recomendação: Verifique se o usuário
cdc
existe em seu banco de dados e também tem a funçãodb_owner
atribuí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 representado ou você não tem 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 decdc user
padrão (sys.database_principals) ou renomear ocdc user
.Recomendação: Verifique se o usuário
cdc
existe em seu banco de dados e também tem a funçãodb_owner
atribuí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 decdc user
padrão (sys.database_principals) ou renomear ocdc user
.Recomendação: Verifique se a tabela do sistema existe e está acessível consultando a tabela diretamente. Consulte o sys.objects catálogo do sistema, configure a cláusula de predicado com is_ms_shipped=1 e schema_name='cdc' para listar todos os objetos relacionados com o 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 dadosdb_owner
ou da função de servidorsysadmin
.Recomendação: Certifique-se de que o
cdc user
tem a funçãodb_owner
atribuí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 gatilho 'CREATE OBJECT' no banco de dados ou no servidor. Quando se ativa o CDC, é criado um
cdc user
para gerir o processo de criação do CDC. Ocdc user
executa vários procedimentos armazenados para habilitar o CDC, e alguns desses procedimentos armazenados criam objetos que disparam gatilhos deCREATE OBJECT
existentes. Como ocdc user
nã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 de 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ção do CDC
Erro 2628 - string ou dados 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. O 'sys.dm_cdc_errors' Dynamic Management View (DMV) é útil para verificar erros relatados no CDC, como os erros 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 913 - O trabalho de captura CDC falha ao processar alterações para uma tabela com o tipo de dados CLR do sistema
Cause: 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 Falha na tarefa de captura CDC ao processar alterações numa tabela com o tipo de dados CLR do sistema (geometria, geografia ou hierarchyid).
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';