Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Configurazione della replica transazionale di SQL Server

La replica transazionale in SQL Server è una delle tecniche di replica più comunemente utilizzate per copiare o distribuire dati su più destinazioni. Negli articoli precedenti abbiamo discusso della replica di SQL Server e del funzionamento interno della replica. Ora il nostro obiettivo è vedere come configurare la replica transazionale in SQL Server utilizzando l'approccio di backup e come aggiungere o rimuovere correttamente gli articoli dalla replica. Senza misure adeguate, rischiamo di invalidare l'istantanea e di dover riconfigurare la replica.

Amministrazione della replica transazionale

Nei miei articoli precedenti, abbiamo esaminato le istruzioni dettagliate sugli elementi seguenti:

  • Configura distribuzione
  • Configura la pubblicazione con l'opzione Snapshot
  • Configura l'abbonamento con l'opzione Snapshot

Durante la configurazione della replica, abbiamo prima configurato il distributore. Quindi abbiamo proceduto a creare una pubblicazione e un abbonamento. Per eliminare o ripulire Replica, è necessario eseguire il processo inverso. Innanzitutto, dovremmo eliminare l'abbonamento, quindi la pubblicazione e, infine, eliminare il distributore o il database di distribuzione.

In questo articolo, proviamo a eliminare la replica transazionale in SQL Server che abbiamo configurato in precedenza. Utilizzeremo l'approccio Backup e aggiungeremo o rimuoveremo articoli da Replica nel modo seguente:

  • Annulla abbonamento
  • Rilascia pubblicazione
  • Distributore Drop o database di distribuzione
  • Ripulisci completamente la replica se uno qualsiasi dei passaggi precedenti non funziona correttamente
  • Configura la replica con il backup del database
  • Elimina articoli da Replication utilizzando sia l'approccio Wizard che T-SQL
  • Aggiungi nuovi articoli a Replication utilizzando sia l'approccio Wizard che T-SQL
  • Aggiungi un articolo Stored Procedure e studia la differenza tra l'articolo Tabella e l'articolo Stored Procedure

Rilascia abbonamento

Per eliminare qualsiasi replica configurata, dobbiamo prima eliminare l'abbonamento.

In SSMS, connettiti all'istanza del publisher> Replica > Pubblicazioni locali . Fai clic con il pulsante destro del mouse su Abbonamento> Elimina o Rilascia Abbonamento:

SQL Server ti chiederà di confermare la tua azione:

Fare clic su per abbandonare l'abbonamento. Questo farà cadere completamente l'abbonamento.

Nella mia configurazione attuale, sia l'editore che l'abbonato si trovano nella stessa istanza. Pertanto, non sono state inviate richieste di connessione all'istanza dell'abbonato per la convalida. Nel caso in cui lo avessimo su un'istanza diversa di SQL Server, richiederebbe di connettersi all'istanza dell'abbonato per convalidare prima di eliminare l'abbonato.

L'eliminazione della pubblicazione utilizza internamente la sp_droppublication e possiamo usare questa procedura per eliminare manualmente la pubblicazione tramite l'approccio T-SQL

Rilascia pubblicazione

Una volta che l'abbonamento è stato eliminato, possiamo procedere e eliminare la Pubblicazione . Fare clic con il pulsante destro del mouse su AdventureWorks_Pub e seleziona Elimina dal menu:

Vedrai un messaggio che ti chiede di confermare quell'azione. Nota che stai per eliminare la pubblicazione. Tuttavia, tutti i record che sono stati replicati nel database dell'abbonato non verranno eliminati. Dovremo eliminare manualmente il database per ripulire quei record replicati. Fai clic su .

L'eliminazione di una pubblicazione internamente applica la sp_droppublication procedura.

Elimina il distributore o il database di distribuzione

In precedenza abbiamo menzionato che il database di distribuzione è un database di sistema. Quindi, non possiamo rilasciarlo facendo clic con il pulsante destro del mouse sul database e selezionando l'opzione di eliminazione come con i database degli utenti. Se facciamo clic con il pulsante destro del mouse sul database di distribuzione, otteniamo solo le seguenti opzioni:

