Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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, oDBCC 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:- Inicie o SQL Server Management Studio e conecte-se à instância do servidor do assinante.
- Expanda Bancos de dados e, em seguida, expanda o banco de dados do assinante.
- Expanda Tabelas e, em seguida, expanda Tabelas do Sistema.
- Clique com o botão direito do mouse em dbo. MSreplication_subscriptions e selecione Propriedades.
- 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
- Para obter mais informações sobre como detectar e encerrar deadlocks, consulte Detectando e encerrando deadlocks
- Para obter mais informações sobre a
ALTER
instrução, consulte Instruções Transact-SQL - Para obter mais informações sobre o
DBCC UPDATEUSAGE
comando, consulte DBCC UPDATEUSAGE (Transact-SQL)