Sdílet prostřednictvím


Opětovné inicializace předplatného

platí pro:SQL Serverazure SQL Database

Toto téma popisuje, jak znovu inicializovat předplatné v SQL Serveru pomocí aplikace SQL Server Management Studio, Transact-SQL nebo objektů RMO (Replication Management Object). Jednotlivá předplatná je možné označit k opětovné inicializaci, aby se při další synchronizaci použil nový snímek.

Poznámka:

Spravovaná instance Azure SQL může být vydavatelem, distributorem a předplatitelem pro snímkovou a transakční replikaci. Databáze ve službě Azure SQL Database můžou být nabízeny pouze předplatitelům pro snímkovou a transakční replikaci. Další informace najdete v tématu Transakční replikace se službou Azure SQL Database a službou Azure SQL Managed Instance.

Použití aplikace SQL Server Management Studio

Opětovná inicializace předplatného je dvoudílný proces:

  1. Jedno předplatné nebo všechna předplatná publikace jsou označena k opětovné inicializaci. Označte předplatná pro opětovnou inicializaci v dialogovém okně Znovu inicializovat předplatná , která je k dispozici ze složky Místní publikace a složka Místní předplatná v aplikaci Microsoft SQL Server Management Studio. Odběry můžete také označit na kartě Všechny odběry a v uzlu Publikace v Monitorování replikace. Informace o spuštění služby Replication Monitor naleznete v tématu Spuštění monitorování replikace. Když označíte předplatné pro opětovné inicializaci, máte následující možnosti:

    Použití aktuálního snímku
    Při příštím spuštění distribučního agenta nebo slučovacího agenta vyberte, jestli chcete aktuální snímek použít pro odběratele. Pokud není k dispozici žádný platný snímek, tuto možnost nelze vybrat.

    Použijte nový snímek
    Vyberte, pokud chcete znovu inicializovat předplatné pomocí nového snímku. Snímek lze na odběratele použít teprve poté, co jej vygeneruje agent snímků. Pokud je agent snímku nastavený tak, aby běžel podle plánu, předplatné se znovu inicializuje až po dalším naplánovaném spuštění agenta snímku. Výběrem možnosti Vygenerovat nový snímek teď spusťte agenta snímků okamžitě.

    Nahrání nesynchronizovaných změn před opětovnou inicializací
    Sloučit pouze replikaci. Vyberte možnost nahrát všechny čekající změny z databáze předplatného, než budou data u odběratele přepsána snímkem.

    Pokud přidáte, zahodíte nebo změníte parametrizovaný filtr, změny čekající u odběratele nelze během opětovné inicializace nahrát na vydavatele. Pokud chcete nahrát čekající změny, před změnou filtru synchronizujte všechna předplatná.

  2. Předplatné se znovu inicializuje při příští synchronizaci: distribuční agent (pro transakční replikaci) nebo slučovací agent (pro slučovací replikaci) použije nejnovější snímek u každého odběratele, který má předplatné označené k opětovné inicializaci. Další informace o synchronizaci předplatných naleznete v tématu Synchronizace odesílaného předplatného a Synchronizace přijatého předplatného.

Označení jednotlivého push nebo pull předplatného pro reinitializaci v Management Studiu (v Publisheru)

  1. Připojte se k publikátoru v SQL Server Management Studio a poté rozbalte uzel serveru.

  2. Rozbalte složku Replikace a potom rozbalte složku Místní publikace .

  3. Rozbalte publikaci s předplatným, které chcete znovu inicializovat.

  4. Klikněte pravým tlačítkem myši na předplatné a potom klikněte na Znovu inicializovat.

  5. V dialogovém okně Znovu inicializovat předplatná vyberte možnosti a potom klepněte na tlačítko Označit pro opětovné inicializace.

