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, oDBCC 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_subscriptions
4.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:- Inicie SQL Server Management Studio e conecte-se à instância do servidor assinante.
- Expanda Bancos de Dados e expanda o banco de dados de assinantes.
- Expanda Tabelas e 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 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
- Para obter mais informações sobre como detectar e encerrar impasses, confira Detectar e encerrar impasses
- 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)
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários