天天看點

mysql的binlog詳解

binlog是mysql記錄操作的二進制日志檔案,有三種格式可選,但是老舊的SBR已經不适合現在大多數業務需求,是以大多數都建議用MBR和RBR,即mixed或row,而解析他的原因,幾乎都隻有一個,就是恢複資料庫,或者是反編譯來恢複資料庫,目的都是一樣.

以下是基于mysql5.6的mysqlbinlog來描述的,請各位知照.

binlog使用方法

直接來看看例子:

<code>#可以在資料庫界面操作一些指令</code>

<code>#隻檢視第一個binlog檔案的内容(不建議)</code>

<code>mysql&gt; show binlog events;</code>

<code>#檢視指定binlog檔案的内容(不建議)</code>

<code>mysql&gt; show binlog events </code><code>in</code> <code>'mysql-bin.000002'</code><code>;</code>

<code>#檢視目前正在寫入的binlog檔案</code>

<code>mysql&gt; show master status\G</code>

<code>#擷取binlog檔案清單</code>

<code>mysql&gt; show binary logs;</code>

<code>#直接用mysqlbinlog指令就更全面一些</code>

<code>#可以直接打開,可能不夠直覺,而且會不停刷屏,慎用</code>

<code>mysqlbinlog mysql-bin.000002 </code>

<code>#檢視row格式下的二進制日志</code>

<code>mysqlbinlog -vv --base64-output=decode-rows filename</code>

<code>#基于開始/結束時間的解析</code>

<code>mysqlbinlog --start-datetime=</code><code>'2013-09-10 00:00:00'</code> <code>--stop-datetime=</code><code>'2013-09-10 01:01:01'</code> <code>-d 庫名 二進制檔案</code>

<code>#基于pos值的解析</code>

<code>mysqlbinlog --start-position=107 --stop-position=1000 -d 庫名 二進制檔案</code>

<code>#恢複單一資料庫的binlog</code>

<code>mysqlbinlog -d dbname  binlog.00002</code>

<code>#一個完成的事例參考:把binlog裡面特定時間,特定庫的語句導出到t.txt</code>

<code>mysqlbinlog  -vv --base64-output=decode-rows --start-datetime=</code><code>'2016-06-15 20:00:00'</code> <code>--stop-datetime=</code><code>'2016-06-15 21:00:00'</code> <code>-d baiyang  mysql-bin.000011 &gt; t.txt</code>

參數說明:

--base64-output=value    使用base-64編碼格式顯示二進制日志内容,AUTO ("automatic") 或 UNSPEC ("unspecified") 參數自動顯示二進制語句的内容,如果沒有指定 --base64-output參數,則效果就相當于--base64-output=AUTO;NEVER參數會導緻二進制語句不會顯示;DECODE-ROWS解碼處理二進制日志。比較常用的是--base64-output=DECODE-ROWS: 會顯示出row模式帶來的sql變更

--bind-address=name    綁定IP位址(用于一些異常IP通路的情況)

--character-sets-dir=name    字元集檔案的目錄路徑(非正常字元集使用)

-C, --compress    啟用壓縮模式(減少帶寬使用)

-d db_name,--database=db_name    隻列出該資料庫的條目(隻用本地日志)。

--debug-check    檢查記憶體和打開的檔案使用情況并退出。

--debug-info    列印一些調試資訊并退出。

--default-auth=name    預設的用戶端身份驗證插件路徑

-D,disable-logs-bin    禁用二進制日志。如果使用--to-last-logs選項将輸出發送給同一台MySQL伺服器,可以避免無限循環。該選項在崩潰恢複時也很有用,可以避免複制已經記錄的語句。注釋:該選項要求有SUPER權限。

-F, --force-if-open    強制打開沒有正常關閉的二進制日志檔案,(預設開啟,通過--skip-force-if-open關閉)

-f, --force-read    強制打開不能識别的二進制日志事件,如果使用該選項,mysqlbinlog預到不能識别的二進制日志事件,它會列印警告,忽略該事件并繼續。沒有該選項,mysqlbinlog讀到此類事件則停止。

-H, --hexdump    在注釋中顯示日志的十六進制轉儲。該輸出可以幫助複制過程中的調試。

-h, --host=name    擷取給定主機上的MySQL伺服器的二進制日志。

-l, --local-load=name    為指定目錄中的LOAD DATA INFILE預處理本地臨時檔案。

-o, --offset=#    跳過前 N個條目。

-p, --password[=name]    連接配接伺服器時使用密碼。如果使用短選項形式(-p),選項和密碼之間不能有空格。如果在指令行中–password或-p選項後面沒有密碼值,則提示輸入一個密碼。

