Compartilhar via


Erro 1205 ao configurar a replicação transacional

Este artigo ajuda você a resolver um problema que ocorre quando você configura a replicação transacional no SQL Server.

Versão original do produto: SQL Server
Número original do KB: 2674882

Sintomas

Considere o cenário a seguir.

  • Você configura a replicação transacional no SQL Server.
  • A topologia de replicação transacional consiste em vários editores.
  • Os publicadores replicam dados no mesmo banco de dados de assinantes.
  • Os agentes de distribuição são executados continuamente ou em uma programação frequente. Por exemplo, os agentes de distribuição são executados a cada minuto.

Nesse cenário, os agentes de distribuição podem estar envolvidos em um cenário de deadlock e podem ser selecionados como uma vítima de deadlock. Quando esse problema ocorre, você pode receber uma mensagem de erro semelhante à seguinte:

Erro 1205
A transação (ID do processo %d) entrou em deadlock em %.*ls recursos com outro processo e foi escolhida como a vítima do deadlock. Execute a transação novamente.

Se você habilitar o sinalizador de rastreamento 1222 para redirecionar as informações de deadlock para o Log de Erros do SQL Server, receberá uma mensagem de erro semelhante a uma das seguintes:

  • atualizar MSreplication_subscriptions definir transaction_timestamp = cast(@P1 como binary(15)) + cast(case datalength(transaction_timestamp) quando 16 then isnull(substring(transaction_timestamp, 16, 1), 0) else 0 end as binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = @P4 and publication = @P5 and subscription_type = 0

  • atualizar MSreplication_subscriptions defina transaction_timestamp = cast(@P1 como binário(15)) + cast(substring(transaction_timestamp, 16, 1) como binário(1)), "tempo" = @P2 onde UPPER(publisher) = UPPER(@P3) e publisher_db = @P4 e publicação = @P5 e subscription_type = 0 e (substring(transaction_timestamp, 16, 1) = 0 ou datalength(transaction_timestamp) < 16)

Causa

Esse problema ocorrerá se a estimativa de contagem de linhas para a tabela do sistema numérico MSreplication_subscriptions estiver incorreta. Se a estimativa de contagem de linhas estiver incorreta, o mecanismo de banco de dados do SQL Server poderá usar um método incorreto para atualizar o banco de dados.

Observação

Normalmente, a estimativa correta de contagem de linhas é igual ao número de assinaturas no banco de dados. Se você usar o recurso Fluxos de Assinatura, a estimativa de contagem de linhas será igual ao número de assinaturas multiplicado pelo número de fluxos configurados para cada assinatura.

Solução

Para resolver esse problema, use um dos seguintes métodos.

  • Método 1: Use o DBCC UPDATEUSAGE comando.

    Para resolver esse problema, atualize o valor incorreto da contagem de linhas. Para fazer isso, execute o seguinte comando:

    DBCC UPDATEUSAGE (**subscriber_database_name** **,**'MSreplication_subscriptions') WITH COUNT_ROWS
    

    Observação

    O DBCC UPDATEUSAGE comando determina os valores corretos para linhas, páginas usadas, páginas reservadas, páginas folha e contagens de páginas de dados para cada partição em uma tabela. Se esses valores estiverem corretos, o DBCC UPDATEUSAGE comando não retornará dados. Se valores imprecisos forem encontrados e corrigidos, DBCC UPDATEUSAGE retornará as linhas e colunas que são atualizadas.

  • Método 2: Use a ALTER INDEX declaração.

    Para resolver esse problema, recompile os índices associados à MSreplication_subscriptions tabela. Para fazer isso, use a seguinte instrução:

    ALTER INDEX ALL ON [dbo].[MSreplication_subscriptions] REBUILD
    

Mais informações

Quando ocorre o problema mencionado na seção Sintomas , a estimativa de contagem de linhas para a tabela do MSreplication_subscriptions sistema pode chegar a 4.294.967.296. Para verificar o valor da contagem de linhas, use um dos métodos a seguir.

  • Método 1: Use o SQL Server Management Studio.

    Para usar o SQL Server Management Studio para verificar o valor de contagem de linhas da tabela do MSreplication_subscriptions sistema, siga estas etapas:

    1. Inicie o SQL Server Management Studio e conecte-se à instância do servidor do assinante.
    2. Expanda Bancos de dados e, em seguida, expanda o banco de dados do assinante.
    3. Expanda Tabelas e, em seguida, expanda Tabelas do Sistema.
    4. Clique com o botão direito do mouse em dbo. MSreplication_subscriptions e selecione Propriedades.
    5. Selecione Armazenamento e verifique o valor da contagem de linhas no campo Contagem de linhas.
  • Método 2: Use uma instrução de consulta.

    Para verificar o valor de contagem de linhas da tabela do MSreplication_subscriptions sistema, execute a seguinte consulta:

    SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
    

Referências