Condividi tramite


Reinizializzare una sottoscrizione

In questo argomento viene descritto come reinizializzare una sottoscrizione in SQL Server 2012 tramite SQL Server Management Studio, Transact-SQL o RMO (Replication Management Objects). È possibile contrassegnare singole sottoscrizioni per la reinizializzazione in modo che nel corso della successiva sincronizzazione venga applicato un nuovo snapshot.

Contenuto dell'argomento

  • Per reinizializzare una sottoscrizione, utilizzando:

    SQL Server Management Studio

    Transact-SQL

    Oggetti RMO (Replication Management Objects)

Utilizzo di SQL Server Management Studio

Il processo di reinizializzazione di una sottoscrizione è articolato in due parti.

  1. Una singola sottoscrizione o tutte le sottoscrizioni di una pubblicazione vengono contrassegnate per la reinizializzazione. Contrassegnare le sottoscrizioni per la reinizializzazione nella finestra di dialogo Reinizializza sottoscrizioni, accessibile dalla cartella Pubblicazioni locali e dalla cartella Sottoscrizioni locali in Microsoft SQL Server Management Studio. È inoltre possibile contrassegnare le sottoscrizioni nella scheda Tutte le sottoscrizioni e nel nodo delle pubblicazioni in Monitoraggio replica. Per informazioni sull'avvio di Monitoraggio replica, vedere Avvio di Monitoraggio replica. Quando si contrassegna una sottoscrizione per la reinizializzazione, sono disponibili le opzioni seguenti:

    • Usa lo snapshot corrente
      Selezionare questa opzione per applicare lo snapshot corrente al Sottoscrittore alla successiva esecuzione dell'agente di distribuzione o di merge. Se non è disponibile uno snapshot valido, non è possibile selezionare questa opzione.

    • Usa un nuovo snapshot
      Selezionare questa opzione per reinizializzare la sottoscrizione con un nuovo snapshot. Lo snapshot può essere applicato al Sottoscrittore solo dopo essere stato generato dall'agente snapshot. Se l'agente snapshot è impostato in modo da essere eseguito in base a una pianificazione, la sottoscrizione verrà reinizializzata soltanto dopo la successiva esecuzione pianificata dell'agente snapshot. Per avviare l'agente snapshot immediatamente, selezionare Genera il nuovo snapshot ora.

    • Carica le modifiche non sincronizzate prima della reinizializzazione
      Solo per la replica di tipo merge. Selezionare questa opzione per caricare le eventuali modifiche in sospeso dal database della sottoscrizione prima che i dati nel Sottoscrittore vengano sovrascritti con uno snapshot.

      Se si aggiunge, elimina o modifica un filtro con parametri, le modifiche in sospeso nel Sottoscrittore non possono essere caricate nel server di pubblicazione durante la reinizializzazione. Se si desidera caricare le modifiche in sospeso, sincronizzare tutte le sottoscrizioni prima di modificare il filtro.

  2. Una sottoscrizione viene reinizializzata alla successiva sincronizzazione. L'agente di distribuzione (per la replica transazionale) o l'agente di merge (per la replica di tipo merge) applica lo snapshot più recente a ogni Sottoscrittore dotato di una sottoscrizione contrassegnata per la reinizializzazione. Per ulteriori informazioni sulla sincronizzazione delle sottoscrizioni, vedere Sincronizzazione di una sottoscrizione push e Sincronizzazione di una sottoscrizione pull.

Per contrassegnare una singola sottoscrizione push o pull per la reinizializzazione in Management Studio (nel server di pubblicazione)

  1. Connettersi al server di pubblicazione in Management Studio e quindi espandere il nodo del server.

  2. Espandere la cartella Replica e quindi la cartella Pubblicazioni locali.

  3. Espandere la pubblicazione di cui si desidera reinizializzare la sottoscrizione.

  4. Fare clic con il pulsante destro del mouse sulla sottoscrizione e quindi scegliere Reinizializza.

  5. Nella finestra di dialogo Reinizializza sottoscrizioni selezionare le opzioni desiderate e quindi fare clic su Contrassegna per la reinizializzazione.

