Vac*_*ano 11 sql-server sequence sql-server-2012
我有一个序列,可以为系统中的对象生成跟踪编号。它已经运行良好有一段时间了。
上周我们注意到它开始重用值。
似乎发生的是,在晚上的不同时间点,它会回滚到前一天的值。然后它将继续从该点生成值。
所以例如我可以得到这样的东西:
10112
10113
10114
10115
10116
10117
10118
10113
10114
10115
10116
...
在它发生的时间、第一次使用和第二次使用之间的持续时间(少则 10 分钟或几个小时)或回滚的次数(少至 1 次,多至数百次)方面似乎没有任何模式。
我考虑过运行跟踪(并且仍然可能),但我认为序列对象没有被直接修改。我相信这是因为修改日期是几天前的,并且指向我们手动提高值以尝试消除重复项的时间。(从那以后这个问题已经发生了好几次。)
有没有人知道什么可能导致序列回滚和每晚重用值?
更新:回答评论中的几个问题:
@@Version:
Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 2012 年 10 月 19 日 13:38:57
创建脚本:
CREATE SEQUENCE [schemaName].[SequenceName]
AS [bigint]
START WITH 410014104
INCREMENT BY 1
MINVALUE 410000000
MAXVALUE 419999999
CYCLE
CACHE
GO
Run Code Online (Sandbox Code Playgroud)我没有唯一约束(但我打算放一个)。然而,这只会帮助我知道我何时重用了一个值。不是什么导致值重置。我做了一项工作,每 5 分钟就会获得一个新值,然后将其保存。时间和价值跳跃不遵循模式。
Aar*_*and 11
首先,如果您不想在此列中出现重复项,请明确声明.
ALTER TABLE dbo.whatever ADD CONSTRAINT uq_that_column UNIQUE (that_column);
Run Code Online (Sandbox Code Playgroud)
(或者你可能想把它作为主键,或者改变聚集索引,或者你有什么......)
在任何情况下,在生成重复项时引发错误都比盲目地插入以后只需要处理的重复项要好得多。
接下来,考虑一个 SEQUENCE 只是一个数字生成器,默认情况下它有 50 个值的缓存。根据事务的设置方式以及服务器上发生的其他关键事件,SQL Server 可能会“忘记”它为您生成了某些值。抱歉,我不知道重现此错误的确切标准是什么。解决这个问题的方法(直到错误得到解决/解释)是更改要使用的序列NO CYCLE和NO CACHE,例如:
ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE;
Run Code Online (Sandbox Code Playgroud)
请注意,这NO CACHE可能会影响性能和并发性,但将有助于消除间隙、丢失的块,谁知道呢,也许您的问题也是如此。
您可能还想验证您使用的是最新的 Service Pack 和 CU。此时我推荐SP1和CU10 搭配 3437;SP2 已发布,但在线重建仍存在可能影响您的严重问题。