Quando dobbiamo eliminare il database di distribuzione, dobbiamo prima fare clic con il pulsante destro del mouse su Replica nodo> Disabilita Pubblicazione e distribuzione .

Si aprirà la procedura guidata.

Per impostazione predefinita, la seconda opzione (No, continua a utilizzare questo server come editore ) è selezionato per evitare la caduta accidentale di tutte le pubblicazioni sul server.

Nel nostro caso, abbiamo una sola pubblicazione e vorremmo ripulire. Quindi, selezioniamo la prima opzione:Sì, disabilita la pubblicazione su questo server . Rilascerà tutte le pubblicazioni insieme agli abbonamenti se non sono già state eliminate insieme alla disabilitazione del Distributore.

Possiamo usare questa stessa procedura guidata per ripulire tutto se il nostro server ha solo una replica configurata. Tuttavia, se sono configurate più repliche, eliminiamo la replica transazionale in SQL Server seguendo i passaggi standard condivisi sopra.

Ora dobbiamo selezionare la prima opzione Sì, disabilita la pubblicazione su questo server e fai clic su Avanti .

Nella nuova finestra, seleziona entrambe le opzioni:Disabilita pubblicazione e distribuzione e Genera un file di script con i passaggi...

Per generare il file di script, dovrai fornire il percorso in cui archiviarlo.

Fai clic su Avanti e visualizzare le opzioni selezionate nella procedura guidata. Verifica e assicurati di aver selezionato tutto correttamente.

Fai clic su Fine .

L'eliminazione interna del database di distribuzione utilizza sp_dropdistributor procedura.

Una volta che il Distributore è disabilitato, possiamo vedere che il database di distribuzione viene eliminato dai database di sistema.

Ripulisci completamente la replica se uno dei passaggi precedenti non funziona correttamente

Se la sottoscrizione o la pubblicazione viene eliminata tramite qualsiasi altro approccio, si verifica una rimozione incoerente della replica transazionale in SQL Server e si ottengono molti errori. Per ripulire tutti i residui di Abbonamento o Pubblicazione, possiamo utilizzare la procedura di sistema sp_removedbreplication .

exec_spremovedbreplication

Eseguire questa procedura solo se sono ancora presenti problemi di replica dopo aver provato tutti gli altri approcci menzionati. Stored procedure sp_removedbreplication deve essere eseguito sul database dell'editore o dal database principale e utilizzando il comando seguente dopo aver sostituito @dbname con il nome del database dell'editore.

exec_spremovedbreplication @dbname

Configura la replica utilizzando l'approccio di backup

Dopo aver rimosso completamente la replica, riconfiguriamo la replica transazionale in SQL Server utilizzando l'approccio di backup. Comprende i passaggi seguenti:

  • Configura il Distributore
  • Crea la pubblicazione
  • Modificare le proprietà della pubblicazione per abilitare la creazione dell'abbonamento dal backup completo o differenziale.
  • Fai un backup completo di Publisher e ripristinalo come abbonato.
  • Configura Abbonamento e avvia l'inizializzazione da Backup.

Abbiamo già eseguito la maggior parte dei passaggi in precedenza durante la configurazione della replica. Pertanto, non entreremo nei dettagli di questi passaggi qui.

Configura distributore e pubblicazione

Fare riferimento alle istruzioni dettagliate dell'articolo precedente su come configurare sia la distribuzione che la pubblicazione utilizzando la procedura guidata Crea pubblicazione. Per apprendere gli script T-SQL utilizzati dalla procedura guidata per creare la distribuzione e la pubblicazione, è sufficiente generare gli script in un file durante l'ultimo passaggio della procedura guidata e non eseguire gli script deselezionando l'opzione "Crea la pubblicazione" come mostrato di seguito .

Ora apri il file di script salvato in una nuova finestra di query per creare il distributore e la pubblicazione utilizzando quegli script:

Si prega di notare la seconda riga commentata:afferma che tutti i valori delle password che abbiamo inserito nella procedura guidata sono stati convertiti in NULL o in una stringa vuota per motivi di sicurezza. Dai un'occhiata alla riga evidenziata con @password =valori vuoti. Sostituiscilo con i valori di password corretti, fai lo stesso per le altre sezioni con password ed esegui lo script.

