Risoluzione dei problemi: Trovare gli errori con la replica transazionale di SQL Server

Si applica a:SQL ServerIstanza gestita di SQL di Azure

La risoluzione degli errori di replica può risultare frustrante senza una conoscenza di base del funzionamento della replica transazionale. Il primo passaggio per la creazione di una pubblicazione prevede che l'agente di snapshot crei lo snapshot e lo salvi nella cartella degli snapshot. Successivamente, l'agente di distribuzione applica lo snapshot al sottoscrittore.

Questo processo crea la pubblicazione e la pone nello stato di sincronizzazione in corso. La sincronizzazione funziona in tre fasi:

  1. Le transazioni vengono eseguite su oggetti replicati e contrassegnati "per la replica" nel log delle transazioni.

  2. L'agente di lettura log esegue l'analisi del log delle transazioni ed esegue una ricerca delle transazioni contrassegnate “per la replica”. Quelle transazioni vengono poi salvate sul database di distribuzione.

  3. L'agente di distribuzione esegue un'analisi del database di distribuzione tramite il thread di lettura. Quindi, usando il thread di scrittura, questo agente si connette al sottoscrittore per applicare tali modifiche nel sottoscrittore.

Gli errori possono verificarsi in qualsiasi passaggio del processo. Trovare questi errori può essere l'aspetto più complesso della risoluzione dei problemi di sincronizzazione. Fortunatamente, l'uso di Monitoraggio replica semplifica questo processo.

Nota

Lo scopo di questa guida alla risoluzione dei problemi è insegnare una metodologia di risoluzione dei problemi. Non è progettata per risolvere errori specifici, ma per fornire indicazioni generali per l'individuazione degli errori con la replica. Vengono forniti alcuni esempi specifici, ma la loro risoluzione può variare a seconda dell'ambiente. Gli errori di esempio sono basati sul Tutorial: Configurare la replica tra due server completamente connessi (transazionale).

Metodologia di risoluzione degli errori

Domande da porsi

  1. In quale fase del processo di sincronizzazione si verificano errori della replica?
  2. Quale agente sta riscontrando un errore?
  3. Quando ha funzionato correttamente la replica per l'ultima volta? Cosa è cambiato da allora?

Passaggi da eseguire

  1. Usare il Monitor di replica per identificare in quale punto la replica incontra l'errore (quale agente?).

    • Se gli errori si verificano nella sezione Dal server di pubblicazione al database di distribuzione, il problema riguarda l'agente di lettura log.
    • Se gli errori si verificano nella sezione Dal database di distribuzione al Sottoscrittore, il problema riguarda l'agente di distribuzione.
  2. Controlla la cronologia dei processi di quell'agente in Job Activity Monitor per individuare i dettagli dell'errore. Se la cronologia delle attività non mostra abbastanza dettagli, puoi abilitare la registrazione dettagliata su quello specifico agente.

  3. Provare a determinare una soluzione per l'errore.

Trovare gli errori che riguardano l'agente di snapshot

L'agente di snapshot genera lo snapshot e lo scrive nella cartella degli snapshot specificata.

  1. Visualizza lo stato di agente di snapshot:

    1. In Esplora oggetti espandere il nodo Pubblicazione locale in Replica.

    2. Fare clic con il pulsante destro del mouse sulla pubblicazione AdvWorksProductTrans>Visualizza lo stato dell'agente snapshot.

    Screenshot del comando 'Visualizza stato dell'agente snapshot' nel menu di scelta rapida.

  2. Se viene segnalato un errore nello stato di agente di snapshot, è possibile trovare maggiori dettagli nella cronologia processi di agente di snapshot:

    1. Espandere SQL Server Agent in Esplora oggetti e aprire Monitoraggio attività processi.

    2. Ordinare per Categoria e identificare l'agente di snapshot in base alla categoria REPL-Snapshot.

    3. Fare clic con il pulsante destro del mouse sull'agente di snapshot e quindi scegliere Visualizza cronologia.

    Screenshot delle selezioni per l'apertura della cronologia dell'Agente Snapshot.

  3. Nella cronologia dell'agente Snapshot, seleziona la voce di log pertinente. in genere una o due righe prima della voce che segnala l'errore. (Una X rossa indica errore) Esamina il testo del messaggio nella casella di testo sotto i log:

    Screenshot dell'errore dell'agente snapshot per l'accesso negato.

    The replication agent had encountered an exception.
    Exception Message: Access to path '\\node1\repldata.....' is denied.
    

