Erstellen und Anwenden des ersten Snapshots

Gilt für:SQL ServerAzure SQL Managed Instance

In diesem Thema wird beschrieben, wie Sie den ersten Snapshot in SQL Server mithilfe von SQL Server Management Studio, Transact-SQL oder Replikationsverwaltungsobjekte (RMO) erstellen und anwenden. Mergepublikationen, die parametrisierte Filter verwenden, erfordern eine zweiteilige Momentaufnahme. Weitere Informationen finden Sie unter Erstellen einer Momentaufnahme für eine Mergeveröffentlichung mit parametrisierten Filtern.
Momentaufnahmen werden nach dem Erstellen einer Veröffentlichung vom Momentaufnahme-Agent generiert. Sie können folgendermaßen generiert werden:

  • Sofort. Standardmäßig wird ein Snapshot für eine Mergepublikation unmittelbar nach dem Erstellen der Publikation mit dem Assistenten für neue Publikationen generiert.
  • Zu einem geplanten Zeitpunkt. Geben Sie auf der Seite Snapshot-Agent des Assistenten für neue Veröffentlichungen oder bei der Verwendung gespeicherter Prozeduren oder von Replikationsverwaltungsobjekten (RMO) einen Zeitplan an.
  • Manuell. Führen Sie den Snapshot-Agent über die Eingabeaufforderung oder in SQL Server Management Studio aus. Weitere Informationen zum Ausführen von Agents finden Sie unter Ausführbare Konzepte für die Programmierung von Replikations-Agents und Starten und Beenden eines Replikations-Agents (SQL Server Management Studio).

Bei der Mergereplikation wird jedes Mal ein Snapshot erstellt, wenn der Snapshot-Agent ausgeführt wird. Bei der Transaktionsreplikation hängt die Momentaufnahmegenerierung von der Einstellung der immediate_sync-Veröffentlichungseigenschaft ab. Wenn die Eigenschaft auf TRUE gesetzt ist (die Standardeinstellung bei Verwendung des Assistenten für neue Veröffentlichungen), wird jedes Mal, wenn der Momentaufnahme-Agent ausgeführt wird, eine Momentaufnahme generiert, die jederzeit bei einem Abonnenten angewendet werden kann. Ist die Eigenschaft auf FALSE festgelegt (die Standardeinstellung bei der Verwendung von sp_addpublication), wird die Momentaufnahme nur dann generiert, wenn seit dem letzten Ausführen des Momentaufnahme-Agents ein neues Abonnement hinzugefügt wurde. Abonnenten können erst synchronisiert werden, nachdem der Momentaufnahme-Agent abgeschlossen ist.

Standardmäßig werden Momentaufnahmen, wenn sie generiert werden, im Standardordner für Momentaufnahmen gespeichert, der sich auf dem Verteiler befindet. Sie können Momentaufnahmedateien aber auch auf Wechselmedien wie z. B. Wechseldatenträgern, CD-ROMs oder an anderen Speicherorten als dem Standardmomentaufnahmeordner speichern. Darüber hinaus können Sie die Momentaufnahmedateien komprimieren, sodass sie leichter zu speichern und zu übertragen sind, und Skripts vor oder nach der Anwendung der Momentaufnahme auf den Abonnenten ausführen. Weitere Informationen zu diesen Optionen finden Sie unter Snapshot Options.

Handelt es sich um eine Momentaufnahme für eine Mergeveröffentlichung, die parametrisierte Filter verwendet, wird die Momentaufnahme mit einem zweiteiligen Prozess erstellt. Zuerst wird ein Schemasnapshot erstellt, der die Replikationsskripte und das Schema der veröffentlichten Objekte enthält, nicht jedoch die Daten. Jedes Abonnement wird dann mit einem Snapshot initialisiert, der die aus dem Schemasnapshot kopierten Skripte und das Schema sowie die Daten enthält, die zur Partition des Abonnements gehören. Weitere Informationen finden Sie unter Momentaufnahmen für Mergeveröffentlichungen mit parametrisierten Filtern.

