绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
SQL SERVER2016 always on 故障转移 自动增长列跳跃问题(自增增加1000)
2023-03-22 10:32:54

据说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参数配置这种方案更好一些。因为它非常简单,并且作用域是服务器级别的。

参考文档:

分享好友

分享这个小栈给你的朋友们,一起进步吧。

SQLServer
创建时间:2023-03-20 14:06:14
美国Microsoft公司推出的一种关系型数据库系统。SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~