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.

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ário cdc. 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 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 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, 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: 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 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, 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: 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 de cdc user padrão (sys.database_principals) ou renomear o cdc 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 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 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. 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 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';