Nachdem der Snapshot beim Publisher erstellt und an einem standardmäßigen oder alternativen Snapshot-Speicherort gespeichert wurde, kann er an den Subscriber übertragen und dort angewendet werden. Der Verteilungs-Agent (für Snapshot- oder Transaktionsreplikation) bzw. der Merge-Agent (für Mergereplikation) überträgt während der Erstsynchronisierung den Snapshot und wendet die Schema- und Datendateien in der Abonnementdatenbank des Abonnenten an. Standardmäßig erfolgt die Erstsynchronisierung sofort nach dem Erstellen eines Abonnements, wenn Sie den Assistenten für neue Abonnements verwenden. Dieses Verhalten wird von der Option Initialisierungszeitpunkt auf der Seite Abonnements initialisieren des Assistenten gesteuert. Wenn Momentaufnahmen generiert werden, nachdem ein Abonnement initialisiert wurde, werden sie nicht auf den Abonnenten angewendet, es sei denn, ein Abonnement ist für die erneute Initialisierung markiert. Weitere Informationen finden Sie unter Erneutes Initialisieren von Abonnements.

Nachdem der Verteilungs-Agent bzw. der Merge-Agent den Anfangssnapshot übernommen hat, überträgt der Agent nachfolgende Aktualisierungen und andere Datenänderungen. Wenn Momentaufnahmen an Abonnenten verteilt und auf ihnen angewendet werden, sind nur die Abonnenten betroffen, die auf eine Anfangsmomentaufnahme oder neue Momentaufnahmen warten. Andere Abonnenten dieser Veröffentlichung (diejenigen, die bereits Einfügungen, Updates, Löschungen oder andere Änderungen der veröffentlichten Daten empfangen) sind nicht betroffen.

Informationen zum Anzeigen oder Ändern des Standardordnerspeicherorts für Momentaufnahmen finden Sie unter

Standard-Speicherort für Snapshots

Geben Sie auf der Seite Snapshotordner des Assistenten zum Konfigurieren der Verteilung den Standardspeicherort für Momentaufnahmen an. Weitere Informationen zum Verwenden dieses Assistenten finden Sie unter Konfigurieren der Veröffentlichung und der Verteilung. Wenn Sie eine Veröffentlichung auf einem Server erstellen, der nicht als Distributor konfiguriert ist, geben Sie auf der Seite Momentaufnahmeordner im Assistenten für neue Veröffentlichungen einen Standardspeicherort für Momentaufnahmen an. Weitere Informationen zum Zugreifen auf diesen Assistenten finden Sie unter Erstellen einer Veröffentlichung.

Ändern Sie den Standardspeicherort für Momentaufnahmen auf der Seite > des Dialogfelds Verteilereigenschaften - Verteiler. Weitere Informationen finden Sie unter Anzeigen und Ändern der Verteiler- und Verlegereigenschaften. Bestimmen Sie den Momentaufnahmeordner für die einzelnen Veröffentlichungen im Dialogfeld Veröffentlichungseigenschaften - <Veröffentlichung>. Weitere Informationen finden Sie unter View and Modify Publication Properties.

Ändern Sie den Standardspeicherort für Snapshots

  1. Klicken Sie auf der Seite Publisher des Dialogfelds Verteilereigenschaften – <Distributor> auf die Eigenschaften-Schaltfläche (...) für den Publisher, für den Sie den Standardspeicherort für Momentaufnahmen ändern möchten.

  2. Geben Sie im Dialogfeld Veröffentlichungseigenschaften - <Publisher> einen Wert für die Eigenschaft Standardsnapshotordner ein.

    Hinweis

    Der Snapshot-Agent muss Schreibberechtigungen für das von Ihnen angegebene Verzeichnis haben, und der Verteilungs-Agent oder Merge-Agent muss über Leseberechtigungen verfügen. Wenn Pullabonnements verwendet werden, müssen Sie ein freigegebenes Verzeichnis als Pfad in der Universal Naming Convention (UNC) angeben, beispielsweise \\computername\snapshot. Weitere Informationen finden Sie unter Absichern des Snapshot-Ordners.

  3. Wählen Sie OK aus.

Erstellen einer Momentaufnahme

Standardmäßig wird unmittelbar nach dem Erstellen einer Veröffentlichung mit dem Assistenten für neue Veröffentlichungen eine Momentaufnahme durch den Momentaufnahme-Agent generiert, sofern SQL Server-Agent ausgeführt wird. Standardmäßig wird sie dann vom Verteilungs-Agent (bei der Momentaufnahme- und Transaktionsreplikation) oder vom Merge-Agent (für Mergeabonnements) auf alle Abonnements angewandt. Eine Momentaufnahme kann auch mit SQL Server Management Studio und dem Replikationsmonitor generiert werden. Informationen zum Starten des Replikationsmonitors finden Sie unter Starten des Replikationsmonitors.