Se le autorizzazioni di Windows non sono configurate correttamente per la cartella snapshot, viene visualizzato un errore di accesso negato per l'agente snapshot. È necessario verificare le autorizzazioni per la cartella in cui è archiviato lo snapshot e assicurarsi che l'account usato per eseguire l'agente snapshot disponga delle autorizzazioni per accedere alla condivisione.

Trova errori con l'agente di lettura log

L'agente di lettura log si connette al database del server di pubblicazione e analizza il log delle transazioni per tutte le transazioni contrassegnate "per la replica". Poi aggiunge quelle transazioni al database di distribuzione.

  1. Connetti il server di pubblicazione in SQL Server Management Studio. Espandere il nodo server, fare clic con il pulsante destro del mouse sulla cartella Replica e quindi selezionare Avvia Monitoraggio replica:

    Screenshot del comando

    Si apre Monitoraggio replica:

    Screenshot di Replication Monitor.

  2. La X rossa indica che la pubblicazione non è sincronizzata. Espandi My Publishers nel riquadro sinistro, quindi espandi il server di pubblicazione appropriato.

  3. Selezionare la pubblicazione AdvWorksProductTrans a sinistra e quindi cercare la X rossa in una delle schede per identificare dove risiede il problema. In questo caso, la X rossa è nella scheda Agenti e indica che uno degli agenti sta riscontrando un errore:

    Screenshot della X rossa nella scheda

  4. Selezionare la scheda Agenti per identificare l'agente per il quale è stato rilevato l'errore:

    Screenshot di Red X nell'agente di lettura log non riuscito in Monitoraggio replica.

  5. Questa vista mostra due agenti, agente di snapshot e Log Reader Agent. Quello che ha riscontrato un errore è contrassegnato con la X rossa. In questo caso, si tratta dell'agente di lettura log.

    Fare doppio clic sulla riga che segnala l'errore per aprire la cronologia dell'agente Log Reader. Questa cronologia offre altre informazioni sull'errore:

    Screenshot dei dettagli dell'errore per l'Agente Lettore di Log.

    Status: 0, code: 20011, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.
    Status: 0, code: 15517, text: 'Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.'.
    Status: 0, code: 22037, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    
  6. L'errore si verifica in genere quando il proprietario del database del server di pubblicazione non è impostato correttamente. Questa situazione può verificarsi quando un database viene ripristinato. Per verificare ciò:

    1. Espandi Database in Esplora oggetti.

    2. Fare clic con il pulsante destro del mouse su AdventureWorks2025>Proprietà.

    3. Verificare l'esistenza di un proprietario nella pagina File. Se questa casella è vuota, questa è la causa probabile del problema.

    Screenshot della pagina

  7. Se il campo Proprietario è vuoto nella pagina Files, apri una finestra Nuova query nel contesto del database AdventureWorks2025. Eseguire il codice T-SQL seguente:

    -- set the owner of the database to 'sa' or a specific user account, without the brackets.
    EXECUTE sp_changedbowner '<useraccount>';
    -- example for sa: exec sp_changedbowner 'sa'
    -- example for user account: exec sp_changedbowner 'sqlrepro\administrator'
    
  8. Potrebbe essere necessario riavviare l'agente di lettura log:

    1. Espandere il nodo SQL Server Agent in Esplora oggetti e aprire Job Activity Monitor.

    2. Ordinare per Categoria e identificare l'agente di lettura log in base alla categoria REPL-LogReader.

    3. Fare clic con il pulsante destro del mouse sul processo Log Reader Agent e selezionare Avvia processo dal passaggio.

    Screenshot delle selezioni per riavviare l'Agente di Lettura del Registro.

  9. Verifica che la pubblicazione si stia ora sincronizzando aprendo nuovamente Replication Monitor. Se non è già aperto, è possibile trovarlo facendo clic con il pulsante destro del mouse su Replica in Esplora oggetti.

  10. Selezionare la pubblicazione AdvWorksProductTrans, selezionare la scheda Agenti e fare doppio clic sull'agente di lettura log per aprire la cronologia dell'agente. A questo punto dovresti vedere che il Log Reader Agent è in esecuzione e che sta replicando i comandi oppure che indica "nessuna transazione replicata":

    Screenshot dell'agente di lettura log in esecuzione senza transazioni replicate.

