Reinicializar una suscripción

Se aplica a:SQL ServerAzure SQL Database

En este tema se describe cómo reinicializar una suscripción en SQL Server 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.

Nota:

Azure SQL Managed Instance puede ser un publicador, un distribuidor y un suscriptor para la replicación transaccional y de instantáneas. Las bases de datos de Azure SQL Database solo pueden ser suscriptores de extracción para la replicación transaccional y de instantáneas. Para obtener más información, vea Replicación transaccional con Azure SQL Database y Azure SQL Managed Instance.

Uso de 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 reinicialización en el cuadro de diálogo Reinicializar suscripción(es), 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 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 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 puede seleccionarse.

    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 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 se agrega, quita o modifica 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. 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 Synchronize a Push Subscription y Synchronize a Pull Subscription.

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, 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 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, 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 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.

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 la base de datos de suscripciones del suscriptor, ejecute sp_reinitpullsubscription (Transact-SQL). Especifique @publisher, @publisher_dby @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, consulte Synchronize a Pull Subscription.

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

  1. En el publicador, ejecute sp_reinitsubscription (Transact-SQL). Especifique @publication, @subscribery @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, consulte Synchronize a Push Subscription.

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

  1. En la base de datos de suscripciones del suscriptor, ejecute sp_reinitmergepullsubscription (Transact-SQL). Especifique @publisher, @publisher_dby @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.

    Importante

    Si se agrega, quita o modifica 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.

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, @subscribery @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.

    Importante

    Si se agrega, quita o modifica 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.

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

  1. 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.

    Importante

    Si se agrega, quita o modifica 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 suscripción.

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

  1. 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.

    Importante

    Si se agrega, quita o modifica 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 más información, consulte View and Modify Publication Properties.

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, 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, 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, consulte Synchronize a Pull Subscription.

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, 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, 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, consulte Synchronize a Push Subscription.

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, 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, 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 más información, consulte Set the Expiration Period for Subscriptions.

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

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, 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, 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 más información, consulte Set the Expiration Period for Subscriptions.

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

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 = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";

// 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 = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"

' 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 = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";

// 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 = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"

' 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

Consulte también

Reinicializar suscripciones
Replication Management Objects Concepts
Procedimientos recomendados de seguridad de replicación