Verwendung von SQL Server Management Studio

  1. Stellen Sie mit dem Herausgeber in Management Studio eine Verbindung her, und erweitern Sie dann den Serverknoten.
  2. Erweitern Sie den Ordner Replikation , und erweitern Sie dann den Ordner Lokale Veröffentlichungen .
  3. Klicken Sie mit der rechten Maustaste auf die Veröffentlichung, für die Sie eine Momentaufnahme erstellen möchten, und klicken Sie anschließend auf Status des Momentaufnahme-Agents anzeigen.
  4. Klicken Sie im Dialogfeld Status des Momentaufnahme-Agents anzeigen - <Publication> auf Start.
    Nachdem der Momentaufnahme-Agent die Momentaufnahme generiert hat, wird eine Meldung angezeigt, die beispielsweise wie folgt lautet: "[100%] Es wurde eine Momentaufnahme mit 17 Artikel(n) generiert".

Im Replikationsmonitor:

  1. Erweitern Sie im Replikationsmonitor im linken Bereich eine Verlegergruppe, und erweitern Sie dann einen Verleger.
  2. Klicken Sie mit der rechten Maustaste auf die Veröffentlichung, für die Sie eine Momentaufnahme generieren möchten, und klicken Sie anschließend auf Momentaufnahme generieren.
  3. Um den Status der Momentaufnahmen-Agent anzuzeigen, klicken Sie auf die Registerkarte Agents. Wenn Sie ausführlichere Informationen benötigen, klicken Sie mit der rechten Maustaste auf die Momentaufnahmen-Agent im Raster und klicken Sie dann auf Details anzeigen.

Verwenden von Transact-SQL

Sie können erste Snapshots programmgesteuert erstellen, indem Sie entweder einen Auftrag für den Snapshot-Agent erstellen und ausführen oder die ausführbare Datei des Snapshot-Agent über eine Batchdatei ausführen. Nachdem eine Anfangsmomentaufnahme generiert wurde, wird sie an den Abonnenten übertragen und auf diesen angewendet, sobald die erste Synchronisierung für das Abonnement durchgeführt wird. Wenn Sie den Snapshot-Agent über die Eingabeaufforderung oder per Batchdatei ausführen, müssen Sie den Agenten jeweils erneut ausführen, sobald der vorhandene Snapshot ungültig wird.

Wichtig

Fordern Sie Benutzer nach Möglichkeit auf, Sicherheitsanmeldeinformationen zur Laufzeit einzugeben. Wenn Anmeldeinformationen in einer Skriptdatei gespeichert werden müssen, muss die Datei an einem sicheren Ort gespeichert werden, um unberechtigten Zugriff zu vermeiden.

  1. Erstellen Sie eine Snapshot-, Transaktions- oder Mergeveröffentlichung. Weitere Informationen finden Sie unter Create a Publication.

  2. Führen Sie sp_addpublication_snapshot (Transact-SQL) aus. Geben Sie @publication und die folgenden Parameter an:

    • Das @job_login, das die Windows-Authentifizierungsanmeldeinformationen angibt, unter denen der Momentaufnahme-Agent auf dem Verteiler ausgeführt wird.

    • Das @job_password, das das Kennwort für die angegebenen Windows-Anmeldeinformationen ist.

    • (Optional) Den Wert 0 für @publisher_security_mode , wenn der Agent die SQL Server-Authentifizierung zum Herstellen der Verbindung mit dem Verleger verwendet. In diesem Fall müssen Sie auch die Anmeldeinformationen für die SQL Server-Authentifizierung für @publisher_login und @publisher_passwordangeben.

    • (Optional) Ein Synchronisierungsplan für den Snapshot-Agent-Auftrag. Weitere Informationen finden Sie unter Angeben von Synchronisierungszeitplänen.

    Wichtig

    Beim Konfigurieren eines Verlegers mit einem Remoteverteiler werden die Werte, die für alle Parameter, einschließlich job_login und job_password, bereitgestellt werden, als Nur-Text an den Verteiler gesendet. Sie sollten die Verbindung zwischen dem Verleger und dem zugehörigen Remoteverteiler verschlüsseln, bevor Sie diese gespeicherte Prozedur ausführen. Weitere Informationen finden Sie unter Aktivieren von verschlüsselten Verbindungen zur Datenbank-Engine (SQL Server-Konfigurations-Manager).

  3. Fügen Sie der Veröffentlichung Artikel hinzu. Weitere Informationen finden Sie unter Definieren eines Artikels.

  4. Führen Sie beim Publisher in der Veröffentlichungsdatenbank sp_startpublication_snapshot (Transact-SQL) aus, wobei Sie den Wert von @publication aus Schritt 1 angeben.