Trovare gli errori che riguardano l'agente di distribuzione

L'agente di distribuzione trova i dati nel database di distribuzione e quindi li applica al sottoscrittore.

  1. Connetti il server di pubblicazione in SQL Server Management Studio. Espandere il nodo del server, fare clic con il pulsante destro del mouse sulla cartella Replica e quindi scegliere Avvia Monitoraggio replica.

  2. In Monitoraggio replica, seleziona la pubblicazione AdvWorksProductTrans e seleziona la scheda Tutte le sottoscrizioni. Fai clic con il pulsante destro sulla sottoscrizione e seleziona Visualizza dettagli:

    Screenshot del comando

  3. Si apre la finestra di dialogo Cronologia da distributore a sottoscrittore, che chiarisce quale errore sta riscontrando l'agente:

    Screenshot dei dettagli dell'errore per l'agente di distribuzione.

    Error messages:
    Agent 'NODE1\SQL2016-AdventureWorks2022-AdvWorksProductTrans-NODE2\SQL2016-7' is retrying after an error. 89 retries attempted. See agent job history in the Jobs folder for more details.
    
  4. L'errore indica che l'agente di distribuzione esegue nuovi tentativi. Per trovare ulteriori informazioni, consulta la cronologia dei processi dell'Agente di distribuzione:

    1. Espandi SQL Server Agent in Esplora oggetti >Monitoraggio attività processi.

    2. Ordina i processi per Categoria.

    3. Identificare l'agente di distribuzione in base alla categoria REPL-Distribution. Fare clic con il pulsante destro del mouse sull'agente e scegliere Visualizza cronologia.

    Screenshot delle selezioni per visualizzare la cronologia dell'agente di distribuzione.

  5. Selezionare una delle voci dell'errore e visualizzare il testo corrispondente nella parte inferiore della finestra:

    Screenshot del testo di errore che indica una password errata per l'agente di distribuzione.

    Message:
    Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
    
  6. Questo errore indica che la password usata dall'agente di distribuzione non è corretta. Per risolvere questo errore:

    1. Espandere il nodo Replica in Esplora oggetti.

    2. Fare clic con il pulsante destro sulla sottoscrizione e scegliere >Proprietà.

    3. Selezionare i puntini di sospensione (...) accanto a Account del processo dell'agente e modificare la password.

    Screenshot delle selezioni per la modifica della password per l'agente di distribuzione.

  7. Verificare nuovamente Monitoraggio della replica facendo clic con il pulsante destro del mouse su Replica in Esplora oggetti. Una X rossa in Tutte le sottoscrizioni indica che l'agente di distribuzione sta ancora riscontrando un errore.

    Apri la cronologia Distribuzione al sottoscrittore facendo clic con il pulsante destro sulla sottoscrizione in Monitoraggio repliche>e scegliendo Visualizza dettagli. In questo caso, l'errore è diverso:

    Screenshot dell'errore che indica che l'agente di distribuzione non è in grado di connettersi.

    Connecting to Subscriber 'NODE2\SQL2016'
    Agent message code 20084. The process could not connect to Subscriber 'NODE2\SQL2016'.
    Number:  18456
    Message: Login failed for user 'NODE2\repl_distribution'.
    
  8. Questo errore indica che l'agente di distribuzione non è riuscito a connettersi al sottoscrittore perché l'account di accesso non è riuscito per l'utente NODE2\repl_distribution. Per analizzare ulteriormente il problema, connettersi al sottoscrittore e aprire il log degli errori di SQL Server corrente nel nodo Gestione in Esplora oggetti:

    Screenshot dell'errore che indica il fallimento dell'accesso per l'abbonato.

    Se visualizzi questo errore, manca il login sul sottoscrittore. Per risolvere questo errore, vedere Requisiti del ruolo di sicurezza per la replica.

  9. Dopo aver risolto l'errore di accesso, controllare nuovamente Monitoraggio della replica. Se tutti i problemi sono stati risolti, si noterà una freccia verde accanto al nome della pubblicazione e lo stato In esecuzione in Tutte le sottoscrizioni.

    Fare clic con il pulsante destro del mouse sulla sottoscrizione per avviare di nuovo la cronologia Dal database di distribuzione al Sottoscrittore e verificare l'esito positivo. Se è la prima volta che si esegue l'agente di distribuzione, vedrà che lo snapshot è stato copiato in blocco nel destinatario.

    Screenshot dell'agente di distribuzione con lo stato

