Отключить публикацию и распространение

Область применения: SQL Server Управляемый экземпляр SQL Azure

В этой статье описывается, как отключить публикацию и распространение в SQL Server с помощью SQL Server Management Studio, Transact-SQL или Replication Management Objects (RMO).

Вы можете выполнить следующие шаги:

  • Удалите все базы данных распространения на дистрибьюторе.

  • Отключите все издатели, использующие данный распространитель, и удалите все публикации на этих издателях.

  • Удалите все подписки на публикации. Данные баз данных публикации и подписки удалены не будут; однако они потеряют отношения синхронизации с любыми базами данных публикации. Если нужно удалить данные на подписчике, то их следует удалять вручную.

Предварительные требования

  • Для отключения публикации и распространения все базы данных распространителей и публикаций должны находиться в режиме «в сети». Если существуют снимки баз данных для базы данных распространения или баз данных публикаций, их необходимо удалить перед отключением публикации и распространения. Снэпшот базы данных — это офлайн-копия базы данных только для чтения, не связанная с репликационным снимком. Дополнительные сведения см. в разделе Моментальные снимки базы данных (SQL Server).

Использование среды SQL Server Management Studio

Используйте мастер отключения публикации и распространения, чтобы отключить публикацию и распространение.

Отключение публикации и распространения

  1. Подключитесь к издателю или распространителю, который необходимо отключить в Microsoft SQL Server Management Studio, а затем разверните узел сервера.

  2. Щелкните правой кнопкой мыши папку Репликация и выберите Отключить публикацию и распространение.

  3. Выполните шаги в мастере отключения публикации и распространения.

Использование Transact-SQL

Вы можете отключить публикацию и распространение, используя процедуры репликации, сохранённые.

Отключение публикации и распространения

  1. Остановите все задания, связанные с репликацией. Список имен задач см. в подразделе «Безопасность агентов при работе с агентом SQL Server» раздела Модель безопасности агента репликации.

  2. На каждом подписчике в базе подписки выполните хранимую процедуру sp_removedbreplication, чтобы удалить объекты репликации из базы данных. Эта сохранённая процедура не удаляет задания репликации в Дистрибьюторе.

  3. На сервере-издателе в базе данных публикации выполните sp_removedbreplication, чтобы удалить из базы данных объекты репликации.

  4. Если издатель использует удаленный распространитель, выполните sp_dropdistributor.

  5. На распространителе выполните хранимую процедуру sp_dropdistpublisher. Выполните эту хранимую процедуру один раз для каждого издателя, зарегистрированного на распространителе.

  6. На распространителе выполните хранимую процедуру sp_dropdistributiondb , чтобы удалить базу данных распространителя. Выполните эту хранимую процедуру один раз для каждой базы данных распространителя на сервере Distributor. Это действие также удаляет все задания агента читателя очереди, связанные с базой данных распределения.

  7. На сервере-распространителе выполните sp_dropdistributor, чтобы удалить с сервера роль распространителя.

    Примечание.

    Если вы не убрали все объекты публикации и распространения репликации до выполнения sp_dropdistpublisher и sp_dropdistributor, эти процедуры возвращают ошибку. Чтобы удалить все объекты, связанные с репликацией, при удалении Publisher или Distributor, задайте параметру @no_checks значение 1. Если издатель или дистрибьютор не в сети или недоступен, установите для параметра @ignore_distributor значение 1, чтобы можно было исключить их. Однако вы должны вручную удалить все оставшиеся объекты для публикации и распространения.

Примеры (Transact-SQL)

В этом примере скрипта удаляются объекты репликации из базы данных подписки.

-- Remove replication objects from the subscription database on MYSUB.
DECLARE @subscriptionDB AS sysname
SET @subscriptionDB = N'AdventureWorks2022Replica'

-- Remove replication objects from a subscription database (if necessary).
USE master
EXEC sp_removedbreplication @subscriptionDB
GO

В этом примере скрипта отключается публикация и распространение на сервере, являющемся издателем и распространителем, и удаляется база данных распространителя.

-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). 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".

-- Disable publishing and distribution.
DECLARE @distributionDB AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB as sysname;
SET @distributionDB = N'distribution';
SET @publisher = $(DistPubServer);
SET @publicationDB = N'AdventureWorks2022';

-- Disable the publication database.
USE [AdventureWorks2022]
EXEC sp_removedbreplication @publicationDB;

-- Remove the registration of the local Publisher at the Distributor.
USE master
EXEC sp_dropdistpublisher @publisher;

-- Delete the distribution database.
EXEC sp_dropdistributiondb @distributionDB;

-- Remove the local server as a Distributor.
EXEC sp_dropdistributor;
GO

Использование объектов управления репликацией (RMO)

