Sql-Server

序列重用

  • September 24, 2021

我有一個序列可以為系統中的對像生成跟踪號。很長一段時間以來,它一直執行良好。

上週我們注意到它開始重用值。

似乎發生的情況是,在晚上的不同時間點,它將回滾到前一天的值。然後它將繼續從該點生成值。

所以例如我可以得到這樣的東西:

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 我們今天正在應用此修復程序。我不認為這些是相關的,但它可能是相關的。

首先,如果您不想在此列中出現重複項,請明確聲明.

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

(或者你可能想把它作為主鍵,或者改變聚集索引,或者你有什麼……)

無論如何,在生成副本時引發錯誤遠比盲目地插入稍後必須處理的副本要好得多。

接下來,考慮一個 SEQUENCE 只是一個數字生成器,預設情況下它有 50 個值的記憶體。根據您的事務的設置方式以及伺服器上發生的其他關鍵事件,SQL Server 可能“忘記”它為您生成了某些值。

在他們根除 Connect 之前,Connect (790161) 上有一個錯誤,它談到了這些重複的值,但似乎已在此修復中解決(感謝 @Andomar):

修復:當 SQL Server 2012 或 SQL Server 2014 處於記憶體壓力之下時,序列對像生成重複的序列值

假設您創建的序列對像在 Microsoft SQL Server 2012 或 SQL Server 2014 中啟用了 CACHE 選項。當實例處於記憶體壓力下,並且多個並發連接從同一序列對象請求序列值時,可能會生成重複的序列值. 此外,將重複序列值插入表中時,會發生唯一鍵或主鍵 (PK) 衝突錯誤。

解決此問題的一種方法(如果該修復無法解決您的問題,或者您在沒有修復的情況下被困在一個古老且不受支持的建構中)是更改使用順序NO CYCLENO CACHE例如:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

請注意,這NO CACHE可能會影響性能和並發性,但有助於消除間隙、失去的塊,誰知道呢,也許你的問題也是如此。

引用自:https://dba.stackexchange.com/questions/68348