Problemas conhecidos e erros com a CDA

Aplica-se a:SQL ServerInstância Gerenciada de SQL do Azure

Este artigo explica problemas conhecidos e erros com a CDA (captura de dados de alterações) para SQL Server e a Instância Gerenciada de SQL do Azure.

Para o Banco de Dados SQL do Azure, confira Problemas conhecidos com a CDA no Banco de Dados SQL do Azure.

Modificar metadados

Para que a CDA funcione corretamente, não modifique manualmente nenhum metadado da CDA, como CDC schema, tabelas de alterações, procedimentos armazenados do sistema da CDA e permissões padrão do usuário cdc user (sys.database_principals), nem altere o nome do usuário cdc user.

Nenhum dos objetos em sys.objects com a propriedade is_ms_shipped definida como 1 deve ser modificado.

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 ordenação

É 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 a captura de dados de alterações. A CDA usa um armazenamento provisório para popular tabelas laterais. Se uma tabela tiver colunas CHAR ou VARCHAR com ordenações diferentes da ordenação de banco de dados e se essas colunas armazenarem caracteres não ASCII (como caracteres DBCS de byte duplo), a CDA não poderá persistir os dados alterados de maneira consistente com os dados nas tabelas base. Isso ocorre porque as variáveis de armazenamento intermediário não podem ter agrupamentos associados a elas.

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

  • Use o tipo de dados NCHAR ou NVARCHAR para colunas que contêm dados não ASCII.

  • Ou use a mesma ordenação para colunas e para o banco de dados.

Por exemplo, se você tiver um banco de dados que usa uma ordenação SQL_Latin1_General_CP1_CI_AS, considere a seguinte tabela:

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

A CDA poderá não capturar os dados binários para a coluna C2, porque sua ordenação é 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ções (CDA)

Atualmente, não há suporte para a habilitação da Captura de dados de alteração (CDA) e da Recuperação acelerada de banco de dados (ADR). Quando você habilita a Captura de dados de alterações (CDA) no SQL Server, o recurso de truncamento agressivo de log da ADR é desabilitado. Isso ocorre porque a verificação CDA 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 varredura da CDC seja recuperada, ou a transação seja cancelada. Isso pode causar vários problemas, incluindo o preenchimento do log de transações além do normal ou operações de dados registradas na tabela lateral de maneira anormal.

Ao habilitar a CDA, recomendamos o uso da opção Índice retomável. O índice retomável não exige que você mantenha aberta uma transação de execução prolongada para criar ou recompilar um índice, permitindo o truncamento do log durante essa operação e um melhor gerenciamento do espaço do log. Para obter mais informações, consulte Diretrizes para operações de índice online – Considerações sobre índice retomável.

A habilitação da CDA falhará se o esquema ou o nome do usuário cdc já existir

Quando você habilita a CDA em um banco de dados, ela cria um esquema e um usuário chamado cdc. Portanto, não é recomendável criar manualmente um esquema personalizado ou um usuário chamado cdc, pois ele é reservado para uso do sistema.

Se você tiver definido manualmente um esquema personalizado ou um usuário chamado cdc no banco de dados que não esteja relacionado à CDA, o procedimento armazenado do sistema sys.sp_cdc_enable_db não conseguirá habilitar a CDA no banco de dados com a mensagem de erro abaixo.

O banco de dados <database_name> não pode ser habilitado para captura de dados de alterações porque um usuário de banco de dados chamado 'cdc' ou um esquema chamado 'cdc' já existe no banco de dados atual. Esses objetos são exigidos exclusivamente pela CDA. Descarte ou renomeie o usuário ou esquema e repita a operação.

Para resolver o problema:

  • Remover manualmente o esquema cdc e o usuáriocdc vazios. Em seguida, a CDA pode ser habilitada com êxito no banco de dados.

A CDA falha após ALTER COLUMN para VARCHAR e VARBINARY

Quando o tipo de dados de uma coluna em uma tabela habilitada para CDA é alterado de TEXT para VARCHAR ou de IMAGE para VARBINARY e uma linha existente é atualizada para um valor fora da linha. Após a atualização, a verificação da CDA resultará em erros.

Alterações de DDL em tabelas de origem

Alterar o tamanho das colunas de uma tabela habilitada para CDA usando instruções DDL pode causar problemas com o processo de captura de CDA subsequente, resultando no erro 2628 ou no erro 8115. Lembre-se de que os dados nas tabelas de alteração de CDA são retidos com base nas definiçõ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 da CDA.

Se sys.dm_cdc_errors indicar que as varreduras estão falhando devido ao erro 2628 ou ao erro 8115 para tabelas de alterações, você deverá primeiro consumir os dados de alterações nas tabelas de alterações afetadas. Depois disso, você precisa desabilitar e reabilitar a CDA na tabela para resolver o problema de forma eficaz.

Importar banco de dados usando operações de Importar/Exportar e Extrair/Publicar de camada de dados

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

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

Alternância de partição com variáveis

O uso de variáveis com alternância de partição em bancos de dados ou tabelas com captura de dados de alterações (CDA) não é compatível para a instrução ALTER TABLE ... SWITCH TO ... PARTITION .... Confira as limitações de alternância de partição para saber mais.

Solução de problemas