Individuare errori con l'Agente di Unione

L'agente di merge può richiedere molto tempo per replicare le modifiche. Per determinare quale passaggio del processo di sincronizzazione della replica di tipo merge richiede più tempo, usare il flag di traccia 101 insieme alla registrazione dell'agente di merge. A tale scopo, usare i parametri seguenti per l'agente di merge, quindi riavviare l'agente:

-T 101
-output
-outputverboselevel

Nota

Se è necessario scrivere i dati statistici nella <distribution-server>..msmerge_history tabella, utilizzare il flag di tracciamento 102.

Di seguito è riportato un output di esempio dell'agente di merge dopo il completamento della sincronizzazione della replica di tipo merge:

**************************************************************
CONNECTION TIMES --> time took to establish the connection to the servers. Publisher (all connections) 156 msec   Subscriber (all connections) 32 msec Distributor 93 msec
**************************************************************
UPLOAD COUNTERS  --> upload phase (changes from the Sub to the Pub) stats MakeGeneration Time = 343 msec. InsertGenHistory Time = 31 msec. UpdateGenHistory Time = 0 msec. ProxiedMetadata Time = 0 msec.
**************************************************************
DOWNLOAD COUNTERS  --> download phase (changes from the Pub to the Sub) stats MakeGeneration Time = 219 msec. InsertGenHistory Time = 0 msec. UpdateGenHistory Time = 0 msec.
**************************************************************
RETENTION-BASED CLEANUP STATISTICS --> sp_mergemetadataretentioncleanup proc stats Publisher: Cleanup Time 281 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_tombstone rows cleaned up 0 Subscriber: Cleanup Time 187 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_rowtrack rows cleaned up 0 MSmerge_tombstone rows cleaned up 0
**************************************************************
RETRY STATISTICS Retry Time (Upload) 0 msec. Retry Time (Download) 0 msec. Total changes retried 0 Number of Iterations through rows needing retry 0 Total number of changes that failed despite retry 0
**************************************************************
PROXY METADATA QUEUE COUNTERS Queue Full: Number of Waits: 0, Total Wait Time: 0 msec
**************************************************************
Distributor-side History Logging Time = 219 msec. Number of Distributor-side History Messages Logged = 11 Subscriber-side History Logging Time = 295 msec. Number of Subscriber-side History Messages Logged = 11
**************************************************************
2013-05-28 17:24:11.820 OLE DB Subscriber '<SQL Server name>\sql2008r2': DBCC SQLPERF (NETSTATS)  2013-05-28 17:24:11.822 OLE DB Publisher '<SQL Server name>\SQL2008R2':  DBCC SQLPERF (NETSTATS)  2013-05-28 17:24:11.824 OLE DB Distributor '<SQL Server name>\SQL2008R2':  DBCC SQLPERF (NETSTATS)  NETWORK STATISTICS Server  Reads  Writes  Bytes Read Bytes Written Publisher 74  74  19112  37526 Subscriber 73  73  19032  36931 Distributor 75  75  19192  38121
**************************************************************
NETWORK STATUS Network Connection: The computer has one or more LAN cards that are active. Network link speed: Destination Incoming  Outgoing Publisher Unreachable  Unreachable Subscriber Unreachable  Unreachable Distributor Unreachable  Unreachable
**************************************************************

