如何从 SQL Server中手动删除复制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从 SQL Server中手动删除复制相关的知识,希望对你有一定的参考价值。

步骤 1-删除所有订阅
您可以运行 sp_helpsubscription 来确定有任何订阅已发布数据库中。
运行以下命令删除已发布数据库中的所有发布的所有订阅。 已发布并且已订阅的每个数据库中,必须运行此命令。 运行此命令还会删除与断开的订阅关联的该通讯组任务。
sp_dropsubscription 'all', 'all', 'all'
请注意 sp_dropsubscriptions 将只正确才能都满足以下条件:

有是分发数据库安装。
发布服务器具有所有的订阅服务器的正确的远程服务器信息。 配置复制时,将自动定义远程服务器的信息。 可以通过运行 sp _ helpserver 验证远程服务器信息。

步骤 2-删除所有文章和发布
您可以运行 sp_helppublication 来确定有任何出版物已发布数据库中。
您可以运行"Select * 从 sysarticles"来确定是否有任何文章在发布数据库中。
运行以下命令删除所有文章和已发布数据库中的订阅。 已发布并且已发布的每个数据库中,必须运行此命令。 运行此命令将同时删除与断开的发布,同步任务。
sp_droppublication 'all'步骤 3-清除事务日志的复制任何"非"

无法截断事务日志,只要有任何不分发的复制的事务。 一个"非复制的事务为已标记为已发布的数据库事务日志中复制,但已不被"分发"的日志读取器任务的交易记录。
您可以看到通过运行以下命令是否有任何"非复制的事务,已发布的数据库中:
dbcc opentran(<published_database_name>) with tableresults如果该数据库了在某个点必须复制的事务,上面的命令将返回最早的分布式的行 ID ("REPL_OLD_DIST_RID") 和最早的非分布式的行 ID ("REPL_OLD_NONDIST_RID")。 如果数据库不具有任何复制的事务,并且有没有打开的事务,上面的命令将返回 0 的行。

如果上面的命令不会返回最旧分布式和最早非-分布式行 ID,和如果这些行 ID 不相同,您有或多个 undistributed 复制该数据库中的事务。 如果行 ID 相同,您没有任何非复制的事务在数据库中。 详细信息,请参阅 Transact-SQL 参考书中的 DBCC 语句 (英文)。
如果非复制的事务请运行下面的命令,将标记为"分配"的所有复制的事务,以便可以截断日志:
sp_repldone 0, 0, null, 0, 0, 1
参考技术A   您可以通过使用系统存储过程和其它事务处理 SQL 语句手动删除复制。要完全删除复制,请执行以下步骤:
除去所有订阅配置为 thereplication。
除去所有的发布配置为 thereplication。
除去分发服务器被配置为 thereplication。本回答被提问者和网友采纳

SQL Server删除distribution数据库

  在数据库服务器删除复制(发布订阅)后,如何删除掉数据库distribution呢?如果你通过SSMS工具去删除数据库distribution,你会发现根本没有删除选项。 下面介绍一下删除distribution的步骤

 

步骤1: 查看相关订阅服务器的信息,如果还存在对应的订阅服务器,从注册的服务器中删除订阅服务器名称

exec sp_helpsubscriberinfo ;
go
 
exec sp_dropsubscriber \'SubscriberName\';
go

 

步骤2: 查看分发服务器的发布服务器的属性

exec sp_helpdistpublisher;

 

步骤3: 删除分发发布服务器

exec sp_dropdistpublisher  @publisher = \'PublisherName\'

 

步骤4: 使用sp_dropdistributiondb删除数据库distribution

use master;
 
go
 
exec sp_dropdistributiondb @database = N\'distribution\'
 
go
 
use master; 
 
go 
 
exec sp_dropdistributor @no_checks = 1, @ignore_distributor = 1 
 
go
 

 

注意事项:

1:错误信息“Could not drop the distribution database \'distribution\'. This distributor database is associated with a Publisher.”

 

exec sp_dropdistributiondb @database = N\'distribution\'  

GO

消息 14120,级别 16,状态 1,过程 sp_dropdistributiondb,第 85 行

Could not drop the distribution database \'distribution\'. This distributor database is associated with a Publisher.

clipboard

出现这个错误,是因为必须先删除对应的分发发布服务器,否则就会出现下面错误。

 

2:错误信息“Cannot drop the distribution database \'distribution\' because it is currently in use”

 

exec sp_dropdistributiondb @database = N\'distribution\'  

go

消息 21122,级别 16,状态 1,过程 sp_dropdistributiondb,第 124 行

Cannot drop the distribution database \'distribution\' because it is currently in use.

 

出现上面情况,是因为会话窗口使用的数据库是distribution,你可以指定会话窗口的数据库为master或使用下面语句即可解决问题。

use master; 
 
go 
 
exec sp_dropdistributiondb @database = N\'distribution\' 
 
go
 

 

另外由于某些原因,导致无法使用sp_dropdistributiondb删除distribution数据库。此时可以使用下面方式强制删除数据库distribution。

clipboard[1]

use master 
go 
 
alter database distribution set offline; 
go
 
drop database distribution;

 

use master;
go
 
alter database distribution set single_user with rollback immediate
go
 
drop database distribution;
go

以上是关于如何从 SQL Server中手动删除复制的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 触发器中复制插入、更新、删除的行

如何根据 SQL Server 中的某个列删除重复项? [复制]

从 SQL Server 2000 中恢复已删除的行

SQL Server删除distribution数据库

我可以在不中断复制的情况下从 SQL Server 复制订阅者数据库中删除特定数据吗?

如何根据多个条件从 SQL Server 中删除大量数据