Share via


Reinicializar una suscripción

En este tema se describe cómo reinicializar una suscripción en SQL Server 2012 mediante SQL Server Management Studio, Transact-SQL o Replication Management Objects (RMO). Las suscripciones individuales se pueden marcar para reinicialización de manera que se aplique una nueva instantánea durante la siguiente sincronización.

En este tema

  • Para reinicializar una suscripción con:

    SQL Server Management Studio

    Transact-SQL

    Replication Management Objects (RMO)

Usar SQL Server Management Studio

Reinicializar una suscripción es un proceso con dos partes:

  1. Una o todas las suscripciones a una publicación se marcan para reinicializarse. Las suscripciones se marcan para reinicializarlas en el cuadro de diálogo Reinicializar suscripciones, disponible en la carpeta Publicaciones locales y en la carpeta Suscripciones locales de Microsoft SQL Server Management Studio. También puede marcar suscripciones desde la pestaña Todas las suscripciones y el nodo de publicaciones del Monitor de replicación. Para obtener información sobre cómo iniciar el Monitor de replicación, vea Iniciar el Monitor de replicación. Al marcar una suscripción para reinicialización, tiene las siguientes opciones:

    • Utilizar la instantánea actual
      Seleccione esta opción para aplicar la instantánea actual al suscriptor la siguiente vez que se ejecute el Agente de distribución o el Agente de mezcla. Si no hay una instantánea válida disponible, no podrá seleccionarse esta opción.

    • Utilizar una instantánea nueva
      Seleccione esta opción para reinicializar la suscripción con una instantánea nueva. La instantánea solo puede aplicarse al suscriptor después de que la haya generado el Agente de instantáneas. Si el Agente de instantáneas está configurado para ejecutarse de acuerdo con una programación, la suscripción no se reinicializará hasta después de la siguiente ejecución programada del Agente de instantáneas. Seleccione Generar la nueva instantánea ahora para iniciar el Agente de instantáneas de forma inmediata.

    • Cargar los cambios no sincronizados antes de reinicializar
      Solo la replicación de mezcla. Seleccione esta opción para cargar cambios pendientes de la base de datos de suscripciones antes de que se sobrescriba el suscriptor con una instantánea.

      Si agrega, quita o cambia un filtro con parámetros, los cambios pendientes en el suscriptor no se podrán cargar en el publicador durante la reinicialización. Si desea cargar los cambios pendientes, sincronice todas las suscripciones antes de cambiar el filtro.

  2. Una suscripción se reinicializa la siguiente vez que se sincroniza: el Agente de distribución (para la replicación transaccional) o el Agente de mezcla (para la replicación de mezcla) aplica la instantánea más reciente a cada suscriptor que tiene una suscripción marcada para reinicialización. 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.

Para marcar una sola suscripción de extracción o de inserción para reinicializarla en Management Studio (en el publicador)

  1. Conéctese al publicador en Management Studio y expanda el nodo de servidor.

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

  3. Expanda la publicación que tiene la suscripción que desea reinicializar.

  4. Haga clic con el botón secundario en la suscripción y, a continuación, haga clic en Reinicializar.

  5. En el cuadro de diálogo Reinicializar suscripciones, seleccione las opciones y, a continuación, haga clic en Marcar para reinicializar.

Para marcar una sola suscripción de extracción para reinicializarla en Management Studio (en el suscriptor)

  1. Conéctese al suscriptor en Management Studio y expanda el nodo de servidor.

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

  3. Haga clic con el botón secundario en la suscripción y, a continuación, haga clic en Reinicializar.

  4. En el cuadro de diálogo de confirmación que se muestra, haga clic en .

Para marcar todas las suscripciones para reinicializarlas en Management Studio

  1. Conéctese al publicador en Management Studio y expanda el nodo de servidor.

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

  3. Haga clic con el botón secundario en la publicación que tiene las suscripciones que desea reinicializar y, a continuación, haga clic en Reinicializar todas las suscripciones.

  4. En el cuadro de diálogo Reinicializar suscripciones, seleccione las opciones y, a continuación, haga clic en Marcar para reinicializar.

Para marcar una sola suscripción de inserción o de extracción para reinicializarla en el Monitor de replicación

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

  2. Haga clic en la pestaña Todas las suscripciones.

  3. Haga clic con el botón secundario en la suscripción que desea reinicializar y, a continuación, haga clic en Reinicializar suscripción.

  4. En el cuadro de diálogo Reinicializar suscripciones, seleccione las opciones y, a continuación, haga clic en Marcar para reinicializar.

Para marcar todas las suscripciones para reinicializarlas 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 que tiene las suscripciones que desea reinicializar y, a continuación, haga clic en Reinicializar todas las suscripciones.

  3. En el cuadro de diálogo Reinicializar suscripciones, seleccione las opciones y, a continuación, haga clic en Marcar para reinicializar.

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

