Modalità di inizializzazione delle pubblicazioni e delle sottoscrizioni mediante la replica di tipo merge

Per consentire il flusso dei dati tra il server di pubblicazione e il Sottoscrittore è necessario inizializzare questi ultimi mediante la replica di tipo merge. In questo argomento vengono fornite informazioni sui passaggi eseguiti durante l'inizializzazione.

Inizializzazione della pubblicazione

Nell'elenco seguente vengono descritti in dettaglio i passaggi per l'inizializzazione di una pubblicazione che hanno luogo durante l'esecuzione di ogni stored procedure elencata o al completamento della Creazione guidata nuova pubblicazione. Ulteriori operazioni di inizializzazione vengono eseguite al termine della prima esecuzione dell'agente snapshot per una pubblicazione.

  • sp_replicationdboption

    • Il database di pubblicazione viene contrassegnato per la replica. Non è possibile eliminare il database a meno che la replica non venga rimossa.

    • Al database di pubblicazione vengono aggiunte tabelle di sistema, a meno che non sia già presente una pubblicazione di tipo merge. Per un elenco completo di tabelle di sistema, vedere la sezione "Tabelle di sistema create nei database di pubblicazione e sottoscrizione" in questo argomento.

  • sp_addmergepublication

    • Alle tabelle di sistema vengono aggiunte voci per la pubblicazione.
  • sp_addpublication_snapshot

    • Un processo dell'agente snapshot viene aggiunto al sistema SQL Server Agent. Il nome del processo ha il formato <Publisher>-<PublicationDatabase>-<Publication>-<Integer>.
  • sp_addmergearticle

    • Ogni oggetto di replica viene contrassegnato per la replica. Non è possibile eliminare l'oggetto a meno che l'articolo corrispondente non venga rimosso da tutte le pubblicazioni.

    • Alle tabelle di sistema vengono aggiunte voci per ogni articolo.

La parte restante dell'inizializzazione per il database di pubblicazione ha luogo durante l'esecuzione iniziale dell'agente snapshot per una pubblicazione (il database di pubblicazione non viene reinizializzato durante le successive esecuzioni dell'agente snapshot). Se si utilizza la Creazione guidata nuova pubblicazione, per impostazione predefinita lo snapshot iniziale viene creato al completamento della procedura guidata. Se si utilizzano stored procedure, è necessario eseguire il processo dell'agente o direttamente l'agente. Per ulteriori informazioni sull'esecuzione degli agenti, vedere Procedura: Avvio e interruzione di un agente di replica (SQL Server Management Studio) e Concetti di base relativi ai file eseguibili dell'agente di replica.

Alla prima esecuzione dell'agente snapshot per una pubblicazione:

  • Una colonna denominata rowguid viene aggiunta a ogni tabella pubblicata, a meno che la tabella non contenga già una colonna con il tipo di dati uniqueidentifier e la proprietà ROWGUIDCOL impostata (in tal caso viene utilizzata questa colonna). La colonna rowguid viene utilizzata per identificare in modo univoco tutte le righe di ogni tabella pubblicata. Se la tabella viene eliminata dalla pubblicazione, la colonna rowguid viene rimossa. Se invece è stata utilizzata una colonna esistente per il rilevamento, la colonna non viene rimossa.

  • Gli oggetti seguenti vengono creati nel database di pubblicazione per ogni tabella pubblicata (tutti gli oggetti vengono creati nello schema dbo):

    • Trigger di inserimento, aggiornamento ed eliminazione vengono aggiunti alle tabelle pubblicate per rilevare le modifiche. I nomi dei trigger hanno il formato MSmerge_ins_<GUID>, MSmerge_upd_<GUID> e MSmerge_del_<GUID>. Il valore GUID viene derivato dalla voce relativa all'articolo nella tabella di sistema sysmergearticles.

    • Vengono create stored procedure per la gestione di inserimenti, aggiornamenti ed eliminazioni di tabelle pubblicate e per l'esecuzione di diverse altre operazioni relative alla replica.

    • Vengono create viste per la gestione di inserimenti, aggiornamenti, eliminazioni e filtri.

    • Vengono create tabelle dei conflitti per l'archiviazione delle informazioni sui conflitti. Tali tabelle corrispondono allo schema delle tabelle pubblicate, ovvero ogni tabella pubblicata viene inserita nello script che quindi viene utilizzato per creare la tabella dei conflitti nel database di pubblicazione. I nomi delle tabelle dei conflitti hanno il formato dbo.MSmerge_conflict_<Publication>_<Article>.

A ogni esecuzione dell'agente snapshot, per ogni articolo del database di pubblicazione vengono creati i tipi di file seguenti, con le estensioni file corrispondenti:

  • Schema (sch)

  • Vincoli e indici (dri)

  • Trigger (trg)

  • Dati di tabelle di sistema (sys)

  • Tabelle dei conflitti (cft)

  • Dati (bcp) -- non creati per le pubblicazioni con filtri con parametri.

    Se nella pubblicazione non vengono utilizzati filtri con parametri, lo snapshot conterrà i dati relativi alle tabelle pubblicate in un set di file con estensione bcp. Se invece vengono utilizzati filtri con parametri (come avviene in genere per le pubblicazioni di tipo merge), lo snapshot iniziale non conterrà dati. I dati vengono forniti utilizzando uno snapshot per una partizione del Sottoscrittore, come illustrato nella sezione "Inizializzazione di una sottoscrizione".

