Condividi tramite


Reinizializzare una sottoscrizione

Si applica a:Database SQL di Sql Serverdi Azure

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

Nota

Istanza gestita di SQL di Azure può essere un server di pubblicazione, un server di distribuzione e un Sottoscrittore per la replica snapshot e transazionale. I database nel database SQL di Azure possono essere solo sottoscrittori push per la replica snapshot e transazionale. Per altre informazioni, vedere Replica transazionale con il database SQL di Azure e con Istanza gestita di SQL di Azure.

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 Reinizializzare sottoscrizioni , disponibile nella cartella Pubblicazioni locali e nella 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 Avviare 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 dell'agente di merge. Se non sono disponibili snapshot validi, questa opzione non può essere selezionata.

    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. Per 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 Synchronize a Push Subscription e Synchronize a Pull Subscription.

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.

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_dbe @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 altre 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, @subscribere @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 altre 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_dbe @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.

    Importante

    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. Per 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 altre 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, @subscribere @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.

    Importante

    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. Per 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 altre informazioni, vedere Sincronizzazione di una sottoscrizione push.

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

  1. 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.

    Importante

    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. Per caricare le modifiche in sospeso, sincronizzare tutte le sottoscrizioni prima di modificare il filtro.

    Per altre informazioni, vedere Create a Publication.

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

  1. 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.

    Importante

    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. Per caricare le modifiche in sospeso, sincronizzare tutte le sottoscrizioni prima di modificare il filtro.

    Per altre informazioni, vedere View and Modify Publication Properties.

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, PublicationDBNamee la connessione ottenuta al passaggio 1 per ConnectionContext.

  3. Chiamare il metodo LoadProperties per recuperare 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 altre 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, SubscriptionDBNamee la connessione ottenuta al passaggio 1 per ConnectionContext.

  3. Chiamare il metodo LoadProperties per recuperare 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 altre 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, PublicationDBNamee la connessione ottenuta al passaggio 1 per ConnectionContext.

  3. Chiamare il metodo LoadProperties per recuperare 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 altre informazioni, vedere Set the Expiration Period for Subscriptions.

  5. Sincronizzare la sottoscrizione pull. Per altre 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, SubscriptionDBNamee la connessione ottenuta al passaggio 1 per ConnectionContext.

  3. Chiamare il metodo LoadProperties per recuperare 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 altre informazioni, vedere Set the Expiration Period for Subscriptions.

  5. Sincronizzare la sottoscrizione push. Per altre 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 = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";

// 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 = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"

' 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 = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";

// 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 = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"

' 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

Vedi anche

Reinizializzare le sottoscrizioni
Replication Management Objects Concepts
Procedure consigliate per la sicurezza della replica