SQL Serverの再起動でindentityで割り振られる値が1000もしくは10000飛ぶ現象について
本章では、SQL Serverの再起動でindentityで割り振られる値がおかしくなる現象について共有します。
原因
SQL Server 2012から、SQL Server再起動及びフェイルオーバー時に、以下仕様が追加されました。
- 前回割り振られたidentityの値に、1ではなく1000(intの場合)が加算される
これは、以下すべてを満たす稀なケースで、INSERTされたテーブルのIDENTITYの一意性を担保するために、用意されたようです。
- トランザクション中
- SELECT INTOといった大量のレコードのINSERTを実行
- ロールバック処理中
- SQL Serverが再起動もしくはフェイルオーバー
しかし利用者にとっては、上記ケースを想定した仕様とは露も知らないため、運用中にSQL Serverの再起動後にデータを見て判明するという訳です。
私は、普段利用しているアプリで、大量のINSERTが同時に実行されるケースがないため、上記仕様を止めるように調整しました。
解決策
解決策は、SQL Serverに起動パラメータを追加して上げる必要があります。
- SQL Serverの構成マネージャーを起動
- 「SQL Serverのサービス」を選択
- 「SQL Server(MSSQLSERVER)」を選択
- 右クリックから「プロパティ」を選択
- 「起動時のパラメーター」を選択
- 「起動時のパラメーターの指定」で「-T272」を入力し「追加」ボタンを選択
上記手順で設定すると、以下のようになります。
これでSQL Serverを再起動すると、設定が反映され、今後identityを含むカラムの値が飛び飛びになることはありません。
筆休め
SQL Serverはビルド番号が上がる度、非常に便利になっています。ただ、細かいところで仕様がわからない箇所がたまにあるので、常に情報はウォッチしていくべきですね。
以上、「SQL Serverの再起動でindentityで割り振られる値が1000もしくは10000飛ぶ現象について」でした。