Sql-Server

合併複製身份欄位問題

  • October 20, 2015

我們的一位客戶正在使用我們的軟體和 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%'

這樣,當您進行故障轉移時,您將不會遇到身份插入失敗的問題。

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