Mysql的binlog日志作用是用來記錄mysql內部增刪改查等對mysql數據庫有更新的內容的記錄(對數據庫的改動),對數據庫的查詢select或show等不會被binlog日志記錄;主要用於數據庫的主從復制以及增量恢復。
mysql的binlog日志必須打開log-bin功能才能生存binlog日志
-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.000002
-rw-rw---- 1 mysql mysql 11799 8月 15 18:17 mysql-bin.000003
1、打開MySQL的log-bin功能
編輯my.cnf配置文件
# grep log-bin my.cnf
log-bin = /data/3306/mysql-bin
查看是否啟用了日志
1
mysql>show variables like 'log_bin';
2、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
3、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的優點
4、MySQL企業binlog模式的選擇
- 互聯網公司使用MySQL的功能較少(不用存儲過程、觸發器、函數),選擇默認的Statement level
- 用到MySQL的特殊功能(存儲過程、觸發器、函數)則選擇Mixed模式
- 用到MySQL的特殊功能(存儲過程、觸發器、函數),又希望數據最大化一直則選擇Row模式
5、設置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
6、配置完成后需要重啟mysql服務
Row模式下解析binlog日志
#mysqlbinlog --base64-output="decode-rows" -v mysql-bin.000001