Compartir a través de


Crear y aplicar la instantánea inicial

En este tema se describe cómo crear y aplicar la instantánea inicial en SQL Server 2014 mediante SQL Server Management Studio, Transact-SQL o Replication Management Objects (RMO). Las publicaciones de combinación que utilizan filtros parametrizados requieren una instantánea de dos partes. Para obtener más información, vea Crear una instantánea para una publicación de mezcla con filtros con parámetros.

En este tema

Uso de SQL Server Management Studio

De forma predeterminada, si se ejecuta el Agente SQL Server, el Agente de instantáneas genera una instantánea inmediatamente después de crear una publicación con el Asistente para nueva publicación. De forma predeterminada, se aplica mediante el Agente de distribución (para la replicación transaccional y de instantánea) o el Agente de mezcla (para suscripciones de mezcla) para todas las suscripciones. También se puede generar una instantánea mediante SQL Server Management Studio y el Monitor de replicación. Para obtener información sobre cómo iniciar el Monitor de replicación, consulte Iniciar el Monitor de replicación.

Para crear una instantánea en Management Studio

  1. Conéctese al publicador en Management Studio y, a continuación, expanda el nodo de servidor.

  2. Expanda la carpeta Replicación y, a continuación, expanda la carpeta Publicaciones locales .

  3. Haga clic con el botón derecho en la publicación para la que desea crear una instantánea y, a continuación, haga clic en Ver estado del agente de instantáneas.

  4. En el cuadro de diálogo Ver estado del agente de instantáneas: <publicación> , haga clic en Iniciar.

Cuando el Agente de instantáneas termine de generar la instantánea, se mostrará un mensaje, como "[100%] Se generó una instantánea de 17 artículos".

Para crear una instantánea en el Monitor de replicación

  1. En el Monitor de replicación, expanda un grupo publicador en el panel izquierdo y, a continuación, expanda un publicador.

  2. Haga clic con el botón derecho en la publicación para la que desea generar una instantánea y, a continuación, haga clic en Generar instantánea.

  3. Para ver el estado del Agente de instantáneas, haga clic en la pestaña Agentes . Para obtener información más detallada, haga clic con el botón derecho en el Agente de instantáneas en la cuadrícula y, a continuación, haga clic en Ver detalles.

Para aplicar una instantánea

  1. Una vez generada la instantánea, se aplica mediante la sincronización de la suscripción con el Agente de distribución o el Agente de mezcla:

    • Si el agente se configura para ejecutarse de forma continua (el valor predeterminado para la replicación transaccional), la instantánea se aplica automáticamente una vez que se ha generado.

    • Si el agente se establece para que se ejecute según una programación, la instantánea se aplica la próxima vez que se programe la ejecución del agente.

    • Si el agente está configurado para ejecutarse bajo demanda, se aplicará la próxima vez que lo ejecute.

    Para obtener más información sobre la sincronización de suscripciones, consulte Sincronizar una suscripción de inserción y Sincronizar una suscripción de extracción.

Uso de Transact-SQL

Las instantáneas iniciales se pueden crear mediante programación mediante la creación y ejecución de un trabajo del Agente de instantáneas o mediante la ejecución del archivo ejecutable del Agente de instantáneas desde un archivo por lotes. Una vez generada una instantánea inicial, se transfiere a y se aplica en el suscriptor cuando la suscripción se sincroniza por primera vez. Si ejecuta el Agente de instantáneas desde un símbolo del sistema o un archivo por lotes, deberá volver a ejecutar el agente siempre que la instantánea existente no sea válida.

Importante

Cuando sea posible, pida a los usuarios que escriban credenciales de seguridad en tiempo de ejecución. Si debe almacenar credenciales en un archivo de script, debe proteger el archivo para evitar el acceso no autorizado.

