mySQL Binlog詳解

MySQL的binlog日誌做用是用來記錄mysql內部增刪改查等對mysql數據庫有更新的內容的記錄(對數據庫的改動),對數據庫的查詢select和show等操做不會被binlog日誌記錄;主要用於數據庫的主從複製以及增量恢復。mysql的binlog日誌必須打開log-bin功能才能生存binlog日誌必須打開log-bin功能才能生成binlog日誌。mysql

一、打開mysql的log-bin功能linux

編輯my.cnf配置文件,首先要找到這個配置文件,不一樣的操做系統和安裝方式最終呈現的目錄結構是不同的,下面以linux操做系統爲例進行說明sql

二進制文件安裝:數據庫

將下載的mysql tar文件安裝包在指定目錄進行解壓,則會生成下圖所示的目錄vim

源碼安裝:安全

編譯完源碼以後,便開始安轉。默認狀況下,能夠將文件安裝到/usr/local,即在該目錄下生成下面的一系列子目錄bash

能夠看到上面兩種不一樣的安裝方式,在一個安裝目錄內,遠嗎安裝的目錄佈局徹底不一樣於二進制安裝:服務器

mysqld服務器被安裝在「libexec」目錄而不是「bin」目錄內。socket

  •  數據目錄是「var」而非「data」
  • mysql_install_db被安裝在「bin」目錄而非「scripts」內。
  • 頭文件和庫目錄是「include/mysql」「lib/mysql」而非「include」「lib」
  • 執行源碼分發根目錄下的scripts/make_binary_distribution腳本,你能夠用編譯過的源碼分發版建立你本身的二進制安裝。

瞭解了mysql的目錄結構以後,my.cnf配置文件通常都在/opt/mysql/data/database_instance_name/my.cnf函數

編輯my.cnf配置文件

# grep log-bin my.cnf
log-bin = /data/3306/mysql-bin

  添加完成以後查看是否已經啓動了日誌

mysql>show variables like 'log_bin';

 二、Mysqlbinlog解析工具

Mysqlbinlog命令功能是將Mysql的binlog日誌轉換成Mysq領域具。默認狀況下binlog日誌是二進制文件,沒法直接查看

Mysqlbinlog參數以下所示:

參數 描述
-d 指定庫的binlog
-r 至關於重定向到指定文件
--start-position--stop-position 按照指定位置精確解析binlog日誌(精確),如不接--stop-positiion則一直到binlog日誌結尾
--start-datetime--stop-datetime 按照指定時間解析binlog日誌(模糊,不許確),如不接--stop-datetime則一直到binlog日誌結尾

 備註:mysqlbinlog分庫處處binlog,如使用-d參數,那麼在導入更新數據時須要在mysql命令行使用use database命令進入到相應的數據庫中。由於bin-log裏記錄了在改mysql上面存儲的全部數據庫的增量操做信息,可是實際使用中咱們經常須要針對某一個數據庫分別進行,因此一般須要使用mysqlbinlog將binlog分庫導出。

例如:解析test數據庫的binlog日誌並將其寫入my.sql文件中。

#mysqlbinlog -d test mysql-bin.000001 -r my.sql

  經過條件查詢精確解析日誌:

mysqlbinlog dadong-bin.000009 --start-position=365 --stop-position=456 -r pos.sql

mysqlbinlog dadong-bin.000005 --start-position=2265 --stop-position=2552 -r pos.sql
mysqlbinlog dadong-bin.000009 --start-position=365 --stop-position=456 -r pos.sql
mysqlbinlog dadong-bin.000009 --start-position=365 -r pos.sql
mysqlbinlog dadong-bin.000009 --stop-position=456 -r pos.sql
截取部分binlog根據pos
mysqlbinlog dadong-bin.000009 --start-position=365 --stop-position=456 -r pos.sql
mysqlbinlog dadong-bin.000009 --start-position=365 -r pos.sql
mysqlbinlog dadong-bin.000009 --stop-position=456 -r pos.sql

截取部分binlog根據時間
mysqlbinlog dadong-bin.000009 --start-datetime='2014-10-16 17:14:15' --stop-datetime='2014-10-16 17:15:15' -r time.sql
mysqlbinlog dadong-bin.000009 --start-datetime='2014-10-16 17:14:15'  -r time.sql
mysqlbinlog dadong-bin.000009  --stop-datetime='2014-10-16 17:15:15' -r time.sql
 
Row模式下解析binlog日誌:#mysqlbinlog --base64-output="decode-rows" -v mysql-bin.000001
 
 
三、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的優勢

總結:

以insert into xxtable values (x,y,z)爲例,

影響: 1行,且爲新增1行, 對於其餘行沒有影響. 

這個狀況,用row格式,直接複製磁盤上1行的新增變化.

 

以update xxtable set age=21 where name=’sss’;

這個狀況,通常也只是影響1行. 用row也比較合適.

 

以過年發紅包,全公司的人,都漲薪100元.

update xxtable set salary=salary+100;

這個語句帶來的影響,是針對每一行的, 所以磁盤上不少row都發生了變化.

此處,適合就statment格式的日誌.

 

2種日誌,各有各的高效的地方,mysql提供了mixed類型.

能夠根據語句的不一樣,而自動選擇適合的日誌格式.

  

四、MySQL企業binlog模式的選擇

  1. 互聯網公司使用MySQL的功能較少(不用存儲過程、觸發器、函數),選擇默認的Statement level
  2. 用到MySQL的特殊功能(存儲過程、觸發器、函數)則選擇Mixed模式
  3. 用到MySQL的特殊功能(存儲過程、觸發器、函數),又但願數據最大化一直則選擇Row模式
 
五、設置MySQL binlog模式
  查看MySQLbinlog模式
1
2
3
4
5
6
7
8
9
10
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模式
1
mysql> set  global binlog_format= 'ROW' ;  
配置文件中設置binlog模式
1
2
3
4
5
6
#vim my.cnf
[mysqld]
binlog_format= 'ROW'           #放在mysqld模塊下面
user    = mysql
port    = 3306
socket  =  /data/3306/mysql .sock
六、配置完成後須要重啓mysql服務

service mysqld restart或者./mysqld restart 

固然如今不少公司爲了安全起見對mysql的原生命令好比mysqld進行了改造   不能直接經過該命令句進行重啓等操做   須要使用自定義的命令進行操做

相關文章
相關標籤/搜索