Errore 1205 durante la configurazione della replica transazionale
Questo articolo consente di risolvere un problema che si verifica quando si configura la replica transazionale in SQL Server.
Versione originale del prodotto: SQL Server
Numero KB originale: 2674882
Sintomi
Considerare lo scenario descritto di seguito:
- È possibile configurare la replica transazionale in SQL Server.
- La topologia di replica transazionale è costituita da diversi server di pubblicazione.
- I server di pubblicazione replicano i dati nello stesso database sottoscrittore.
- Gli agenti di distribuzione vengono eseguiti in modo continuo o eseguiti in base a una pianificazione frequente. Ad esempio, gli agenti di distribuzione vengono eseguiti ogni minuto.
In questo scenario, gli agenti di distribuzione possono essere coinvolti in uno scenario deadlock e possono essere selezionati come vittima di deadlock. Quando si verifica questo problema, è possibile che venga visualizzato un messaggio di errore simile al seguente:
Errore 1205
La transazione (ID processo %d) è stata bloccata nelle risorse %.*ls con un altro processo ed è stata scelta come vittima del deadlock. Ripetere la transazione.
Se si abilita il flag di traccia 1222 per reindirizzare le informazioni sui deadlock nel log degli errori SQL Server, viene visualizzato un messaggio di errore simile a uno dei seguenti:
-
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) else 0 end as binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = @P4 and publication = @P5 and subscription_type = 0
-
update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(substring(transaction_timestamp, 16, 1) come binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) e publisher_db = @P4 e publication = @P5 e subscription_type = 0 e (sottostringa(transaction_timestamp, 16, 1) = 0 o datalength(transaction_timestamp) < 16)
Causa
Questo problema si verifica se la stima rowcount per la tabella di sistema numerica MSreplication_subscriptions
non è corretta. Se la stima rowcount non è corretta, il motore di database SQL Server potrebbe usare un metodo non corretto per aggiornare il database.
Nota
In genere, la stima rowcount corretta è uguale al numero di sottoscrizioni nel database. Se si usa la funzionalità Flussi di sottoscrizione, la stima rowcount è uguale al numero di sottoscrizioni moltiplicate per il numero di flussi configurati per ogni sottoscrizione.
Risoluzione
Per risolvere questo problema, utilizzare uno dei seguenti metodi.
Metodo 1: usare il
DBCC UPDATEUSAGE
comando .Per risolvere questo problema, aggiornare il valore rowcount non corretto. A tale scopo, utilizzare il seguente comando:
DBCC UPDATEUSAGE (**subscriber_database_name** **,**'MSreplication_subscriptions') WITH COUNT_ROWS
Nota
Il
DBCC UPDATEUSAGE
comando determina i valori corretti per le righe, le pagine usate, le pagine riservate, le pagine foglia e i conteggi delle pagine dati per ogni partizione di una tabella. Se questi valori sono corretti, ilDBCC UPDATEUSAGE
comando non restituisce dati. Se vengono trovati e corretti valori imprecisi,DBCC UPDATEUSAGE
restituisce le righe e le colonne aggiornate.Metodo 2: usare l'istruzione
ALTER INDEX
.Per risolvere questo problema, ricompilare gli indici associati alla
MSreplication_subscriptions
tabella. A tale scopo, usare l'istruzione seguente:ALTER INDEX ALL ON [dbo].[MSreplication_subscriptions] REBUILD
Ulteriori informazioni
Quando si verifica il problema menzionato nella sezione Sintomi , la stima del conteggio delle righe per la MSreplication_subscriptions
tabella di sistema può essere pari a 4.294.967.296. Per controllare il valore rowcount, usare uno dei metodi seguenti.
Metodo 1: usare SQL Server Management Studio.
Per usare SQL Server Management Studio per controllare il valore rowcount per la tabella di
MSreplication_subscriptions
sistema, seguire questa procedura:- Avviare SQL Server Management Studio e quindi connettersi all'istanza del server sottoscrittore.
- Espandere Database e quindi espandere il database del Sottoscrittore.
- Espandere Tabelle e quindi Tabelle di sistema.
- Fare clic con il pulsante destro del mouse su dbo. MSreplication_subscriptions e quindi selezionare Proprietà.
- Selezionare Archiviazione e quindi verificare il valore rowcount nel campo Conteggio righe .
Metodo 2: usare un'istruzione di query.
Per controllare il valore rowcount per la tabella di
MSreplication_subscriptions
sistema, eseguire la query seguente:SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
Riferimenti
- Per altre informazioni sul rilevamento e la fine dei deadlock, vedere Rilevamento e chiusura di deadlock
- Per altre informazioni sull'istruzione
ALTER
, vedere Istruzioni Transact-SQL - Per altre informazioni sul
DBCC UPDATEUSAGE
comando, vedere DBCC UPDATEUSAGE (Transact-SQL)
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per