binlog,即二進制日誌,它記錄了數據庫上的全部改變.html
改變數據庫的SQL語句執行結束時,將在binlog的末尾寫入一條記錄,同時通知語句解析器,語句執行完畢.java
binlog格式mysql
基於語句,沒法保證全部語句都在從庫執行成功,好比update ... limit 1;sql
基於行,將每一次改動記爲binlog中的一行.在執行一個特別複雜的update或者delete操做時,基於行的格式會有優點.shell
只查看第一個binlog文件的內容數據庫
show binlog events;
查看指定binlog文件的內容windows
show binlog events in 'mysql-bin.000002';
查看當前正在寫入的binlog文件服務器
show master status\G
獲取binlog文件列表less
show binary logs;
注意:ide
不要查看當前正在寫入的binlog文件
不要加--force參數強制訪問
若是binlog格式是行模式的,請加 -vv參數
基於開始/結束時間
mysqlbinlog --start-datetime='2013-09-10 00:00:00' --stop-datetime='2013-09-10 01:01:01' -d 庫名 二進制文件
基於pos值
mysqlbinlog --start-postion=107 --stop-position=1000 -d 庫名 二進制文件
指定開始/結束時間,並把結果重定向到本地t.binlog文件中.
mysqlbinlog -u username -p password -hl-db1.dba.beta.cn6.qunar.com -P3306 \ --read-from-remote-server --start-datetime='2013-09-10 23:00:00' --stop-datetime='2013-09-10 23:30:00' mysql-bin.000001 > t.binlog
是否啓用了日誌
mysql>show variables like 'log_bin';
怎樣知道當前的日誌
mysql> show master status;
看二進制日誌文件用mysqlbinlog
shell>mysqlbinlog mail-bin.000001
或者shell>mysqlbinlog mail-bin.000001 | tail
mysqlbinlog mysql-bin.000036 | less
查詢包含幾個字段的語句:
mysqlbinlog mysql-bin.000036| egrep '(2011030610002460|2011030310001730|2011030410011680|2011030410006280)'
mysqlbinlog查看二進制日誌的問題 在使用mysqlbinlog查看日誌的時候碰到了一個問題, 錯誤提示以下: /usr/local/mysql/bin/mysqlbinlog: unknown variable 'default-character-set=utf8' 產生這個問題的緣由是由於我在my.cnf中的client選項組中添加了 default-character-set=utf8 要解決這個bug的方法仍是有的, 一種方法是使用:--no-defaults ./mysqlbinlog --no-defaults mysql-bin.000063 另外一種方法:使用mysqlbinlog工具查看二進制日誌時會從新讀取的mysql的配置文件my.cnf(windows下是my.ini),而不是服務器已經加載進內存的配置文件。也就是說只要修改並保存了my.cnf文件,而不須要重起mysql服務器,則使用mysqlbinlog查看時修改後的my.cnf配置文件對mysqlbinlog而言已經生效。因此這裏可使用此方法:把client選項組中default-character-set=utf8選項屏蔽掉,如 #default-character-set=utf8 而後運行mysqlbinlog工具,則不會產生任何問題了。固然記得在不在使用mysqlbinlog工具時,把#default-character-set=utf8 選項恢復爲default-character-set=utf8 1、mysqlbinlog簡介 binlog又叫二進制日誌文件,它會將mysql中全部修改數據庫數據的Query以二進制的形式記錄到日誌文件中,如:create,insert,drop,update等;(對於select操做則不會被記錄到binlog裏,由於它並無修改數據庫的數據)。binlog通常存儲在數據目錄下,而且命名爲:mysql-bin.***(這個能夠在配置文件中修改my.cnf:log-bin=mysql-bin,就是文件名的前綴;mysqld在每一個 binlog 名後面添加一個數字擴展名。每次啓動服務器或刷新日誌時增長文件的大小大於max_binlog_size,一個事務不會被拆分開)。 binlog主要是用於保證數據完整的,如主從備份,經過從binlog文件中讀取操做來在salve機上進行一樣的操做,保證主從備份,固然不可能每次都從開始的地方redo,因此每條記錄都有一個時間截TIMESTAMP。 2、binglog的類型 binlog的格式有三種,這也反應了mysql的複製技術:基於SQL語句的複製(statement-based replication, SBR),基於行的複製(row-based replication, RBR),混合模式複製(mixed-based replication, MBR)。相應地,binlog的格式也有三種:STATEMENT,ROW,MIXED。 mysql>showvariables like 'binlog_format' #查看binlog的格式 |
三、簡單的使用binlog及查看修改其類型
show binary logs; #顯示binlog文件
purge binary logsto 'mysql-bin.**' #刪除到**文件
bin/mysqlbinlog binlogfile #解析binlog文件
具體使用能夠查看幫助文件,也能夠參考官方用法:
http://dev.mysql.com/doc/refman/5.1/zh/client-side-scripts.html#mysqlbinlog
利用binlog恢復數據:
bin/mysqlbinlog --start-datetime='2011-7-7 18:0:0'--stop-datetime='2011-7-7 20:07:13' data/mysql-bin.000008 |mysql -u root
查看及修改binlog的類型能夠經過查看my.cnf文件,如混合型的設置以下:
log-bin=mysql-bin
#binlog_format=STATEMENT
#binlog_format=ROW
binlog_format=mixed
另外也能夠經過查看binlog日誌文件的內容,具體上面已進行講解。 也能夠經過查看sql狀態來查看:
mysql> show variables like '%log%';
+-----------------------------------------+--------------------------------+
| Variable_name | Value |
+-----------------------------------------+--------------------------------+
| back_log | 50 |
| binlog_cache_size | 32768 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | MIXED
不復啓mysql從新加載my.cnf文件的狀況下,修改mysqlbinlog類型的方法:
mysql> SET SESSION binlog_format = 'STATEMENT';
mysql> SET SESSION binlog_format = 'ROW';
mysql> SET SESSION binlog_format = 'MIXED';
mysql> SET GLOBAL binlog_format = 'STATEMENT';
mysql> SET GLOBAL binlog_format = 'ROW';
mysql> SET GLOBAL binlog_format = 'MIXED';
4、binlog記錄的格式
每一個binlog的開始都是由4個字節:fe 62 69 6e,後面三個字節就是bin。
而後接下來的就是一條記錄的內容它包括:Common-Header,這部分不一樣版本的大小不同,4.0以上的都是19個字節。在這個以後就是BODY。
Common-Header格式:(單位:字節)
Timestamp(4) |
Type(1) |
Server_id(4) |
Total_size(4) |
End_log_pos(4) |
Flag(2) |
Timestamp:從1970開始
Type:此log event type如FORMAT_DESCRIPTION_EVENT、QUERY、LOAD_EVENT等,其中每一個binlog的第一條記錄的類型都是FORMAT_DESCRIPTION_EVENT,它記錄了該binlog的相關信息,如版本,這些信息對於後序分析binlog記錄是有用的,因此對於任務要讀取binlog的內容的工具都必須先讀取第一條記錄。QUERY包括咱們常常操做的如:create,drop,update,insert等。
Server_id:建立這個事件的server id。防止循環主從致使的主機被從寫。The master's server id (is preserved in therelay log; used to prevent from infinite loops in circular replication).
Total_size:該記錄的大小,包括common_header及body。
End_log_pos:此下一條記錄的開始位置。也是此條記錄結束位置的上一個字節。
Flag:標誌位。
QUERY類型的記錄:
QUERY類型的記錄除了開始的common-header以外,在body的開頭是一個Post-header,而後以後纔是真正的body內容。
Query Post-Header:(單位字節)
Thread_id(4) |
Exec_time(4) |
Db_len(1) |
Error_code(2) |
Status_var_len(2) |
Thread_id:is used to distinguish temporary tables that belong to differentclients.
Exec_time:The time from whenthe query started to when it was logged in the binlog, in seconds.QUERY到達到這個binlog事件生成的時間間隔。
Db_len:當前數據庫的名稱長度。
Error_code:執行出錯的錯誤號。