シーケンスが再利用されています


11

システム内のオブジェクトの追跡番号を生成するシーケンスがあります。かなり前から問題なく動作していました。

先週、値を再利用し始めていることに気づきました。

起こっているように見えるのは、夕方の異なる時点で、前日の値にロールバックすることです。その後、そのポイントから値を生成し続けます。

たとえば、次のようなものを取得できます。

10112
10113
10114
10115
10116
10117
10118
10113
10114
10115
10116
...

いつ、最初の使用から2回目の使用までの期間(わずか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
マーティン・スミス

2
まあ、CYCLEは基本的にSQL Serverに値を再利用しても問題ないことを伝えます。私は絶対にないアイデアがない、なぜあなたはこの問題を抱えている、そしてなぜあなたは見つけるだろうことを知っていない(あなたはフラットタイヤを持って、なぜあなたはそれを交換する前に、調査どのくらいの時間を過ごすんが?)。私はあなたの最善の策は重複を防ぐためにそこに制約を持ち、再利用を防ぐためにキャッシュをオフにすることだと私はまだ思います。
アーロンバートランド

回答:


11

まず、この列を重複させたくない場合は、その旨を明示してください

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

(または、それを主キーにしたり、クラスター化インデックスを変更したり、何をしたいかもしれません...)

いずれにしても、複製を生成するときにエラーを発生させる方が、後で処理する必要がある複製を盲目的に挿入するよりもはるかに優れています。

次に、SEQUENCEは単なる数値ジェネレーターであり、デフォルトでは50個の値のキャッシュがあることを考慮してください。トランザクションの設定方法、およびサーバーで発生するその他の重要なイベントによっては、SQL Serverが特定の値を生成したことを「忘れる」可能性があります。申し訳ありませんが、このバグを再現するための基準となる要素を正確には知りません。これを回避する方法は(までバグが解消される/説明)を使用する順序を変更することですNO CYCLENO CACHE、例えば:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

NO CACHEパフォーマンスと同時実行性に影響を与えることができますが、ギャップを解消するのに役立ちます、失われたブロックと、知っている、多分あなたの問題は、あまりにも。

また、最新のサービスパックとCUを使用していることを確認することもできます。この時点で、3437を備えたSP1およびCU10をお勧めします。SP2はリリースされましたが、オンラインでの再構築に関して重大な問題があり、影響を受ける可能性があります


まあ、それをバックアップすることはできません。だからノーキャッシュがそれを修正するなら、それは私がやることです。
Vaccano 2014年

これを引き起こすトランザクションがあるのではないかと思いました。しかし、MSDNのシーケンスページには、「シーケンス番号は現在のトランザクションのスコープ外で生成されます。シーケンス番号を使用するトランザクションがコミットされるかロールバックされるかに関係なく、シーケンス番号が消費されます。」だから私は私のトランザクション理論を破棄しました。私は何か他のことが起こっているに違いないことに同意します。
Vaccano 2014年

で設定するだけNO CYCLEで十分であることがわかります。(少なくとも昨夜は起こらなかった。)助けてくれてありがとう!
ヴァッカーノ2014年

1
FIX:SQL Server 2012またはSQL Server 2014がメモリ不足の場合にシーケンスオブジェクトが重複したシーケンス値を生成する Microsoft SQL Server 2012またはSQL Server 2014でCACHEオプションが有効になっているシーケンスオブジェクトを作成するとします。インスタンスがメモリ不足の場合、および複数の同時接続が同じシーケンスオブジェクトのシーケンス値を要求すると、重複するシーケンス値が生成される場合があります。また、重複するシーケンス値がテーブルに挿入されると、一意キーまたは主キー(PK)違反エラーが発生します。
Andomar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.