Отключение публикации и распространения

  1. Удалите все подписки на публикации, которые используют распространитель. Дополнительные сведения см. в разделах Delete a Pull Subscription и Delete a Push Subscription.

  2. Удалите все публикации, которые используют распространитель, и отключите публикацию для всех баз данных, если издатель и распространитель находятся на одном сервере. Дополнительные сведения см. в разделе Delete a Publication.

  3. Создайте соединение с распространителем с помощью класса ServerConnection .

  4. Создайте экземпляр класса DistributionPublisher. Укажите свойство Name и передайте объект ServerConnection из шага 3.

  5. (Необязательно) Вызовите метод LoadProperties , чтобы получить свойства объекта и убедиться, что издатель существует. Если этот метод возвращает ложное, значит имя Publisher, установленное на шаге 4, было неверным или Publisher не используется этим дистрибьютором.

  6. Вызовите метод Remove . Укажите значение true для параметра force, если Издатель и Распространитель находятся на разных серверах, а также если Издатель требуется удалить на Распространителе без предварительной проверки того, что на Издателе больше нет публикаций.

  7. Создайте экземпляр класса ReplicationServer. Передайте объект ServerConnection , созданный на шаге 3.

  8. Вызовите метод UninstallDistributor . Укажите значение true для параметра force, чтобы удалить все объекты репликации на распространителе без предварительной проверки того, что все локальные базы данных публикаций отключены, а базы данных распространения деинсталлированы.

Примеры (RMO)

Следующий пример удаляет регистрацию Publisher у дистрибьютора, убирает базу данных Distribution и удаляет Distributor.

// Set the Distributor and publication database names.
// Publisher and Distributor are on the same server instance.
string publisherName = publisherInstance;
string distributorName = publisherInstance;
string distributionDbName = "distribution";
string publicationDbName = "AdventureWorks2022";

// Create connections to the Publisher and Distributor
// using Windows Authentication.
ServerConnection publisherConn = new ServerConnection(publisherName);
ServerConnection distributorConn = new ServerConnection(distributorName);

// Create the objects we need.
ReplicationServer distributor =
    new ReplicationServer(distributorConn);
DistributionPublisher publisher;
DistributionDatabase distributionDb =
    new DistributionDatabase(distributionDbName, distributorConn);
ReplicationDatabase publicationDb;
publicationDb = new ReplicationDatabase(publicationDbName, publisherConn);

try
{
    // Connect to the Publisher and Distributor.
    publisherConn.Connect();
    distributorConn.Connect();

    // Disable all publishing on the AdventureWorks2022 database.
    if (publicationDb.LoadProperties())
    {
        if (publicationDb.EnabledMergePublishing)
        {
            publicationDb.EnabledMergePublishing = false;
        }
        else if (publicationDb.EnabledTransPublishing)
        {
            publicationDb.EnabledTransPublishing = false;
        }
    }
    else
    {
        throw new ApplicationException(
            String.Format("The {0} database does not exist.", publicationDbName));
    }

    // We cannot uninstall the Publisher if there are still Subscribers.
    if (distributor.RegisteredSubscribers.Count == 0)
    {
        // Uninstall the Publisher, if it exists.
        publisher = new DistributionPublisher(publisherName, distributorConn);
        if (publisher.LoadProperties())
        {
            publisher.Remove(false);
        }
        else
        {
            // Do something here if the Publisher does not exist.
            throw new ApplicationException(String.Format(
                "{0} is not a Publisher for {1}.", publisherName, distributorName));
        }

        // Drop the distribution database.
        if (distributionDb.LoadProperties())
        {
            distributionDb.Remove();
        }
        else
        {
            // Do something here if the distribition DB does not exist.
            throw new ApplicationException(String.Format(
                "The distribution database '{0}' does not exist on {1}.",
                distributionDbName, distributorName));
        }

        // Uninstall the Distributor, if it exists.
        if (distributor.LoadProperties())
        {
            // Passing a value of false means that the Publisher 
            // and distribution databases must already be uninstalled,
            // and that no local databases be enabled for publishing.
            distributor.UninstallDistributor(false);
        }
        else
        {
            //Do something here if the distributor does not exist.
            throw new ApplicationException(String.Format(
                "The Distributor '{0}' does not exist.", distributorName));
        }
    }
    else
    {
        throw new ApplicationException("You must first delete all subscriptions.");
    }
}
catch (Exception ex)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The Publisher and Distributor could not be uninstalled", ex);
}
finally
{
    publisherConn.Disconnect();
    distributorConn.Disconnect();
}
' Set the Distributor and publication database names.
' Publisher and Distributor are on the same server instance.
Dim publisherName As String = publisherInstance
Dim distributorName As String = subscriberInstance
Dim distributionDbName As String = "distribution"
Dim publicationDbName As String = "AdventureWorks2022"

' Create connections to the Publisher and Distributor
' using Windows Authentication.
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
Dim distributorConn As ServerConnection = New ServerConnection(distributorName)