Usar Transact-SQL

Las suscripciones pueden reinicializarse mediante programación con procedimientos almacenados de replicación. El procedimiento almacenado que se usa depende del tipo de suscripción (inserción o extracción) y el tipo de publicación a la que pertenece la suscripción.

Para reinicializar una suscripción de extracción a una publicación transaccional

  1. En el suscriptor de la base de datos de suscripciones, ejecute sp_reinitpullsubscription (Transact-SQL). Especifique @publisher, @publisher_db y @publication. Esto marca la suscripción para reinicializarla la próxima vez que se ejecute el Agente de distribución.

  2. (Opcional) Inicie el Agente de distribución en el suscriptor para sincronizar la suscripción. Para obtener más información, vea Sincronizar una suscripción de extracción.

Para reinicializar una suscripción de inserción a una publicación transaccional

  1. En el publicador, ejecute sp_reinitsubscription (Transact-SQL). Especifique @publication, @subscriber y @destination_db. Esto marca la suscripción para reinicializarla la próxima vez que se ejecute el Agente de distribución.

  2. (Opcional) Inicie el Agente de distribución en el distribuidor para sincronizar la suscripción. Para obtener más información, vea Sincronizar una suscripción de inserción.

Para reinicializar una suscripción de extracción a una publicación de combinación

  1. En el suscriptor de la base de datos de suscripciones, ejecute sp_reinitmergepullsubscription (Transact-SQL). Especifique @publisher, @publisher_db y @publication. Para cargar los cambios del Suscriptor antes de que se produzca la reinicialización, especifique un valor true para @upload_first. Esto marca la suscripción para reinicializarla la próxima vez que se ejecute el Agente de mezcla.

    Nota importanteImportante

    Si agrega, quita o cambia un filtro con parámetros, los cambios pendientes en el suscriptor no se pueden volver a cargar en el publicador durante la reinicialización. Si desea volver a cargar los cambios pendientes, sincronice todas las suscripciones antes de cambiar el filtro.

  2. (Opcional) Inicie el Agente de mezcla en el suscriptor para sincronizar la suscripción. Para obtener más información, vea Sincronizar una suscripción de extracción.

Para reinicializar una suscripción de inserción a una publicación de combinación

  1. En el publicador, ejecute sp_reinitmergesubscription (Transact-SQL). Especifique @publication, @subscriber y @subscriber_db. Para cargar los cambios del Suscriptor antes de que se produzca la reinicialización, especifique un valor true para @upload_first. Esto marca la suscripción para reinicializarla la próxima vez que se ejecute el Agente de distribución.

    Nota importanteImportante

    Si agrega, quita o cambia un filtro con parámetros, los cambios pendientes en el suscriptor no se pueden volver a cargar en el publicador durante la reinicialización. Si desea volver a cargar los cambios pendientes, sincronice todas las suscripciones antes de cambiar el filtro.

  2. (Opcional) Inicie el Agente de mezcla en el distribuidor para sincronizar la suscripción. Para obtener más información, vea Sincronizar una suscripción de inserción.

Para establecer la directiva de reinicialización al crear una nueva publicación de combinación

  • En el publicador de la base de datos de publicación, ejecute sp_addmergepublication, especificando uno de los valores siguientes para @automatic_reinitialization_policy:

    • 1: los cambios se cargan en el suscriptor antes de que una suscripción se reinicialice automáticamente según lo requiera un cambio a la publicación.

    • 0: los cambios en el suscriptor se descartan cuando una suscripción se reinicializa automáticamente según lo requiera un cambio a la publicación.

    Nota importanteImportante

    Si agrega, quita o cambia un filtro con parámetros, los cambios pendientes en el suscriptor no se pueden volver a cargar en el publicador durante la reinicialización. Si desea volver a cargar los cambios pendientes, sincronice todas las suscripciones antes de cambiar el filtro.

    Para obtener más información, vea Crear una publicación.

Para cambiar la directiva de reinicialización para una publicación de combinación existente

  • En el publicador de la base de datos de publicación, ejecute sp_changemergepublication, especificando automatic_reinitialization_policy para @property y uno de los siguientes valores para @value:

    • 1: los cambios se cargan en el suscriptor antes de que una suscripción se reinicialice automáticamente según lo requiera un cambio a la publicación.

    • 0: los cambios en el suscriptor se descartan cuando una suscripción se reinicializa automáticamente según lo requiera un cambio a la publicación.

    Nota importanteImportante

    Si agrega, quita o cambia un filtro con parámetros, los cambios pendientes en el suscriptor no se pueden volver a cargar en el publicador durante la reinicialización. Si desea volver a cargar los cambios pendientes, sincronice todas las suscripciones antes de cambiar el filtro.

    Para obtener más información, vea Ver y modificar propiedades de publicación.

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

Usar Replication Management Objects (RMO)