Per contrassegnare una singola sottoscrizione pull per la reinizializzazione in Management Studio (nel Sottoscrittore)

  1. Connettersi al Sottoscrittore in Management Studio e quindi espandere il nodo del server.

  2. Espandere la cartella Replica e quindi la cartella Sottoscrizioni locali.

  3. Fare clic con il pulsante destro del mouse sulla sottoscrizione e quindi scegliere Reinizializza.

  4. Nella finestra di dialogo di conferma che viene visualizzata, fare clic su .

Per contrassegnare tutte le sottoscrizioni per la reinizializzazione in Management Studio

  1. Connettersi al server di pubblicazione in Management Studio e quindi espandere il nodo del server.

  2. Espandere la cartella Replica e quindi la cartella Pubblicazioni locali.

  3. Fare clic con il pulsante destro del mouse sulla pubblicazione di cui desidera reinizializzare le sottoscrizioni e quindi scegliere Reinizializza tutte le sottoscrizioni.

  4. Nella finestra di dialogo Reinizializza sottoscrizioni selezionare le opzioni desiderate e quindi fare clic su Contrassegna per la reinizializzazione.

Per contrassegnare una singola sottoscrizione push o pull per la reinizializzazione in Monitoraggio replica

  1. In Monitoraggio replica espandere un gruppo di server di pubblicazione nel riquadro di sinistra, espandere un server di pubblicazione e quindi fare clic su una pubblicazione.

  2. Fare clic sulla scheda Tutte le sottoscrizioni.

  3. Fare clic con il pulsante destro del mouse sulla sottoscrizione che si desidera reinizializzare e quindi scegliere Reinizializza sottoscrizione.

  4. Nella finestra di dialogo Reinizializza sottoscrizioni selezionare le opzioni desiderate e quindi fare clic su Contrassegna per la reinizializzazione.

Per contrassegnare tutte le sottoscrizioni per la reinizializzazione in Monitoraggio replica

  1. In Monitoraggio replica espandere un gruppo di server di pubblicazione nel riquadro di sinistra e quindi espandere un server di pubblicazione.

  2. Fare clic con il pulsante destro del mouse sulla pubblicazione di cui desidera reinizializzare le sottoscrizioni e quindi scegliere Reinizializza tutte le sottoscrizioni.

  3. Nella finestra di dialogo Reinizializza sottoscrizioni selezionare le opzioni desiderate e quindi fare clic su Contrassegna per la reinizializzazione.

Icona freccia utilizzata con il collegamento Torna all'inizio[Top]

Utilizzo di Transact-SQL

È possibile reinizializzare le sottoscrizioni a livello di programmazione tramite le stored procedure di replica. La stored procedure utilizzata dipende dal tipo di sottoscrizione, ovvero push o pull, nonché dal tipo di pubblicazione a cui appartiene la sottoscrizione.

Per reinizializzare una sottoscrizione pull in una pubblicazione transazionale

  1. Nel database di sottoscrizione del Sottoscrittore eseguire sp_reinitpullsubscription (Transact-SQL). Specificare i parametri @publisher, @publisher_db e @publication La sottoscrizione verrà contrassegnata per la reinizializzazione alla successiva esecuzione dell'agente di distribuzione.

  2. (Facoltativo) Avviare l'agente di distribuzione nel Sottoscrittore per sincronizzare la sottoscrizione. Per ulteriori informazioni, vedere Sincronizzazione di una sottoscrizione pull.