Označení jednoho předplatného pro vyžádanou replikaci pro opětovnou inicializaci v Management Studio (u odběratele)

  1. Připojte se k odběrateli v prostředí Management Studio a pak rozbalte uzel serveru.

  2. Rozbalte složku Replikace a potom rozbalte složku Místní předplatná .

  3. Klikněte pravým tlačítkem myši na předplatné a potom klikněte na Znovu inicializovat.

  4. V potvrzovací dialogovém okně, které se zobrazí, klepněte na tlačítko Ano.

Označit všechna předplatná pro opětovnou inicializaci v Management Studio

  1. Připojte se k publikátoru v SQL Server Management Studio a poté rozbalte uzel serveru.

  2. Rozbalte složku Replikace a potom rozbalte složku Místní publikace .

  3. Klikněte pravým tlačítkem myši na publikaci s předplatnými, která chcete znovu inicializovat, a potom klepněte na tlačítko Znovu inicializovat všechna předplatná.

  4. V dialogovém okně Znovu inicializovat předplatná vyberte možnosti a potom klepněte na tlačítko Označit pro opětovné inicializace.

Označit jedno push nebo pull předplatné pro opětovnou inicializaci v Monitoru replikace

  1. V nástroji Sledování replikace rozbalte skupinu vydavatele v levém podokně, rozbalte položku Publisher a klikněte na publikaci.

  2. Klikněte na kartu Všechna předplatná .

  3. Klikněte pravým tlačítkem myši na předplatné, které chcete znovu inicializovat, a potom klepněte na tlačítko Znovu inicializovat předplatné.

  4. V dialogovém okně Znovu inicializovat předplatná vyberte možnosti a potom klepněte na tlačítko Označit pro opětovné inicializace.

Označit všechna předplatná pro opětovnou inicializaci v nástroji Replication Monitor

  1. V nástroji Sledování replikace rozbalte v levém podokně skupinu vydavatele a potom rozbalte položku Publisher.

  2. Klikněte pravým tlačítkem myši na publikaci s předplatnými, která chcete znovu inicializovat, a potom klepněte na tlačítko Znovu inicializovat všechna předplatná.

  3. V dialogovém okně Znovu inicializovat předplatná vyberte možnosti a potom klepněte na tlačítko Označit pro opětovné inicializace.

Použití Transact-SQL

Předplatná se dají znovu inicializovat prostřednictvím kódu programu pomocí uložených procedur replikace. Použitá uložená procedura závisí na typu předplatného (push nebo pull) a typu publikace, k níž předplatné patří.

Opět inicializovat pull odběr pro transakční publikaci

  1. U odběratele databáze předplatného spusťte sp_reinitpullsubscription (Transact-SQL). Zadejte @publisher, @publisher_db a @publication. Tímto se předplatné označí pro opětovnou inicializaci při dalším spuštění Distribučního agenta.

  2. (Volitelné) Spusťte distribučního agenta u odběratele a synchronizujte předplatné. Další informace naleznete v tématu Synchronizace vyžádaného odběru.

Chcete-li opětovně inicializovat push odběr na transakční publikaci

  1. V Publisheru spusťte sp_reinitsubscription (Transact-SQL). Zadejte @publication, @subscriber a @destination_db. Tím se označí předplatné pro opětovnou inicializaci při dalším spuštění Distribučního agenta.

  2. (Volitelné) Spusťte distribučního agenta u distributora a synchronizujte předplatné. Další informace naleznete v tématu Synchronizace push předplatného.

Chcete-li znovu inicializovat odběr se stažením pro slučovanou publikaci.

  1. U předplatitele na předplatitelské databázi spusťte sp_reinitmergepullsubscription (Transact-SQL). Zadejte @publisher, @publisher_db a @publication. Chcete-li nahrát změny od odběratele před opětovnou inicializací, zadejte hodnotu true pro @upload_first. Tím se označí předplatné pro opětovnou inicializaci při příštím spuštění agenta sloučení.

    Důležité

    Pokud přidáte, zahodíte nebo změníte parametrizovaný filtr, změny čekající na odběratele nelze během opětovné inicializace vydavatele nahrát. Pokud chcete nahrát čekající změny, před změnou filtru synchronizujte všechna předplatná.

  2. (Volitelné) Spusťte agenta sloučení u odběratele a synchronizujte předplatné. Další informace najdete v tématu Synchronizace zpětného odběru.

