SQL Server 合并复制遇到identity range check报错的解决
最近帮一个客户搭建跨洋的合并复制,由于数据库非常大,跨洋网络条件不稳定,因此只能通过备份初始化,在初始化完成后向海外订阅端插入数据时发现报出如下错误:
Msg 548, Level 16, State 2, Line 2
The insert failed. It conflicted with an identity range check constraint in database %s, replicated table %s, column %s. If the identity column is automatically managed by replication, update the range as follows: for the Publisher, execute sp_adjustpublisheridentityrange; for the Subscriber, run the Distribution Agent or the Merge Agent.
原因?
在SQL Server中,对于自增列的定义是对于每一条新插入的行,都会自动按照顺序新生成一个递增的数字,改数字通常和业务无关且被用于作为主键。但如果该表用于可更新事务复制或者合并复制,那么该自增列的区间范围则由复制管理。
此时,复制可以保证自增列可控,因为复制代理插入行时不会导致自增列自增,只有用户显式插入时才会导致自增列自增。
让我们来做一个实验。首先创建表,表定义如下:
CREATE TABLE [dbo].[Table_1](
[c1] [int] IDENTITY(1,1),
[c2] [int] NULL,
[ROWGUID] [uniqueidentifier] NOT NULL,
[rowguid4] [uniqueidentifier] ROWGUIDCOL NOT NULL,
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED
(
[c1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
此时我们对创建合并复制,并把该表包含在内,并使用快照代理初始化复制,当完成该步骤时,我们发现该表上自动多了两个约束,如图1所示。
图1.合并复制所加的约束
我们看到该约束的定义只允许4002到5002以及5002到6002之间的数据被插入。
此时如果出现了一些BUG或者人为改动了该表自增列种子的值,则会报错,如图2所示。
图2.改动种子值导致插入数据出错
该约束会由合并代理自动递增,比如说我们用如下代码插入2000条数据,则发现该约束会自动递增如图3所示。
DECLARE @index INT=1
WHILE @index<2000
BEGIN
INSERT INTO table_1(c2,ROWGUID) VALUES(2,NEWID())
SET @index=@index+1
END
图3.约束区间自动递增滑动
解决办法
此时我已经找出了上面报错的原因,因为是由于从备份初始化,那么备份以及备份传输期间发布库又有新的数据插入,此时发布库比如说,该表的种子大小已经增加到了6000,而备份中该表大小还是5000,而约束已经滑动到了6000,那么在订阅端插入数据时就会发生这种问题。
解决办法1
在发布端使用sp_adjustpublisheridentityrange 存储过程使得约束范围自动向后滑动,比如从6000-8000滑动到8000-10000。缺点自增值之间会有一个GAP。如果业务允许,推荐使用该做法。
sp_adjustpublisheridentityrange @table_name=’表名称‘
解决办法2
在发布端运行SELECT IDENT_CURRENT('表名称'),找到发布表的种子值。在订阅端通过DBCC CHECKIDENT (表名称,RESEED, 设置为上面值)命令将两端种子值设置为一致。
解决办法3
在订阅端运行合并代理,即可修复数据。如果此方法不行,则再次尝试上述方法。
解决办法4
不用自增列,而使用GUID列,但这涉及到表结构以及程序的修改,而且需要重新初始化复制,因此不是每一个环境都有条件这么做。
此时,就可以正常插入数据了。
SQL Server 合并复制遇到identity range check报错的解决相关推荐
- [翻译]一步步教你配置SQL SERVER合并复制(五)配置Publisher(上)
上一篇:一步步教你配置 SQL SERVER合并复制(四)设置Distributor的安全 (译者注:本篇内容较多也是合并复制最重要的一个环节之一,因此配置Publisher将分成两个章节来翻译) ...
- Linux上SQL Server合并复制
Replication is a process to manage multiple copies of the same data at a different node. Microsoft S ...
- [翻译]一步步教你配置SQL SERVER合并复制(四)提高Distributor的安全性
上一篇:一步步教你配置SQL SERVER合并复制(三)配置Distributor 为了让已订阅数据库的设备能够更好地去联系Distributor,你必须在数据库中添加一个域用户,让设备能够通过这个用 ...
- sql server 快照_在SQL Server合并复制中应用快照时出现外键问题
sql server 快照 This article will review specific SQL Server merge replication issues related to forei ...
- Sql Server 2008卸载后再次安装一直报错
sql server 2008卸载之后再次安装一直报错问题. 第一:由于上一次的卸载不干净,可参照百度完全卸载sql server2008 的方式 1. 用WindowsInstaller删除所有与S ...
- 解决SQL Server 导入System.Web.dll程序集,报错问题
本人由于需要做一个小项目,项目的内容是这样的:SQl Server中有个报警信息表(tb_Alarm_info),当这个报警信息表有新的数据插入时,将这个产生的报警信息发送到相关人员手机上: 解决思路 ...
- 'ascii' codec can't encode characters in position 20-24:ordinal not in range(128)报错根本解决办法
转载地址:https://blog.csdn.net/Mickey220521/article/details/82759930 遇到这个问题,本人解决了一下午,亲测有效,可以解决根本问题. 讲一下背 ...
- Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理...
在维护一个非常旧的项目时,由于该项目版本已经非常老了,而且在客户现场运行的非常稳定,更要命的是本人目前没有找到该项目的代码,为了处理一个新的需求而且还不能修改程序代码,于是决定从数据库入手,毕竟该项目 ...
- sql server合并行_合并SQL Server复制参数化的行筛选器问题
sql server合并行 In this article we will discuss about SQL Server Merge Replication Parameterized row f ...
最新文章
- Spring Boot 项目的 API 接口防刷
- textaligncenter仍然不居中_戊唑醇和己唑醇都是杀菌剂,有啥不同?真正懂的人不多...
- C++2 dimension vector
- 蓝桥练习-算法训练 素因子去重
- 简述C和C++的学习历程
- hive工作中分享总结
- windows终止进程——taskkill
- SQL Server 2005 Service Pack 2 – CTP December 2006发布
- 刷题总结——Human Gene Functions(hdu1080)
- 红米手机Pro超简单刷入开发版获得ROOT超级权限的步骤
- 如何干掉腾讯网迷你版
- SHOI 2008 仙人掌图 BZOJ 1023
- 计算机学院考勤管理办法,学生考勤管理规定
- 超简单禁止迅雷下载!(分析+方法)
- 基于javaee的养老保险管理系统
- 动态规划-背包问题(1)
- 【收藏夹2020-2021】
- php微信支付返回值,php微信支付全记录
- 百度OCR文字识别教程(有demo)
- 关于fancybox打开动态加载的图片
热门文章
- 未找到与约束ContractName,无法打开项目的解决方案
- 异常:Software caused connection abort: socket write error
- 在Java中编码为Base64
- 你如何删除ActiveRecord对象?
- win11正式版iso镜像如何安装 windows11正式版iso镜像安装方法
- 关于MultiActionController异步请求Ajax,pc端正常,手机端报error错误;此问题一般是通过setInterval,seTimeout,做Ajax轮询时会产生此问题;
- STM32:win10装CH340驱动、获取删除权限
- 四轮驱动移动机器人(4WD)运动模型及应用分析(图片版)
- 相对定位(HTML、CSS)
- 清除浮动-双伪元素清除浮动(HTML、CSS)