mysql replace的主從不一致

2021-08-19 13:45:58 字數 1727 閱讀 9178

問題:資料庫遷移後,執行語句 load data local infile '%s' replace into table %s (%s)。 

會出現 duplicate entry 的問題

但是在binlog只產生一條update語句。 --》從庫的auto_increment不會 +1。

詳細了解下~

一。準備知識:insert會使auto_increment +1 ,而update 不會。

先建立乙個表 auto_increment 為1

插入一條資料

發現auto_increment 變為2

執行update

發現auto_increment 還是2

so~ insert使auto_increment +1 (insert 失敗auto_increment也會 +1),而update並沒有。

二 replace 的操作。主、從執行不一致

replace操作對於已經存在的資料進行update操作,而update實際是delete+insert兩個連續操作 --》 主庫

binlog產生一條update語句,這裡binlog_format=row  --》從庫

三 遷庫前的機器狀態

在執行 load data local infile '%s' replace into table %s (%s) 後。

主庫狀態(a)

從庫狀態(b)

id = 1 

id = 1 

auto_increment = 2

auto_increment = 1

四 將b作為master,向其中寫入資料,產生衝突。

由於 auto_increment=1,所以插入資料時id設為1。但是資料庫中已經存在一條id為1的記錄,會報主鍵衝突。

但是,在次執行插入操作,不會出現主鍵衝突 ,因為執行insert 操作是使得 auto_increment+1,而實際上mysql是通過select max(id)+1 from t的方法來拿到auto_inrement的值。 所以此時auto_increment = 2.

五 最後

很棒的微博: 

MySQL replace函式的幾種實用場景

mysql的replace函式都有哪些用法,你是否都知曉呢?今天,讓我帶大家花幾分鐘時間來一起看一看,記得mark!附 一張有故事的 五 replace string,from str,to str 即 將string中所有出現的from str替換為to str,這裡的from str不支援正則匹...

MySQL REPLACE函式 字串替換

replace string expression string pattern string replacement 替換字串,接受3個引數,分別是原字串,被替代字串,替代字串。select username from user username peter pedro jerry 通過repla...

mysql 主從維護 MYSQL主從的維護

分類 mysql postgresql 1.m上把事件從二進位制日誌中過濾 引數 binlog do db binlog ignore db 2.s上事件從中繼日誌中過濾 引數 replicate do db replicte do table repicate ingore db repliaca...