Per reinizializzare una sottoscrizione push in una pubblicazione transazionale

  1. Nel server di pubblicazione eseguire sp_reinitsubscription (Transact-SQL). Specificare i parametri @publication, @subscriber e @destination_db. La sottoscrizione verrà contrassegnata per la reinizializzazione alla successiva esecuzione dell'agente di distribuzione.

  2. (Facoltativo) Avviare l'agente di distribuzione nel server di distribuzione per sincronizzare la sottoscrizione. Per ulteriori informazioni, vedere Sincronizzazione di una sottoscrizione push.

Per reinizializzare una sottoscrizione pull in una pubblicazione di tipo merge

  1. Nel database di sottoscrizione del Sottoscrittore eseguire sp_reinitmergepullsubscription (Transact-SQL). Specificare i parametri @publisher, @publisher_db e @publication Per caricare le modifiche dal Sottoscrittore prima della reinizializzazione, specificare il valore true per @upload_first. La sottoscrizione verrà contrassegnata per la reinizializzazione alla successiva esecuzione dell'agente di merge.

    Nota importanteImportante

    In caso di aggiunta, eliminazione o modifica di un filtro con parametri, le modifiche in sospeso nel Sottoscrittore non potranno essere caricate nel server di pubblicazione durante la reinizializzazione. Se si desidera caricare le modifiche in sospeso, sincronizzare tutte le sottoscrizioni prima di modificare il filtro.

  2. (Facoltativo) Avviare l'agente di merge nel Sottoscrittore per sincronizzare la sottoscrizione. Per ulteriori informazioni, vedere Sincronizzazione di una sottoscrizione pull.

Per reinizializzare una sottoscrizione push in una pubblicazione di tipo merge

  1. Nel server di pubblicazione eseguire sp_reinitmergesubscription (Transact-SQL). Specificare i parametri @publication, @subscriber e @subscriber_db. Per caricare le modifiche dal Sottoscrittore prima della reinizializzazione, specificare il valore true per @upload_first. La sottoscrizione verrà contrassegnata per la reinizializzazione alla successiva esecuzione dell'agente di distribuzione.

    Nota importanteImportante

    In caso di aggiunta, eliminazione o modifica di un filtro con parametri, le modifiche in sospeso nel Sottoscrittore non potranno essere caricate nel server di pubblicazione durante la reinizializzazione. Se si desidera caricare le modifiche in sospeso, sincronizzare tutte le sottoscrizioni prima di modificare il filtro.

  2. (Facoltativo) Avviare l'agente di merge nel server di distribuzione per sincronizzare la sottoscrizione. Per ulteriori informazioni, vedere Sincronizzazione di una sottoscrizione push.

Per impostare i criteri di reinizializzazione durante la creazione di una nuova pubblicazione di tipo merge

  • Nel database di pubblicazione del server di pubblicazione eseguire sp_addmergepublication, specificando uno dei valori seguenti per @automatic_reinitialization_policy:

    • 1: le modifiche vengono caricate dal Sottoscrittore prima della reinizializzazione automatica di una sottoscrizione in seguito a una modifica della pubblicazione.

    • 0: le modifiche nel Sottoscrittore vengono eliminate quando una sottoscrizione viene reinizializzata automaticamente in seguito a una modifica della pubblicazione.

    Nota importanteImportante

    In caso di aggiunta, eliminazione o modifica di un filtro con parametri, le modifiche in sospeso nel Sottoscrittore non potranno essere caricate nel server di pubblicazione durante la reinizializzazione. Se si desidera caricare le modifiche in sospeso, sincronizzare tutte le sottoscrizioni prima di modificare il filtro.

    Per ulteriori informazioni, vedere Creazione di una pubblicazione.

