01 概述
Binlog它記錄了全部的DDL和DML(除了數據查詢語句)語句,以事件(EVENT)形式記錄,還包含語句所執行的消耗的時間,MySQL的二進制日誌是事務安全型的。mysql
通常來講開啓二進制日誌大概會有1%的性能損耗(MySQL官方測試數據),雖然會下降性能,可是binlog能夠用於主從複製(replication)和point-in-time的恢復,因此仍是頗有必要開啓的。sql
查看:數據庫
SHOWBINLOGEVENTIN'mysqld.00001'\G;緩存
配置:安全
經過參數log-bin[=name]能夠開啓二進制日誌,若是不指定name,默認二進制日誌文件名爲主機名,後綴名爲二進制日誌的序列號,所在路徑爲數據庫所在目錄(datadir)。服務器
02 分類
二進制日誌包括兩類文件:架構
一、二進制日誌索引文件(文件名後綴爲.index)用於記錄全部的二進制文件。 函數
二、二進制日誌文件(文件名後綴爲.00000*)記錄數據庫全部的DDL和DML(除了數據查詢語句)語句事件。 性能
03 分類
binlog有三種格式:測試
一、基於SQL語句的複製(statement-based replication, SBR)
二、基於行的複製(row-based replication, RBR)
三、混合模式複製(mixed-based replication, MBR)
3.1 Statement
記錄的是邏輯SQL,每一條修改操做的sql都會記錄在binlog中。
優勢:不須要記錄每一行的變化,減小了binlog日誌量,節約了IO, 提升了性能。
缺點:沒法徹底保證slave節點與master節點數據徹底一致。像一些特定函數的功能,slave可與master上要保持一致會有不少相關問題。
3.2 Row
5.1.5版本的MySQL開始支持row level的複製,它不記錄sql語句上下文相關信息,僅保存哪條記錄被修改。
優勢:binlog中能夠不記錄執行的sql語句的上下文相關的信息,僅須要記錄那一條記錄被修改爲什麼了。row格式的日誌內容會很是清楚的記錄下每一行數據修改的細節,不會出現某些特定狀況下的存儲過程。
缺點:全部的執行的語句當記錄到日誌中的時候,都將以每行記錄的修改來記錄,這樣可能會產生大量的日誌內容。
3.3 Mixed
從5.1.8版本開始,MySQL提供了Mixed格式,實際上就是Statement與Row的結合。
在Mixed模式下,(默認狀況下)通常的語句修改使用statment格式保存binlog,下面的狀況會採用row格式的狀況包括:
一、表的存儲引擎爲NDB;
二、使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不肯定函數;
三、使用了INSERT DELAY語句;
四、使用了用戶定義函數(UDF);
五、使用了臨時表(temporary table)。
注:不須要死記硬背這些狀況會使用row,之因此不使用statement模式,就是由於簡單的邏輯SQL沒法實現數據的回放,好比使用UUID(),這個是隨機的,沒法保證每次結果都同樣,爲了保證主從複製數據一致性,則必須是記錄數據的變化信息。
04 參數
4.1 max_binlog_size
指定了單個二進制日誌文件最大值,若是超過該值,則產生新的二進制日誌文件後綴名+1,並記錄到.index文件。
4.2 binlog_cache_size
控制緩衝大小,默認大小32K,基於會話的,所以每開啓一個事務就分配一個binlog_cache_size大小的緩存,因此不能設置過大。
當一個事務的記錄大於binlog_cache_size時,MySQL會把緩衝中的日誌寫入一個臨時文件中,所以該值又不能設置過小(不然會頻繁刷盤)。
4.3 sync_binlog
表示每寫緩衝多少次就要同步到磁盤。若是設置爲1,表示採用同步寫磁盤的方式來寫二進制日誌,這時候寫操做不使用操做系統的緩衝來寫二進制日誌。sync_binlog的默認值爲0,若是使用InnoDB存儲引擎進行復制,而且想獲得最大的可用性,建議將該值設置爲ON(對數據庫IO系統帶來必定影響)。
4.4 binlog-do-db
表示須要寫入哪些庫的日誌,默認爲空,表示須要同步全部庫的日誌到二進制日誌。
4.5 binlog-ignore-db
表示須要忽略寫入哪些庫的日誌,默認爲空,表示須要同步全部庫的日誌到二進制日誌。
4.6 log-slave-update
若當前數據庫是主從複製架構中的slave節點,則它不會將從master取得並執行的binlog寫入本身的二進制文件中。可是,若是須要搭建master->slave->slave這種架構的複製,則必須設置該參數。
4.7 binlog_format
記錄二進制日誌的格式。
05 操做
5.1 開啓
一、vi編輯打開mysql配置文件
# vi /usr/local/mysql/etc/my.cnf在[mysqld] 區塊設置/添加 log-bin=mysql-bin
重啓mysqld服務使配置生效
# /usr/local/mysql/bin/mysqld_safe --user=mysql &
二、也可登陸mysql服務器,經過mysql的變量配置表,查看二進制日誌是否已開啓
5.2 查看日誌列表
mysql> show master logs;
5.3 查看節點狀態
查看主節點狀態信息:
mysql> show master status;
查看從節點狀態信息:
mysql> show slave status;
5.4 刷新log日誌
mysql> flush logs;
注:每當mysqld服務重啓時,會自動執行此命令,刷新binlog日誌;在mysqldump備份數據時加 -F 選項也會刷新binlog日誌;
5.5 清空日誌
mysql> reset master;
5.6 啓動複製
mysql> start slave
能夠指定線程類型:IO_THREAD,SQL_THREAD,若是不指定,兩個都啓動。
06 應用場景
binlog主要使用場景:
一、主從複製:在master節點開啓binlog,並把它的二進制日誌傳遞給slaves,slave節點經過複製和執行二進制日誌進行實時同步。
注:具體工做流程參考《MySQL主從複製》。
二、數據恢復:某些數據的恢復須要二進制日誌,例如,若是須要恢復數據庫全量備份的文件,能夠經過二進制日誌進行point-in-time恢復。
三、審計(audit):用戶經過二進制日誌中的信息來進行審計,判斷是否有對數據庫進行注入的攻擊。