--plugin-dir=name    用戶端插件目錄

-P, --port=#    用于連接配接遠端伺服器的TCP/IP端口号。

--protocol=name    使用那種連接配接協定,可以是:tcp, socket, pipe,memory

-R, --read-from-remote-server    從MySQL伺服器讀二進制日志。如果沒有加入該選項,任何連接配接伺服器的參數選項将無效。這些選項是–host、–password、–port、–protocol、–socket和–user。可代替read-from-remote-master=BINLOG-DUMP-NON-GTIDS.

--read-from-remote-master=name    從MySQL伺服器讀二進制日志.通過設定COM_BINLOG_DUMP或COM_BINLOG_DUMP_GTID指令來設定參數BINLOG-DUMP-NON-GTIDS或BINLOG-DUMP-GTIDS,如果設定--read-from-remote-master=BINLOG-DUMP-GTIDS并結合--exclude-gtids,可以省一些網絡流量

--raw    需要配合-R使用。輸出原始二進制日志資料,而不是SQL,并輸出到日志檔案。

-r, --result-file=name    将輸出指向給定的檔案。和--raw一起使用的話,這是一個檔案前序.

--secure-auth    如果用戶端低于pre-4.1.1,将拒絕連接配接,預設開啟,可以通過--skip-secure-auth來關閉

--server-id=#    隻提取給定伺服器ID的二進制日志,指my.cnf的server-id的ID值

--server-id-bits=#    把server-id設定在顯著位置

--set-charset=name    輸出時添加SET NAMES character_set提示設定字元集

-s, --short-form    隻顯示日志中包含的語句,不顯示其它資訊。這僅用于測試,不應被使用在生産系統中。如果要禁止base64-output的輸出,可以考慮使用--base64-output=never instead.

-S, --socket=name    使用套接字socket來連接配接,通常是本機

--ssl    使用ssl協定來連接配接(一般不會用)

--ssl-ca=name    使用ca證書方式的SLL來連接配接,同理,下面幾個選項是各種證書和密鑰驗證方式的SSL登陸,就不一一介紹了.

--ssl-capath=name,--ssl-cert=name,--ssl-cipher=name,--ssl-key=name,--ssl-crl=name,--ssl-crlpath=name,--ssl-verify-server-cert

--start-datetime=datetime    從二進制日志中第1個日期時間等于或晚于datetime參量的事件開始讀取。datetime值相對于運作mysqlbinlog的機器上的本地時區。該值格式應符合DATETIME或TIMESTAMP資料類型。例如:mysqlbinlog –start-datetime="2004-12-2511:25:56" binlog.000003

-j, --start-position=#    從二進制日志中第1個位置等于N參量時的事件開始讀。

--stop-datetime=datetime    從二進制日志中第1個日期時間等于或晚于datetime參量的事件起停止讀。和--start-datetime選項配合使用設定導出特定的時間段資訊,有助于減少結果輸出。

--stop-never    等待更多的日志傳輸而不是退出目前指令,直到斷開伺服器連接配接為止,隐式設定--to-last-log

--stop-never-slave-server-id=#    目前指令的從庫ID值,當用到--read-from-remote-server或--stop-never時,指令就會像從庫一樣拉取binlog資料,是以需要一個唯一的server-id值來辨別他.

--stop-position=#    從二進制日志中第1個位置等于和大于N參量時的事件起停止讀。和--start-position選項配合使用設定導出特定的position間隔的binlog資訊,有助于減少結果輸出.

-t, --to-last-log    在MySQL伺服器中請求的二進制日志的結尾處不停止,而是繼續列印直到最後一個二進制日志的結尾。如果将輸出發送給同一台MySQL伺服器,會導緻無限循環。該選項要求–read-from-remote-server。

-u, --user=name    連接配接遠端伺服器時使用的MySQL使用者名。

-v, --verbose    詳細模式,顯示statement模式帶來的sql語句,-vv表示增加列類型的注釋.

-V, --version    顯示版本資訊并退出

--open-files-limit=#    指定要保留的打開的檔案描述符的數量

-c, --verify-binlog-checksum    驗證校驗binlog日志

--binlog-row-event-max-size=#    最大binlog日志檔案容量大小,此值必須是256的倍數。

--skip-gtids    不列印全局事務辨別符資訊(GTID),例如:SET GTID_NEXT=... etc

--include-gtids=name    列印給定值的GTID的資訊

--exclude-gtids=name    列印給定值以外的GTID的資訊