Per modificare i criteri di reinizializzazione per una pubblicazione di tipo merge esistente

  • Nel database di pubblicazione del server di pubblicazione eseguire sp_changemergepublication, specificando automatic_reinitialization_policy per @property e uno dei valori seguenti per @value:

    • 1: le modifiche vengono caricate dal Sottoscrittore prima della reinizializzazione automatica di una sottoscrizione in seguito a una modifica della pubblicazione.

    • 0: le modifiche nel Sottoscrittore vengono eliminate quando una sottoscrizione viene reinizializzata automaticamente in seguito a una modifica della pubblicazione.

    Nota importanteImportante

    In caso di aggiunta, eliminazione o modifica di un filtro con parametri, le modifiche in sospeso nel Sottoscrittore non potranno essere caricate nel server di pubblicazione durante la reinizializzazione. Se si desidera caricare le modifiche in sospeso, sincronizzare tutte le sottoscrizioni prima di modificare il filtro.

    Per ulteriori informazioni, vedere Visualizzazione e modifica delle proprietà della pubblicazione.

Icona freccia utilizzata con il collegamento Torna all'inizio[Top]

Utilizzo di RMO (Replication Management Objects)

È possibile contrassegnare singole sottoscrizioni per la reinizializzazione in modo che nel corso della successiva sincronizzazione venga applicato un nuovo snapshot. Le sottoscrizioni possono essere reinizializzate a livello di programmazione tramite gli oggetti RMO (Replication Management Objects). Le classi utilizzate dipendono dal tipo di pubblicazione a cui appartiene la sottoscrizione e dal tipo di sottoscrizione, ovvero push o pull.

Per reinizializzare una sottoscrizione pull in una pubblicazione transazionale

  1. Creare una connessione al Sottoscrittore tramite la classe ServerConnection.

  2. Creare un'istanza della classe TransPullSubscription, quindi impostare PublicationName, DatabaseName, PublisherName, PublicationDBName e la connessione ottenuta al passaggio 1 per ConnectionContext.

  3. Chiamare il metodo LoadProperties per ottenere le proprietà dell'oggetto.

    [!NOTA]

    Se questo metodo restituisce false, le proprietà di sottoscrizione sono state definite in modo non corretto nel passaggio 2 oppure la sottoscrizione pull non esiste.

  4. Chiamare il metodo Reinitialize. Questo metodo contrassegna la sottoscrizione per la reinizializzazione.

  5. Sincronizzare la sottoscrizione pull. Per ulteriori informazioni, vedere Sincronizzazione di una sottoscrizione pull.

Per reinizializzare una sottoscrizione push in una pubblicazione transazionale

  1. Creare una connessione al server di pubblicazione tramite la classe ServerConnection.

  2. Creare un'istanza della classe TransSubscription, quindi impostare PublicationName, DatabaseName, SubscriberName, SubscriptionDBName e la connessione ottenuta al passaggio 1 per ConnectionContext.

  3. Chiamare il metodo LoadProperties per ottenere le proprietà dell'oggetto.

    [!NOTA]

    Se questo metodo restituisce false, le proprietà di sottoscrizione sono state definite in modo non corretto nel passaggio 2 oppure la sottoscrizione push non esiste.

  4. Chiamare il metodo Reinitialize. Questo metodo contrassegna la sottoscrizione per la reinizializzazione.

  5. Sincronizzare la sottoscrizione push. Per ulteriori informazioni, vedere Sincronizzazione di una sottoscrizione push.

Per reinizializzare una sottoscrizione pull in una pubblicazione di tipo merge

  1. Creare una connessione al Sottoscrittore tramite la classe ServerConnection.

  2. Creare un'istanza della classe MergePullSubscription, quindi impostare PublicationName, DatabaseName, PublisherName, PublicationDBName e la connessione ottenuta al passaggio 1 per ConnectionContext.

  3. Chiamare il metodo LoadProperties per ottenere le proprietà dell'oggetto.

    [!NOTA]

    Se questo metodo restituisce false, le proprietà di sottoscrizione sono state definite in modo non corretto nel passaggio 2 oppure la sottoscrizione pull non esiste.

  4. Chiamare il metodo Reinitialize. Passare il valore true per caricare le modifiche nel Sottoscrittore prima della reinizializzazione oppure il valore false per eseguire la reinizializzazione e perdere eventuali modifiche in sospeso nel Sottoscrittore. Questo metodo contrassegna la sottoscrizione per la reinizializzazione.

    [!NOTA]

    Se la sottoscrizione è scaduta, non sarà possibile caricare le modifiche. Per ulteriori informazioni, vedere Impostazione del periodo di scadenza per le sottoscrizioni.

  5. Sincronizzare la sottoscrizione pull. Per ulteriori informazioni, vedere Sincronizzazione di una sottoscrizione pull.