Abilitare la registrazione dettagliata per qualsiasi agente

È possibile usare la registrazione verbosa per visualizzare informazioni più dettagliate sugli errori relativi a qualsiasi agente nella topologia di replica. I passaggi sono gli stessi per ogni agente. Assicurati solo di selezionare l'agente corretto in Job Activity Monitor.

Nota

Gli agenti possono trovarsi nel server di pubblicazione o nel server di sottoscrizione, a seconda che si tratti di una sottoscrizione pull o push. Se l'agente non è disponibile nel server che si sta esaminando, controllare l'altro server.

  1. Decidere dove si vuole salvare la registrazione dettagliata e verificare che la cartella esista. Questo esempio usa c:\temp.

  2. Espandere il nodo SQL Server Agent in Esplora oggetti e aprire Job Activity Monitor.

    Screenshot del comando

  3. Ordinare per Categoria e identificare l'agente di interesse. Questo esempio usa l'agente di lettura log. Fai clic con il pulsante destro del mouse sull'agente di interesse >Proprietà.

    Screenshot delle selezioni per aprire le proprietà dell'agente.

  4. Selezionare la pagina Passaggi ed evidenziare il passaggio Esecuzione dell'agente. Seleziona Modifica

    Screenshot delle selezioni per modificare il passaggio

  5. Nella casella Comando iniziare una nuova riga, immettere il testo seguente e selezionare OK:

    -Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
    

    È possibile modificare la posizione e il livello di verbosità in base alle proprie preferenze.

    Screenshot dell'output dettagliato nelle proprietà della fase del processo.

    Quando si aggiunge il parametro di output verboso, i problemi seguenti possono causare il fallimento dell'agente o la mancanza del file di output.

    • C'è un problema di formattazione per cui la lineetta è diventata un trattino.

    • Il percorso non esiste nel disco o l'account che esegue l'agente non ha le autorizzazioni per scrivere nel percorso specificato.

    • Manca uno spazio tra l'ultimo parametro e il parametro -Output.

    • Agenti diversi supportano diversi livelli di verbosità. Se abiliti il logging dettagliato ma l'agente non riesce ad avviarsi, prova a ridurre di 1 il livello di verbosità specificato.

  6. Riavviare l'Agente di lettura log facendo clic con il pulsante destro sull'agente >Interrompi processo al passaggio. Aggiornare selezionando l'icona Aggiorna sulla barra degli strumenti. Fai clic con il pulsante destro del mouse sull'agente >Inizia processo al passaggio.

  7. Controllare il risultato su disco.

    Screenshot del file di testo di uscita.

  8. Per disabilitare la registrazione dettagliata, seguire gli stessi passaggi precedenti per rimuovere l'intera riga -Output aggiunta in precedenza.

Ottieni assistenza

Contribuire alla documentazione di SQL

Sapevi che puoi modificare tu stesso il contenuto SQL? L'autore delle modifiche contribuirà a migliorare la documentazione e verrà accreditato come collaboratore alla realizzazione della pagina.

Per altre informazioni, vedere Modificare la documentazione di Microsoft Learn.