複製中資料衝突解決

2021-06-17 20:03:20 字數 2586 閱讀 9060

在複製中,有的時候會出現訂閱端被人修改,導致發布端插入資料的時候主鍵衝突,這個時候我們要做的不是直接的初始化太過暴力,而對於生產環境來說,這樣的操作代價也會很大。下面會說幾種方法來處理衝突:

1、  檢視出錯的複製命令的具體內容

如果在複製監視器的訂閱詳細資訊中檢視分發**出錯資訊時,如果發錯發生在應用複製命令時,則可以看到類似資訊:

嘗試的命令:

if @@trancount > 0 rollback tran

(事務序列號:.......)

錯誤訊息:

違反了primary key 約束'%s'。不能在物件'%s'中插入重複鍵.

如下例子:

嘗試的命令:

if@@trancount

>

0rollback

tran

(事務序列號:

0x0001d2a8000005d4002700000000,命令 id: 2

)錯誤訊息:

violation

ofprimary

keyconstraint

'pk_somasterextention

'. cannot insert duplicate key

in object '

dbo.somasterextention

'. the duplicate key value is (600001). (源: mssqlserver,錯誤號: 2627

)獲取幫助: http:

//help/

2627

violation

ofprimary

keyconstraint

'pk_somasterextention

'. cannot insert duplicate key

in object '

dbo.somasterextention

'. the duplicate key value is (600001). (源: mssqlserver,錯誤號: 2627

)獲取幫助: http:

//help/

2627

在上面我們可以看到事務的序列號為 : 0x0001d2a8000005d4002700000000   ,而衝突主鍵為:600001 

,但有的時候這個主鍵會不準確,當多個的時候也只是會顯示插入的第乙個主鍵。

我們可以通過以下語句來看一下有多少的事務

use

distribution

gosp_browsereplcmds

'0x0001d2a8000005d4002700000000

' ,'

0x0001d2a8000005d4002700000000

'

可以看到以下結果:

由上面可以看到是8條插入語句在發布庫執行。command 預設的命名規則是sp_ms+operation+schemaname+tablename ,可以通過下面這個查詢定位到具體表

declare

@article_id

intset

@article_id=3

usedistribution

goselect

*from msarticles where article_id=

@article_id

可以看到

解決方法是將刪除的行在訂閱中重新插入,主鍵就是sp_msins_dbosomasterextention裡的引數。

如果在訂閱端刪除資料,而發布端又更新資料的時候,複製也會報錯,如下:

嘗試的命令:

if@@trancount

>

0rollback

tran

(事務序列號:

0x0001d2a8000005de001600000000,命令 id: 1

)錯誤訊息:

the row was

)獲取幫助: http:

//help/

20598

the row was

)獲取幫助: http:

//help/

20598

2、 忽略複製失敗的命令

在複製監視器中可以選中發布伺服器 ---在 "操作 '"下拉列表中可以看到 "**配置檔案 "

可以看到**配置檔案屬性為:

可以在這個裡面進行配置來設定跳過錯誤,也就是把預設設定改為" continue on data consistency errors. " 如果設定之後沒有的話,可以把**重新啟動。在此不再舉例了。

3、 比較表中的資料差異

對於以上三種方式我提倡的是1和3,第二種方法不太提倡。

主主複製 主主複製時的主鍵衝突解決

大致思路 1 2臺伺服器都設定上二進位制日誌和relay日誌 2 都設定上replcation賬號 3 都設定對方為自己的master 主主複製下一定要注意避免的問題 同步衝突 例 create table stu id int primary key auto increment.2臺mysql地...

SVN中衝突的解決

本人使用svn的時間不是很長,在使用之前也僅僅是粗淺的了解過這個軟體。從今年的8月份開始,由於乙個專案使用eclipse 3.1,跨地域的開發,為了適應不同的開發人員處於不同的地理位置,因此我們使用svn作為團隊開發的管理工具。開始使用時,僅僅是邊學邊用,遇到不懂的地方再去查詢資料。今天由於有點時間...

解決Gradle中jar衝突

plain view plain copy 1.直接在configuration中排除 plain view plain copy configurations plain view plain copy dependencies 排除多個jar可以使用多個exclude 3.當然,我們也可以強制使...