Share via


Crear y aplicar la instantánea inicial

En este tema se describe cómo crear y aplicar la instantánea inicial en SQL Server 2012 mediante SQL Server Management Studio, Transact-SQL o Replication Management Objects (RMO). Las publicaciones de mezcla que usan filtros con parámetros necesitan 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

  • Para crear y aplicar la instantánea inicial con:

    SQL Server Management Studio

    Transact-SQL

    Replication Management Objects (RMO)

Usar SQL Server Management Studio

De forma predeterminada, si se está ejecutando el Agente SQL Server, el Agente de instantáneas genera una instantánea inmediatamente después de que se cree una publicación con el Asistente para nueva publicación. A continuación, el Agente de distribución (para la replicación de instantáneas y transaccional) o el Agente de mezcla (para las suscripciones de mezcla) la aplican a todas las suscripciones. Las instantáneas también se pueden generar mediante SQL Server Management Studio y el Monitor de replicación. Para obtener información sobre cómo iniciar el Monitor de replicación, vea 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 secundario en la publicación para la que desee 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 termina de generar la instantánea, aparece un mensaje del tipo "[100%] Se ha generado 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 de publicador en el panel izquierdo, y, a continuación, expanda un publicador.

  2. Haga clic con el botón secundario en la publicación para la que desee crear 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 secundario en el Agente de instantáneas en la cuadrícula y, a continuación, haga clic en Ver detalles.

Para aplicar una instantánea

  • 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 ejecuta de forma continua (valor predeterminado para la replicación transaccional), la instantánea se aplica inmediatamente después de haberse generado.

    • Si el agente se ejecuta según una programación, la instantánea se aplica la siguiente vez que está programada la ejecución del agente.

    • Si el agente se ejecuta a petición, se aplica la siguiente vez que se ejecuta el agente.

    Para obtener más información acerca de cómo sincronizar suscripciones, vea Sincronizar una suscripción de inserción y Sincronizar una suscripción de extracción.

Icono de flecha usado con el vínculo Volver al principio[Top]

Usar Transact-SQL

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

Nota de seguridadNota de seguridad

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

Para crear y ejecutar un trabajo del Agente de instantáneas que genere la instantánea inicial

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

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

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

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

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

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

    Nota de seguridadNota de seguridad

    Al configurar un publicador con un distribuidor remoto, los valores suministrados para todos los parámetros, incluidos job_login y job_password, se envían al distribuidor como texto simple. Antes de ejecutar este procedimiento almacenado, se recomienda cifrar la conexión entre el publicador y su distribuidor remoto. 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 obtener más información, vea Definir un artículo.

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

Para ejecutar el Agente de instantáneas y generar una instantánea inicial

  1. Cree una publicación de instantáneas, 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 obtener más información, vea Definir un artículo.

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

    • -Publication

    • -Publisher

    • -Distributor

    • -PublisherDB

    • -ReplicationType

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

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = 0

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = 0

Ejemplos (Transact-SQL)

Este ejemplo muestra cómo crear una publicación transaccional y agregar un trabajo del Agente de instantáneas para la nueva publicación (utilizando variables de scripting de 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 un trabajo del Agente de instantáneas (utilizando variables de 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 que genere la instantánea para una publicación de combinación.

[!NOTA]

Los saltos de línea se incluyeron para mejorar la legibilidad. En un archivo por lotes, los comandos se deben realizar en una única línea.

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\110\COM\SNAPSHOT.EXE" -Publication %Publication% 
-Publisher %Publisher% -Distributor %Publisher% -PublisherDB %PublicationDB% 
-ReplicationType 2 -OutputVerboseLevel 1 -DistributorSecurityMode 1 

Icono de flecha usado con el vínculo Volver al principio[Top]

Usar Replication Management Objects (RMO)

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

Nota de seguridadNota de seguridad

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

Para generar la instantánea inicial de una publicación transaccional o de instantáneas 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 la propiedad ConnectionContext en la conexión creada en el paso 1.

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

  4. Si el valor de SnapshotAgentExists es false, llame a CreateSnapshotAgent para crear el trabajo de 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 inicial 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 transaccional o de instantáneas ejecutando el trabajo del Agente de instantáneas (sincrónico)

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

  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 las propiedades Name y DatabaseName para la publicación y la propiedad ConnectionContext en la conexión creada en el paso 1.

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

  4. Si el valor de SnapshotAgentExists es false, llame a CreateSnapshotAgent para crear el trabajo de 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 inicial 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 ejecutando el Agente de instantáneas (sincrónico)

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

  2. Establezca un valor Merge para ReplicationType.

  3. Llame al método GenerateSnapshot.

Ejemplos (RMO)

Este ejemplo ejecuta sincrónicamente el Agente de instantáneas 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

Este ejemplo inicia asincrónicamente el Agente de instantáneas 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

Icono de flecha usado con el vínculo Volver al principio[Top]

Vea también

Conceptos

Crear una publicación

Crear una suscripción de extracción

Crear una suscripción de inserción

Especificar programaciones de sincronización

Crear y aplicar una instantánea

Inicializar una suscripción con una instantánea

Conceptos de los Replication Management Objects (RMO)

Prácticas recomendadas de seguridad de replicación

Conceptos sobre los procedimientos almacenados del sistema de replicación

Usar sqlcmd con variables de script