Как удалить репликацию ms sql
Перейти к содержимому

Как удалить репликацию ms sql

  • автор:

Delete a Publication (Удаление публикации)

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

В этом разделе

  • Для удаления публикации используется:Среда SQL Server Management StudioTransact-SQLобъекты RMO;

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

Удалите публикации из папки локальных публикаций в SQL Server Management Studio.

Удаление публикации
  1. Подключитесь к издателю в Management Studio и разверните узел сервера.
  2. Раскройте папку Репликация , а затем папку Локальные публикации .
  3. Щелкните правой кнопкой мыши публикацию, которую требуется удалить, и выберите Удалить.

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

Публикации могут быть удалены программно, с помощью хранимых процедур репликации. Какие именно хранимые процедуры для этого применяются, зависит от типа удаляемой публикации.

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

Удаление публикации моментальных снимков или транзакций
  1. Выполните одно из следующих действий.
  2. Для удаления отдельной публикации в базе данных публикации на издателе выполните инструкцию sp_droppublication .
  3. Чтобы удалить все публикации и удалить все объекты репликации из опубликованной базы данных, выполните процедуру sp_removedbreplication на издателе. Укажите значение tran в параметре @type. Если распространитель недоступен или база данных находится в подозрительном состоянии или в режиме «вне сети», укажите значение 1 в параметре @force(необязательно). Укажите имя базы данных в параметре @dbname , если процедура sp_removedbreplication не выполнялась в базе данных публикации (необязательно).

Заметка Если задать значение 1 в параметре @force , в базе данных могут остаться объекты публикации, связанные с репликацией.

Удаление публикации слиянием
  1. Выполните одно из следующих действий.
  2. Чтобы удалить одну публикацию, выполните sp_dropmergepublication (Transact-SQL) на издателе в базе данных публикации.
  3. Чтобы удалить все публикации и удалить все объекты репликации из опубликованной базы данных, выполните процедуру sp_removedbreplication на издателе. Укажите значение merge в параметре @type. Если распространитель недоступен или база данных находится в подозрительном состоянии или в режиме «вне сети», укажите значение 1 в параметре @force(необязательно). Укажите имя базы данных в параметре @dbname , если процедура sp_removedbreplication не выполнялась в базе данных публикации (необязательно).

Заметка Если задать значение 1 в параметре @force , в базе данных могут остаться объекты публикации, связанные с репликацией.

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

В следующем примере показано удаление публикации транзакций и отключение функции публикации транзакций для базы данных. В этом примере предполагается, что все подписки были удалены ранее. Дополнительные сведения см. в разделе Delete a Pull Subscription или Delete a Push Subscription.

DECLARE @publicationDB AS sysname; DECLARE @publication AS sysname; SET @publicationDB = N'AdventureWorks'; SET @publication = N'AdvWorksProductTran'; -- Remove a transactional publication. USE [AdventureWorks2022] EXEC sp_droppublication @publication = @publication; -- Remove replication objects from the database. USE [master] EXEC sp_replicationdboption @dbname = @publicationDB, @optname = N'publish', @value = N'false'; GO 

В следующем примере показано удаление публикации слиянием и отключение функции публикации слиянием для базы данных. В этом примере предполагается, что все подписки были удалены ранее. Дополнительные сведения см. в разделе Delete a Pull Subscription или Delete a Push Subscription.

DECLARE @publication AS sysname DECLARE @publicationDB AS sysname SET @publication = N'AdvWorksSalesOrdersMerge' SET @publicationDB = N'AdventureWorks' -- Remove the merge publication. USE [AdventureWorks] EXEC sp_dropmergepublication @publication = @publication; -- Remove replication objects from the database. USE master EXEC sp_replicationdboption @dbname = @publicationDB, @optname = N'merge publish', @value = N'false' GO 

При помощи объектов RMO

Публикации можно удалять программно с помощью объектов RMO. Классы RMO, используемые, чтобы удалить публикацию, зависят от типа удаляемой публикации.