Snapshot anwenden

Verwendung von SQL Server Management Studio

  1. Nachdem die Momentaufnahme generiert wurde, wird sie angewendet, indem das Abonnement mit dem Verteiler-Agent oder dem Merge-Agent synchronisiert wird:

    • Wenn der Agent so eingestellt ist, dass er kontinuierlich ausgeführt wird (die Standardeinstellung für die Transaktionsreplikation), wird der Snapshot nach seiner Erstellung automatisch angewendet.
    • Wenn der Agent so konfiguriert ist, dass er nach Zeitplan ausgeführt wird, wird die Momentaufnahme angewendet, wenn der Agent das nächste Mal planmäßig ausgeführt wird.
    • Wenn der Agent so eingestellt ist, dass er bei Bedarf ausgeführt wird, wird dies bei der nächsten Ausführung des Agenten angewendet.

    Weitere Informationen zum Synchronisieren von Abonnements finden Sie unter Synchronisieren eines Pushabonnements und Synchronisieren eines Pullabonnements.

Verwenden von Transact-SQL

  1. Erstellen Sie eine Snapshot-, Transaktions- oder Mergeveröffentlichung. Weitere Informationen finden Sie unter Create a Publication.

  2. Fügen Sie der Veröffentlichung Artikel hinzu. Weitere Informationen finden Sie unter Definieren eines Artikels.

  3. Starten Sie den Replication Momentaufnahmen-Agent von der Eingabeaufforderung oder in einer Batchdatei, indem Sie die Datei snapshot.exeausführen. Geben Sie hierzu die folgenden Befehlszeilenargumente ein:

    • -Publikation
    • -Publisher
    • -Distributor
    • -PublisherDB
    • -ReplicationType

    Wenn Sie die SQL Server-Authentifizierung verwenden, müssen Sie auch die folgenden Argumente angeben:

    • -DistributorLogin
    • -DistributorPassword
    • -DistributorSecurityMode = 0
    • -PublisherLogin
    • -PublisherPassword
    • -PublisherSecurityMode = 0

Beispiele (Transact-SQL)

In diesem Beispiel wird gezeigt, wie eine Transaktionsveröffentlichung erstellt und der neuen Veröffentlichung ein Auftrag für den Snapshot-Agent hinzugefügt wird (mithilfe von sqlcmd-Skriptvariablen). Das Beispiel startet auch den Job.

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; --publication database
SET @publication = N'AdvWorksCustomerTran'; -- transactional publication name
SET @login = $(Login);
SET @password = $(Password);

USE [AdventureWorks]

-- Enable transactional and snapshot replication on the publication database.
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname = N'publish',
  @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
  @job_login = @login, 
  @job_password = @password,
  -- Explicitly specify the security mode used when connecting to the Publisher.
  @publisher_security_mode = 1;

-- Create new transactional publication, using the defaults. 
USE [AdventureWorks2022]
EXEC sp_addpublication 
  @publication = @publication, 
  @description = N'transactional publication';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

In diesem Beispiel wird eine Mergeveröffentlichung erstellt und ein Momentaufnahme-Agentauftrag für die Veröffentlichung hinzugefügt (mithilfe von sqlcmd -Variablen). Im Beispiel wird der Auftrag auch gestartet.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; 
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @login = $(Login);
SET @password = $(Password);

-- Enable merge replication on the publication database.
USE master
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname=N'merge publish',
  @value = N'true';

-- Create new merge publication, using the defaults. 
USE [AdventureWorks]
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication.';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