Las suscripciones individuales se pueden marcar para reinicialización de manera que, durante la siguiente sincronización, se aplique una nueva instantánea. Las suscripciones se pueden reinicializar mediante programación usando Replication Management Objects (RMO). Las clases RMO que usa dependen del tipo de publicación a la que pertenece la suscripción y del tipo de suscripción (es decir, una suscripción de inserción o de extracción).

Para reinicializar una suscripción de extracción a una publicación transaccional

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

  2. Cree una instancia de la clase TransPullSubscription y establezca PublicationName, DatabaseName, PublisherName, PublicationDBName y la conexión del paso 1 para ConnectionContext.

  3. Llame al método LoadProperties para obtener las propiedades del objeto.

    [!NOTA]

    Si este método devuelve false, significa que las propiedades de suscripción del paso 2 se definieron incorrectamente o que la suscripción de extracción no existe.

  4. Llame al método Reinitialize. Este método marca la suscripción para la reinicialización.

  5. Sincronice la suscripción de extracción. Para obtener más información, vea Sincronizar una suscripción de extracción.

Para reinicializar una suscripción de inserción a una publicación transaccional

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

  2. Cree una instancia de la clase TransSubscription y establezca PublicationName, DatabaseName, SubscriberName, SubscriptionDBName y la conexión del paso 1 para ConnectionContext.

  3. Llame al método LoadProperties para obtener las propiedades del objeto.

    [!NOTA]

    Si este método devuelve false, significa que las propiedades de suscripción del paso 2 se definieron incorrectamente o que la suscripción de inserción no existe.

  4. Llame al método Reinitialize. Este método marca la suscripción para la reinicialización.

  5. Sincronice la suscripción de inserción. Para obtener más información, vea Sincronizar una suscripción de inserción.

Para reinicializar una suscripción de extracción a una publicación de combinación

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

  2. Cree una instancia de la clase MergePullSubscription y establezca PublicationName, DatabaseName, PublisherName, PublicationDBName y la conexión del paso 1 para ConnectionContext.

  3. Llame al método LoadProperties para obtener las propiedades del objeto.

    [!NOTA]

    Si este método devuelve false, significa que las propiedades de suscripción del paso 2 se definieron incorrectamente o que la suscripción de extracción no existe.

  4. Llame al método Reinitialize. Pase un valor de true para cargar cambios en el Suscriptor antes de la reinicialización o un valor de false para reinicializar y perder cualquier cambio pendiente en el Suscriptor. Este método marca la suscripción para la reinicialización.

    [!NOTA]

    No se pueden cargar los cambios si expira la suscripción. Para obtener más información, vea Establecer el período de expiración para las suscripciones.

  5. Sincronice la suscripción de extracción. Para obtener más información, vea Sincronizar una suscripción de extracción.

Para reinicializar una suscripción de inserción a una publicación de combinación

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

  2. Cree una instancia de la clase MergeSubscription y establezca PublicationName, DatabaseName, SubscriberName, SubscriptionDBName y la conexión del paso 1 para ConnectionContext.

  3. Llame al método LoadProperties para obtener las propiedades del objeto.

    [!NOTA]

    Si este método devuelve false, significa que las propiedades de suscripción del paso 2 se definieron incorrectamente o que la suscripción de inserción no existe.

  4. Llame al método Reinitialize. Pase un valor de true para cargar cambios en el Suscriptor antes de la reinicialización o un valor de false para reinicializar y perder cualquier cambio pendiente en el Suscriptor. Este método marca la suscripción para la reinicialización.

    [!NOTA]

    No se pueden cargar los cambios si expira la suscripción. Para obtener más información, vea Establecer el período de expiración para las suscripciones.

  5. Sincronice la suscripción de inserción. Para obtener más información, vea Sincronizar una suscripción de inserción.

Ejemplos (RMO)

En este ejemplo reinicializa una suscripción de extracción para una publicación transaccional.

            // Define server, publication, and database names.
            String subscriberName = subscriberInstance;
            String publisherName = publisherInstance;
            String publicationName = "AdvWorksProductTran";
            String publicationDbName = "AdventureWorks2012";
            String subscriptionDbName = "AdventureWorks2012Replica";

            // 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 = "AdventureWorks2012"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"

' 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

Este ejemplo reinicializa una suscripción de extracción a una publicación de combinación después de cargar primero los cambios pendientes en el Suscriptor.

         // Define server, publication, and database names.
            String subscriberName = subscriberInstance;
            String publisherName = publisherInstance;
            String publicationName = "AdvWorksSalesOrdersMerge";
            String publicationDbName = "AdventureWorks2012";
            String subscriptionDbName = "AdventureWorks2012Replica";

            // 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 = "AdventureWorks2012"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"

' 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

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

Vea también

Conceptos

Reinicializar suscripciones

Conceptos de los Replication Management Objects (RMO)

Prácticas recomendadas de seguridad de replicación