--rewrite-db=name    更新資料庫時給出一個和原來不一樣的資料庫名,例如:rewrite-db='from-&gt;to'.

—help,-?    顯示幫助消息并退出。

使用binlog恢複資料

由于binlog可以直接解析成sql語句的,一般來說直接執行是可行的.

但是有時候我們不想做的那麼複雜,加上一個參數,直接執行,通過管道符就可以了.

<code>mysqlbinlog --start-position=</code><code>'530050688'</code> <code>--stop-position=</code><code>'601156037'</code> <code>-d </code><code>test</code> <code>/opt/mysql-bin</code><code>.000019 |mysql -uroot -p123 --binary-mode</code>

binlog server的建立:

用過mysql的都知道mysql支援主從架構,有些時候我們單純隻想異地備份binlog日志,但是特地搭一個從庫貌似不科學,而且mysql機制上也并不是把binlog拉下來就算,還要寫進資料庫占用一定空間,以前會引入blackhold引擎,而現在就友善多了,因為mysql5.6後引入了mysql的binlog server,相當友善,相當簡單,binlog就被拉過來了,而且隻要程序不掉,就一直拉.

因為方法很簡單,就是一條指令過去,是以不用很緊張,至于參數的意思,請看上面

指令如下,記得加背景運作指令符噢:

<code>#先看看目前的master狀态,可以忽略GTID,因為可以不用設定GTID</code>

<code>*************************** 1. row ***************************</code>

<code>             </code><code>File: mysql-bin.000007</code>

<code>         </code><code>Position: 56789</code>

<code>     </code><code>Binlog_Do_DB: </code>

<code> </code><code>Binlog_Ignore_DB: </code>

<code>Executed_Gtid_Set: 3edae34c-6299-11e6-8999-8038bc0c67be:1-6754,</code>

<code>4cdc2a74-6299-7555-95ce-008cfaf595bc:1-7941248</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

<code>#開啟binlog server</code>

<code>mysqlbinlog -R --raw --host=*.*.*.* --user=root --password=x xxxxxxxxx --stop-never --stop-never-slave-server-</code><code>id</code><code>=56789 mysql-bin.000007 &amp;</code>

<code>#binlog就過來了,看看目錄</code>

<code>ll ./*</code>

<code>-rw-rw---- 1 root root 1073741921 5月  29 19:15 mysql-bin.000007</code>

<code>-rw-rw---- 1 root root 1073741954 6月   2 12:14 mysql-bin.000008</code>

<code>-rw-rw---- 1 root root 1073743557 6月   8 10:03 mysql-bin.000009</code>

<code>-rw-rw---- 1 root root 1073742035 6月  12 16:33 mysql-bin.000010</code>

<code>-rw-rw---- 1 root root 1073742000 6月  16 10:38 mysql-bin.000011</code>

<code>-rw-rw---- 1 root root 1073742053 6月  20 09:18 mysql-bin.000012</code>

<code>#看看程序,正在運作,這就完成了</code>

<code>ps</code> <code>aux |</code><code>grep</code> <code>mysql</code>

<code>root     19683  0.0  0.2  59836  4764 pts</code><code>/1</code>    <code>S    14:39   0:00 mysqlbinlog -R --raw --host=x.x.x.x -uroot -P3306 -px xxxxxxxxxxxxxx --stop-never --stop-never-slave-server-</code><code>id</code><code>=21305198 mysql-bin.000007</code>

<code>root     19697  0.0  0.0 112648   976 pts</code><code>/1</code>    <code>S+   14:45   0:00 </code><code>grep</code> <code>--color=auto mysql</code>

原來我已經跑那麼多了,呵呵~!

再看看資料庫狀态

<code>show processlist;</code>

<code>|    66379 | tencentroot | 10.*.*.*:47303   | NULL    | Binlog Dump | 6932150 | Master has sent all binlog to slave; waiting </code><code>for</code> <code>binlog to be updated | NULL             |</code>

<code>| 14277762 | tencentroot | 127.0.0.1:53878     | NULL    | Sleep       |      25 |                                                                       | NULL             |</code>

<code>| 20949882 | root        | 10.*.*.*:2080  | NULL    | Binlog Dump | 2937110 | Master has sent all binlog to slave; waiting </code><code>for</code> <code>binlog to be updated | NULL</code>

有兩個程序在拉binlog,毫無疑問,其中一個是真正的從庫,另一個就是我的binlogserver了.

完畢.

     本文轉自arthur376 51CTO部落格,原文連結:http://blog.51cto.com/arthur376/1794632,如需轉載請自行聯系原作者