Mit den folgenden Befehlszeilenargumenten wird der Snapshot-Agent gestartet, um die Momentaufnahme für eine Mergeveröffentlichung zu erstellen.

Hinweis

Zeilenumbrüche wurden hinzugefügt, um die Lesbarkeit zu verbessern. In einer Batchdatei müssen Befehle in einer einzelnen Zeile stehen.

  
REM -- Declare variables  
SET Publisher=%InstanceName%  
SET PublicationDB=AdventureWorks2022   
SET Publication=AdvWorksSalesOrdersMerge   
  
REM --Start the Snapshot Agent to generate the snapshot for AdvWorksSalesOrdersMerge.  
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %Publication%   
-Publisher %Publisher% -Distributor %Publisher% -PublisherDB %PublicationDB%   
-ReplicationType 2 -OutputVerboseLevel 1 -DistributorSecurityMode 1  
  

Verwenden von Replikationsverwaltungsobjekten (RMO)

Der Momentaufnahme-Agent generiert Momentaufnahmen, nachdem eine Veröffentlichung erstellt wurde. Sie können diese Momentaufnahmen mit Replikationsverwaltungsobjekten (RMO) und dem direkten Zugriff von verwaltetem Code auf Funktionen des Replikations-Agents programmgesteuert generieren. Welche Objekte Sie verwenden, hängt vom Typ der Replikation ab. Der Snapshot-Agent kann synchron mit dem SnapshotGenerationAgent-Objekt oder asynchron über den Agentauftrag gestartet werden. Nachdem die Anfangsmomentaufnahme generiert wurde, wird sie an den Abonnenten übertragen und auf diesen angewendet, sobald die erste Synchronisierung für das Abonnement durchgeführt wird. Sie müssen den Agent immer dann erneut ausführen, wenn der vorhandene Snapshot keine gültigen, aktuellen Daten mehr enthält. Weitere Informationen finden Sie unter Verwalten von Veröffentlichungen.

Wichtig

Fordern Sie Benutzer nach Möglichkeit auf, Sicherheitsanmeldeinformationen zur Laufzeit einzugeben. Wenn Sie Anmeldeinformationen speichern müssen, verwenden Sie die Kryptografiedienste von Microsoft Windows .NET Framework.

So generieren Sie die Anfangsmomentaufnahme für eine Momentaufnahme- oder Transaktionsveröffentlichung durch Starten des Auftrags des Momentaufnahme-Agents (asynchron)

  1. Erstellen Sie eine Verbindung mit dem Verleger, indem Sie die ServerConnection -Klasse verwenden.

  2. Erstellen Sie eine Instanz der TransPublication-Klasse. Legen Sie die Name -Eigenschaft und die DatabaseName -Eigenschaft für die Veröffentlichung fest, und legen Sie die ConnectionContext -Eigenschaft auf die in Schritt 1 erstellte Verbindung fest.

  3. Rufen Sie die LoadProperties -Methode auf, um die restlichen Objekteigenschaften zu laden. Wenn diese Methode falsezurückgibt, sind die Veröffentlichungseigenschaften in Schritt 2 falsch definiert, oder die Veröffentlichung ist nicht vorhanden.

  4. Wenn der Wert von SnapshotAgentExistsfalse lautet, rufen Sie CreateSnapshotAgent auf, um den Agentauftrag für die Snapshoterstellung für diese Veröffentlichung zu erstellen.

  5. Rufen Sie die StartSnapshotGenerationAgentJob -Methode auf, um den Agentauftrag zu starten, der die Momentaufnahme für diese Veröffentlichung generiert.

  6. (Optional) Wenn der Wert von SnapshotAvailable auf truelautet, steht die Momentaufnahme den Abonnenten zur Verfügung.

So generieren Sie den anfänglichen Snapshot für eine Snapshot- oder Transaktionspublikation durch das Ausführen des Snapshot-Agents (synchron)

  1. Erstellen Sie eine Instanz der SnapshotGenerationAgent -Klasse, und legen Sie die folgenden erforderlichen Eigenschaften fest:

    • Publisher – Name des Verlegers

    • PublisherDatabase – Name der Veröffentlichungsdatenbank

    • Publication – Name der Veröffentlichung

    • Distributor – Name des Vertriebspartners

    • PublisherSecurityMode – ein Wert von Integrated, um bei der Verbindung mit dem Publisher die Windows-Authentifizierung zu verwenden, oder ein Wert von Standard sowie Werte für PublisherLogin und , um bei der Verbindung mit dem Publisher die SQL Server-Authentifizierung zu verwenden. Die Windows-Authentifizierung wird empfohlen.

    • DistributorSecurityMode Den Wert Integrated zur Verwendung der Windows-Authentifizierung, wenn eine Verbindung mit dem Verteiler hergestellt wird, oder den Wert Standard sowie Werte für DistributorLogin und DistributorPassword zur Verwendung der SQL Server-Authentifizierung, wenn eine Verbindung mit dem Verteiler hergestellt wird. Die Windows-Authentifizierung wird empfohlen.

  2. Legen Sie den Wert Transactional oder Snapshot für ReplicationTypefest.

  3. Rufen Sie die GenerateSnapshot-Methode auf.

So generieren Sie die Anfangsmomentaufnahme für eine Mergeveröffentlichung durch Starten des Auftrags des Momentaufnahme-Agents (asynchron)

  1. Erstellen Sie eine Verbindung mit dem Verleger, indem Sie die ServerConnection -Klasse verwenden.

  2. Erstellen Sie eine Instanz der MergePublication-Klasse. Legen Sie die Name -Eigenschaft und die DatabaseName -Eigenschaft für die Veröffentlichung fest, und legen Sie die ConnectionContext -Eigenschaft auf die in Schritt 1 erstellte Verbindung fest.

  3. Rufen Sie die LoadProperties -Methode auf, um die restlichen Objekteigenschaften zu laden. Wenn diese Methode falsezurückgibt, sind die Veröffentlichungseigenschaften in Schritt 2 falsch definiert, oder die Veröffentlichung ist nicht vorhanden.

  4. Wenn der Wert von SnapshotAgentExistsfalse lautet, rufen Sie CreateSnapshotAgent auf, um den Agentauftrag für die Snapshoterstellung für diese Veröffentlichung zu erstellen.

  5. Rufen Sie die StartSnapshotGenerationAgentJob -Methode auf, um den Agentauftrag zu starten, der die Momentaufnahme für diese Veröffentlichung generiert.

  6. (Optional) Wenn der Wert von SnapshotAvailable auf truelautet, steht die Momentaufnahme den Abonnenten zur Verfügung.

So generieren Sie die Anfangsmomentaufnahme für eine Mergeveröffentlichung durch Ausführen des Momentaufnahme-Agents (synchron)

  1. Erstellen Sie eine Instanz der SnapshotGenerationAgent -Klasse, und legen Sie die folgenden erforderlichen Eigenschaften fest:

    • Publisher – Name des Verlegers

    • PublisherDatabase – Name der Veröffentlichungsdatenbank

    • Publication – Name der Veröffentlichung

    • Distributor – Name des Distributors

    • PublisherSecurityMode – ein Wert von Integrated zur Verwendung der Windows-Authentifizierung beim Herstellen einer Verbindung mit dem Publisher oder ein Wert von Standard sowie Werte für PublisherLogin und zur Verwendung der SQL Server-Authentifizierung beim Herstellen einer Verbindung mit dem Publisher. Die Windows-Authentifizierung wird empfohlen.

    • DistributorSecurityMode Den Wert Integrated zur Verwendung der Windows-Authentifizierung, wenn eine Verbindung mit dem Verteiler hergestellt wird, oder den Wert Standard sowie Werte für DistributorLogin und DistributorPassword zur Verwendung der SQL Server-Authentifizierung, wenn eine Verbindung mit dem Verteiler hergestellt wird. Die Windows-Authentifizierung wird empfohlen.

  2. Legen Sie den Wert Merge für ReplicationTypefest.

  3. Rufen Sie die GenerateSnapshot-Methode auf.

Beispiele (RMO)

In diesem Beispiel wird der Snapshot-Agent synchron ausgeführt, um die anfängliche Momentaufnahme für eine transaktionale Veröffentlichung zu generieren.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;
string distributorName = publisherInstance;

SnapshotGenerationAgent agent;

