0

SQL Server 2012 とレプリケーション プロセスを使用しています。現在、レプリケーション プロセスは正常に機能していますが、このレプリケーションを削除したいと考えています。つまり、スクリプトを使用したすべての出版物、サブスクリプション、および記事を削除したいと考えています。このサイトhttp://support.microsoft.com/kb/324401を調べて、次のスクリプトを試しました

:setvar PublisherDatabase "AdventureWorks2012"
:setvar SubscriberServer "HYDHTC0131320D\MSSQLSERVER2"

use [$(PublisherDatabase)]

--Drop all subscriptions
exec sp_dropsubscription  
@publication = N'TestPubs',
@article = N'all',
--@subscriber = [$(SubscriberServer)]
@subscriber = N'all',
@destination_db = N'all'

--Drop publication
if exists (Select 1 From SysPublications where name = N'TestPubs')
EXEC sp_droppublication @publication = N'TestPubs'

EXEC sp_replicationdboption @dbname = [$(PublisherDatabase)], @optname = N'publish', @value = N'false'

--Drop subscriber entry
EXEC sp_dropsubscriber @subscriber = [$(SubscriberServer)]

--Drop distributor
EXEC sp_dropdistributor @no_checks = 1

上記のスクリプトを実行した後、次のエラーが発生します。

Only one Log Reader Agent or log-related procedure (sp_repldone, sp_replcmds, and sp_replshowcmds) can connect to a database at a time. If you executed a log-related procedure, drop the connection over which the procedure was executed or execute sp_replflush over that connection before starting the Log Reader Agent or executing another log-related procedure.

Msg 18752, Level 16, State 1, Procedure sp_replcmds, Line 1

Only one Log Reader Agent or log-related procedure (sp_repldone, sp_replcmds, and sp_replshowcmds) can connect to a database at a time. If you executed a log-related procedure, drop the connection over which the procedure was executed or execute sp_replflush over that connection before starting the Log Reader Agent or executing another log-related procedure.

The Subscriber was dropped.

Msg 20015, Level 16, State 1, Procedure 

sp_MSreplremoveuncdir, Line 83
Could not remove directory 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\ReplData\unc\HYDHTC0131320D_ADVENTUREWORKS2012_TESTPUBS\20120719152739\'. Check the security context of xp_cmdshell and close other processes that may be accessing the directory.

詳細については、このスクリーンショットを確認してください

ここに画像の説明を入力

誰でもこれらの問題を解決するのを手伝ってもらえますか

4

2 に答える 2

2

レプリケーションの削除時にエラーが発生し、サブスクライバーに孤立したサブスクリプション メタデータがあるようです。孤立したメタデータは、 sp_removedbreplicationを使用してサブスクリプション データベースから削除できます。

今後の参考のために、次の手順に従って、すべてのサブスクリプションとパブリケーションを削除し、パブリッシングとディストリビューションを無効にすることができます。

リンクからの関連コード

a)トランザクションレプリケーションでプッシュ サブスクリプションを削除するには

-- This batch is executed at the Publisher to remove 
-- a pull or push subscription to a transactional publication.
DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriber = $(SubServer);

USE [AdventureWorks2012]
EXEC sp_dropsubscription 
  @publication = @publication, 
  @article = N'all',
  @subscriber = @subscriber;
GO

b)マージレプリケーションでサブスクリプションを削除するには

DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorks2012Replica';

USE [AdventureWorks2012]
EXEC sp_dropmergesubscription 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @subscriber_db = @subscriptionDB;
GO

c)トランザクションレプリケーションで、パブリケーションを削除し、ソース DBをパブリッシャーとして停止するように設定する。

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
SET @publicationDB = N'AdventureWorks2008R2'; 
SET @publication = N'AdvWorksProductTran'; 

-- Remove a transactional publication.
USE [AdventureWorks2008R2]
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

d)マージレプリケーションで、パブリケーションを削除し、ソース DBをパブリッシャーとして停止するように設定する。

DECLARE @publication AS sysname
DECLARE @publicationDB    AS sysname
SET @publication = N'AdvWorksSalesOrdersMerge' 
SET @publicationDB = N'AdventureWorks2008R2'

-- Remove the merge publication.
USE [AdventureWorks2008R2]
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
于 2012-07-21T22:55:10.313 に答える
0

私の回避策はsp_droppublication、トランザクションで行うことです。

-- local variables
declare
 @return_code    int -- return code of sp
,@dependent_publ sysname -- publication dependent on replicated RDZ tables

declare a cursor for
select distinct p.name from syspublications p
 inner join sysarticles s on p.pubid = s.pubid 
 inner join adm_replicated_rdz_tables r on r.table_name = s.name

if exists
 (select * from sys.objects
   where object_id = object_id('[dbo].[sysarticles]') and type in ('U'))
begin
 open a; fetch next from a into @dependent_publ; while @@fetch_status = 0
 begin
  begin transaction
   print @dependent_publ
   execute sp_droppublication @dependent_publ;
  commit
  fetch next from a into @dependent_publ;
 end; close a; deallocate a;
end
于 2013-10-04T10:15:36.233 に答える