謹慎設定binlog_format=MIXED

來源:互聯網
上載者:User

my.cnf設定檔binlog_format=MIXED,而且使用的是預設隔離等級REPEATABLE-READ,那麼這裡面存在很重大的問題,導致主從資料不一致。

下面我示範下:

主從都是MySQL5.5,binlog_format=MIXED,隔離等級REPEATABLE-READ。

master上的資料是

 
  1. mysql> select * from t2; 
  2. +----+ 
  3. | id | 
  4. +----+ 
  5. |  1 | 
  6. |  2 | 
  7. |  3 | 
  8. |  4 | 
  9. |  5 | 
  10. |  6 | 
  11. |  7 | 
  12. |  8 | 
  13. |  9 | 
  14. | 10 | 
  15. +----+ 
  16. 10 rows in set (0.00 sec) 

slave上的資料是

 
  1. mysql> select * from t2;                          
  2. +------+ 
  3. | id   | 
  4. +------+ 
  5. |    1 | 
  6. |    2 | 
  7. |    3 | 
  8. |    4 | 
  9. |    5 | 
  10. +------+ 
  11. 5 rows in set (0.00 sec) 

那麼我在master上執行

 
  1. mysql> update t2 set id=77 where id=7; 
  2. Query OK, 1 row affected (0.01 sec) 
  3. Rows matched: 1  Changed: 1  Warnings: 0 

你說slave上會報錯嗎?

答案是:NO,不會報錯,沒有任何提示。

不信?你可以試試。

那為啥不會報錯呢?從手冊上來看,只有下面幾種情況才會轉換為ROW模式記錄

650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131229/19212V3O-0.jpg" alt="" />

再改為binlog_format=ROW格式後,再執行剛才的語句,就會報錯,如下

 
  1. mysql> update t2 set id=99 where id=9;   
  2. Query OK, 1 row affected (0.00 sec) 
  3. Rows matched: 1  Changed: 1  Warnings: 0 

650) this.width=650;" border="0" src="http://www.bkjia.com/uploads/allimg/131229/19212U310-1.jpg" alt="" />

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131229/19212U151-2.jpg" />

小結:如果你採用預設隔離等級REPEATABLE-READ,那麼建議binlog_format=ROW。如果你是READ-COMMITTED隔離等級,binlog_format=MIXED和binlog_format=ROW效果是一樣的,binlog記錄的格式都是ROW,對主從複製來說是很安全的參數。

 

 

本文出自 “賀春暘的技術專欄” 部落格,請務必保留此出處http://hcymysql.blog.51cto.com/5223301/1021174

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.