【Mysql】mysql同步錯誤:Last_Errno: 1677

小亮520cl發表於2016-08-22
背景從庫報錯:
  1. Replicate_Wild_Ignore_Table:
  2.                    Last_Errno: 1677
  3.                    Last_Error: Column 25 of table 'hd.article' cannot be converted from type 'date' to type 'int(11)'
  4.                  Skip_Counter: 0

遇到這個錯誤比較奇怪,按錯誤的字面意思大概說是欄位型別的轉換出了錯。明膽是兩臺資料庫,一樣的表結構,怎麼會出現型別轉換問題呢。
連設定slave-skip-errors=1677都不能跳過這個錯誤:

原因:
GOOGLE搜尋了好久也說是mysql5.7版本以前存在這個BUG,建議升級mysql版本。
我試著去分析了一下錯誤原因,發現是因為之前在伺服器上加了新欄位引起的問題(修改欄位型別也可能引起該問題)。
假設我的兩臺伺服器分別是A和B,A和B做的雙主同步。
A和B中test.users結構如下:
  1. +--------------------+---------------------+------+-----+---------------------+----------------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +--------------------+---------------------+------+-----+---------------------+----------------+
  4. | id | int(11) unsigned | NO | PRI | NULL | auto_increment |
  5. | site_id | int(11) | NO | MUL | 0 | |
  6. | source_book_id | varchar(100) | NO | MUL | 0 | |
  7. | read_times | int(11) | NO | MUL | 0 | |
  8. | fav_times | int(11) | NO | MUL | 0 | |
  9. +--------------------+---------------------+------+-----+---------------------+----------------+


  1. +--------------------+---------------------+------+-----+---------------------+----------------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +--------------------+---------------------+------+-----+---------------------+----------------+
  4. | id | int(11) unsigned | NO | PRI | NULL | auto_increment |
  5. | site_id | int(11) | NO | MUL | 0 | |
  6. | source_book_id | varchar(100) | NO | MUL | 0 | |
  7. | read_times | int(11) | NO | MUL | 0 | |
  8. | fav_times | int(11) | NO | MUL | 0 | |
  9. +--------------------+---------------------+------+-----+---------------------+----------------+

因為在其中一臺伺服器A上的test.users上加了一個欄位,加欄位之後的表結構如下:
  1. +--------------------+---------------------+------+-----+---------------------+----------------+
    | Field              | Type                | Null | Key | Default             | Extra          |
    +--------------------+---------------------+------+-----+---------------------+----------------+
    | id                 | int(11) unsigned    | NO   | PRI | NULL                | auto_increment |
    | site_id            | int(11)             | NO   | MUL | 0                   |                |
    | source_book_id     | varchar(100)        | NO   | MUL | 0                   |                |
    | read_times         | int(11)             | NO   | MUL | 0                   |                |
    | last_chapter_title | varchar(128)        | NO   |     |                     |                |
    | fav_times          | int(11)             | NO   | MUL | 0                   |                |
    +--------------------+---------------------+------+-----+---------------------+----------------+


因為加欄位的時候表test.users還有大量資料沒有完全同步到A上來,加了欄位後還需要將之前的資料進行同步,解析了一下mysql的binlog裡面的插入sql格式如下:
INSERT INTO test.users VALUES (1, 2, 1, 99, 6);
從上面的sql明顯可以看出來,第5個欄位的值是6,原本這個6對應的是fav_times的值,表的欄位個數和第5個欄位的型別都不一樣了,所以同步會出錯。

解決方法
將新加的欄位last_chapter_title從A上先刪除掉,等表資料然全同步完之後再次加了新欄位。


線上錯誤的原因:從庫比主庫多了click這個欄位,原本插到另外一個datetime型別的資料 結果需要插到這個click int型,所以報錯了,應該是當時新增欄位加到從庫了

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-2123787/,如需轉載,請註明出處,否則將追究法律責任。

相關文章