【问题标题】:Sql Server Replication and Identity ColumnsSql Server 复制和标识列
【发布时间】:2023-03-28 00:47:01
【问题描述】:

我们的生产环境中有一个大数据库(100 GB),我们有两个镜像。我们使用复制来同步我们的镜像数据库。(SQL Server 2012 上的事务复制)

当我们创建复制时,我们的 DBA 首先从我们的服务器下载完整备份并将其还原到镜像服务器上,然后配置发布者 (Production-DB) 和订阅者 (Mirror-1) 之间的复制。一切正常,镜像和制作完美同步。

在每次发布之前,我们应该在我们的 UAT 服务器上使用 REAL 测试我们的系统!数据。所以我们从我们的一个镜像服务器(现场镜像)创建一个备份,然后在我们的 UAT 数据库上恢复它。

我们数据库中的所有表都有一个 PK 类似:

[ID] [int] IDENTITY(1,1) NOT NULL

在我们的 UAT 数据库中,OrderTransaction 表的最后一条记录 ID = 160.000.000,但是当我们的应用程序尝试插入该表时,系统遇到问题并引发异常。

违反 PRIMARY KEY 约束“ID”。无法在对象中插入重复键...

系统尝试插入小于 160.000.000 (ID = 145.695.000) 的整数值 当我查询数据库时,此 ID 是生产数据库的备份恢复到镜像数据库时以及事务复制开始后的最后一个 ID。 生产和镜像的所有信息均已正确同步,并且两台服务器上的表 ID 相同且相同。

当我在 UAT 或镜像数据库上运行此命令时,它返回 145.695.000

SELECT IDENT_CURRENT( 'OrderTransaction' )

当我阅读 MSDN、博客和相关的 SO 问题时,这个问题与复制和身份列有关。

但是,我怎样才能强制我们的镜像数据库在生产中增加其身份。(并接受这个值作为本地身份值)。或者我们应该编写一个脚本来为每个表重新设置种子以便在我们的 UAT 环境中进行测试!?

谢谢。

【问题讨论】:

    标签: sql sql-server sql-server-2012 replication identity-column


    【解决方案1】:

    如果您只是在将 prod 镜像恢复到 UAT 时遇到问题,那么按照您的建议,您最简单的解决方案可能只是为每个表编写一个 reseed 脚本。

    对于更一般的问题复制和身份问题,您可能会发现this excellent article from Hilary Cotter on Simple-Talk 很有用。

    在本文中,我们研究了实现身份管理的方法 复制中的解决方案以避免主键冲突。我们看了 分区和手动和自动身份范围管理 解决方案。使用自动身份范围管理的解决方案可以通过仔细规划很好地工作。

    编辑: 这应该将所有身份重置为当前最大值:

    EXEC sp_MSForEachTable '
    IF OBJECTPROPERTY(object_id(''?''), ''TableHasIdentity'') = 1
    DBCC CHECKIDENT (''?'', RESEED)'
    

    这是对Pinal Dave's work的轻微修改。

    【讨论】:

    • 谢谢,我正在尝试编写脚本来查找所有具有标识 ID 列的表并重新设置它们的种子,但我认为它应该是最后的解决方案。可能应该有某种方法可以通过 SQL Server 复制设置以自动化方式执行此操作。
    • 脚本应该非常简洁。以防万一,我会发布一个裂缝。
    猜你喜欢
    • 2010-09-18
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多