MySQL binlog原理及應用

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):用戶經過二進制日誌中的信息來進行審計,判斷是否有對數據庫進行注入的攻擊。

相關文章
相關標籤/搜索