序列正在重用


11

我有一个序列,可以为系统中的对象生成跟踪号。它已经运行了一段时间了。

上周,我们注意到它开始重新使用值。

似乎发生的事情是,在晚上的不同时间点,它将回滚到前一天的值。然后它将继续从该点生成值。

因此,例如,我可以得到这样的东西:

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
  • 我没有唯一约束(但我打算穿上)。但是,这只会让我知道何时重用了值。不是什么导致值重置。我的工作是每5分钟保存一个新值。时间和价值跳跃没有遵循规律。

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

1
为什么在此列上没有PK或唯一约束?有了这个适当的位置,这种重用就会被捕获,并且您不必尝试猜测它的来历,除​​非您的应用程序代码仅吞没了所有错误……
Aaron Bertrand


您可以显示序列的定义吗?您还可以检查错误日志以查看是否在一夜之间发生了任何重大事件(例如,故障转移,服务重启,内存问题等)吗?
亚伦·伯特兰

2
什么@@VERSION啊 环境也有变化吗?有一个连接项报告类似的内容。那里的OP认为与之相关11.0.3000.0
Martin Smith

2
好吧,CYCLE本质上告诉SQL Server您可以重新使用值。我绝对不知道您为什么会遇到这个问题,也不知道您为什么会发现(在更换轮胎之前,您花了多少时间调查为什么轮胎漏气?)。我仍然认为您最好的选择是在其中设置约束以防止重复,并关闭缓存以防止重复使用。
亚伦·伯特兰

Answers:


11

首先,如果您不想在此列中重复,请明确声明

ALTER TABLE dbo.whatever ADD CONSTRAINT uq_that_column UNIQUE (that_column);

(或者,您可能希望将其作为主键,或者更改聚簇索引,或者您所拥有的...)

无论如何,在生成重复项时引发错误比仅盲目地插入稍后将要处理的重复项要好得多。

接下来,考虑一个SEQUENCE只是一个数字生成器,默认情况下它具有50个值的缓存。根据事务的设置方式以及服务器上发生的其他重要事件,SQL Server可能会“忘记”它为您生成了某些值。抱歉,但我不确切知道是什么标准来重现此错误。要解决这个问题(直到方式的bug解决/解释)与序列改变用途NO CYCLENO CACHE,例如:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

请注意,这NO CACHE可能会影响性能和并发性,但将有助于消除差距,丢失的数据块,甚至可以消除您的问题。

您可能还需要验证您是否使用了最新的Service Pack和CU。在这一点上,我建议使用3437的SP1CU10 ; SP2已发布,但在线重建仍然存在一个关键问题,可能会影响您


好吧,我不能备份它。因此,如果没有CACHE可以解决它,那就是我会做的。
瓦卡诺

我认为可能有交易导致此情况。但是MSDN上的“序列”页面说:“序列号是在当前事务范围之外生成的。无论是提交还是回滚使用序列号的事务,都将消耗它们。” 因此,我放弃了交易理论。我同意还必须进行其他操作。
瓦卡诺

事实证明,只需对其进行设置就NO CYCLE足够了。(至少昨晚没有发生。)谢谢您的帮助!
瓦卡诺

1
FIX:序列对象在SQL Server 2012或SQL Server 2014处于内存压力下时会生成重复的序列值假定您创建一个在Microsoft SQL Server 2012或SQL Server 2014中启用了CACHE选项的序列对象。 ,并且多个并发连接从同一序列对象请求序列值,则可能会生成重复的序列值。此外,将重复序列值插入表中时,还会发生唯一或主键(PK)冲突错误。
Andomar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.