Compartir a través de


Reinicialización de una suscripción

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

En este tema

Uso de SQL Server Management Studio

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

  1. Una sola suscripción o todas las suscripciones a una publicación se marcan para reinicialización. Marque las suscripciones para reinicialización en el cuadro de diálogo Reinicializar suscripciones , que está 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 publicaciones del Monitor de replicación. Para obtener información sobre cómo iniciar el Monitor de replicación, consulte Iniciar el Monitor de replicación. Al marcar una suscripción para reinicialización, tiene las siguientes opciones:

    Uso de la instantánea actual
    Seleccione esta opción para aplicar la instantánea actual al suscriptor la próxima vez que se ejecute el Agente de distribución o el Agente de mezcla. Si no hay ninguna instantánea válida disponible, esta opción no se puede seleccionar.

    Uso de una nueva instantánea
    Seleccione esta opción para reinicializar la suscripción con una nueva instantánea. La instantánea solo se puede aplicar al suscriptor después de que el Agente de instantáneas la haya generado. Si el Agente de instantáneas se establece para ejecutarse según una programación, la suscripción no se reinicializa 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 inmediatamente.

    Cargar cambios no sincronizados antes de reinicialización
    Solo replicación de combinación. Seleccione esta opción para cargar los cambios pendientes de la base de datos de suscripciones antes de que los datos del suscriptor se sobrescriban con una instantánea.

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

  2. Se reinicializa una suscripción la próxima 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 sobre la sincronización de suscripciones, consulte Sincronizar una suscripción de inserción y Sincronizar una suscripción de extracción.

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

  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. Expanda la publicación que tiene la suscripción que desea reinicializar.

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

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

Para marcar una sola suscripción de extracción para reinicialización 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, expanda la carpeta Suscripciones locales .

  3. Haga clic con el botón derecho 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 reinicialización 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 con 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 opciones y, a continuación, haga clic en Marcar para reinicialización.

Para marcar una sola suscripción de envío o recepción para reinicialización en el Monitor de replicación

  1. En el Monitor de replicación, expanda un grupo 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 derecho 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 opciones y, a continuación, haga clic en Marcar para reinicialización.

Para marcar todas las suscripciones para reinicialización 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 con 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 opciones y, a continuación, haga clic en Marcar para reinicialización.

Uso de Transact-SQL

Las suscripciones se pueden reinicializar programáticamente usando procedimientos almacenados de replicación. El procedimiento almacenado que se usa depende del tipo de suscripción (inserción o extracción) y del tipo de publicación al que pertenece la suscripción.

Para reinitializar una suscripción de tipo pull 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 reinicialización 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, consulte Synchronize a Pull Subscription(Sincronizar una suscripción de extracción).

Para reinicializar una suscripción push 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 reinicialización 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, consulte Synchronize a Push Subscription(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 de true para @upload_first. Esto marca la suscripción para la reinicialización la próxima vez que se ejecute el Agente de Mezcla.

    Importante

    Si agrega, quita o cambia un filtro con parámetros, los cambios pendientes en el suscriptor no se pueden cargar en el publicador durante la reinicialización. Si desea 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, consulte Synchronize a Pull Subscription(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 editor, 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 de true para @upload_first. Esto marca la suscripción para reinicialización la próxima vez que se ejecute el Agente de distribución.

    Importante

    Si agrega, quita o cambia un filtro con parámetros, los cambios pendientes en el suscriptor no se pueden cargar en el publicador durante la reinicialización. Si desea 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, consulte Synchronize a Push Subscription(Sincronizar una suscripción de inserción).

Para establecer la política de reinicialización al crear una nueva publicación de tipo combinación

  1. En la base de datos de publicación del publicador, ejecute sp_addmergepublication y especifique uno de los siguientes valores para @automatic_reinitialization_policy:

    • 1 : los cambios se cargan desde el suscriptor antes de que una suscripción se reinicialice automáticamente según sea necesario por un cambio en 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 en la publicación.

    Importante

    Si agrega, quita o cambia un filtro con parámetros, los cambios pendientes en el suscriptor no se pueden cargar en el publicador durante la reinicialización. Si desea 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 política de reinicialización de una publicación de fusión existente

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

    • 1 : los cambios se cargan desde el suscriptor antes de que una suscripción se reinicialice automáticamente según sea necesario por un cambio en 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 en la publicación.

    Importante

    Si agrega, quita o cambia un filtro con parámetros, los cambios pendientes en el suscriptor no se pueden cargar en el publicador durante la reinicialización. Si desea 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.

El uso de Replication Management Objects (RMO)

Las suscripciones individuales se pueden marcar para su reinicialización, de modo que durante la siguiente sincronización se aplique una nueva instantánea. Las suscripciones se pueden reinicializar mediante programación mediante replication Management Objects (RMO). Las clases que use 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 extracción).

Para reiniciar una suscripción de tipo "pull" a una publicación transaccional

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

  2. Cree una instancia de la TransPullSubscription clase y establezca PublicationName, DatabaseName, PublisherName, PublicationDBNamey 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, las propiedades de la suscripción del paso 2 se definieron incorrectamente o la suscripción de extracción no existe.

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

  5. Sincronice la suscripción de extracción. Para obtener más información, consulte Synchronize a Pull Subscription(Sincronizar una suscripción de extracción).

Para reinicializar una suscripción automática a una publicación transaccional

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

  2. Cree una instancia de la TransSubscription clase y establezca PublicationName, DatabaseName, SubscriberName, SubscriptionDBNamey 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, las propiedades de suscripción del paso 2 se definieron incorrectamente o 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, consulte Synchronize a Push Subscription(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 ServerConnection clase .

  2. Cree una instancia de la MergePullSubscription clase y establezca PublicationName, DatabaseName, PublisherName, PublicationDBNamey 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, las propiedades de la suscripción del paso 2 se definieron incorrectamente o la suscripción de extracción no existe.

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

    Nota:

    Los cambios no se pueden cargar si la suscripción ha expirado. Para obtener más información, vea Establecer el período de expiración de las suscripciones.

  5. Sincronice la suscripción de extracción. Para obtener más información, consulte Synchronize a Pull Subscription(Sincronizar una suscripción de extracción).

Para reinicializar una suscripción de envío a una publicación de mezcla

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

  2. Cree una instancia de la MergeSubscription clase y establezca PublicationName, DatabaseName, SubscriberName, SubscriptionDBNamey 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, las propiedades de suscripción del paso 2 se definieron incorrectamente o la suscripción de inserción no existe.

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

    Nota:

    Los cambios no se pueden cargar si la suscripción ha expirado. Para obtener más información, vea Establecer el período de expiración de las suscripciones.

  5. Sincronice la suscripción de inserción. Para obtener más información, consulte Synchronize a Push Subscription(Sincronizar una suscripción de inserción).

Ejemplos (RMO)

En este ejemplo se reinicializa una suscripción de tipo 'pull' a una publicación por transacciones.

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

En este ejemplo se 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

Véase también

Reinicialización de suscripciones
Conceptos de objetos de gestión de replicación
Procedimientos recomendados de seguridad de replicación