Opětovná inicializace push předplatného na sloučenou publikaci

  1. V Publisheru spusťte sp_reinitmergesubscription (Transact-SQL). Zadejte @publication, @subscriber a @subscriber_db. Chcete-li nahrát změny od odběratele před opětovnou inicializací, zadejte hodnotu true pro @upload_first. Tím se nastaví předplatné pro opětovnou inicializaci při příštím spuštění Distribučního agenta.

    Důležité

    Pokud přidáte, zahodíte nebo změníte parametrizovaný filtr, není možné u odběratele čekající změny během opětovné inicializace nahrát na vydavatele. Pokud chcete nahrát čekající změny, před změnou filtru synchronizujte všechna předplatná.

  2. (Volitelné) Spusťte agenta sloučení u distributora, aby se předplatné synchronizovalo. Další informace naleznete v části Synchronizace push předplatného.

Nastavení zásad opětovné inicializace při vytváření nové slučovací publikace

  1. V aplikaci Publisher v databázi publikace spusťte sp_addmergepublication a zadejte jednu z následujících hodnot pro @automatic_reinitialization_policy:

    • 1 – změny se nahrají od odběratele před tím, než se předplatné automaticky znovu inicializuje podle potřeby změnou publikace.

    • 0 – změny u odběratele se zahodí, když se předplatné automaticky znovu inicializuje, pokud to vyžaduje změna publikace.

    Důležité

    Pokud přidáte, odeberete nebo změníte parametrizovaný filtr, změny čekající u odběratele nelze během opětovné inicializace nahrát k vydavateli. Pokud chcete nahrát čekající změny, před změnou filtru synchronizujte všechna předplatná.

    Další informace naleznete v tématu Vytvoření publikace.

Změna zásad opětovné inicializace pro existující sloučenou publikaci

  1. V aplikaci Publisher v databázi publikace spusťte sp_changemergepublication a zadejte automatic_reinitialization_policy pro @property a jednu z následujících hodnot pro @value:

    • 1 – změny se nahrají od odběratele před tím, než se předplatné automaticky znovu inicializuje podle potřeby změnou publikace.

    • 0 – změny na straně odběratele se zahodí, když se předplatné automaticky znovu inicializuje podle požadavků způsobených změnou v publikaci.

    Důležité

    Pokud přidáte, odstraníte nebo změníte parametrizovaný filtr, čekající změny u odběratele nelze během opětovné inicializace nahrát k vydavateli. Pokud chcete nahrát čekající změny, před změnou filtru synchronizujte všechna předplatná.

    Další informace naleznete v tématu Zobrazit a upravit vlastnosti publikace.

Použití objektů správy replikace (RMO)

Jednotlivá předplatná je možné označit k opětovné inicializaci, aby se při další synchronizaci použil nový snímek. Předplatná se dají znovu inicializovat programově pomocí objektů RMO (Replication Management Objects). Třídy, které používáte, závisí na typu publikace, do které předplatné patří, a typu předplatného (to znamená nabízené nebo vyžádané předplatné).

Opětovná inicializace odběru typu "pull" pro transakční publikaci

  1. Vytvořte připojení k odběrateli pomocí ServerConnection třídy.

  2. Vytvořte instanci TransPullSubscription třídy a nastavte PublicationName, DatabaseName, PublisherNamePublicationDBName, a připojení z kroku 1 pro ConnectionContext.

  3. Zavolejte metodu LoadProperties pro získání vlastností objektu.

    Poznámka:

    Pokud tato metoda vrátí false, buď byly vlastnosti předplatného v kroku 2 definovány nesprávně, nebo pull předplatné neexistuje.

  4. Zavolejte metodu Reinitialize . Tato metoda označuje předplatné k opětovné inicializaci.

  5. Synchronizujte pull odběr. Další informace najdete v tématu Synchronizace odběru vyžádaného předplatného.