Per reinizializzare una sottoscrizione push in una pubblicazione di tipo merge

  1. Creare una connessione al server di pubblicazione tramite la classe ServerConnection.

  2. Creare un'istanza della classe MergeSubscription, quindi impostare PublicationName, DatabaseName, SubscriberName, SubscriptionDBName e la connessione ottenuta al passaggio 1 per ConnectionContext.

  3. Chiamare il metodo LoadProperties per ottenere le proprietà dell'oggetto.

    [!NOTA]

    Se questo metodo restituisce false, le proprietà di sottoscrizione sono state definite in modo non corretto nel passaggio 2 oppure la sottoscrizione push non esiste.

  4. Chiamare il metodo Reinitialize. Passare il valore true per caricare le modifiche nel Sottoscrittore prima della reinizializzazione oppure il valore false per eseguire la reinizializzazione e perdere eventuali modifiche in sospeso nel Sottoscrittore. Questo metodo contrassegna la sottoscrizione per la reinizializzazione.

    [!NOTA]

    Se la sottoscrizione è scaduta, non sarà possibile caricare le modifiche. Per ulteriori informazioni, vedere Impostazione del periodo di scadenza per le sottoscrizioni.

  5. Sincronizzare la sottoscrizione push. Per ulteriori informazioni, vedere Sincronizzazione di una sottoscrizione push.

Esempi (RMO)

In questo esempio viene eseguita la reinizializzazione di una sottoscrizione pull in una pubblicazione transazionale.

           // Define server, publication, and database names.
            String subscriberName = subscriberInstance;
            String publisherName = publisherInstance;
            String publicationName = "AdvWorksProductTran";
            String publicationDbName = "AdventureWorks2012";
            String subscriptionDbName = "AdventureWorks2012Replica";

            // Create a connection to the Subscriber.
            ServerConnection conn = new ServerConnection(subscriberName);

            TransPullSubscription subscription;

            try
            {
                // Connect to the Subscriber.
                conn.Connect();

                // Define subscription properties.
                subscription = new TransPullSubscription();
                subscription.ConnectionContext = conn;
                subscription.DatabaseName = subscriptionDbName;
                subscription.PublisherName = publisherName;
                subscription.PublicationDBName = publicationDbName;
                subscription.PublicationName = publicationName;

                // If the pull subscription and the job exists, mark the subscription
                // for reinitialization and start the agent job.
                if (subscription.LoadProperties() && subscription.AgentJobId != null)
                {
                    subscription.Reinitialize();
                    subscription.SynchronizeWithJob();
                }
                else
                {
                    // Do something here if the subscription does not exist.
                    throw new ApplicationException(String.Format(
                        "A subscription to '{0}' does not exists on {1}",
                        publicationName, subscriberName));
                }
            }
            catch (Exception ex)
            {
                // Do appropriate error handling here.
                throw new ApplicationException("The subscription could not be reinitialized.", ex);
            }
            finally
            {
                conn.Disconnect();
            }
' Define server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2012"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"

' Create a connection to the Subscriber.
Dim conn As ServerConnection = New ServerConnection(subscriberName)

Dim subscription As TransPullSubscription

