Sql-Server

重新啟動 SQL Server 時標識值跳躍

  • November 17, 2017

我們剛剛從 SQL Server 2008 R2 切換到 SQL Server 2012。我遇到了標識列的問題:

每當我重新啟動 SQL Server 時,每個標識列的種子值都會增加 1000(對於int標識列,它是 1000,對於bigint它是 10,000)。例如,如果int表的下一個標識值是 3,則在重新啟動 SQL Server 後它將是 1003。如果我再次重新啟動 SQL Server,它將是 2003,依此類推。

Google搜尋後,發現它是SQL Server 2012中的一個新特性(不知道有什麼用),如果你想要舊的身份行為,只有兩個解決方案:

  1. 使用序列對象

這對我來說是不可能的,因為:

a) 我在 SQL Server 2008 和 2012 中使用相同的數據庫。我不能在 2008 中使用序列。

b)如果我按照順序進行,那麼我需要更改每個表的保存過程,這對我們來說將是一項繁重的任務。 2. 使用跟踪標誌 272 (-T272)

我可以使用此解決方案,因為無需對我的應用程序進行任何更改。有人建議添加-T272作為啟動參數,之後此 SQL Server 標識將像以前的版本一樣工作。我做了同樣的事情,但它不工作。

我不想對我的數據庫結構進行任何更改。請提出解決方案或解釋為什麼-T272不起作用。

我發現它是一個新功能(不知道它有什麼用)

在 SQL Server 2012 之前,標識分配總是單獨記錄(因為使用了每個值)。在短時間內生成許多標識值的情況下,這種每行日誌記錄活動可能會限制吞吐量。為了提高效率,SQL Server 2012(及更高版本)僅記錄一批標識值的分配。分配的範圍被記憶體並按需發布,直到需要新的一批值。

如果 SQL Server 重新啟動,而包含身份對象的數據庫在關閉時未設置檢查點,則記憶體範圍中任何剩餘的未使用值都將失去,從而導致重新啟動時值發生跳躍。

不幸的是,關閉 SQL Server 2012 的常用方法目前不會自動檢查點數據庫(這與文件相矛盾,因此應該在將來的某個時候修復)。為避免在 SQL Server 2012 上分配的標識值發生跳躍的特殊原因,請始終使用T-SQL命令SHUTDOWN(不帶該NOWAIT選項)關閉 SQL Server 。

SHUTDOWN命令將在關閉伺服器之前正確檢查所有使用者數據庫。不要使用Windows 服務控制應用程序、SQL Server 配置管理器、SQL Server Management Studio UI 或任何其他方法。

您也可以CHECKPOINT在使用任何其他方法關閉 SQL Server 之前手動操作所有數據庫,但這要求您確保在檢查點之後和關閉完成之前在任何數據庫中都不會發生身份分配活動。這可能不容易可靠地實現。

Kalen Delaney的Lost Identity中的更多資訊和背景。


跟踪標誌 272 現在記錄在DBCC TRACEON - 跟踪標誌 (Transact-SQL) 中

在伺服器意外重新啟動或故障轉移到輔助伺服器的情況下,禁用身份預分配以避免身份列的值出現間隙。請注意,身份記憶體用於提高具有身份列的表的 INSERT 性能。

**注意:**從 SQL Server 2017 開始,要在數據庫級別完成此操作,請參閱ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL)中的 IDENTITY_CACHE 選項。

**範圍:**僅限全球

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