Lo script è stato eseguito correttamente. Possiamo vedere che l'esecuzione degli script ha creato il database di distribuzione e tutte le tabelle di sistema al suo interno. Alla fine del messaggio, possiamo vedere che anche il processo di Log Reader Agent è stato creato e avviato.

Se necessario, è possibile archiviare i risultati per conoscere tutte le tabelle, le viste e le procedure critiche nel database di distribuzione. Queste informazioni saranno utili per un'ulteriore risoluzione dei problemi.

Dopo la corretta esecuzione degli script, possiamo vedere il database di distribuzione e la pubblicazione creata correttamente.

Modifica le proprietà della pubblicazione per abilitare la creazione di abbonamenti dal backup completo o differenziale

Se la dimensione del database è molto piccola, il tempo necessario per inviare lo snapshot iniziale sarà più veloce.

D'altra parte, la creazione della replica transazionale in SQL Server utilizzando Snapshot non è efficiente nei seguenti casi:

  1. Se il database è enorme (300 GB o più). Il tempo necessario per inviare lo snapshot iniziale sarà troppo lungo.
  2. Se l'abbonato si trova in luoghi diversi con larghezza di banda di rete ridotta. Quindi il processo di snapshot iniziale durerà più giorni.

Pertanto, eseguire un backup completo, trasferirlo tramite FTP o fisicamente nell'altra posizione, ripristinare il backup e inizializzare l'abbonato sarà notevolmente più veloce rispetto all'approccio Snapshot.

Per consentire alla pubblicazione di supportare l'inizializzazione dai backup, è necessario modificare una delle proprietà della pubblicazione. Può essere eseguito tramite SSMS o T-SQL.

Approccio SSMS

Fai clic con il pulsante destro del mouse su AdventureWorks_pub pubblicazione e scegli Proprietà :

Fai clic su Opzioni di abbonamento :

Imposta Vero per Consenti inizializzazione da file di backup e fai clic su OK . Questo ci consentirà di eseguire l'inizializzazione sia dal backup completo che da quello differenziale.

Approccio T-SQL

In T-SQL, possiamo chiamare la procedura sp_changepublication per modificare questa proprietà.

Lo script per modificare questa proprietà è di seguito:

USE AdventureWorks
GO
exec sp_changepublication @publication = 'AdventureWorks_pub', @property = 'allow_initialize_from_backup', @value = 'true'

Fai un backup completo di Publisher e ripristinalo come abbonato

Un fattore chiave per notare che dobbiamo eseguire un backup completo dopo aver implementato la proprietà di pubblicazione sopra. Se la dimensione del database è enorme, possiamo eseguire un backup completo e ripristinarlo in modalità RECOVERY nell'istanza dell'abbonato, eseguire un backup differenziale dopo aver apportato la modifica alla configurazione sopra e ripristinarlo nel database dell'abbonato con la modalità NORECOVERY.

Configura l'abbonamento e avvia l'inizializzazione dal backup

Ancora una volta, fare riferimento alle istruzioni dettagliate. Dobbiamo generare gli script necessari ma non eseguirli. Il fatto è che inizializzeremo l'abbonamento dal backup completo o differenziale utilizzando solo script T-SQL. Ho creato quegli script durante la creazione dell'abbonamento l'ultima volta. Vedi il file aperto qui sotto.

Nota :Gli script per la creazione dell'abbonamento devono essere eseguiti dal database dell'editore. Quindi, apri la finestra Query connettendoti all'istanza Publisher.

Abbiamo bisogno di apportare alcune modifiche per l'inizializzazione dell'abbonamento dal backup:

  • Cambia il @sync_type valore da automatico per inizializzare con il backup
  • Fornire le password corrette per quelle sostituite con NULL o stringhe vuote. Dal momento che ho utilizzato l'account del servizio agente all'interno del server, non è necessario modificare le password.
  • Aggiungi i parametri @backupdevicetype e @backupdevicename e fornire il percorso per il backup completo o differenziale sul server di pubblicazione (lo script verrà eseguito su di esso).

Al termine, il nostro script sarà simile al seguente:

