AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 44655
Accepted
Adel Khayata
Adel Khayata
Asked: 2013-06-17 22:58:29 +0800 CST2013-06-17 22:58:29 +0800 CST 2013-06-17 22:58:29 +0800 CST

如何正确清理合并复制设置

  • 772

完全清理合并复制设置的正确方法是什么?

我尝试删除订阅,然后删除发布,然后“禁用发布和分发”并删除分发数据库,​​然后再次开始设置复制。

不幸的是,在那之后我发现 dbo.msmergesubscriptions 表仍然有关于我在 2 年前曾经拥有的旧订阅的旧记录!

是否有任何关于如何正确和完全清理合并复制设置的官方文档?

sql-server replication
  • 2 2 个回答
  • 9081 Views

2 个回答

  • Voted
  1. Brandon Williams
    2013-06-19T07:40:02+08:002013-06-19T07:40:02+08:00

    不知何故,在删除订阅和/或发布后,您会得到孤立的复制元数据。当使用 GUI 删除订阅和发布时,可能会发生这种情况。相反,请尝试使用 T-SQL 复制存储过程来删除订阅和发布。

    如何:删除推送订阅(复制 Transact-SQL 编程)

    如何:删除请求订阅(复制 Transact-SQL 编程)

    如何:删除发布(复制 Transact-SQL 编程)

    删除订阅和发布后,验证复制元数据是否已删除。如果没有,请使用sp_removedbreplication从数据库中删除所有复制对象。

    • 2
  2. Best Answer
    Kin Shah
    2013-06-19T09:24:39+08:002013-06-19T09:24:39+08:00

    与事务复制相比,合并复制有点难以删除。

    以下是我成功删除过时/剩余的合并复制点点滴滴的步骤:

    1. 在继续之前在发布者和订阅者处备份合并复制数据库。
    2. 从发布服务器编写合并复制并将创建/删除脚本安全地存储在另一个位置。
    3. 通过在发布者和订阅者的合并复制数据库上运行以下查询并将结果暂时存储在某个地方(即在文本文件中),获取已发布文章及其现有触发器的列表以供稍后参考

      set nocount on 
      print 'get the list of published articles and its triggers' 
      select 
      p.name as publication_name, 
      o2.name as tbl_name, 
      o1.parent_obj , 
      o1.name as trigger_name, 
      left(o1.name, 3) as trigger_type, 
      o1.crdate as create_date 
      
      into #t 
      from sysobjects o1 
      join sysobjects o2 on o1.parent_obj = o2.id 
      join sysmergearticles a on o2.id = a.objid 
      join sysmergepublications p on a.pubid = p.pubid 
      where o1.xtype = 'TR' 
      and p.name = '' 
      order by p.name, o2.name, o1.name 
      
      select * from #t 
      
      print 'generate the drop statements for the replication triggers' 
      
      select 'drop trigger ['+trigger_name+']' 
      from #t 
      where trigger_type in ('ins','upd','del') 
      drop table #t 
      
    4. 通过从发布者运行步骤 1 中生成的删除脚本来删除合并复制。

    5. 在发布者和订阅者上,通过运行在步骤 3 中生成的删除触发器脚本,清除复制删除脚本未删除的所有触发器。

    6. 在发布者和订阅者上,检查sysmergepublications、sysmergesubscriptions和sysmergearticles表是否仍然存在合并复制的条目。如果是这样,请运行以下脚本以从 sysmergearticles 和 sysmergepublications 中删除条目

      注意:您还可以删除 sysmergearticles 中不再被 sysmergepublictaions/sysmergesubscriptions 中的条目引用的任何条目,但在执行此操作时请务必小心

         -- delete the obsolete entries from sysmergearticles on the publisher side 
      
         delete from sysmergearticles 
         where pubid in ( select p.pubid 
         from sysmergepublications p 
         where p.name = '' 
         ) 
         -- delete the obsolete entries from sysmergearticles on the subscriber side 
         delete from sysmergearticles 
         where pubid in ( select p.pubid 
         from sysmergesubscriptions p 
         where p.publication = '' 
         ) 
         -- delete the obsolete entries from sysmergepublications 
         delete from sysmergepublications 
         where name = '' 
          -- delete the obsolete entries from sysmergesubscriptions 
          delete from sysmergesubscriptions 
          where publication = ''
      
    7. 如果此数据库上没有设置其他合并复制,您还可以截断发布者/订阅者数据库上的 MSmerge* 表。

    遵循上述步骤将确保MERGE Replication 被彻底删除- 不留下任何痕迹!

    注意:我在当前环境中一直使用上述方法,没有任何问题。但是请事先测试一下......不用说......如果有什么事情搞砸了,不要责怪这个网站和我:-)

    • 1

相关问题

  • 运行时间偏移延迟复制的最佳实践

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve