MySQL的binlog數據如何查看

binlog介紹

  1. binlog,即二進制日誌,它記錄了數據庫上的全部改變.html

  2. 改變數據庫的SQL語句執行結束時,將在binlog的末尾寫入一條記錄,同時通知語句解析器,語句執行完畢.java

  3. binlog格式mysql

  • 基於語句,沒法保證全部語句都在從庫執行成功,好比update ... limit 1;sql

  • 基於行,將每一次改動記爲binlog中的一行.在執行一個特別複雜的update或者delete操做時,基於行的格式會有優點.shell

登陸到mysql查看binlog

  1. 只查看第一個binlog文件的內容數據庫

    show binlog events;
  2. 查看指定binlog文件的內容windows

    show binlog events in 'mysql-bin.000002';
  3. 查看當前正在寫入的binlog文件服務器

    show master status\G
  4. 獲取binlog文件列表less

    show binary logs;

用mysqlbinlog工具查看

注意:ide

  1. 不要查看當前正在寫入的binlog文件

  2. 不要加--force參數強制訪問

  3. 若是binlog格式是行模式的,請加 -vv參數

本地查看

  1. 基於開始/結束時間

    mysqlbinlog --start-datetime='2013-09-10 00:00:00' --stop-datetime='2013-09-10 01:01:01' -d 庫名 二進制文件
  2. 基於pos值

    mysqlbinlog --start-postion=107 --stop-position=1000 -d 庫名 二進制文件

遠程查看

  1. 指定開始/結束時間,並把結果重定向到本地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.cnflog-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的格式也有三種:STATEMENTROWMIXED

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 typeFORMAT_DESCRIPTION_EVENTQUERYLOAD_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_headerbody

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_idis used to distinguish temporary tables that belong to differentclients.

Exec_timeThe time from whenthe query started to when it was logged in the binlog, in seconds.QUERY到達到這個binlog事件生成的時間間隔。

Db_len:當前數據庫的名稱長度。

Error_code:執行出錯的錯誤號。

相關文章
相關標籤/搜索