将事务复制订阅者移动到另一台服务器而无需重新创建快照

Iva*_*off 5 replication sql-server transactional-replication sql-server-2016

我在同一台服务器上有发布者和订阅者。我需要将订阅者的数据库移动到另一台服务器但不创建新快照。我试过这个步骤:

  • 停止所有代理
  • 备份订阅者的数据库
  • 使用KEEP_REPLICATION在另一台服务器上恢复订阅者的数据库
  • 更改了syssubscriptionsMSsubscriber_infoMSsubscriber_schedule 中的服务器名称
  • 更改计划任务中的服务器名称以进行复制

然后我启动了代理并收到错误 20053(服务器未注册)。我通过将链接服务器添加到新服务器来修复它

之后,我收到错误 20044(订阅已过时或不存在),但订阅存在。

我做错了什么或者我错过了任何步骤?

我不能使用备份初始化,因为订阅者有一些额外的表、视图、例程。谢谢

Sql*_*ide 3

我的回答假设您是在停机期间执行此操作。

一旦停机开始(确认应用程序服务器没有建立任何新的连接/写入发布文章):

  1. 继续运行分发代理作业,直到未传递的命令计数为零(这是您没有任何未传递的命令的关键)。
  2. 停止分发代理作业。
  3. 脚本输出复制。
  4. 删除复制(仅限发布者和订阅者),但保持分发者不变。这是我的偏好,但您也可以决定仅删除订阅者。
  5. 运行 sp_addsubscription 时,使用“仅复制支持”重新安装复制。请参阅此处的详细信息。
  6. 运行快照作业。它不会重新同步您的表架构+数据,而是创建系统对象(如果丢失)。

仅复制支持 在订阅者处提供支持更新订阅的文章自定义存储过程和触发器的自动生成(如果适用)。假设订阅服务器已经拥有已发布表的架构和初始数据。配置对等事务复制拓扑时,请确保拓扑中所有节点上的数据相同。有关更多信息,请参阅对等事务复制。

不支持订阅非 SQL Server 发布。

您可以使用此查询来查找分发数据库中未传递的命令。

SELECT ss.srvname AS publisher, 
       [name]     AS Agent, 
       publication, 
       a.publisher_db, 
       subscriber_db, 
       art.article, 
       art.destination_object, 
       art.source_object, 
       undelivcmdsindistdb, 
       delivcmdsindistdb, 
       s.article_id, 
       agent_id, 
       a.publisher_id, 
       subscriber_id 
FROM   distribution.dbo.msdistribution_status AS s WITH (nolock) 
       FULL OUTER JOIN distribution.dbo.msdistribution_agents AS a WITH (nolock) 
                    ON s.agent_id = a.id 
       JOIN master.dbo.sysservers AS ss WITH (nolock) 
         ON a.publisher_id = ss.srvid 
       JOIN distribution.dbo.msarticles AS art WITH (nolock) 
         ON s.article_id = art.article_id 
WHERE  subscriber_db <> 'virtual' 
       AND subscriber_db = 'SubscriberDBName' 
ORDER  BY undelivcmdsindistdb DESC 
COMPUTE sum(undelivcmdsindistdb) 
Run Code Online (Sandbox Code Playgroud)