Esegui lo script per completare la configurazione dell'abbonamento e riceveremo il completamento corretto dello script come mostrato di seguito.

Come indica lo stato, il processo dell'agente di distribuzione SQL Server Agent è stato creato e avviato durante la creazione della sottoscrizione.

Pertanto, abbiamo creato con successo la nostra replica utilizzando l'approccio di backup. Ora possiamo verificare l'Abbonamento disponibile.

Avvia Replication Monitor e fai clic con il pulsante destro del mouse sull'abbonato. Mostrerà lo stato della replica:

Come possiamo vedere, tutti i dati sono stati inizializzati correttamente dal backup senza la necessità di eseguire il processo di Snapshot Agent. Poiché non ci sono transazioni attive in corso sul database, al momento viene visualizzato il messaggio "Nessuna transazione replicata disponibile" in Replication Monitor.

Elimina articoli dalla replica

Dopo aver appreso come configurare la replica transazionale in SQL Server tramite la procedura guidata di replica o gli script T-SQL, ora possiamo verificare come eliminare un articolo dalla replica tramite entrambi questi metodi.

Utilizzo della procedura guidata

Fare clic con il pulsante destro del mouse su AdventureWorks_pub Pubblicazione> Proprietà . Fare clic su Articolo per visualizzare l'elenco degli articoli inclusi in Replica.

Per impostazione predefinita, elencherà gli oggetti del database nel formato OBJECT_NAME (SCHEMA_NAME). A scopo di test, eliminiamo la tabella Person.ContactType dalla replica.

Per questo, deseleziona semplicemente la casella prima di ContactType (Persona). SQL Server mostrerà il messaggio di avviso o di conferma:

Come spiega, se ci sono istantanee attualmente disponibili, le istantanee verranno invalidate a causa delle modifiche agli articoli.

Poiché abbiamo inizializzato utilizzando l'approccio Backup e non abbiamo utilizzato le istantanee, possiamo tranquillamente ignorare questo messaggio e fare clic su per rimuovere questa tabella Articolo dalla replica. Fai clic su OK per completare la rimozione dell'articolo dalla replica.

Ora il Person.ContactType la tabella viene rimossa dalla replica. Eventuali modifiche apportate all'editore non verranno inviate al database dell'abbonato. Possiamo verificarlo inserendo record INSERT/UPDATE/DELETE su Person.ContactType tabella.

Utilizzo di T-SQL

Un altro modo è eliminare un articolo dalla replica con l'aiuto di sp_droparticle procedura.

USE [AdventureWorks]
GO
EXEC sp_droparticle 
  @publication = N'AdventureWorks_pub', 
  @article = N'ContactType',
  @force_invalidate_snapshot = 1;
GO

Aggiungi nuovi articoli alla replica tramite procedura guidata o approccio TSQL

In alcuni casi (come la manutenzione della tabella), potrebbe essere necessario rimuovere alcuni articoli e aggiungerli di nuovo alla replica una volta completata la manutenzione.

Abbiamo imparato con successo come rimuovere gli articoli dalla replica. Consideriamo come aggiungere nuovi articoli alla replica. Aggiungeremo il Person.ContactType tabella che abbiamo rimosso in precedenza per tornare alla replica.

Utilizzo della procedura guidata

Per aggiungere di nuovo un articolo della tabella alla replica, fai clic con il pulsante destro del mouse su Pubblicazione > Proprietà > Articoli . Verrà visualizzato l'elenco degli articoli disponibili nella pubblicazione.

Non siamo riusciti a trovare il Person.ContactType tabella:sullo schermo vengono visualizzate solo le tabelle che facevano parte della replica. Per vedere tutte le tabelle disponibili nel database di Publisher, deseleziona Mostra solo gli articoli selezionati nell'elenco per visualizzare tutte le tabelle.

Ora possiamo vedere il Person.ContactType tabella elencata.

Come discusso in precedenza, tutte le tabelle senza chiavi primarie avranno un cerchio rosso icona che indica che queste tabelle non possono essere incluse nella replica tramite procedura guidata o approccio T-SQL.

Controlla il ContactType (Persona) tabella per aggiungerla di nuovo alla replica e fare clic su OK .