Удаление публикации моментальных снимков или публикации транзакций
  1. Создайте соединение с издателем с помощью класса ServerConnection .
  2. Создайте экземпляр класса TransPublication.
  3. Задайте для публикации свойства Name и DatabaseName , а также установите созданное на шаге 1 соединение ConnectionContext в качестве значения для свойства.
  4. Чтобы убедиться в существовании публикации, проверьте свойство IsExistingObject . Если значение этого свойства равно false, то либо на шаге 3 были неверно определены свойства публикации, либо публикация не существует.
  5. Вызовите метод Remove .
  6. (Необязательно) Если в базе данных не существует других публикаций транзакций, базу данных можно отключить от публикации транзакций следующим образом.
    1. Создайте экземпляр класса ReplicationDatabase. В качестве значения для свойства ConnectionContext укажите экземпляр соединения ServerConnection , созданный на шаге 1.
    2. Вызовите метод LoadProperties . Если этот метод возвращает значение false, убедитесь, что база данных существует.
    3. Задайте для публикации свойства EnabledTransPublishing в значение false.
    4. Вызовите метод CommitPropertyChanges .
    Удаление публикации слиянием
    1. Создайте соединение с издателем с помощью класса ServerConnection .
    2. Создайте экземпляр класса MergePublication.
    3. Задайте для публикации свойства Name и DatabaseName , а также установите созданное на шаге 1 соединение ConnectionContext в качестве значения для свойства.
    4. Чтобы убедиться в существовании публикации, проверьте свойство IsExistingObject . Если значение этого свойства равно false, то либо на шаге 3 были неверно определены свойства публикации, либо публикация не существует.
    5. Вызовите метод Remove .
    6. (Необязательно) Если в базе данных не существует других публикаций слиянием, базу данных можно отключить от публикации слиянием следующим образом.
      1. Создайте экземпляр класса ReplicationDatabase. Присвойте свойству ConnectionContext значение экземпляра ServerConnection из шага 1.
      2. Вызовите метод LoadProperties . Если этот метод возвращает значение false, проверьте, существует ли база данных.
      3. Задайте для публикации свойства EnabledMergePublishing в значение false.
      4. Вызовите метод CommitPropertyChanges .

      Примеры (объекты RMO)

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

      // Define the Publisher, publication database, // and publication names. string publisherName = publisherInstance; string publicationName = "AdvWorksProductTran"; string publicationDbName = "AdventureWorks2022"; TransPublication publication; ReplicationDatabase publicationDb; // Create a connection to the Publisher // using Windows Authentication. ServerConnection conn = new ServerConnection(publisherName); try < conn.Connect(); // Set the required properties for the transactional publication. publication = new TransPublication(); publication.ConnectionContext = conn; publication.Name = publicationName; publication.DatabaseName = publicationDbName; // Delete the publication, if it exists and has no subscriptions. if (publication.LoadProperties() && !publication.HasSubscription) < publication.Remove(); >else < // Do something here if the publication does not exist // or has subscriptions. throw new ApplicationException(String.Format( "The publication could not be deleted. " + "Ensure that the publication exists and that all " + "subscriptions have been deleted.", publicationName, publisherName)); > // If no other transactional publications exists, // disable publishing on the database. publicationDb = new ReplicationDatabase(publicationDbName, conn); if (publicationDb.LoadProperties()) < if (publicationDb.TransPublications.Count == 0) < publicationDb.EnabledTransPublishing = false; >> else < // Do something here if the database does not exist. throw new ApplicationException(String.Format( "The database does not exist on .", publicationDbName, publisherName)); > > catch (Exception ex) < // Implement application error handling here. throw new ApplicationException(String.Format( "The publication could not be deleted.", publicationName), ex); > finally
      ' Define the Publisher, publication database, ' and publication names. Dim publisherName As String = publisherInstance Dim publicationName As String = "AdvWorksProductTran" Dim publicationDbName As String = "AdventureWorks2022" Dim publication As TransPublication Dim publicationDb As ReplicationDatabase ' Create a connection to the Publisher ' using Windows Authentication. Dim conn As ServerConnection = New ServerConnection(publisherName) Try conn.Connect() ' Set the required properties for the transactional publication. publication = New TransPublication() publication.ConnectionContext = conn publication.Name = publicationName publication.DatabaseName = publicationDbName ' Delete the publication, if it exists and has no subscriptions. If publication.LoadProperties() And Not publication.HasSubscription Then publication.Remove() Else ' Do something here if the publication does not exist ' or has subscriptions. Throw New ApplicationException(String.Format( _ "The publication could not be deleted. " + _ "Ensure that the publication exists and that all " + _ "subscriptions have been deleted.", _ publicationName, publisherName)) End If ' If no other transactional publications exists, ' disable publishing on the database. publicationDb = New ReplicationDatabase(publicationDbName, conn) If publicationDb.LoadProperties() Then If publicationDb.TransPublications.Count = 0 Then publicationDb.EnabledTransPublishing = False End If Else ' Do something here if the database does not exist. Throw New ApplicationException(String.Format( _ "The database does not exist on .", _ publicationDbName, publisherName)) End If Catch ex As Exception ' Implement application error handling here. Throw New ApplicationException(String.Format( _ "The publication could not be deleted.", _ publicationName), ex) Finally conn.Disconnect() End Try 

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

      // Define the Publisher, publication database, // and publication names. string publisherName = publisherInstance; string publicationName = "AdvWorksSalesOrdersMerge"; string publicationDbName = "AdventureWorks2022"; MergePublication publication; ReplicationDatabase publicationDb; // Create a connection to the Publisher. ServerConnection conn = new ServerConnection(publisherName); try < // Connect to the Publisher. conn.Connect(); // Set the required properties for the merge publication. publication = new MergePublication(); publication.ConnectionContext = conn; publication.Name = publicationName; publication.DatabaseName = publicationDbName; // Delete the publication, if it exists and has no subscriptions. if (publication.LoadProperties() && !publication.HasSubscription) < publication.Remove(); >else < // Do something here if the publication does not exist // or has subscriptions. throw new ApplicationException(String.Format( "The publication could not be deleted. " + "Ensure that the publication exists and that all " + "subscriptions have been deleted.", publicationName, publisherName)); > // If no other merge publications exists, // disable publishing on the database. publicationDb = new ReplicationDatabase(publicationDbName, conn); if (publicationDb.LoadProperties()) < if (publicationDb.MergePublications.Count == 0 && publicationDb.EnabledMergePublishing) < publicationDb.EnabledMergePublishing = false; >> else < // Do something here if the database does not exist. throw new ApplicationException(String.Format( "The database does not exist on .", publicationDbName, publisherName)); > > catch (Exception ex) < // Implement application error handling here. throw new ApplicationException(String.Format( "The publication could not be deleted.", publicationName), ex); > finally
      ' Define the Publisher, publication database, ' and publication names. Dim publisherName As String = publisherInstance Dim publicationName As String = "AdvWorksSalesOrdersMerge" Dim publicationDbName As String = "AdventureWorks2022" Dim publication As MergePublication Dim publicationDb As ReplicationDatabase ' Create a connection to the Publisher. Dim conn As ServerConnection = New ServerConnection(publisherName) Try ' Connect to the Publisher. conn.Connect() ' Set the required properties for the merge publication. publication = New MergePublication() publication.ConnectionContext = conn publication.Name = publicationName publication.DatabaseName = publicationDbName ' Delete the publication, if it exists and has no subscriptions. If (publication.LoadProperties() And Not publication.HasSubscription) Then publication.Remove() Else ' Do something here if the publication does not exist ' or has subscriptions. Throw New ApplicationException(String.Format( _ "The publication could not be deleted. " + _ "Ensure that the publication exists and that all " + _ "subscriptions have been deleted.", _ publicationName, publisherName)) End If ' If no other merge publications exists, ' disable publishing on the database. publicationDb = New ReplicationDatabase(publicationDbName, conn) If publicationDb.LoadProperties() Then If publicationDb.MergePublications.Count = 0 _ And publicationDb.EnabledMergePublishing Then publicationDb.EnabledMergePublishing = False End If Else ' Do something here if the database does not exist. Throw New ApplicationException(String.Format( _ "The database does not exist on .", _ publicationDbName, publisherName)) End If Catch ex As Exception ' Implement application error handling here. Throw New ApplicationException(String.Format( _ "The publication could not be deleted.", _ publicationName), ex) Finally conn.Disconnect() End Try 

      Удаление репликации вручную в SQL Server

      В этой статье объясняется, как вручную удалить репликацию в SQL Server.

      Оригинальная версия продукта: SQL Server
      Исходный номер базы знаний: 324401

      Аннотация

      В этой статье описывается удаление репликации с компьютера под управлением Microsoft SQL Server. Чтобы удалить репликацию, необходимо удалить подписки, публикации и распространитель, настроенный для репликации. Репликацию можно удалить, запустив скрипт Transact-SQL, созданный SQL Server Enterprise Manager или SQL Server Management Studio. Однако если невозможно создать скрипт Transact-SQL для удаления репликации, можно вручную удалить репликацию с помощью системных хранимых процедур и других инструкций Transact-SQL. Эта статья содержит сведения о системных хранимых процедурах, которые можно использовать в этом процессе.

      Дополнительные сведения о системных хранимых процедурах, упомянутых в этой статье, см. в SQL Server электронной документации.

      Удаление репликации вручную

      Репликацию можно удалить вручную с помощью системных хранимых процедур и других инструкций Transact-SQL. Чтобы полностью удалить репликацию, выполните следующие действия.

      1. Удалите все подписки, настроенные для репликации.
      2. Удалите все публикации, настроенные для репликации.
      3. Удалите распространитель, настроенный для репликации.

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

      Удаление подписок

      Чтобы удалить подписки из экземпляра SQL Server, можно использовать следующие хранимые процедуры и соответствующие параметры:

      • sp_dropsubscription : системная хранимая sp_dropsubscription процедура позволяет удалять подписки на определенную статью, публикацию или набор подписок на издателе. Хранимую процедуру необходимо выполнить на сервере издателя в базе данных публикации.
      • sp_droppullsubscription : системная хранимая sp_droppullsubscription процедура позволяет удалить подписку в текущей базе данных подписчика. Хранимую процедуру необходимо выполнить на подписчике в базе данных подписки по запросу.
      • sp_dropmergesubscription : системная sp_dropmergesubscription хранимая процедура позволяет удалить подписку на публикацию слиянием и агент слияния, связанную с публикацией слиянием. Хранимую процедуру необходимо выполнить на сервере издателя в базе данных публикации.
      • sp_dropmergepullsubscription : для удаления подписки на слияние можно использовать sp_dropmergepullsubscription системную хранимую процедуру. Хранимую процедуру необходимо выполнить на подписчике в базе данных подписки по запросу.

      Удаление подписок на моментальные снимки

      Чтобы удалить принудительная подписка на все статьи для публикации моментального снимка, выполните следующий скрипт на издателе:

      USE < **Publication database name** >GO EXEC sp_dropsubscription @publication = N'', @article = N'all', @subscriber = N'all', @destination_db = N'all' 

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

        Выполните следующий скрипт SQL на подписчике:

      USE < **Subscription database name** >GO EXEC sp_droppullsubscription @publisher = N'', @publisher_db = N'', @publication = N'' 
      USE < **Publication database name** >GO EXEC sp_dropsubscription @publication=N'', @subscriber = N'', @article = N'all', @destination_db = N'all' 

      Удаление транзакционной подписки

      Чтобы удалить принудительная подписка на все статьи для публикации транзакций, выполните следующий скрипт на издателе:

      USE < **Publication database name** >GO EXEC sp_dropsubscription @publication = N'', @article = N'all', @subscriber = N'all', @destination_db = N'all' 

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

        Выполните следующий скрипт на подписчике:

      USE < **Subscription database name** >GO EXEC sp_droppullsubscription @publisher = N'', @publisher_db = N'', @publication = N'' 
      USE < **Publication database name** >GO EXEC sp_dropsubscription @publication =N'', @subscriber = N'', @article = N'all', @destination_db = N'' 

      Удаление подписки слиянием

      Чтобы удалить принудительная подписка, выполните следующий скрипт на издателе:

      USE < **Publication database name** >GO EXEC sp_dropmergesubscription @publication = N'', @subscriber = N'', @subscriber_db = N'', @subscription_type = N'push' 

      Чтобы удалить подписку по запросу, выполните следующие действия.

        Выполните следующий скрипт на подписчике:

      USE < **Subscription database name** >GO EXEC sp_dropmergepullsubscription @publication = N'', @publisher = N'', @publisher_db = N'' 
      USE < **Publication database name** >GO EXEC sp_dropmergesubscription @subscription_type = N'pull', @publication = N'', @subscriber = N'', @subscriber_db = N'' 

      Удаление публикаций

      После удаления всех подписок, которые подписываются на публикацию, можно удалить публикацию. После удаления публикаций в базе данных публикации необходимо задать для параметра базы данных репликации для базы данных публикации значение false. Чтобы удалить публикацию, можно использовать следующие системные хранимые процедуры:

      • sp_droppublication : системная хранимая sp_droppublication процедура позволяет удалить публикацию и связанные с ней статьи. Хранимую процедуру необходимо выполнить на издателе в базе данных публикации.
      • sp_dropmergepublication : системная хранимая sp_dropmergepublication процедура позволяет удалить публикацию слиянием и агент моментальных снимков, связанную с публикацией слиянием. Статьи, связанные с публикацией, также удаляются. Хранимую процедуру необходимо выполнить на издателе в базе данных публикации.
      • sp_replicationdboption : системная хранимая sp_replicationdboption процедура позволяет задать параметр базы данных репликации для текущей базы данных. Хранимую процедуру необходимо выполнить на сервере издателя.

      Чтобы удалить публикацию моментального снимка, выполните следующий скрипт на издателе:

      USE < **Publication database name** >GO EXEC sp_droppublication @publication = N'' USE master GO exec sp_replicationdboption @dbname = N'', @optname = N'publish', @value = N'false' 

      Чтобы удалить публикацию транзакций, выполните следующий скрипт на издателе:

      USE < **Publication database name** >GO EXEC sp_droppublication @publication = N'' USE master GO EXEC sp_replicationdboption @dbname = N'', @optname = N'publish', @value = N'false' 

      Чтобы удалить публикацию слиянием, выполните следующий сценарий на сайте Publisher:

      USE < **Publication database name** >GO EXEC sp_dropmergepublication @publication = N'' USE master GO EXEC sp_replicationdboption @dbname = N'', @optname = N'merge publish', @value = N'false' 

      Удаление распространителя

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

      • sp_dropsubscriber : системная хранимая sp_dropsubscriber процедура позволяет удалить обозначение подписчика с зарегистрированного сервера. Хранимая процедура удаляет запись реестра для подписчика. Хранимая процедура выполняется на издателе в базе данных публикации.
      • sp_dropdistributor : для удаления распространителя sp_dropdistributor можно использовать системную хранимую процедуру. Хранимая процедура выполняется на распространитетеле. Чтобы удалить название подписчика из Publisher, выполните следующий скрипт на сайте Publisher:

      USE master GO EXEC sp_dropsubscriber @subscriber = N'', @reserved = N'drop_subscriptions' 

      Чтобы удалить распространитель, выполните на распространитетеле следующий сценарий:

      USE master GO EXEC sp_dropdistributor @no_checks = 1 

      Использование хранимых процедур

      При удалении репликации можно также использовать следующие хранимые процедуры:

        sp_removedbreplication : системная хранимая sp_removedbreplication процедура позволяет удалить все объекты репликации из базы данных без обновления данных на распространитетеле. Хранимую процедуру необходимо выполнить на издателе в базе данных публикации или на подписчике в базе данных подписки. Ниже приведен синтаксис этой хранимой процедуры.

      sp_removedbreplication '' 
      sp_droparticle @publication = N'', @article = N'', @force_invalidate_snapshot = 1 

      Ссылки

      Дополнительные сведения см. в следующих разделах электронной документации по SQL Server:

      • Отключение публикации и распространения
      • Удаление публикации
      • Удаление принудительной подписки
      • Удаление подписки по запросу

      Обратная связь

      Были ли сведения на этой странице полезными?

      Немножко всего .. из жизни администратора ms sql server

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

      Итак , все таки удалим репликацию с базы данных.

      Начнем с диагности, убедимся, что в журнале транзакций висят именно транзакции репликации, выполним команду на нашей базе данных:

      Должен быть примерно следующий результат:

      Transaction information for database ‘DbName’.
      Replicated Transaction Information:
      Oldest distributed LSN : (0:0:0)
      Oldest non-distributed LSN : (1154873:22795:10)
      DBCC execution completed. If DBCC printed error messages, contact your system administrator.

      В таких случаях в SQL Server Management Studio не показвывает, что есть публикации, такой же результатпоказывают и другие процедуры репликации,сообщая , что база данных не сконфигурирована как издатель.

      Когда убедившись, что транзакции именно репликации, удалим все объекты репликации в базе данных, использовав процедуру sp_removedbreplication, она документирована и рекомендуется её использовать именно на крайний случай:

      Устранение неполадок репликации транзакций

      В данной статье я покажу, как использовать встроенные в SQL Server средства для мониторинга производительности репликации, получения уведомления о возникающих неполадках и выявления их причин. Кроме того, мы обсудим три часто возникающие проблемы репликации транзакций и выясним, как с ними бороться

      Репликация транзакций представляет собой эффективный способ сохранения схемы и данных для определенных объектов, синхронизируемых между несколькими базами данных SQL Server. Репликация может использоваться как в простом сценарии, в котором задействовано несколько серверов, так и в сложных, распределенных по многим центрам обработки данных средах. Однако независимо от размера и сложности топологии большое число участвующих в репликации компонентов означает, что время от времени будут возникать проблемы, требующие вмешательства администраторов баз данных.

      Просмотр состояния репликации

      Монитор репликации Replication Monitor является основным имеющимся в вашем распоряжении графическим инструментом для наблюдения за производительностью репликации и диагностики. Replication Monitor был включен в управляющую консоль Enterprise Manager в SQL Server 2000, однако в SQL Server 2005 он был выделен из SQL Server Management Studio в специальный исполняемый модуль (SSMS). Как и SSMS, Replication Monitor можно применять для мониторинга издателей (Publishers), подписчиков (Subscribers) и распространителей (Distributors), работающих на предыдущих версиях SQL Server, хотя те возможности, которые отсутствуют в SQL Server 2005, не будут отображаться на экране.

      Для запуска Replication Monitor откройте SSMS подключитесь в окне Object Explorer к издателю, щелкните правой кнопкой мыши на папке Replication и выберите в контекстном меню пункт Launch Replication Monitor (запустить монитор репликации). На экране 1 показано окно Replication Monitor с несколькими зарегистрированными издателями. В левой панели окна мы видим дерево со списком зарегистрированных издателей, содержимое правой панели зависит от того элемента, который выбран в дереве.

      Replication Monitor с зарегистрированными издателями
      Экран 1. Replication Monitor с зарегистрированными издателями

      Выбор издателя в древовидном представлении отображает в правой панели представления в виде трех закладок: Publications («Публикации»), где показаны название, текущий статус и количество подписчиков для каждой публикации данного издателя; Subscription Watch List («Список наблюдения за подписками»), где показаны статус и приблизительная задержка (время выполнения находящихся в ожидании команд) всех подписок данного издателя; Agents («Агенты»), где отображаются время последнего запуска и текущее состояние агента моментальных снимков, агента чтения журнала и агента чтения очереди, а также различные задания автоматического обслуживания, созданные SQL Server для поддержки работоспособности репликации.

      Раскрытие в дереве узла какого-либо издателя показывает его публикации. В результате выбора публикации в правой панели отображаются представления из четырех закладок: All Subscriptions («Все подписки»), где показаны текущий статус и приблизительная задержка агента распространителя для каждой подписки; Tracer Tokens («Маркеры трассировки»), где показаны статусы последних маркеров трассировки для публикации (позднее мы рассмотрим маркеры трассировки более подробно); Agents («Агенты»), где отражено время последнего запуска, время выполнения и текущее состояние агента моментальных снимков и агента чтения журнала, используемых данной публикацией; Warnings («Предупреждения»), отображающие параметры всех предупреждений, настроенных для данной публикации.

      Если щелкнуть правой кнопкой мыши на любой строке (на агенте) на закладках Subscription Watch List, All Subscriptions или Agents, появится контекстное меню с такими пунктами, как остановка и запуск агента, просмотр профиля агента и просмотр свойств заданий агента. В результате двойного щелчка мышью по агенту открывается окно, показывающее специфические детали статуса агента.

      Окно агента распространителя содержит три закладки: Publisher to Distributor History («Журнал операций от издателя к распространителю»), показывающая статус и список последних выполненных действий агента чтения журнала данной публикации; Distributor to Subscriber History («Журнал операций от распространителя к подписчику»), показывающая статус и список последних выполненных действий агента распространителя; Undistributed Commands («Нераспространенные команды»), на которой показано количество команд в базе данных распространителя, ожидающих применения к подписчику, и примерное время выполнения этих команд. Окна агентов чтения журнала и моментальных снимков содержат только закладку Agent History («Журнал агента»), на которой показан статус и список последних выполненных действий агента.

      При возникновении проблем с репликацией, например в случае сбоя в работе агента распространителя, значок для издателя, публикации и самого агента меняет вид в зависимости от типа ошибки. Значок в виде красного кружка с крестиком говорит о сбое агента, белый кружок с круговой стрелкой показывает, что агент пытается повторно выполнить команду, а желтый символ с восклицательным знаком является предупреждением. Определение проблемного агента осуществляется путем раскрытия в дереве тех издателей и публикаций, вид значка которых говорит о неполадках, выбора в правой панели закладок для проблемных агентов и двойного щелчка на агенте для отображения его статуса и информации об ошибке.

      Измерение потока данных

      Понимать, как долго передаются данные на каждом этапе, очень важно при устранении неисправностей, связанных с задержками передачи. Это позволит вам сосредоточиться на проблемном сегменте. В SQL Server 2005 были добавлены маркеры трассировки для измерения потока данных и реальных задержек на всем пути от издателя до подписчиков (значения задержек для агентов Replication Monitor являются приближенными). При создании маркера трассировки специальный маркер записывается в журнал транзакций базы данных публикации, который затем просматривается агентом чтения журнала, записывается в базу данных распространителя и пересылается всем подписчикам. Время, потребовавшееся маркеру для перемещения по всем этапам, сохраняется в базе данных распространителя.

      Маркеры трассировки могут использоваться только в том случае, если и база данных публикации, и база данных распространителя развернуты на SQL Server 2005 или более новой версии. Статистика подписчика для принудительных подписок накапливается, если подписчик развернут на SQL Server 7.0 или более новой версии, а для подписок по запросу — если подписчик развернут на SQL Server 2005 и более новых версиях. Для подписчиков, не удовлетворяющих этим требованиям (например, работающих не на SQL Server), статистика для маркеров трассировки может быть накоплена издателем или распространителем. Для добавления маркера трассировки вам должна быть назначена серверная роль sysadmin или роль db_owner для база данных издателя.

      Для добавления нового маркера трассировки или просмотра статуса существующих маркеров перейдите в Replication Monitor на закладку Tracer Tokens. На экране 2 показан пример закладки Tracer Tokens с подробной информацией о задержках для ранее добавленных маркеров. Для создания нового маркера нажмите кнопку Insert Tracer (добавить трассировку). Информацию для существующих маркеров можно получить, выбрав соответствующий пункт из выпадающего списка в правой части окна.

      Закладка Tracer Tokens с подробной информацией о задержках для ранее добавленных маркеров
      Экран 2. Закладка Tracer Tokens с подробной информацией
      о задержках для ранее добавленных маркеров

      Определение момента возникновения неполадки

      Несмотря на то, что Replication Monitor очень полезен для просмотра состояния репликации, вряд ли кто-то станет держать его постоянно открытым в ожидании ошибки. У администратора базы данных много других дел, помимо разглядывания экрана в течение всего дня, и в какие-то моменты ему приходится покидать свое рабочее место.

      Однако SQL Server можно настроить для отправки оповещений при возникновении определенных проблем репликации. При начальной настройке распространителя создается группа оповещений для событий, связанных с репликацией. Для просмотра списка оповещений откройте SSMS и подключитесь в окне Object Explorer к базе данных распространителя, а затем в дереве раскройте узлы SQL Server Agent и Alerts. Для просмотра или настройки оповещения откройте окно свойств оповещения двойным щелчком мыши на оповещении или щелчком правой кнопкой и выбором в контекстном меню пункта Properties («Свойства»). Или же можно настроить оповещение по-другому: в окне Replication Monitor выбрать публикацию в левой панели, открыть закладку Warnings в правой панели и нажать кнопку Configure Alerts («Настроить оповещения»). Варианты, доступные в окне свойств оповещения для определения ответных действий, уведомлений и т.д. — те же, что и в оповещениях для заданий агента SQL Server. На экране 3 показан пример закладки Warnings в Replication Monitor.

      Закладка Warnings в Replication Monitor
      Экран 3. Закладка Warnings в Replication Monitor

      Для репликации транзакций особый интерес представляют три оповещения: Replication: Agent failure («Репликация: сбой агента»), Replication: Agent retry («Репликация: повторная попытка агента») и Replication Warning: Transactional replication latency (Threshold: latency) («Предупреждение: задержка репликации транзакций (порог задержки)»). По умолчанию включены (но не настроены для отправки уведомлений оператору) только оповещения для порогов задержки. Такие оповещения настраиваются на закладке Warnings для публикации в Replication Monitor. Оповещения запускаются при превышении этих порогов и используются монитором репликации для отображения на экране соответствующего значка оповещения. В большинстве случаев стандартные значения порогов не требуют изменения, однако их необходимо пересмотреть на предмет удовлетворения требованиям тех SLA и SLE, за которые вы несете ответственность.

      Типичным ответным действием оповещения является отправка уведомления (например, по электронной почте) членам группы администраторов база данных. Поскольку отправка почтовых сообщений базируется на работе компонента Database Mail, вам необходимо ее настроить, если вы еще этого не сделали. Кроме того, чтобы избежать избытка оповещений, следует увеличить задержку между ответами до пяти минут или более. Наконец, не забудьте включить данное оповещение на странице General окна Alert properties («Свойства оповещения»).

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

      Другие потенциальные проблемы, требующие внимания

      Могут возникнуть и такие проблемы, к которым ни оповещения, ни Replication Monitor не привлекут вашего внимания: прекращение работы агентов и неконтролируемый рост базы данных распространителя.

      Обычной практикой является постоянная работа агентов (или автоматический запуск при старте службы SQL Server Agent). Иногда агенты могут останавливаться, и если их не перезапустить, то это приведет к накоплению на сервере-распространителе транзакций, ожидающих применения на сервере-подписчике, или, если остановился агент чтения журнала, к росту журнала транзакций на сервере-издателе. Приближенные значения задержек, показываемые в Replication Monitor, основаны на текущей производительности работающего агента или на недавней истории агента, если он остановлен. Если в момент останова задержка агента была ниже порога создания оповещения, то оповещение о превышении порога задержки не создается и Replication Monitor не отобразит изменения значка оповещений.

      Хранимая процедура dbo.Admin_Start_Idle_Repl_Agents, приведенная в листинге 1, может запускаться на сервере-распространителе (и на серверах-подписчиках с подписками по запросу) и служить для перезапуска агентов репликации, настроенных на постоянную работу, но в данный момент не функционирующих. Настройка данной процедуры для периодического запуска (например, каждые шесть часов) не допустит, чтобы простои агентов приводили к серьезным проблемам.

      Неконтролируемый рост базы данных распространителя может происходить даже при работающих агентах. Как только команды будут доставлены ко всем подписчикам, их необходимо удалить, чтобы освободить пространство для новых команд. При начальной настройке распространителя создается задание службы SQL Server Agent под названием Distribution clean up: distribution для удаления команд, доставленных ко всем подписчикам. Если это задание отключено или работает некорректно (например, заблокировано), команды не удаляются и база данных распространителя растет. Проверка истории выполнения этого задания и размера базы данных распространителя на всех распространителях должна стать частью ежедневной работы администратора базы данных.

      Распространенные неисправности и их устранение

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

      Distribution Agents fail with the error message The row was not found at the Subscriber when applying the replicated command or Violation of PRIMARY KEY constraint [Primary Key Name]. Cannot insert duplicate key in object [Object Name].

      (Агенты распространителя прекратили работу с ошибкой «Строка не обнаружена на подписчике при применении реплицированной команды или нарушение ограничения по первичному ключу [имя первичного ключа]. Невозможно вставить повторяющийся ключ в объект [имя объекта]).

      Причина. По умолчанию процесс репликации доставляет команды к подписчикам построчно (но при этом как часть пакета, упакованного в транзакцию) и использует @@rowcount, чтобы проверить, была ли затронута только одна строка. Первичный ключ используется для проверки того, какую именно строку необходимо вставить, обновить или удалить; при вставке, если строка с первичным ключом уже существует у подписчика, команда не выполнится по причине нарушения ограничения по первичному ключу. При обновлении или удалении, если нет соответствующего первичного ключа, @@rowcount возвращает 0, и возникает ошибка, вызывающая сбой в работе агента распространителя.

      Решение. Если вас не интересует, в какой команде произошел сбой, вы можете просто изменить профиль агента распространителя для игнорирования ошибок. Для изменения профиля перейдите в Replication Monitor к Publication, щелкните правой кнопкой мыши на проблемном подписчике в закладке All Subscriptions и выберите пункт Agent Profile («Профиль агента»). Откроется новое окно, в котором вы можете изменить профиль выбранного агента; поставьте флажок для профиля Continue on data consistency errors и нажмите OK. На экране 4 показан пример окна профиля агента, в котором отмечен данный профиль. Агент распространителя необходимо перезапустить, чтобы вступил в действие новый профиль. Для этого щелкните правой кнопкой мыши на подписчике и выберите пункт Stop Synchronizing («Остановить синхронизацию»). Когда статус подписчика сменится с Running («Работает») на Not Running («Не работает»), снова щелкните правой кнопкой мыши на подписчике и выберите пункт меню Start Synchronizing («Запустить синхронизацию»).

      Профиль Continue on Data Consistency Errors, отмеченный в профиле агента распространителя
      Экран 4. Профиль Continue on Data Consistency Errors, отмеченный в профиле агента распространителя

      Данный профиль является системным профилем, который будет игнорировать три ошибки: вставка строки с повторяющимся ключом, нарушение ограничений по первичному ключу и отсутствующие у подписчика строки. Если при использовании данного профиля возникает одна из этих ошибок, агент распространителя не прекратит работу, а перейдет к выполнению следующей команды. Выбирая данный профиль, имейте в виду, что может нарушиться синхронизация данных между издателем и подписчиком.

      Если вы хотите узнать, когда именно возникла ошибка, можно выполнить на распространителе хранимую процедуру sp_browsereplcmds. Ей нужны три параметра: ID базы данных издателя, порядковый номер транзакции (transaction sequence number) и ID команды. Для получения ID базы данных издателя выполните на распространителе код листинга 2 (заполнив предварительно соответствующие значения для издателя, подписчика и публикации).

      Для получения порядкового номера транзакции и ID команды перейдите в мониторе репликации к агенту, на котором произошел сбой, откройте окно его статуса, выберите закладку Distributor to Subscriber History и выберите самый последний сеанс с ошибочным статусом. Порядковый номер транзакции и ID команды содержатся в сообщении с подробным описанием ошибки. На экране 5 показан пример сообщения об ошибке, содержащего эти два значения.

      Сообщение об ошибке с информацией о?порядковом номере транзакции и ID команды
      Экран 5. Сообщение об ошибке с информацией о?порядковом номере транзакции и ID команды

      А теперь выполните код листинга 3, используя только что полученные значения для отображения той команды, на которой произошла ошибка у подписчика. Зная команду, вызвавшую ошибку, вы можете внести на подписчике необходимые изменения, чтобы команда выполнилась успешно.

      Distribution Agent fails with the error message Could not find stored procedure 'sp_MSins_'.

      (Агент распространителя прекратил работу с ошибкой «Не удалось найти хранимую процедуру ‘sp_MSins_ ‘».)

      Причина. Публикация настроена на исполнение команд INSERT, UPDATE и DELETE с помощью хранимых процедур, но эти процедуры у подписчика были удалены. Хранимые процедуры репликации не считаются системными хранимыми процедурами и могут быть обработаны инструментами сравнения схем. Если эти инструменты использовались для переноса изменений из нереплицированной версии базы данных подписчика в реплицированную версию (например, миграция изменений схемы из локальной среды разработки в тестовую среду), процедуры могли быть удалены, потому что они отсутствовали в нереплицированной версии.

      Решение. С этой проблемой справиться довольно легко. В опубликованной базе данных на издателе выполните хранимую процедуру sp_scriptPublicationcustomprocs для создания на издателе хранимых процедур для команд INSERT, UPDATE и DELETE. Данная процедура использует всего один параметр (имя публикации) и возвращает в качестве результата столбец с данными типа nvarchar(4000). При запуске процедуры в SSMS обеспечьте вывод результата в виде текста (выберите меню Control-T или Query, затем Results To и далее Results To Text) и установите максимальное количество символов для вывода результата в текст не менее 8000. Данное значение можно установить, выбрав меню Tools, далее — Options, Query Results, Results to Text, Maximum number of characters displayed in each column. После выполнения процедуры скопируйте сгенерированные сценарии в окно с новым запросом и выполните их в соответствующей базе данных подписки на подписчике.

      Distribution Agents won’t start or don’t appear to do anything.

      (Агенты распространителя не запускаются или не выполняют никаких действий)

      Причина. Обычно такое происходит, когда на одном и том же сервере одновременно работает большое количество агентов распространителя, например на распространителе, который обслуживает более 50 публикаций или подписок. Агенты распространителя являются независимыми исполняемыми файлами, работающими вне процесса SQL Server в неинтерактивном режиме (то есть без графического интерфейса). Windows Server для запуска таких процессов использует специальную область памяти, называемую кучей неинтерактивного рабочего стола (non-interactive desktop heap). Если Windows расходует всю доступную в данной куче память, агенты распространителя не могут запуститься.

      Решение. Данная проблема требует внесения изменений в системный реестр на неисправном сервере (обычно это распространитель) для увеличения размера кучи неинтерактивного рабочего стола и его перезагрузки. Здесь важно заметить, что модификация системного реестра может привести к серьезным ошибкам, если выполняется некорректно. Очень аккуратно выполните следующие действия и обязательно сделайте резервную копию реестра перед его модификацией.

      1. Запустите редактор реестра с помощью команды regedit32.exe в диалоговом окне «Выполнить» или в окне командной строки.
      2. Перейдите в левой панели к ключу HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerSubSystems
      3. В правой панели выполните двойной щелчок мышью на параметре Windows для запуска панели редактирования текстовой строки.
      4. Найдите в панели ввода данных параметр SharedSection. В нем вы увидите три значения, разделенные запятыми и имеющие примерно такой вид:
      SharedSection=1024,3072,512

      За размер кучи рабочего стола отвечает третье значение (в данном примере 512). Увеличение этого значения на 256 или 512 (доведение его величины до 768 или 1024) должно быть достаточным для решения проблемы. После изменения значения нажмите OK. Чтобы изменения вступили в действие, необходима перезагрузка Windows. Более подробную информацию о куче неинтерактивного рабочего стола можно найти в статье «Unexpected behavior occurs when you run many processes on a computer that is running SQL Server» (http://support.microsoft.com/kb/824422).

      Мониторинг среды репликации

      Совместное применение таких инструментов как Replication Monitor, маркеры трассировки и оповещения является мощным средством мониторинга вашей топологии репликации и поиска источников возникающих проблем. Несмотря на то что описанные выше методы являются хорошим руководством для исправления наиболее распространенных неполадок в репликации транзакций, одной этой статьи недостаточно для описания всех известных проблем. Дополнительную информацию об устранении неисправностей в процессе репликации можно найти в блоге REPLTalk группы поддержки репликации Microsoft SQL Server (http://blogs.msdn.com/b/repltalk/).

      Листинг 1. Перезапуск агентов репликации, настроенных на постоянную работу

      USE msdb GO DROP PROCEDURE dbo.Admin_Start_Idle_Repl_Agents GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO

      Admin_Start_Idle_Repl_Agents v1.00 (2010-02-01)

      (C) 2010, Kendal Van Dyke

      Admin_Start_Idle_Repl_Agents is free to download and use for personal, educational, and internal

      corporate purposes, provided that this header is preserved. Redistribution or sale

      of Admin_Start_Idle_Repl_Agents, in whole or in part, is prohibited without the author’s express

      CREATE PROCEDURE dbo.Admin_Start_Idle_Repl_Agents AS BEGIN SET NOCOUNT ON DECLARE @JobID UNIQUEIDENTIFIER CREATE TABLE #enum_job ( [Job_ID] UNIQUEIDENTIFIER, [Last_Run_Date] INT, [Last_Run_Time] INT, [Next_Run_Date] INT, [Next_Run_Time] INT, [Next_Run_Schedule_ID] INT, [Requested_To_Run] INT, [Request_Source] INT, [Request_Source_ID] VARCHAR(100), [Running] INT, [Current_Step] INT, [Current_Retry_Attempt] INT, [State] INT ) INSERT INTO #enum_job EXEC master.dbo.xp_sqlagent_enum_jobs 1, garbage — Iterate through agents that are not running (but should be) and call sp_start_job to start them DECLARE curJob local fast_forward FOR SELECT enum_job.Job_ID FROM #enum_job AS enum_job INNER JOIN msdb.dbo.sysjobs AS sysjobs ON enum_job.Job_ID = sysjobs.job_id INNER JOIN msdb.dbo.syscategories AS syscategories ON sysjobs.category_id = syscategories.category_id WHERE enum_job.Next_Run_Date = 0 AND enum_job.Running = 0 AND ( syscategories.name = N'REPL-LogReader' OR syscategories.name = N'REPL-Distribution' OR syscategories.NAME = N'REPL-QueueReader' ) OPEN curJob FETCH NEXT FROM curJob INTO @JobID WHILE @@fetch_status = 0 BEGIN EXEC msdb.dbo.sp_start_job @job_id = @JobID FETCH NEXT FROM curJob INTO @JobID END CLOSE curJob DEALLOCATE curJob DROP TABLE #enum_job END GO

      Листинг 2. Код для получения ID базы данных издателя

      SELECT DISTINCT subscriptions.publisher_database_id FROM sys.servers AS [publishers] INNER JOIN distribution.dbo.MSpublications AS [publications] ON publishers.server_id = publications.publisher_id INNER JOIN distribution.dbo.MSarticles AS [articles] ON publications.publication_id = articles.publication_id INNER JOIN distribution.dbo.MSsubscriptions AS [subscriptions] ON articles.article_id = subscriptions.article_id AND articles.publication_id = subscriptions.publication_id AND articles.publisher_db = subscriptions.publisher_db AND articles.publisher_id = subscriptions.publisher_id INNER JOIN sys.servers AS [subscribers] ON subscriptions.subscriber_id = subscribers.server_id WHERE publishers.name = 'MyPublisher' AND publications.publication = 'MyPublication' AND subscribers.name = 'MySubscriber'

      Листинг 3. Код для отображения команды, на которой произошла ошибка у подписчика

      EXECUTE distribution.dbo.sp_browsereplcmds @xact_seqno_start = '0x0000001900001926000800000000', @xact_seqno_end = '0x0000001900001926000800000000', @publisher_database_id = 29, @command_id = 1

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *