Condividi tramite


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. Per quale agente si verifica 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. Esaminare la cronologia dei processi dell'agente in Monitoraggio attività processi per identificare 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. Visualizzare lo stato dell'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 stato agente snapshot.

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

  2. Se nello stato dell'agente di snapshot viene segnalato un errore, è possibile trovare altri dettagli nella cronologia processo dell'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 di snapshot selezionare 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.

Trovare gli errori che riguardano 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. Espandere Server di pubblicazione personali sul lato sinistro e quindi espandere il server di pubblicazione pertinente.

  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 visualizzazione mostra due agenti, l'agente di snapshot e l'agente di lettura log. 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 con la segnalazione dell'errore per aprire la cronologia per l'agente di lettura log. 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. Espandere Database in Esplora oggetti.

    2. Fai clic con il pulsante destro del mouse su AdventureWorks2012>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 proprietario è vuoto nella pagina File, apri una finestra Nuova query all'interno del contesto del database AdventureWorks2022. 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 Monitoraggio attività processi.

    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 dell'agente di lettura log e scegliere Inizia processo al passaggio.

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

  9. Verificare che la pubblicazione venga ora sincronizzata aprendo di nuovo Monitoraggio replica. 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. È ora possibile vedere l'agente di lettura log in esecuzione, nonché i comandi di replica oppure il messaggio "Nessuna transazione replicata disponibile":

    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. Verrà visualizzata la finestra di dialogo Cronologia database di distribuzione - Sottoscrittore con chiarimenti sull'errore riscontrato dall'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 altre informazioni, controllare la cronologia processo dell'agente di distribuzione:

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

    2. Ordinare 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. Fai clic con il pulsante destro del mouse sulla sottoscrizione >Proprietà.

    3. Selezionare i puntini di sospensione (...) accanto ad Account processo agente e modificare la password.

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

  7. Controllare di nuovo Monitoraggio 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.

    Aprire la cronologia Da database di distribuzione a Sottoscrittore facendo clic con il pulsante destro del mouse sulla sottoscrizione in Monitoraggio replica>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 viene visualizzato questo errore, l'account di accesso risulta mancante nel sottoscrittore. Per risolvere questo errore, vedere Requisiti del ruolo di sicurezza per la replica.

  9. Dopo aver risolto l'errore di accesso, controllare di nuovo Monitoraggio 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 merge richiede il maggior tempo, usare il flag di traccia 101 insieme alla registrazione tramite 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 statistiche nella tabella <distribution-server>..msmerge_history, utilizza Trace Flag 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 dettagliata per visualizzare informazioni più dettagliate sugli errori che si verificano con qualsiasi agente nella topologia di replica. I passaggi sono gli stessi per ogni agente. È sufficiente assicurarsi di selezionare l'agente corretto in Monitoraggio attività processi.

Nota

Gli agenti possono essere nel server di pubblicazione o nel sottoscrittore, 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 Monitoraggio attività processi.

    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 il percorso e il livello di dettaglio 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.

    • È presente un problema di formattazione a causa del quale il trattino diventa un segno meno.

    • 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 dettaglio. Se si abilita la registrazione dettagliata, ma l'agente non viene avviato, provare a diminuire il livello di dettaglio specificato di 1.

  6. Riavvia l'agente di lettura log facendo clic con il pulsante destro del mouse sull'agente >Arresta 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. Esaminare l'output 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.

Ottenere aiuto

Contribuire alla documentazione di SQL

Il contenuto SQL può essere modificato. 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.