La tabella viene nuovamente aggiunta alla replica. Tuttavia, dobbiamo elaborare un metodo per inviare lo snapshot iniziale per questo articolo della tabella appena aggiunto.

Se hai letto l'articolo finora, avresti indovinato:esegui semplicemente il processo dell'agente snapshot per inviare lo snapshot iniziale per questa tabella.

Facciamolo ora:fai clic con il pulsante destro del mouse su Pubblicazione > visualizza l'Agente snapshot stato.

Fare clic su Inizia per inviare l'istantanea per gli articoli idonei. Invia questi dati al database di distribuzione e, infine, al database degli abbonati.

Approccio T-SQL

Possiamo eseguire azioni simili usando sp_addarticle procedura.

Lo script seguente aggiungerà articoli alla replica.

use [AdventureWorks]
GO
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'ContactType', @source_owner = N'Person', @source_object = N'ContactType'
, @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509F
, @identityrangemanagementoption = N'manual', @destination_table = N'ContactType', @destination_owner = N'Person', @vertical_partition = N'false'
, @ins_cmd = N'CALL sp_MSins_PersonContactType'
, @del_cmd = N'CALL sp_MSdel_PersonContactType'
, @upd_cmd = N'SCALL sp_MSupd_PersonContactType'
GO

Abbiamo notato in precedenza come funziona la replica per un articolo di tabella applicando 3 procedure create nel database dell'abbonato per gestire le operazioni INSERT/UPDATE ed DELETE.

Utilizzando l'approccio T-SQL, sappiamo come si fa riferimento a queste procedure. Se necessario, possiamo rinominare oggetti, nomi di tabelle di destinazione o procedure predefinite. Per questo, apporteremo modifiche a sp_addarticle procedura.

NOTA :Se apportiamo modifiche alla replica, dovremmo documentarle tutte correttamente. Altrimenti, potrebbe portare a un disastro in seguito.

Aggiungi un articolo di stored procedure e studia la differenza tra un articolo da tabella e un articolo di stored procedure

Per aggiungere una stored procedure alla replica, è necessario accedere agli Articoli pagina e controllare la stored procedure richiesta per ottenerla replicata. Possiamo fare lo stesso per Visualizzazioni , Viste indicizzate o Funzioni definite dall'utente anche.

Per saperne di più sulla differenza tra gli articoli della tabella e le visualizzazioni/ stored procedure/viste indicizzate/funzioni definite dall'utente, possiamo aggiungere uno di ogni articolo per ogni categoria utilizzando T-SQL:

Aggiunta di un nuovo articolo di stored procedure alla replica

use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'uspGetBillOfMaterials', @source_owner = N'dbo'
, @source_object = N'uspGetBillOfMaterials', @type = N'proc schema only', @description = null, @creation_script = null
, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001, @force_invalidate_snapshot = 1
, @destination_table = N'uspGetBillOfMaterials', @destination_owner = N'dbo'

Aggiunta di una nuova visualizzazione articolo alla replica

use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'vVendorWithContacts', @source_owner = N'Purchasing'
, @source_object = N'vVendorWithContacts', @type = N'view schema only', @description = null, @creation_script = null, @pre_creation_cmd = N'drop'
, @schema_option = 0x0000000008000001, @destination_table = N'vVendorWithContacts', @destination_owner = N'Purchasing'
GO

Aggiunta di un nuovo articolo di visualizzazione indicizzata alla replica

use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'vStateProvinceCountryRegion', @source_owner = N'Person'
, @source_object = N'vStateProvinceCountryRegion', @type = N'indexed view schema only', @description = null, @creation_script = null
, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001, @force_invalidate_snapshot = 1
, @destination_table = N'vStateProvinceCountryRegion', @destination_owner = N'Person'

Aggiunta di un nuovo articolo sulla funzione definita dall'utente alla replica

use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'ufnGetStock', @source_owner = N'dbo', @source_object = N'ufnGetStock'
, @type = N'func schema only', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001
, @force_invalidate_snapshot = 1, @destination_table = N'ufnGetStock', @destination_owner = N'dbo'

