my.cnf設定檔binlog_format=MIXED,而且使用的是預設隔離等級REPEATABLE-READ,那麼這裡面存在很重大的問題,導致主從資料不一致。
下面我示範下:
主從都是MySQL5.5,binlog_format=MIXED,隔離等級REPEATABLE-READ。
master上的資料是
- mysql> select * from t2;
- +----+
- | id |
- +----+
- | 1 |
- | 2 |
- | 3 |
- | 4 |
- | 5 |
- | 6 |
- | 7 |
- | 8 |
- | 9 |
- | 10 |
- +----+
- 10 rows in set (0.00 sec)
slave上的資料是
- mysql> select * from t2;
- +------+
- | id |
- +------+
- | 1 |
- | 2 |
- | 3 |
- | 4 |
- | 5 |
- +------+
- 5 rows in set (0.00 sec)
那麼我在master上執行
- mysql> update t2 set id=77 where id=7;
- Query OK, 1 row affected (0.01 sec)
- 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格式後,再執行剛才的語句,就會報錯,如下
- mysql> update t2 set id=99 where id=9;
- Query OK, 1 row affected (0.00 sec)
- 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