MySQL Binlog詳解

MySQL Binlog詳解

  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
一、打開MySQL的log-bin功能
編輯my.cnf配置文件
# grep log-bin my.cnf
log-bin = /data/3306/mysql-bin
查看是否啓用了日誌
mysql>show variables like 'log_bin';

二、Mysqlbinlog解析工具mysql

  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模式的選擇sql

  1. 互聯網公司使用MySQL的功能較少(不用存儲過程、觸發器、函數),選擇默認的Statement level
  2. 用到MySQL的特殊功能(存儲過程、觸發器、函數)則選擇Mixed模式
  3. 用到MySQL的特殊功能(存儲過程、觸發器、函數),又但願數據最大化一直則選擇Row模式
五、設置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
相關文章
相關標籤/搜索