Try
    ' Connect to the Subscriber.
    conn.Connect()

    ' Define subscription properties.
    subscription = New TransPullSubscription()
    subscription.ConnectionContext = conn
    subscription.DatabaseName = subscriptionDbName
    subscription.PublisherName = publisherName
    subscription.PublicationDBName = publicationDbName
    subscription.PublicationName = publicationName

    ' If the pull subscription and the job exists, mark the subscription
    ' for reinitialization and start the agent job.
    If subscription.LoadProperties() And (Not subscription.AgentJobId Is Nothing) Then
        subscription.Reinitialize()
        subscription.SynchronizeWithJob()
    Else
        ' Do something here if the subscription does not exist.
        Throw New ApplicationException(String.Format( _
         "A subscription to '{0}' does not exists on {1}", _
         publicationName, subscriberName))
    End If
Catch ex As Exception
    ' Do appropriate error handling here.
    Throw New ApplicationException("The subscription could not be reinitialized.", ex)
Finally
    conn.Disconnect()
End Try

In questo esempio viene eseguita la reinizializzazione di una sottoscrizione pull in una pubblicazione di tipo merge dopo aver prima caricato le modifiche in sospeso nel Sottoscrittore.

           // Define server, publication, and database names.
            String subscriberName = subscriberInstance;
            String publisherName = publisherInstance;
            String publicationName = "AdvWorksSalesOrdersMerge";
            String publicationDbName = "AdventureWorks2012";
            String subscriptionDbName = "AdventureWorks2012Replica";

            // Create a connection to the Subscriber.
            ServerConnection conn = new ServerConnection(subscriberName);

            MergePullSubscription subscription;

            try
            {
                // Connect to the Subscriber.
                conn.Connect();

                // Define subscription properties.
                subscription = new MergePullSubscription();
                subscription.ConnectionContext = conn;
                subscription.DatabaseName = subscriptionDbName;
                subscription.PublisherName = publisherName;
                subscription.PublicationDBName = publicationDbName;
                subscription.PublicationName = publicationName;

                // If the pull subscription and the job exists, mark the subscription
                // for reinitialization after upload and start the agent job.
                if (subscription.LoadProperties() && subscription.AgentJobId != null)
                {
                    subscription.Reinitialize(true);
                    subscription.SynchronizeWithJob();
                }
                else
                {
                    // Do something here if the subscription does not exist.
                    throw new ApplicationException(String.Format(
                        "A subscription to '{0}' does not exists on {1}",
                        publicationName, subscriberName));
                }
            }
            catch (Exception ex)
            {
                // Do appropriate error handling here.
                throw new ApplicationException("The subscription could not be synchronized.", ex);
            }
            finally
            {
                conn.Disconnect();
            }
' Define server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2012"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"

' Create a connection to the Subscriber.
Dim conn As ServerConnection = New ServerConnection(subscriberName)

Dim subscription As MergePullSubscription

Try
    ' Connect to the Subscriber.
    conn.Connect()

    ' Define subscription properties.
    subscription = New MergePullSubscription()
    subscription.ConnectionContext = conn
    subscription.DatabaseName = subscriptionDbName
    subscription.PublisherName = publisherName
    subscription.PublicationDBName = publicationDbName
    subscription.PublicationName = publicationName

    ' If the pull subscription and the job exists, mark the subscription
    ' for reinitialization after upload and start the agent job.
    If subscription.LoadProperties() And (Not subscription.AgentJobId Is Nothing) Then
        subscription.Reinitialize(True)
        subscription.SynchronizeWithJob()
    Else
        ' Do something here if the subscription does not exist.
        Throw New ApplicationException(String.Format( _
         "A subscription to '{0}' does not exists on {1}", _
         publicationName, subscriberName))
    End If
Catch ex As Exception
    ' Do appropriate error handling here.
    Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
    conn.Disconnect()
End Try

Icona freccia utilizzata con il collegamento Torna all'inizio[Top]

Vedere anche

Concetti

Reinizializzare le sottoscrizioni

Concetti di base relativi a RMO (Replication Management Objects)

Procedure consigliate per la sicurezza della replica