Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra come 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
Prendi in considerazione lo scenario seguente:
- La replica transazionale viene configurata 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 continuamente 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 di deadlock e possono essere selezionati come vittima del deadlock. Quando si verifica questo problema, è possibile che venga visualizzato un messaggio di errore simile al seguente:
Errore 1205
La transazione (ID di processo %d) è stata interrotta a causa di un deadlock delle risorse %.*ls con un altro processo. Ripetere la transazione.
Se si abilita il flag di traccia 1222 per reindirizzare le informazioni sul deadlock nel log degli errori di 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) quando 16 then isnull(substring(transaction_timestamp, 16, 1), 0) else 0 end as binary(1)), "time" = where UPPER(publisher) = @P2 UPPER(@P3) e 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 and publication = @P5 and subscription_type = 0 e (substring(transaction_timestamp, 16, 1) = 0 o datalength(transaction_timestamp) 16) <
Causa
Questo problema si verifica se la stima del conteggio delle righe per la tabella di sistema numerica MSreplication_subscriptions
non è corretta. Se la stima del conteggio delle righe non è corretta, il motore di database di SQL Server potrebbe usare un metodo non corretto per aggiornare il database.
Note
In genere, la stima corretta del conteggio delle righe è uguale al numero di sottoscrizioni nel database. Se si usa la funzionalità Flussi di sottoscrizione, la stima del conteggio delle righe è 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 del conteggio delle righe non corretto. A tale scopo, utilizzare il seguente comando:
DBCC UPDATEUSAGE (**subscriber_database_name** **,**'MSreplication_subscriptions') WITH COUNT_ROWS
Note
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 di dati per ogni partizione in una tabella. Se questi valori sono corretti, ilDBCC UPDATEUSAGE
comando non restituisce dati. Se vengono trovati e corretti valori non accurati,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 del conteggio delle righe, utilizzare uno dei metodi seguenti.
Metodo 1: usare SQL Server Management Studio.
Per usare SQL Server Management Studio per controllare il valore del conteggio delle righe per la
MSreplication_subscriptions
tabella di sistema, seguire questa procedura:- Avviare SQL Server Management Studio e quindi connettersi all'istanza del server sottoscrittore.
- Espandere Database, quindi espandere il database 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 del conteggio delle righe nel campo Conteggio righe.
Metodo 2: usare un'istruzione di query.
Per controllare il valore del conteggio delle righe 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 su come rilevare e terminare i deadlock, vedere Rilevamento e terminazione dei deadlock
- Per altre informazioni sull'istruzione
ALTER
, vedere Istruzioni Transact-SQL - Per altre informazioni sul
DBCC UPDATEUSAGE
comando, vedere DBCC UPDATEUSAGE (Transact-SQL)