' Create the objects we need.
Dim distributor As ReplicationServer
distributor = New ReplicationServer(distributorConn)
Dim publisher As DistributionPublisher
Dim distributionDb As DistributionDatabase
distributionDb = New DistributionDatabase(distributionDbName, distributorConn)
Dim publicationDb As ReplicationDatabase
publicationDb = New ReplicationDatabase(publicationDbName, publisherConn)

Try
    ' Connect to the Publisher and Distributor.
    publisherConn.Connect()
    distributorConn.Connect()

    ' Disable all publishing on the AdventureWorks2022 database.
    If publicationDb.LoadProperties() Then
        If publicationDb.EnabledMergePublishing Then
            publicationDb.EnabledMergePublishing = False
        ElseIf publicationDb.EnabledTransPublishing Then
            publicationDb.EnabledTransPublishing = False
        End If
    Else
        Throw New ApplicationException( _
            String.Format("The {0} database does not exist.", publicationDbName))
    End If

    ' We cannot uninstall the Publisher if there are still Subscribers.
    If distributor.RegisteredSubscribers.Count = 0 Then
        ' Uninstall the Publisher, if it exists.
        publisher = New DistributionPublisher(publisherName, distributorConn)
        If publisher.LoadProperties() Then
            publisher.Remove(False)
        Else
            ' Do something here if the Publisher does not exist.
            Throw New ApplicationException(String.Format( _
                "{0} is not a Publisher for {1}.", publisherName, distributorName))
        End If

        ' Drop the distribution database.
        If distributionDb.LoadProperties() Then
            distributionDb.Remove()
        Else
            ' Do something here if the distribition DB does not exist.
            Throw New ApplicationException(String.Format( _
             "The distribution database '{0}' does not exist on {1}.", _
             distributionDbName, distributorName))
        End If

        ' Uninstall the Distributor, if it exists.
        If distributor.LoadProperties() Then
            ' Passing a value of false means that the Publisher 
            ' and distribution databases must already be uninstalled,
            ' and that no local databases be enabled for publishing.
            distributor.UninstallDistributor(False)
        Else
            'Do something here if the distributor does not exist.
            Throw New ApplicationException(String.Format( _
                "The Distributor '{0}' does not exist.", distributorName))
        End If
    Else
        Throw New ApplicationException("You must first delete all subscriptions.")
    End If

Catch ex As Exception
    ' Implement appropriate error handling here.
    Throw New ApplicationException("The Publisher and Distributor could not be uninstalled", ex)

Finally
    publisherConn.Disconnect()
    distributorConn.Disconnect()

End Try

Следующий пример удаляет Дистрибьютор без предварительного отключения локальных баз данных публикации или удаления базы данных распространения.

// Set the Distributor and publication database names.
// Publisher and Distributor are on the same server instance.
string distributorName = publisherInstance;

// Create connections to the Distributor
// using Windows Authentication.
ServerConnection conn = new ServerConnection(distributorName);
conn.DatabaseName = "master";

// Create the objects we need.
ReplicationServer distributor = new ReplicationServer(conn);

try
{
    // Connect to the Publisher and Distributor.
    conn.Connect();


    // Uninstall the Distributor, if it exists.
    // Use the force parameter to remove everthing.  
    if (distributor.IsDistributor && distributor.LoadProperties())
    {
        // Passing a value of true means that the Distributor 
        // is uninstalled even when publishing objects, subscriptions,
        // and distribution databases exist on the server.
        distributor.UninstallDistributor(true);
    }
    else
    {
        //Do something here if the distributor does not exist.
    }
}
catch (Exception ex)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The Publisher and Distributor could not be uninstalled", ex);
}
finally
{
    conn.Disconnect();
}
' Set the Distributor and publication database names.
' Publisher and Distributor are on the same server instance.
Dim distributorName As String = publisherInstance

' Create connections to the Distributor
' using Windows Authentication.
Dim conn As ServerConnection = New ServerConnection(distributorName)
conn.DatabaseName = "master"

' Create the objects we need.
Dim distributor As ReplicationServer = New ReplicationServer(conn)

Try
    ' Connect to the Publisher and Distributor.
    conn.Connect()


    ' Uninstall the Distributor, if it exists.
    ' Use the force parameter to remove everthing.  
    If distributor.IsDistributor And distributor.LoadProperties() Then
        ' Passing a value of true means that the Distributor 
        ' is uninstalled even when publishing objects, subscriptions,
        ' and distribution databases exist on the server.
        distributor.UninstallDistributor(True)
    Else
        'Do something here if the distributor does not exist.
    End If

Catch ex As Exception
    ' Implement appropriate error handling here.
    Throw New ApplicationException("The Publisher and Distributor could not be uninstalled", ex)

Finally
    conn.Disconnect()

End Try