Binlog日誌的三種模式介紹及模式修改
Binlog日誌的三種模式介紹
一、Binlog日誌的三種模式
1.1 Statement Level模式
每一條修改資料的sql都會記錄到master的bin_log中,slave在複製的時候sql程序會解析成master端執行過的相同的sql在slave庫上再次執行。
優點:statement level下的優點首先就是解決了row level下的缺點,不需要記錄每一行的變化,較少bin-log日誌量,節約IO,提高效能。因為它只需要記錄在master上所執行的語句的細節,以及執行語句時候的上下文資訊。
缺點:由於它是記錄執行語句,所以,為了讓這些語句在slave端也能正確執行,那麼它還必須記錄每條語句在執行的時候的一些相關資訊,也就是上下文資訊,來保證所有語句在slave端能夠得到和在master端相同的執行結果。由於mysql更新較快,使mysql的賦值遇到了不小的挑戰,自然賦值的時候就會涉及到越複雜的內容,bug也就容易出現。在statement level下,目前就已經發現了不少情況會造成mysql的複製出現問題,主要是修改資料的時候使用了某些特定的函式或者功能的時候會出現。比如:sleep()函式在有些版本中就不能正確賦值,在儲存過程中使用了last_insert_id()函式,可能會使slave和master上得到不一致的id等等。由於row level是基於每一行記錄的裱花,所以不會出現類似的問題。
總結:
Statement level優點:
1、解決了row level的缺點,不需要記錄每一行的變化。
2、日誌量少,節約IO,從庫應用日誌塊。
Statement level缺點:一些新功能同步可能會有障礙,比如函式、觸發器等。
1.2 Row Level模式
日誌中會記錄成每一行資料修改的形式,然後在slave端再對相同的資料進行修改。
優點:在row level的模式下,bin_log中可以不記錄執行的sql語句的上下文資訊,僅僅只需要記錄哪一條記錄被修改,修改成什麼樣。所以row level的日誌內容會非常清楚的記錄每一行資料修改的細節,非常容易理解。而且不會出現某些特定情況下的儲存過程,或fuction,以及trigger的呼叫或處罰無法被正確複製的問題。
缺點:row level模式下,所有的執行語句都會記錄到日誌中,同時都會以每行記錄修改的來記錄,這樣可能會產生大量的日誌內容。
總結:
row level的優點:
1、記錄詳細
2、解決statement level模式無法解決的複製問題。
row level的缺點:日誌量大,因為是按行來拆分。
1.3 Mixed模式(混合模式)
實際上就是前兩種模式的結合,在mixed模式下,mysql會根據執行的每一條具體的sql語句來區分對待記錄的日誌形式,也是在statement和row之間選擇一種。
新版本中的mysql中對row level模式也做了優化,並不是所有的修改都會以row level來記錄,像遇到表結構變更的時候就會以statement模式來記錄,如果sql語句確實就是update或者delete等修改資料的語句,那麼還是會記錄所有行的變更。
二、調整binlog日誌模式
binlog日誌預設模式:
Server version: 5.6.17 Source distribution
mysql> show variables like "%binlog_format%";
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
方法一:線上修改立即生效
mysql> set global binlog_format='MIXED';
Query OK, 0 rows affected (0.00 sec)
退出mysql,檢視當前mysql日誌模式
mysql> show variables like "%binlog_format%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.00 sec)
方法二:在配置檔案中引數如下:
[mysqld]
log-bin=/var/lib/mysql/mysql-bin
#binlog_format="ROW"
binlog_format="MIXED" #開啟MIXED模式
#binlog_format="STATEMENT"
修改後重啟mysql服務日誌模式:
mysql> show variables like "%binlog_format%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.00 sec)
三、在日誌模式當前為row的模式下,記錄日誌的形式內容。
mysql> show variables like "%binlog_format%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)
[[email protected] mysql]# mysqlbinlog --base64-output=decode-rows -v mysql-bin.000011
小結:執行sql部分的sql顯示為base64編碼格式
#171126 17:35:53 server id 1 end_log_pos 458 Table_map: `boy`.`tomcat1` mapped to number 15
#171126 17:35:53 server id 1 end_log_pos 571 Delete_rows: table id 15 flags: STMT_END_F
### DELETE FROM `boy`.`tomcat1`
### WHERE
### @1=11
### @2='huang1'
### DELETE FROM `boy`.`tomcat1`
### WHERE
### @1=2
### @2='huang2'
### DELETE FROM `boy`.`tomcat1`
### WHERE
### @1=3
### @2='huang3'
### @2='zhang7'
# at 571
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET [email protected]_COMPLETION_TYPE*/;
---------------------
作者:東城絕神
來源:CSDN
原文:https://blog.csdn.net/m0_37814112/article/details/78638359?utm_source=copy
版權宣告:本文為博主原創文章,轉載請附上博文連結!