序列正在重用

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 分钟就会获得一个新值,然后将其保存。时间和价值跳跃不遵循模式。

  • 我检查了事件日志以查看是否有错误。唯一认为正在发生的是:http : //support.microsoft.com/kb/2793634 我们今天正在应用此修复程序。我不认为这些是相关的,但它可能是。

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 CYCLENO CACHE,例如:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 
Run Code Online (Sandbox Code Playgroud)

请注意,这NO CACHE可能会影响性能和并发性,但将有助于消除间隙、丢失的块,谁知道呢,也许您的问题也是如此。

您可能还想验证您使用的是最新的 Service Pack 和 CU。此时我推荐SP1CU10 搭配 3437;SP2 已发布,但在线重建仍存在可能影响您的严重问题

  • [修复:当 SQL Server 2012 或 SQL Server 2014 面临内存压力时,序列对象会生成重复的序列值](https://support.microsoft.com/en-us/kb/3011465) 假设您创建的序列对象具有Microsoft SQL Server 2012 或 SQL Server 2014 中启用了 CACHE 选项。当实例面临内存压力,并且多个并发连接从同一序列对象请求序列值时,可能会生成重复的序列值。此外,当将重复的序列值插入表中时,会发生唯一键或主键 (PK) 冲突错误。 (2认同)