Esta seção executa as etapas para solucionar problemas referentes a erros associados à CDA no SQL Server e à Instância Gerenciada de SQL do Azure. Os erros relacionados ao CDA podem obstruir o funcionamento adequado do processo de captura e levar à expansão do log de transações do banco de dados.

Para examinar esses erros, você pode consultar a exibição de gerenciamento dinâmico sys.dm_cdc_errors. Se a exibição de gerenciamento dinâmico 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 à CDA quando a tabela rastreada foi modificada ou descartada.
Gerenciamento de espaço do banco de dados Inclui informações sobre como mitigar problemas quando o espaço do banco de dados se esgotou.
Limitação da CDA Inclui informações sobre como mitigar problemas causados por limitações da CDA.

Metadados modificados

Erro 200/208 – nome de objeto inválido

  • Causa: o erro pode ocorrer quando os metadados da CDA foram descartados. Para que a CDA funcione corretamente, não modifique manualmente nenhum metadado da CDA, como CDC schema, tabelas de alterações, procedimentos armazenados do sistema da CDA e permissões padrão do usuário cdc user (sys.database_principals), nem altere o nome do usuário cdc user.

  • Recomendação: para resolver esse problema, desabilite e reative a CDA para seu banco de dados. Ao habilitar uma captura de dados de alterações para um banco de dados, o esquema cdc, usuário cdc, as tabelas de metadados e outros objetos de sistema são criados para o banco de dados.

Observação

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

Erro 1202 - A entidade de segurança do banco de dados não existe ou o usuário não é um membro

  • Causa: o erro pode ocorrer quando o usuário da CDA foi descartado. Para que a CDA funcione corretamente, não modifique manualmente nenhum metadado da CDA, como CDC schema, tabelas de alterações, procedimentos armazenados do sistema da CDA e permissões padrão do usuário cdc user (sys.database_principals), nem altere o nome do usuário 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 entidade de segurança do banco de dados porque essa entidade de segurança não existe

  • Causa: esse tipo de entidade de segurança não pode se passar por outra pessoa ou você não tem permissão. O erro pode ocorrer quando os metadados da CDA foram descartados ou não fazem mais parte da função db_owner. Para que a CDA funcione corretamente, não modifique manualmente nenhum metadado da CDA, como CDC schema, tabelas de alterações, procedimentos armazenados do sistema da CDA e permissões padrão do usuário cdc user (sys.database_principals), nem altere o nome do usuário 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 uma ID de objeto para a tabela do sistema de replicação

  • Causa: esse erro ocorre quando o SQL Server não consegue localizar ou acessar a tabela do sistema de replicação '%s'. Isso pode acontecer porque a tabela está ausente ou inacessível. Para que a CDA funcione corretamente, não modifique manualmente nenhum metadado da CDA, como CDC schema, tabelas de alterações, procedimentos armazenados do sistema da CDA e permissões padrão do usuário cdc user (sys.database_principals), nem altere o nome do usuário cdc user.

  • Recomendação: verifique se a tabela do sistema existe e se pode ser acessada consultando a tabela diretamente. Consulte o catálogo do sistema sys.objects, defina a cláusula de predicado com is_ms_shipped=1 e schema_name='cdc' para listar todos os objetos relacionados à CDA. Se a consulta não retornar nenhum objeto, você deverá desabilitar e reabilitar a CDA para seu banco de dados. Habilitar uma captura de dados de alterações para um banco de dados cria o esquema cdc, o usuário cdc, as tabelas de metadados e outros objetos de sistema para o banco de dados.

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

  • Causa: o usuário cdc foi removido da função de banco de dados db_owner ou da função de servidor sysadmin.

  • Recomendação: verifique se o usuário cdc 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.

Gerenciamento de espaço do 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: esse 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 possam ser removidos com segurança. Monitore a utilização do espaço de perto. Para obter mais informações, confira Gerenciar espaço de arquivo para bancos de dados no Banco de Dados SQL do Azure

    Caso não seja viável descartar objetos de dados desnecessários, 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, confira o Guia de arquitetura e gerenciamento de log de transações do SQL Server).

Limitação da CDA

Erro 2628 – cadeia de caracteres ou dados binários seriam truncados na tabela

  • Causa: alterar o tamanho das colunas de uma tabela habilitada para CDA usando instruções DDL pode causar problemas com o processo subsequente de captura da CDA. A DMV (Exibição de Gerenciamento Dinâmico) 'sys.dm_cdc_errors' é útil para verificar qualquer CDA em busca de problemas relatados, como os números do erro 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 da CDA. Para resolver esse problema, desabilite e reative a CDA para seu banco de dados. Para obter mais informações sobre como habilitar a CDA para um banco de dados ou uma tabela, confira Habilitar a CDA para um banco de dados e Habilitar a CDA para uma tabela.

Erro 913 – o trabalho de captura da CDA falha ao processar alterações em uma tabela com o tipo de dados CLR do sistema.

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

  • Recomendação: as etapas recomendadas são fechar para novas sessões o DML para a 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 então reabilitar o processamento de DML. Para obter mais informações, consulte O trabalho de captura da CDA falha ao processar alterações.

Criar usuário e atribuir função

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

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

EXEC sp_addrolemember 'db_owner' , 'cdc';

Próximas etapas