Condividi tramite


Errore 1205 quando si configura la replica transazionale

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, il DBCC 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:

    1. Avviare SQL Server Management Studio e quindi connettersi all'istanza del server sottoscrittore.
    2. Espandere Database, quindi espandere il database sottoscrittore.
    3. Espandere Tabelle e quindi tabelle di sistema.
    4. Fare clic con il pulsante destro del mouse su dbo. MSreplication_subscriptions e quindi selezionare Proprietà.
    5. 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