据说2012版本后部署always on 后,如果设置了自增列,那么在每次重启服务器 或者重启sqlserver 服务后 主键会自动跳转到 重启前做大id+1000
从 SQL Server 2012 版本开始, 当SQL Server 实例重启之后,表格的自动增长列的值会发生跳跃,而具体的跳跃值的大小是根据增长列的数据类型而定的。如果数据类型是 整型(int),那么跳跃值为 1000;如果数据类型为 长整型(bigint),那么跳跃值为 10000。从我们的项目来看,这种跳跃问题是不能被接受的。这个奇怪的问题只在 SQL Server 2012 及更高的版本中存在,SQL Server 2012之前版本不存在此问题。
测试 SQL server2016 、win server 2019 、 always on 环境
测试1
CREATE TABLE [demo]([id] INT,[name] VARCHAR(100))
INSERT INTO [demo] SELECT 1,'test'
INSERT INTO [demo] SELECT 2,'test'
INSERT INTO [demo] SELECT 3,'test'
重启服务器或服务后 并没有出现异常。
测试2
create table test
(id int identity(1,1),primary key(id),name varchar(10))
insert into test(name) values ('a')
insert into test(name) values ('b')
主辅节点同步数据后,查询数据没有发现异常。
向主节点中插入数据,后 重启服务
insert into test(name) values ('c')
此时,主节点变成辅节点,辅节点变主节点,查询后发现id 变成1002 自增了1000.
继续在主数据库中插入数据
insert into test(name) values ('d');
insert into test(name) values ('e');
查询结果显示:ID再次增长1000 ,然后开始自增。
我以为是bug,后来看了这个才知道这是SQL SERVER机制自动分配的
微软声明这是一个功能而并非bug, 在很多场景下是很有用处的。用法网上有大神给出来了提示:
附链接:
解决办法:
测试: 增加sql server服务参数 -t272
备机
主机 插入数据 后重启服务
insert into test(name) values ('f')
查询备机(现在的主机)id 没有跳转而是正常增加。
将设置好的sql server服务参数 -t272 删除掉,测试
服务停止后,发现备机的id 又重新开始跳转1000。
由此得出 配置一台服务器即可。
如果在你的数据库中有很多自增列的表,并且这些表都存在数值跳跃问题,那么采用SQL server参数配置这种方案更好一些。因为它非常简单,并且作用域是服务器级别的。
参考文档: