合併複製身份欄位問題
我們的一位客戶正在使用我們的軟體和 SQL Server 2008 R2 機器上的數據庫合併複製。在不同的地理位置有兩個生產環境,任何時候只有一個是線上的,所以基本上一個,一個線上備用。只有實時數據庫由應用程序更新。每隔幾個月,它們在數據中心和備用環境之間的故障轉移就會成為實時中心。每個數據中心都有一個 SQL Server 2008 實例,合併複製用於使它們保持同步。這一切正常,直到今年年初我們開始在具有屬性集
lTID
的各種表中的某些列出現複製錯誤。Identity
錯誤是這樣的:
插入失敗。它與數據庫“GateMain”、複製表“dbo.tGateCalcsLog”、列“lTID”中的標識範圍檢查約束衝突。如果標識列由複制自動管理,則更新範圍如下:對於發布者,執行 sp_adjustpublisheridentityrange;對於訂閱伺服器,執行分發代理或合併代理。
然後在最後一次故障轉移之後,我們注意到我們
lTID
在一個特定表中的值存在問題。我們的應用程序依賴於lTID
始終按順序遞增的值,以便最高的 lTID 值始終是表中的最新條目。我們發現,由於身份範圍是如何通過複製來管理的,當系統發生故障轉移時,現在活動的數據庫伺服器的 lTID 範圍可能具有低於表中已經存在的值的範圍。有沒有辦法在合併複製中管理這個,所以我們可以保證分配給lTID
列的下一個標識值大於lTID
表中目前的任何標識值?或者我們是否需要使用不同類型的複製或鏡像?
您可以關閉自動身份管理並手動分配您的範圍。另一種選擇是通過發出 sp_msrefresh_publisher_idrange 並指定範圍邊界來強制重新分配範圍。
但是,這兩個選項都不能保證該
lTID
列填充了不斷增加的值:您將始終為發布者提供至少一個範圍,為訂閱者提供一個範圍,如果使用者在兩個站點上都插入,您將永遠無法擁有 -增加身份證。這是設計使然,沒有辦法繞過它。
如果您的目標是保持在訂閱者處生成的身份值不斷增加,那將是一個完全不同的故事,並且可以通過上述選項之一來實現。
如果我正確理解您的問題,則您的問題與身份列有關
發布者和訂閱者之間的身份增量是多少?我建議你如下:
例如
在發布者上:保持身份增量為 1 ==> ODD
在訂閱者上:保持身份增量為 2 ==> 偶數
--- Below query will give the Current Identity Value. SELECT QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) AS TableName, c.name AS ColumnName, IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) AS CurrentIdentityValue, IDENT_INCR (SCHEMA_NAME(t.schema_id) + '.' + t.name) as Identity_increment FROM sys.columns AS c INNER JOIN sys.tables AS t ON t.[object_id] = c.[object_id] WHERE c.is_identity = 1 -- write here the table name if you want to filter for specific table and t.name like '%TABLE_NAME%'
這樣,當您進行故障轉移時,您將不會遇到身份插入失敗的問題。