Opětovně inicializovat odesílací odběr pro transakční publikaci

  1. Vytvořte připojení k Publisheru pomocí ServerConnection třídy.

  2. Vytvořte instanci TransSubscription třídy a nastavte PublicationName, DatabaseName, SubscriberNameSubscriptionDBName, a připojení z kroku 1 pro ConnectionContext.

  3. Zavolejte metodu LoadProperties pro získání vlastností objektu.

    Poznámka:

    Pokud tato metoda vrátí hodnotu false, buď vlastnosti předplatného v kroku 2 byly definovány nesprávně nebo nabízené předplatné neexistuje.

  4. Zavolejte metodu Reinitialize . Tato metoda označuje odběr pro opětovnou inicializaci.

  5. Synchronizujte push předplatné. Další informace naleznete v tématu Synchronizace pushového předplatného.

Opětovná inicializace předplatného typu pull do sloučené publikace

  1. Vytvořte připojení k odběrateli pomocí ServerConnection třídy.

  2. Vytvořte instanci MergePullSubscription třídy a nastavte PublicationName, DatabaseName, PublisherNamePublicationDBName, a připojení z kroku 1 pro ConnectionContext.

  3. Zavolejte metodu LoadProperties pro získání vlastností objektu.

    Poznámka:

    Pokud tato metoda vrátí false, buď byly vlastnosti předplatného ve kroku 2 definovány nesprávně, nebo neexistuje stahované předplatné.

  4. Zavolejte metodu Reinitialize . Předejte hodnotu true pro nahrání změn u odběratele před opětovnou inicializací nebo hodnotu false pro opětovnou inicializaci a ztrátu všech nevyřízených změn u odběratele. Tato metoda označuje odběr pro opětovnou inicializaci.

    Poznámka:

    Změny nelze nahrát, pokud vypršela platnost předplatného. Další informace najdete v tématu Nastavení období vypršení platnosti pro předplatná.

  5. Synchronizujte odběr na požádání. Další informace naleznete v Synchronizaci odběru pull.

Opětovná inicializace push předplatného pro sloučenou publikaci

  1. Vytvořte připojení k Publisheru pomocí ServerConnection třídy.

  2. Vytvořte instanci MergeSubscription třídy a nastavte PublicationName, DatabaseName, SubscriberNameSubscriptionDBName, a připojení z kroku 1 pro ConnectionContext.

  3. Zavolejte metodu LoadProperties pro získání vlastností objektu.

    Poznámka:

    Pokud tato metoda vrátí hodnotu false, buď vlastnosti předplatného v kroku 2 byly definovány nesprávně nebo nabízené předplatné neexistuje.

  4. Zavolejte metodu Reinitialize . Předejte hodnotu true pro nahrání změn u odběratele před opětovnou inicializací nebo hodnotu false pro znovu inicializovat a ztratit všechny čekající změny u odběratele. Tato metoda označuje předplatné pro opětovnou inicializaci.

    Poznámka:

    Změny nelze nahrát, pokud vypršela platnost předplatného. Další informace najdete v tématu Nastavení období vypršení platnosti pro předplatná.

  5. Synchronizujte push předplatné. Další informace naleznete v tématu Synchronizace push předplatného.

Příklady (RMO)

Tento příklad znovu inicializuje odběr vyžádané replikace do transakční publikace.

// 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

Tento příklad znovu inicializuje odběr stažení ke sloučené publikaci po nahrání čekajících změn u odběratele.

// 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