如何从 SQL Server中手动删除复制(删除发布订阅)

时间:2022-09-15 14:39:29

本文介绍的步骤可以使用手动删除 (卸载) 复制,通过使用存储的过程和 Transact-SQL 命令。

本文中的该信息可能在您怀疑未正确,被删除的复制某些元素中,并且想要手动删除这些元素的情况下有用。 如果复制未正确删除,以前发布的数据库的事务日志可能会填满,因为日志不能被截断。 请 (参阅步骤 3 的详细信息如何诊断这种可能性)。

本文可能很有用如果您要创建脚本或程序的过程卸载复制。

下面的列表是手动删除复制的必要步骤的摘要。 本文的在"更多信息"部分提供每个步骤的详细信息。

  1. 删除所有订阅。
  2. 删除所有文章和发布。
  3. 清除任何"非"的事务日志复制交易记录。
  4. 删除数据库的发布和订阅状态。
  5. 删除不需要的远程服务器和远程登录。
  6. 删除服务器的发布服务器、 订阅服务器和分发服务器状态。
  7. 删除任何剩余的复制任务。
  8. 删除.sch 和.tmp 文件 repldata 目录中。
  9. 删除分发数据库。
  10. 重置 MSlast_job_info 表。
  11. 请验证复制注册表项。

您可能会发现更容易使用 SQL Enterprise Manager 可能要卸载复制,而不是使用存储过程和 Transact-SQL 命令。

SQL Server 6.5 中, 可以使用 SQL 企业管理器删除通过单击复制配置 / 卸载发布服务器菜单上的复制。 有关详细的信息请参阅第 3 部分的新增 SQL Server 6.5 简介册中的"卸载复制"。

SQL Server 6.0 没有一个复制卸载选项,但您可以执行的步骤 1 至 7 使用 SQL 企业管理器。 对于 SQL Server 6.0,仍然需要手动执行步骤 8 至 11。 有关详细信息,请参阅"停止复制"章 14 中 SQL Server 6.0 管理员的助理。

请注意您不应使用转储和负载的机制将发布和订阅数据库传输到一个不同的服务器。 (在这种情况下"不同服务器"意味着不在最初发布数据库的一个)。 在很多的情况下本文中的过程不会从已从一台服务器转储并加载到另一台服务器上的数据库中删除复制足够。

如果您必须将已发布的数据库移到另一台服务器中,应考虑使用传输管理器或大容量复制程序 (BCP)。 您可以安全地使用转储并加载不同服务器传输已发布的数据库仅当删除所有订阅和所有的出版物已发布数据库中之前转储数据库的机制。 

下面是步骤手动删除 (卸载) 复制进行详细说明。 请参阅 SQL Server 联机丛书有关详细信息在命令和下面讨论的存储的过程。

如何从 SQL Server中手动删除复制(删除发布订阅)回到顶端

步骤 1-删除所有订阅

您可以运行 sp_helpsubscription 来确定有任何订阅已发布数据库中。

运行以下命令删除已发布数据库中的所有发布的所有订阅。 已发布并且已订阅的每个数据库中,必须运行此命令。 运行此命令还会删除与断开的订阅关联的该通讯组任务。


   sp_dropsubscription 'all', 'all', 'all'


请注意 sp_dropsubscriptions 将只正确才能都满足以下条件:

  • 有是分发数据库安装。

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

 

如何从 SQL Server中手动删除复制(删除发布订阅)回到顶端

步骤 2-删除所有文章和发布

您可以运行 sp_helppublication 来确定有任何出版物已发布数据库中。

您可以运行"Select * 从 sysarticles"来确定是否有任何文章在发布数据库中。

运行以下命令删除所有文章和已发布数据库中的订阅。 已发布并且已发布的每个数据库中,必须运行此命令。 运行此命令将同时删除与断开的发布,同步任务。


   sp_droppublication 'all'


步骤 3-清除事务日志的复制任何"非"

如何从 SQL Server中手动删除复制(删除发布订阅)回到顶端

交易记录

无法截断事务日志,只要有任何不分发的复制的事务。 一个"非复制的事务为已标记为已发布的数据库事务日志中复制,但已不被"分发"的日志读取器任务的交易记录。

您可以看到通过运行以下命令是否有任何"非复制的事务,已发布的数据库中:


   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


sp _ repldone 命令必须运行在每个具有非复制的事务的数据库中。

如果数据库被标记为发布只能运行 sp _ repldone 命令。 如有必要,您可以将临时标记数据库为发布的运行以下命令:


   sp_dboption <database_name>, pub, true


在运行 sp _ repldone 之后可以通过运行以下命令来标记不是发布的数据库:


   sp_dboption <database_name>, pub, false


您应该与您的主要支持提供者联系如果您持续看到完成本文中过程后的事务日志中复制的事务中。

如何从 SQL Server中手动删除复制(删除发布订阅)回到顶端

步骤 4-删除数据库的"发布"和"订阅"状态

运行 sp _ helpdb 来验证的数据库有状态为"发布"或"已订阅。

