复制两个程序使用的数据库

Ste*_*wie 5 replication sql-server

我在两个相同的数据库之间设置了一个对等事务复制集,每个数据库都被两个不同服务器上的不同程序使用。由于我们实现了复制,我一直在表上遇到 PK 冲突,尽管插入语句没有输入主键并让 SQL Server 处理它,但两个程序都会更新。在这种情况下,表名是 Statistics: Violation of PRIMARY KEY 约束 'PK_Statistics'。无法在对象“dbo.Statistic”中插入重复键。

我的插入语句:

INSERT INTO [StackExchange].[dbo].[Statistic]
       ([UserId]
       ,[CreateDate]
       ,[IsError]
       ,[CustomData]
       ,[ModuleId]
       ,[StatisticTypeId])
 VALUES
       (19,GETDATE(),'true','test replication',1,1)
Run Code Online (Sandbox Code Playgroud)

此外,服务器中的事件查看器充满了冲突数据:

这是我在服务器 2 上经常遇到的错误:

在对等 1(传入)、事务 id 0x000000000031dea3 和对等(空)(在磁盘上)、事务 id(空)之间的对等 2 上检测到“更新-删除”类型的冲突

这是我在服务器 1 上遇到的相同事务错误:

在对等 2(传入)、事务 ID 0x0000000000245950 和对等 1(在磁盘上)、事务 ID 0x000000000031dea3 之间的对等 1 上检测到“删除更新”类型的冲突

在这种情况下,你会建议我做什么?

谢谢!

Bra*_*ams 2

对于PK违规:

您需要确保对等拓扑中的每个节点都有一个身份范围岛,如果插入源自该节点,则该身份范围岛不会发生冲突。为此,您需要运行 DBCC checkident(talbename, reseed, start of range),即。节点 1 为 DBCC checkident(tablename, reseed, 100000),节点 2 为 DBCC checkident(tablename, reseed, 200000),依此类推。

对于更新-删除冲突:

您需要将位置特定标识符列添加到表中,并将此列扩展到您的 PK。这将减少发生冲突的机会。如果这不是一个选项,您将丢失数据,因为具有最高发起者 ID 的节点上发生的更改将赢得冲突。这可能适合你,也可能不适合你。