Inizializzazione di una sottoscrizione

Ogni sottoscrizione viene inizializzata quando viene eseguito l'agente di merge per la sottoscrizione e copiato lo snapshot iniziale nel database di sottoscrizione. Oltre allo schema e ai dati degli oggetti replicati, lo snapshot contiene tabelle di sistema, viste, trigger e stored procedure presenti nel database di pubblicazione (nel database di sottoscrizione vengono anche copiate una o due tabelle di sistema aggiuntive). Per un elenco completo di tabelle di sistema, vedere la sezione "Tabelle di sistema create nei database di pubblicazione e sottoscrizione" in questo argomento. Se una sottoscrizione viene reinizializzata, tutti gli oggetti replicati e gli oggetti del sistema di replica vengono sovrascritti.

Se in nessuna delle tabelle del database di pubblicazione vengono utilizzati filtri con parametri, in ogni Sottoscrittore verrà copiato lo stesso snapshot di pubblicazione. Se vengono utilizzati uno o più filtri con parametri, la modalità di inizializzazione di ogni sottoscrizione sarà regolata dalla logica seguente:

  • Se la posizione dello snapshot viene fornita all'agente di merge dalla riga di comando:

    • Applicare lo snapshot da tale posizione.
  • Se invece lo snapshot è stato generato in precedenza:

    • Recuperare la posizione dello snapshot da MSmerge_dynamic_snapshots nel database di pubblicazione e applicare lo snapshot da tale posizione.
  • Se invece la pubblicazione consente ai Sottoscrittori di inizializzare gli snapshot:

    • Se è stato già generato uno snapshot per un altro Sottoscrittore con la stessa partizione, applicare tale snapshot al Sottoscrittore.

    • Altrimenti generare e applicare uno snapshot al Sottoscrittore.

  • Altrimenti inizializzare il Sottoscrittore utilizzando le istruzioni SELECT nelle tabelle della pubblicazione. Questo approccio è molto più lento dell'utilizzo di uno snapshot per la partizione del Sottoscrittore.

Se il trasferimento dello snapshot viene interrotto in un punto, verrà ripreso automaticamente senza rinviare i file di cui è stato completato il trasferimento. L'unità di recapito per l'agente snapshot è il file con estensione bcp per ogni articolo della pubblicazione e pertanto i file recapitati solo in parte devono essere recapitati nuovamente per intero. Il ripristino dello snapshot, tuttavia, può comportare una riduzione significativa della quantità di dati trasmessi e garantire il recapito dello snapshot in tempo utile anche se la connessione non è affidabile. Per ulteriori informazioni sulla creazione di snapshot, vedere Snapshot per pubblicazioni di tipo merge con filtri con parametri.

Posizione degli snapshot

La posizione degli snapshot dipende dalla specifica di un percorso predefinito o alternativo, dall'utilizzo o meno nella pubblicazione di un percorso UNC o di una condivisione FTP per la cartella snapshot e dall'utilizzo dei filtri con parametri. In questi esempi si presuppone che la posizione della cartella snapshot sia \\<MyComputer>\<MyFolder>\:

  • Se la pubblicazione utilizza un percorso UNC, la prima parte del percorso sarà \\<MyComputer>\<MyFolder>\unc\. Se utilizza una condivisione FTP, sarà \\<MyComputer>\<MyFolder>\ftp\.

  • Se la pubblicazione utilizza un percorso UNC e non utilizza filtri con parametri, il percorso sarà \\<MyComputer>\<MyFolder>\unc\<Publisher><Publicationdb><publication>

  • Se la pubblicazione utilizza un percorso UNC e filtri con parametri, la posizione si baserà sul percorso della cartella snapshot e sui criteri di filtro delle righe con parametri della pubblicazione. Se, ad esempio, l'articolo viene filtrato utilizzando la funzione HOST_NAME() il cui valore per la partizione è "SalesLaptop", il percorso dello snapshot per la partizione sarà \\<MyComputer>\<MyFolder>\unc\<Publisher><Publicationdb><publication>\ SalesLaptop_12\, dove 12 è l'ID utilizzato internamente per la partizione.

Tabelle di sistema create nei database di pubblicazione e sottoscrizione

Le tabelle seguenti vengono create nel database di pubblicazione e in ogni database di sottoscrizione.

Tabella

Descrizione

MSdynamicsnapshotjobs (Transact-SQL)

Contiene informazioni sui processi di snapshot per le pubblicazioni che utilizzano filtri con parametri.

MSdynamicsnapshotviews (Transact-SQL)

Rileva tutte le viste di snapshot temporanee create dall'agente snapshot. Viene utilizzata dal sistema per l'eliminazione delle viste in caso di chiusura anomala di SQL Server Agent o dell'agente snapshot.

