binlog三種模式的區別(row,statement,mixed)
binlog模式分三種(row,statement,mixed)
1.Row
日誌中會記錄成每一行資料被修改的形式,然後在slave端再對相同的資料進行修改,只記錄要修改的資料,只有value,不會有sql多表關聯的情況。優點:在row模式下,bin-log中可以不記錄執行的sql語句的上下文相關的資訊,僅僅只需要記錄那一條記錄被修改了,修改成什麼樣了,所以row的日誌內容會非常清楚的記錄下每一行資料修改的細節,非常容易理解。而且不會出現某些特定情況下的儲存過程和function,以及trigger的呼叫和出發無法被正確複製問題。缺點:在row模式下,所有的執行的語句當記錄到日誌中的時候,都將以每行記錄的修改來記錄,這樣可能會產生大量的日誌內容。
mysql> insert into username(username) select * from aa;
ERROR 1146 (42S02): Table 'test.username' doesn't exist
mysql> insert into user(username) select * from aa;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
檢視binlog
2.statement
每一條會修改資料的sql都會記錄到master的binlog中,slave在複製的時候sql程序會解析成和原來master端執行多相同的sql再執行。優點:在statement模式下首先就是解決了row模式的缺點,不需要記錄每一行資料的變化減少了binlog日誌量,節省了I/O以及儲存資源,提高效能。因為他只需要記錄在master上所執行的語句的細節以及執行語句的上下文資訊。缺點
3.Mixed
從官方文件中看到,之前的 MySQL 一直都只有基於 statement 的複製模式,直到 5.1.5 版本的 MySQL 才開始支援 row 複製。從 5.0 開始,MySQL 的複製已經解決了大量老版本中出現的無法正確複製的問題。但是由於儲存過程的出現,給 MySQL Replication 又帶來了更大的新挑戰。另外,看到官方文件說,從 5.1.8 版本開始,MySQL 提供了除 Statement 和 Row 之外的第三種複製模式:Mixed,實際上就是前兩種模式的結合。在 Mixed 模式下,MySQL 會根據執行的每一條具體的 SQL 語句來區分對待記錄的日誌形式,也就是在 statement 和 row 之間選擇一種。新版本中的 statment 還是和以前一樣,僅僅記錄執行的語句。而新版本的 MySQL 中對 row 模式也被做了優化,並不是所有的修改都會以 row 模式來記錄,比如遇到表結構變更的時候就會以 statement 模式來記錄,如果 SQL 語句確實就是 update 或者 delete 等修改資料的語句,那麼還是會記錄所有行的變更。
Mysql Binlog日誌分析
通過MysqlBinlog指令檢視具體的mysql日誌,如下:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SET TIMESTAMP=1350355892/*!*/;
BEGIN
/*!*/;
# at 1643330
#121016 10:51:32 server id 1 end_log_pos 1643885 Query thread_id=272571 exec_time=0 error_code=0
SET TIMESTAMP=1350355892/*!*/;
Insert into T_test….)
/*!*/;
# at 1643885
#121016 10:51:32 server id 1 end_log_pos 1643912 Xid = 0
COMMIT/*!*/;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1.開始事物的時間:
SET TIMESTAMP=1350355892/*!*/;
BEGIN
2.sqlevent起點
#at 1643330 :為事件的起點,是以1643330位元組開始。
3.sqlevent 發生的時間點
#121016 10:51:32:是事件發生的時間,
4.serverId
server id 1 :為master 的serverId
5.sqlevent終點及花費時間,錯誤碼
end_log_pos 1643885:為事件的終點,是以1643885 位元組結束。
execTime 0: 花費的時間
error_code=0:錯誤碼
Xid:事件指示提交的XA事務