没有主键的事务复制(唯一索引)

Posted

技术标签:

【中文标题】没有主键的事务复制(唯一索引)【英文标题】:Transactional replication with no primary key (unique index) 【发布时间】:2010-11-12 23:21:53 【问题描述】:

我刚刚遇到了一些令人不安的事情,我试图从一个设计不受我们控制的数据库实现事务复制。这种复制是为了在不对系统造成过多负担的情况下执行报告。在尝试复制时,只有一些表通过了。

在调查表未选择复制时,因为它们没有主键,我认为如果我使用 ODBC 和 ms 访问但不在管理工作室中,它甚至不会显示为主键。查询也不是慢得离谱。

我尝试插入重复记录,但未能说出唯一索引(不是主键)。似乎是使用唯一索引而不是主键来实现表。为什么我不知道我会尖叫。

是否有执行事务复制或替代方案,它需要是实时的(最后一分钟或两分钟)。主数据库服务器目前是 sql 2000 sp3a 和报告服务器 2005。

我目前唯一想到的尝试是将复制设置为另一种类型的数据库。我相信复制说 oracle 是可能的,这会强制使用 ODBC 驱动程序,就像我假设访问正在使用的那样,因此显示主键。我不知道这是否准确。

【问题讨论】:

【参考方案1】:

作为 MSDN states,不可能在没有主键的表上创建事务复制。您可以使用Merge replication(一种方式),它不需要主键,如果它不存在,它会自动创建一个rowguid 列:

合并复制使用全局 唯一标识符 (GUID) 列 在合并期间识别每一行 复制过程。如果发布了 表没有唯一标识符 具有 ROWGUIDCOL 属性的列 和一个唯一的索引,复制添加 一。确保任何 SELECT 和 INSERT 引用已发表的声明 表使用列列表。如果一个表是 不再发布和复制 添加了列,该列是 移除;如果该列已经 存在,它不会被删除。

很遗憾,如果使用合并复制,您将受到性能损失。

如果您只需要将复制用于报告,并且您不需要与发布者上的数据完全相同,那么您也可以考虑快照复制

【讨论】:

不能进行合并复制,因为它会添加一个 guid 这个数据库通常会被定期修改以添加列等,并且发送给我们运行以执行更新的脚本。如果我添加了一个指导栏,他们可能会撤回支持等等。除非我们在主数据库服务器上升级到 sql 2005,否则我似乎被卡住了,然后我可以进行镜像并将其视为只读。不幸的是,需要在一分钟内获得实时数据。

以上是关于没有主键的事务复制(唯一索引)的主要内容,如果未能解决你的问题,请参考以下文章

失效主键唯一索引还存在的一种解决方法

具有唯一索引和主键的列给出唯一约束违规

oracle 唯一索引,唯一约束,主键之间的联系

为啥mysql主从复制,从刚开始能复制一会就不行了

MySQL-约束存储引擎事务索引视图

MYSQL中MyISAM 和InnoDB索引的区别