Para crear y ejecutar un trabajo de agente de instantáneas para generar la instantánea inicial

  1. Cree una publicación de instantánea, transaccional o combinación. Para obtener más información, vea Crear una publicación.

  2. Ejecute sp_addpublication_snapshot (Transact-SQL). Especifique @publication y los parámetros siguientes:

    • La @job_login, que especifica las credenciales de autenticación de Windows bajo las cuales se ejecuta el Agente de instantáneas en el distribuidor.

    • **El @job_password**, que es la contraseña de las credenciales de Windows proporcionadas.

    • (Opcional) Valor 0 para @publisher_security_mode si el agente usará la autenticación de SQL Server al conectarse al publicador. En este caso, también debe especificar la información de inicio de sesión de autenticación de SQL Server para @publisher_login y @publisher_password.

    • (Opcional) Una programación de sincronización para el trabajo del Agente de instantáneas. Para obtener más información, vea Especificar programaciones de sincronización.

    Importante

    Al configurar un publicador con un distribuidor remoto, los valores proporcionados para todos los parámetros, incluidos job_login y job_password, se envían al distribuidor como texto sin formato. Debe cifrar la conexión entre el publicador y su distribuidor remoto antes de ejecutar este procedimiento almacenado. Para obtener más información, vea Habilitar conexiones cifradas en el motor de base de datos (Administrador de configuración de SQL Server).

  3. Agregue artículos a la publicación. Para más información, consulte Define an Article.

  4. En la base de datos de publicación del publicador, ejecute sp_startpublication_snapshot (Transact-SQL) y especifique el valor de @publication del paso 1.

Para ejecutar el Agente de instantáneas para generar la instantánea inicial

  1. Cree una publicación de tipo instantánea, transaccional o de combinación. Para obtener más información, vea Crear una publicación.

  2. Agregue artículos a la publicación. Para más información, consulte Define an Article.

  3. Desde el símbolo del sistema de comandos o en un archivo por lotes, inicie el Agente de instantáneas de replicación ejecutando snapshot.exe, especificando los siguientes argumentos de línea de comandos:

    • -Publicación

    • -Editor

    • -Distribuidor

    • -PublisherDB

    • -ReplicationType

    Si usa la autenticación de SQL Server, también debe especificar los argumentos siguientes:

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = 0

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = 0

Ejemplos (Transact-SQL)

En este ejemplo se muestra cómo crear una publicación transaccional y agregar una tarea del Agente de instantáneas para la nueva publicación mediante variables de scripting sqlcmd. En el ejemplo también se inicia el trabajo.

-- 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'AdventureWorks2012'; --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 [AdventureWorks2012]
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

En este ejemplo se crea una publicación de combinación y se agrega una tarea del Agente de instantáneas (mediante variables sqlcmd) para la publicación. En este ejemplo también se inicia el trabajo.

-- 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'AdventureWorks2012'; 
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

Los siguientes argumentos de la línea de comandos inician el Agente de instantáneas para generar la instantánea para una publicación de fusión.

Nota:

Se agregaron saltos de línea para mejorar la legibilidad. En un archivo por lotes, los comandos deben realizarse en una sola línea.

@ECHO OFF
SET InstanceName=%computername%
REM<snippetstartmergesnapshot_10>
REM -- Declare variables
SET Publisher=%InstanceName%
SET PublicationDB=AdventureWorks2012 
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 
REM</snippetstartmergesnapshot_10>

PAUSE

El uso de Replication Management Objects (RMO)

El Agente de instantáneas genera instantáneas después de crear una publicación. Puede generar estas instantáneas mediante programación mediante el uso de Replication Management Objects (RMO) y el acceso directo de código administrado a las funcionalidades del agente de replicación. Los objetos que use dependen del tipo de replicación. El Agente de instantáneas se puede iniciar de forma sincrónica mediante el SnapshotGenerationAgent objeto o de forma asincrónica mediante el trabajo del agente. Una vez generada la instantánea inicial, se transfiere a y se aplica en el suscriptor cuando la suscripción se sincroniza por primera vez. Tendrá que volver a ejecutar el agente cada vez que la instantánea existente ya no contenga datos válidos up-to-date. Para obtener más información, vea Mantener publicaciones.