运行以下命令从数据库中删除"发布"状态。 运行此命令还会删除数据库的日志读取器任务。


   sp_dboption <database_name>, published, false


运行以下命令从数据库中删除"已订阅"的状态:


   sp_dboption <database_name>, subscribed, false

 

如何从 SQL Server中手动删除复制(删除发布订阅)回到顶端

步骤 5-删除不需要的远程服务器和远程登录

安装复制时,复制会自动定义远程服务器和远程登录。 远程服务器和远程登录是运行远程过程调用所必需的。 如果不需要其他 SQL Server 应用程序,可以删除远程服务器和远程登录。

注意: 您不应删除本地服务器。

本地服务器是运行 sp _ helpserver 时具有服务器 ID 0。 有关远程服务器和远程用户的详细信息,请参阅第 10 章 SQL Server 管理员助理中。

您可以运行"sp _ helpserver"若要查看远程服务器的列表。 您可以运行"sp_helpremotelogin"若要查看远程登录的列表。 运行以下命令删除远程登录:


   sp_dropremotelogin remoteserver_name [, loginame [, remotename]]


运行以下命令以删除远程服务器: 注意: 不删除本地服务器。 本地服务器具有服务器 ID 0。


   sp_dropserver server_name [, droplogins]

 

如何从 SQL Server中手动删除复制(删除发布订阅)回到顶端

步骤 6-删除服务器的发布者、 订阅服务器和分发服务器状态

运行 sp _ helpserver 以验证服务器的状态。 然后运行下面的命令,若要删除服务器的发布服务器 ("pub") 状态:


   sp_serveroption <server_name>, pub, false


运行以下命令删除服务器的远程发布服务器 ("dpub") 状态:


   sp_serveroption <server_name>, dpub, false


运行以下命令删除服务器的订阅服务器 ("Sub") 状态:


   sp_serveroption <server_name>, sub, false


运行以下命令删除服务器的分发服务器 ("分发") 状态:


   sp_serveroption <server_name>, dist, false

 

如何从 SQL Server中手动删除复制(删除发布订阅)回到顶端

步骤 7-删除任何剩余的复制任务

打开在 SQL 企业管理器管理计划任务窗口,双击 SQL Executive 图标。 删除具有类型"日志读取器,"所有任务"通讯组"或"Sync"。 同时删除所有复制清除任务。 清除任务具有名称以下列格式:


   <publisher_server_name>_<subscriber_server_name>_cleanup.

 

如何从 SQL Server中手动删除复制(删除发布订阅)回到顶端

步骤 8-删除.Sch 和.Tmp 文件,Repldata Directory 中

删除.sch (已发布的表架构脚本) 和 MSSQL/Repldata 目录中分发服务器上的.tmp (同步数据) 文件。

如何从 SQL Server中手动删除复制(删除发布订阅)回到顶端

步骤 9-删除分发数据库

运行以下命令删除分发数据库:


   drop database distribution

删除分发数据库之后, 需要手动删除数据,然后登录分发数据库的设备文件,; 这要求停止并重新启动该 SQL Server。

如何从 SQL Server中手动删除复制(删除发布订阅)回到顶端

步骤 10-重置 MSlast_job_info 表

MSlast_job_info 表将存在于每个订阅数据库中,将跟踪最后任务从每个已复制到该数据库的发布数据库。 您订阅了发布后,将由分配任务创建了 MSlast_job_info 表。

如果订阅的数据库当前未订阅任何发布数据库,可以每个订阅数据库中删除 MSlast_job_info 表,只需使用下面的命令:


   drop table MSlast_job_info


如果订阅数据库仍然订阅到一个或多个发布的数据库中,您应使用下面的命令删除它不再订阅到该数据库与对应的 MSlast_job_info 表中行:


   delete MSlast_job_info
where publisher = '<publishing_server_name>'
and publisher_db = '<publishing_database_name>'

 

如何从 SQL Server中手动删除复制(删除发布订阅)回到顶端

步骤 11-验证复制注册表项

您可以重新安装复制之前,HKEY_LOCAL_MACHINE/Software/Microsoft/MSSQLServer/Repliction 注册表项下的,"DistributionDB 值必须一个空字符串。

可以从 master 数据库将该字符串为空运行以下命令:


   xp_regwrite 'HKEY_LOCAL_MACHINE',
'SOFTWARE/Microsoft/MSSQLServer/Replication', 'DistributionDB',
'REG_SZ', ''


警告: 错误地使用注册表编辑器可以导致严重问题,可能需要重新安装 SQL Server。 Microsoft 不能保证可以解决因注册表编辑器使用不当导致的问题。 使用注册表编辑器需要您自担风险。

也是可以更改此项使用注册表编辑器 (Regedt 32 在 Windows NT 3.50 和 Windows NT 3.51 中) 或 Windows NT 4.0 和 Windows 95 中的注册表编辑器。 如果您使用注册表编辑器,执行不删除"DistributionDB 项本身 ; 而,双击 DistributionDB 条目并删除编辑对话框框中的,字符串。