Usiamo il sp_addarticle procedura per aggiungere qualsiasi tipo di articolo alla Replica con i parametri e le opzioni di input necessari modificando il @type incluso parametro.

Possiamo anche aggiungere questi articoli alla pubblicazione facendo clic con il pulsante destro del mouse su Pubblicazione > Proprietà > Articoli e aggiungendoli alla pubblicazione.

Proprietà articolo tabella

Ora, cambiamo le proprietà dell'articolo tramite gli Articoli menu nella Pubblicazione proprietà:

Fai clic sul nostro Person.ContactType preferito tabella> Proprietà articolo . Ci sarà un'opzione per modificare le Proprietà articolo solo per questa Tabella o per tutte le Tabelle incluse nella Replica. Per un test, selezioniamo Imposta proprietà dell'articolo della tabella evidenziata per visualizzare le proprietà di Person.ContactType tabella.

Vedi tutte le opzioni disponibili per questa tabella Articolo:

Copia oggetti e impostazioni nell'abbonato e Recapito dell'estratto conto sono le impostazioni più importanti per la replica. Dobbiamo stare molto attenti a modificare uno qualsiasi di questi parametri.

Fare clic sul formato di consegna INSERT\UPDATE\DELETE per ottenere le seguenti opzioni.

  • Non replicare le istruzioni INSERT\UPDATE\DELETE:per personalizzare la replica in modo da non inviare comandi specifici al database dell'abbonato
  • Istruzione INSERT\UPDATE\DELETE – per inviare l'istruzione INSERT\UPDATE\DELETE direttamente all'abbonato invece di ricostruire i dati dai registri transazionali
  • CALL – Esegui la stored procedure integrata mostrata sopra in sp_addarticle per replicare i dati.
  • XCALL – Esegue la stored procedure estesa per replicare le modifiche.

Proprietà articolo stored procedure

Fai clic su Proprietà articolo su una qualsiasi delle stored procedure per visualizzare le Proprietà

Una delle proprietà chiave della stored procedure è l'opzione Replica – vedere le opzioni disponibili di seguito:

  • Solo definizione di stored procedure – replica solo le modifiche alla struttura DDL di stored procedure. Questa è l'opzione predefinita per qualsiasi stored procedure.
  • Esecuzione della Stored Procedure – utilizzare questa opzione per ridurre il carico di replica. Esegue tutte le modifiche tramite l'esecuzione di stored procedure sull'abbonato senza inviare singoli comandi. Possiamo vedere questa funzione per risolvere i problemi di prestazioni durante la replica di enormi modifiche ai dati nel mio prossimo articolo.
  • Esecuzione in una transazione serializzata dell'SP – un'opzione ibrida per scegliere Esecuzione di stored procedure solo se la procedura viene eseguita all'interno di una transazione serializzata. Altrimenti verrebbe replicato come singoli comandi DML.

Visualizza proprietà articolo

Fai clic su Proprietà articolo per qualsiasi vista per ottenere le Proprietà :

Visualizza proprietà articolo indicizzato

Fai clic su Proprietà articolo per una qualsiasi delle Visualizzazioni indicizzate per le Proprietà :

Proprietà dell'articolo funzione definito dall'utente

Fai clic su Proprietà articolo su qualsiasi Funzione definita dall'utente per le sue Proprietà

Le proprietà delle viste, delle viste indicizzate e delle funzioni definite dall'utente sono praticamente le stesse. Quindi, non possiamo personalizzarli molto.

Conclusione

Grazie per aver esaminato un altro articolo ricco di energia relativo alla replica. Oggi abbiamo chiarito i dettagli sull'eliminazione di abbonamenti, pubblicazioni, database di distribuzione e sulla pulizia completa della replica anche in caso di problemi.

Abbiamo configurato una replica appena inizializzata dal backup e verificato come aggiungere nuovi articoli alla replica o rimuoverli da essa. Nell'ulteriore lavoro con i database e, in particolare, nella ricerca delle discrepanze tra di essi, trarrai grandi vantaggi dagli strumenti professionali. Il bundle di confronto dbForge per SQL Server identifica e analizza tutte queste differenze e le segnala.

Nel prossimo articolo esamineremo i problemi di replica frequenti e come risolverli in modo professionale.