Erro 1205 ao configurar a replicação transacional

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

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

Sintomas

Considere o seguinte cenário:

  • Você configura a replicação transacional no SQL Server.
  • A topologia de replicação transacional consiste em vários editores.
  • Os editores replicam dados no mesmo banco de dados de assinantes.
  • Os agentes de distribuição são executados continuamente ou executados em uma agenda 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 impasse e podem ser selecionados como vítimas de impasse. Quando esse problema ocorrer, você poderá receber uma mensagem de erro que se assemelha ao seguinte:

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

Se você habilitar o sinalizador de rastreamento 1222 para redirecionar as informações de impasse para o log de erros SQL Server, você receberá uma mensagem de erro que se assemelha a uma das seguintes:

  • update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(case datalength(transaction_timestamp) when 16 then isnull(substring(transaction_timestamp, 16, 1), 0) mais 0 termina como binário(1)), "time" = @P2 em que UPPER(publisher) = UPPER(@P3) e publisher_db = @P4 e publicação = @P5 e subscription_type = 0

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

Motivo

Esse problema ocorrerá se a estimativa de contagem de linhas para a tabela do sistema de números MSreplication_subscriptions estiver incorreta. Se a estimativa de contagem de linhas estiver incorreta, o mecanismo de banco de dados 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 multiplicadas pelo número de fluxos configurados para cada assinatura.

Resolução

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

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

    Para resolve esse problema, atualize o valor de contagem de linhas incorreto. 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 de folhas e contagens de página 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 atualizadas.

  • Método 2: use a ALTER INDEX instrução.

    Para resolve 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 o problema mencionado na seção Sintomas ocorre, a estimativa de contagem de linhas para a tabela do sistema pode chegar a MSreplication_subscriptions4.294.967.296. Para marcar o valor da contagem de linhas, use um dos métodos a seguir.

  • Método 1: use SQL Server Management Studio.

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

    1. Inicie SQL Server Management Studio e conecte-se à instância do servidor assinante.
    2. Expanda Bancos de Dados e expanda o banco de dados de assinantes.
    3. Expanda Tabelas e 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 marcar o valor da contagem de linhas para a tabela do MSreplication_subscriptions sistema, execute a seguinte consulta:

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

Referências