MSmerge_altsyncpartners (Transact-SQL)

Tiene traccia dei partner di sincronizzazione correnti di un server di pubblicazione.

MSmerge_articlehistory (Transact-SQL)

Tiene traccia delle modifiche apportate agli articoli durante una sessione di sincronizzazione dell'agente di merge, con una riga per ogni articolo modificato.

MSmerge_conflicts_info (Transact-SQL)

Tiene traccia dei conflitti che si verificano durante la sincronizzazione di una sottoscrizione con una pubblicazione di tipo merge.

MSmerge_contents (Transact-SQL)

Include una riga per ogni riga modificata nel database corrente dal momento in cui è stato pubblicato. Questa tabella viene utilizzata durante il processo di merge per determinare le righe modificate.

MSmerge_current_partition_mappings

Contiene una riga per ogni partizione alla quale appartiene una determinata riga modificata.

MSmerge_dynamic_snapshots (Transact-SQL)

Tiene traccia della posizione dello snapshot per ogni partizione definita per una pubblicazione di tipo merge.

MSmerge_errorlineage (Transact-SQL)

Contiene righe che sono state eliminate nel Sottoscrittore, ma la cui eliminazione non è stata propagata al server di pubblicazione.

MSmerge_generation_partition_mappings (Transact-SQL)

Rileva se una determinata generazione contiene modifiche rilevanti per una specifica partizione.

MSmerge_genhistory (Transact-SQL)

Include una riga per ogni generazione. Una generazione è una raccolta di modifiche recapitate a un server di pubblicazione o a un Sottoscrittore. Le generazioni vengono chiuse ogni volta che viene eseguito l'agente di merge. Le modifiche successive in un database vengono aggiunte a una o più generazioni aperte.

MSmerge_history (Transact-SQL)

Contiene righe di cronologia con descrizioni dettagliate dei risultati delle precedenti sessioni dei processi dell'agente di merge.

MSmerge_identity_range (Transact-SQL)

Tiene traccia degli intervalli numerici assegnati a colonne Identity per le sottoscrizioni delle pubblicazioni per le quali la replica sta automaticamente gestendo assegnazioni di intervalli.

MSmerge_metadataaction_request (Transact-SQL)

Contiene una riga per ogni azione di compensazione richiesta. Un'azione di compensazione viene utilizzata per eseguire il rollback di una modifica in un nodo se la modifica non è riuscita in un altro nodo.

MSmerge_partition_groups (Transact-SQL)

Contiene una riga per ogni partizione pre-calcolata di un determinato database.

MSmerge_past_partition_mappings (Transact-SQL)

Contiene una riga per ogni partizione alla quale apparteneva in precedenza una determinata riga modificata.

MSmerge_replinfo (Transact-SQL)

Include una riga per ogni sottoscrizione. In questa tabella vengono elencate informazioni interne sulle generazioni inviate e ricevute.

MSmerge_sessions (Transact-SQL)

Contiene righe di cronologia con i risultati delle precedenti sessioni dei processi dell'agente di merge.

MSmerge_settingshistory (Transact-SQL)

Contiene una cronologia delle modifiche apportate alle proprietà dell'articolo e della pubblicazione, con una riga per ogni modifica apportata.

MSmerge_tombstone (Transact-SQL)

Include informazioni sulle righe eliminate e consente di propagare le eliminazioni ad altri Sottoscrittori.

MSrepl_errors (Transact-SQL)

Contiene informazioni dettagliate sugli errori dell'agente.

sysmergearticles (Transact-SQL)

Include una riga per ogni articolo di merge.

sysmergepartitioninfo (Transact-SQL)

Contiene informazioni sulle partizioni di ogni articolo, con una riga per ogni articolo.

sysmergepartitioninfoview (Transact-SQL)

Contiene informazioni di partizionamento per gli articoli di tabelle.

sysmergepublications (Transact-SQL)

Include una riga per ogni pubblicazione di tipo merge.

sysmergeschemaarticles (Transact-SQL)

Tiene traccia degli articoli relativi solo allo schema, come le stored procedure.

sysmergeschemachange (Transact-SQL)

Include informazioni sugli articoli pubblicati generati dall'agente snapshot.

sysmergesubscriptions (Transact-SQL)

Include una riga per ogni Sottoscrittore.

sysmergesubsetfilters (Transact-SQL)

Include informazioni sui filtri join per gli articoli partizionati.

Vengono inoltre create la tabella MSsnapshotdeliveryprogress in ogni database di sottoscrizione e la tabella MSsubscription_properties in ogni database di sottoscrizione che utilizza una sottoscrizione pull:

Tabella

Descrizione

MSsnapshotdeliveryprogress (Transact-SQL)

Tiene traccia dei file che sono stati recapitati al Sottoscrittore al momento dell'applicazione di uno snapshot. Tali dati vengono utilizzati per riprendere il recapito dei file nel caso in cui l'agente di merge non riesca a recapitare tutti i file durante la sessione.

MSsubscription_properties (Transact-SQL)

Contiene le informazioni sui parametri necessarie per l'esecuzione degli agenti di replica nel Sottoscrittore