Mysql的binlog日誌做用是用來記錄mysql內部增刪改查等對mysql數據庫有更新的內容的記錄(對數據庫的改動),對數據庫的查詢select或show等不會被binlog日誌記錄;主要用於數據庫的主從複製以及增量恢復。mysql
mysql的binlog日誌必須打開log-bin功能才能生存binlog日誌sql
-rw-rw---- 1 mysql mysql 669 8月 10 21:29 mysql-bin.000001數據庫
-rw-rw---- 1 mysql mysql 126 8月 10 22:06 mysql-bin.000002vim
-rw-rw---- 1 mysql mysql 11799 8月 15 18:17 mysql-bin.000003socket
一、打開MySQL的log-bin功能函數
編輯my.cnf配置文件工具
# grep log-bin my.cnf日誌
log-bin = /data/3306/mysql-bincode
查看是否啓用了日誌orm
1
mysql>show variables like 'log_bin';
二、Mysqlbinlog解析工具
Mysqlbinlog功能是將Mysql的binlog日誌轉換成Mysql語句,默認狀況下binlog日誌是二進制文件,沒法直接查看。
Mysqlbinlog參數
參數
描述
-d
指定庫的binlog
-r
至關於重定向到指定文件
--start-position--stop-position
按照指定位置精確解析binlog日誌(精確),如不接--stop-positiion則一直到binlog日誌結尾
--start-datetime--stop-datetime
按照指定時間解析binlog日誌(模糊,不許確),如不接--stop-datetime則一直到binlog日誌結尾
備註:myslqlbinlog分庫導出binlog,如使用-d參數,更新數據時必須使用use database。
例:解析ceshi數據庫的binlog日誌並寫入my.sql文件
#mysqlbinlog -d ceshi mysql-bin.000003 -r my.sql
使用位置精確解析binlog日誌
#mysqlbinlog mysql-bin.000003 --start-position=100 --stop-position=200 -r my.sql
三、MySQL binlog的三種工做模式
(1)Row level
日誌中會記錄每一行數據被修改的狀況,而後在slave端對相同的數據進行修改。
優勢:能清楚的記錄每一行數據修改的細節
缺點:數據量太大
(2)Statement level(默認)
每一條被修改數據的sql都會記錄到master的bin-log中,slave在複製的時候sql進程會解析成和原來master端執行過的相同的sql再次執行
優勢:解決了 Row level下的缺點,不須要記錄每一行的數據變化,減小bin-log日誌量,節約磁盤IO,提升新能
缺點:容易出現主從複製不一致
(3)Mixed(混合模式)
結合了Row level和Statement level的優勢
四、MySQL企業binlog模式的選擇
五、設置MySQL binlog模式
查看MySQLbinlog模式
mysql>show global variables like "binlog%";
+-----------------------------------------+-----------+
| Variable_name | Value |
+-----------------------------------------+-----------+
| binlog_cache_size | 1048576 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | STATEMENT | #系統默認爲STATEMENT模式
| binlog_stmt_cache_size | 32768 |
+-----------------------------------------+-----------+
4 rows in set (0.00 sec)
MySQL中設置binlog模式
mysql>set global binlog_format='ROW';
配置文件中設置binlog模式
#vim my.cnf
[mysqld]
binlog_format='ROW' #放在mysqld模塊下面
user = mysql
port = 3306
socket = /data/3306/mysql.sock
六、配置完成後須要重啓mysql服務
Row模式下解析binlog日誌
#mysqlbinlog --base64-output="decode-rows" -v mysql-bin.000001