Importante

Cuando sea posible, pida a los usuarios que escriban credenciales de seguridad en tiempo de ejecución. Si debe almacenar credenciales, use los servicios criptográficos proporcionados por Microsoft Windows .NET Framework.

Para generar la instantánea inicial de una instantánea o publicación transaccional iniciando el trabajo del Agente de instantáneas (asincrónico)

  1. Cree una conexión al publicador mediante la clase ServerConnection .

  2. Cree una instancia de la clase TransPublication. Establezca las propiedades Name y DatabaseName para la publicación, y fije la propiedad ConnectionContext a la conexión creada en el paso 1.

  3. Llame al LoadProperties método para cargar las propiedades restantes del objeto. Si este método devuelve false, las propiedades de publicación del paso 2 se definieron incorrectamente o la publicación no existe.

  4. Si el valor de SnapshotAgentExists es false, llame a CreateSnapshotAgent para crear el trabajo del agente de instantáneas para esta publicación.

  5. Llame al método StartSnapshotGenerationAgentJob para iniciar el trabajo del agente que genera una instantánea para esta publicación.

  6. (Opcional) Cuando el valor de SnapshotAvailable es true, la instantánea está disponible para los suscriptores.

Para generar la instantánea inicial para una publicación instantánea o transaccional ejecutando el Agente de instantáneas (sincrónico)

  1. Cree una instancia de la SnapshotGenerationAgent clase y establezca las siguientes propiedades necesarias:

  2. Establezca un valor de Transactional o Snapshot para ReplicationType.

  3. Llame al método GenerateSnapshot.

Para generar la instantánea inicial de una publicación de combinación iniciando el trabajo del Agente de instantáneas (asincrónico)

  1. Cree una conexión al publicador mediante la clase ServerConnection .

  2. Cree una instancia de la clase MergePublication. Establezca la propiedad Name y la propiedad DatabaseName para la publicación, y establezca la propiedad ConnectionContext a la conexión creada en el paso 1.

  3. Llame al LoadProperties método para cargar las propiedades restantes del objeto. Si este método devuelve false, las propiedades de publicación del paso 2 se definieron incorrectamente o la publicación no existe.

  4. Si el valor de SnapshotAgentExists es false, llame a CreateSnapshotAgent para crear el trabajo del agente de instantáneas para esta publicación.

  5. Llame al método StartSnapshotGenerationAgentJob para iniciar el trabajo del agente que genera la instantánea de esta publicación.

  6. (Opcional) Cuando el valor de SnapshotAvailable es true, la instantánea está disponible para los suscriptores.

Para generar la instantánea inicial de una publicación de combinación mediante la ejecución del Agente de instantáneas de manera sincrónica

  1. Cree una instancia de la SnapshotGenerationAgent clase y establezca las siguientes propiedades necesarias:

  2. Establezca un valor de Merge para ReplicationType.

  3. Llame al método GenerateSnapshot.

Ejemplos (RMO)

En este ejemplo se ejecuta el Agente de instantáneas de forma sincrónica para generar la instantánea inicial de una publicación transaccional.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2012";
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 = "AdventureWorks2012"
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

En este ejemplo se inicia de forma asincrónica el trabajo del agente para generar la instantánea inicial de una publicación transaccional.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2012";
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 = "AdventureWorks2012"
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

Véase también

Create a Publication (Creación de una publicación)
Crear una suscripción de extracción
Crear una suscripción push
Especificar programaciones de sincronización
Crear y aplicar la instantánea
Inicialización de una suscripción con una instantánea
Conceptos de objetos de gestión de replicación
Procedimientos recomendados de seguridad de replicación
Conceptos de procedimientos almacenados del sistema de replicación
Usar sqlcmd con variables de script