try
{
    // Set the required properties for Snapshot Agent.
    agent = new SnapshotGenerationAgent();
    agent.Distributor = distributorName;
    agent.DistributorSecurityMode = SecurityMode.Integrated;
    agent.Publisher = publisherName;
    agent.PublisherSecurityMode = SecurityMode.Integrated;
    agent.Publication = publicationName;
    agent.PublisherDatabase = publicationDbName;
    agent.ReplicationType = ReplicationType.Transactional;

    // Start the agent synchronously.
    agent.GenerateSnapshot();

}
catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "A snapshot could not be generated for the {0} publication."
        , publicationName), ex);
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance
Dim distributorName As String = publisherInstance

Dim agent As SnapshotGenerationAgent

Try
    ' Set the required properties for Snapshot Agent.
    agent = New SnapshotGenerationAgent()
    agent.Distributor = distributorName
    agent.DistributorSecurityMode = SecurityMode.Integrated
    agent.Publisher = publisherName
    agent.PublisherSecurityMode = SecurityMode.Integrated
    agent.Publication = publicationName
    agent.PublisherDatabase = publicationDbName
    agent.ReplicationType = ReplicationType.Transactional

    ' Start the agent synchronously.
    agent.GenerateSnapshot()

Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
     "A snapshot could not be generated for the {0} publication." _
     , publicationName), ex)
End Try

In diesem Beispiel wird der Agentauftrag asynchron gestartet, um den Anfangssnapshot für eine transaktionale Veröffentlichung zu generieren.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;

TransPublication publication;

// Create a connection to the Publisher using Windows Authentication.
ServerConnection conn;
conn = new ServerConnection(publisherName);

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

    // Set the required properties for an existing publication.
    publication = new TransPublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    if (publication.LoadProperties())
    {
        // Start the Snapshot Agent job for the publication.
        publication.StartSnapshotGenerationAgentJob();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The {0} publication does not exist.", publicationName));
    }
}
catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "A snapshot could not be generated for the {0} publication."
        , publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance

Dim publication As TransPublication

' Create a connection to the Publisher using Windows Authentication.
Dim conn As ServerConnection
conn = New ServerConnection(publisherName)

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

    ' Set the required properties for an existing publication.
    publication = New TransPublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    If publication.LoadProperties() Then
        ' Start the Snapshot Agent job for the publication.
        publication.StartSnapshotGenerationAgentJob()
    Else
        Throw New ApplicationException(String.Format( _
         "The {0} publication does not exist.", publicationName))
    End If
Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
     "A snapshot could not be generated for the {0} publication." _
     , publicationName), ex)
Finally
    conn.Disconnect()
End Try

Blockierung beim Anwenden des ersten Snapshots

Wenn Sie mehrere Veröffentlichungen haben, die Daten in einer Datenbank bei dem/den Abonnenten veröffentlichen, während Sie die Anfangsmomentaufnahme(n) anwenden, stellen Sie fest, dass nur eine Veröffentlichung in der Lage ist, ihren Snapshot zur gleichen Zeit anzuwenden.

Bei der Überprüfung der SQL-Aktivität wird möglicherweise eine Warteressource wie die folgende angezeigt:

APP: 18:16384:[snapshot_delivery_in_progress_Tr]:(9bcdaf92)
APP: 5:16384:[snapshot_delivery_in_progress_Er]:(3c3b7db9
)

Bei der Abfrage des Sperrverhaltens werden möglicherweise Ressourcen ähnlich den folgenden angezeigt:

APP 16384:[appname]:(fbe42d68) XAPP 16384:[snapshot_del]:(9bcdaf92) X

Dieses Verhalten ist beabsichtigt. Es tritt auf, da eine Anwendungssperre verwendet wird, um zu verhindern, dass mehrere Replikations-Agents gleichzeitig Momentaufnahmen verschiedener Publikationen auf dieselbe Abonnentendatenbank anwenden. Da die Anwendungssperre den Namen der Abonnentendatenbank enthält, werden alle Publikationen, die in derselben Abonnentendatenbank veröffentlicht werden, betroffen sein. Das Ergebnis ist, dass jeweils nur eine Momentaufnahme in die Abonnentendatenbank eingefügt werden kann.

Exklusivsperren werden in dieser Situation eingesetzt, um zu verhindern, dass Replikationsagenten sich gegenseitig blockieren.

Um dieses Problem zu umgehen, geben Sie für jede Publikation eine andere Abonnentendatenbank an.