mysql binlog sql统计_mysql的binlog详解
binlog是mysql記錄操作的二進(jìn)制日志文件,有三種格式可選,但是老舊的SBR已經(jīng)不適合現(xiàn)在大多數(shù)業(yè)務(wù)需求,所以大多數(shù)都建議用MBR和RBR,即mixed或row,而解析他的原因,幾乎都只有一個(gè),就是恢復(fù)數(shù)據(jù)庫(kù),或者是反編譯來(lái)恢復(fù)數(shù)據(jù)庫(kù),目的都是一樣.
以下是基于mysql5.6的mysqlbinlog來(lái)描述的,請(qǐng)各位知照.
binlog使用方法
直接來(lái)看看例子:#可以在數(shù)據(jù)庫(kù)界面操作一些命令
#只查看第一個(gè)binlog文件的內(nèi)容(不建議)
mysql>?show?binlog?events;
#查看指定binlog文件的內(nèi)容(不建議)
mysql>?show?binlog?events?in?'mysql-bin.000002';
#查看當(dāng)前正在寫入的binlog文件
mysql>?show?master?status\G
#獲取binlog文件列表
mysql>?show?binary?logs;
#直接用mysqlbinlog命令就更全面一些
#可以直接打開(kāi),可能不夠直觀,而且會(huì)不停刷屏,慎用
mysqlbinlog?mysql-bin.000002
#查看row格式下的二進(jìn)制日志
mysqlbinlog?-vv?--base64-output=decode-rows?filename
#基于開(kāi)始/結(jié)束時(shí)間的解析
mysqlbinlog?--start-datetime='2013-09-10?00:00:00'?--stop-datetime='2013-09-10?01:01:01'?-d?庫(kù)名?二進(jìn)制文件
#基于pos值的解析
mysqlbinlog?--start-position=107?--stop-position=1000?-d?庫(kù)名?二進(jìn)制文件
#恢復(fù)單一數(shù)據(jù)庫(kù)的binlog
mysqlbinlog?-d?dbname??binlog.00002
#常用示例1:將一個(gè)row格式的binlog文件按特定時(shí)間段,特定庫(kù)解析出來(lái),導(dǎo)出到文件,-vv意思是把注釋也打出來(lái)
mysqlbinlog?-vv?--base64-output=decode-rows?--start-datetime='2016-06-15?20:00:00'?--stop-datetime='2016-06-15?21:00:00'?-d?baiyang??mysql-bin.000011?>?t.txt
#常用示例2:將解析出來(lái)的binlog文件進(jìn)行增刪改查統(tǒng)計(jì)
mysqlbinlog?-vv?--base64-output=decode-rows?filename|awk?'/###/?{if($0~/UPDATE|INSERT|SELECT/)count[$2"?"$NF]++}END{for(i?in?count)?print?i,"\t",count[i]}'?|?column?-t?|?sort?-k3nr
參數(shù)說(shuō)明:
--base64-output=value????使用base-64編碼格式顯示二進(jìn)制日志內(nèi)容,AUTO ("automatic") 或 UNSPEC ("unspecified") 參數(shù)自動(dòng)顯示二進(jìn)制語(yǔ)句的內(nèi)容,如果沒(méi)有指定 --base64-output參數(shù),則效果就相當(dāng)于--base64-output=AUTO;NEVER參數(shù)會(huì)導(dǎo)致二進(jìn)制語(yǔ)句不會(huì)顯示;DECODE-ROWS解碼處理二進(jìn)制日志。比較常用的是--base64-output=DECODE-ROWS: 會(huì)顯示出row模式帶來(lái)的sql變更
--bind-address=name????綁定IP地址(用于一些異常IP訪問(wèn)的情況)
--character-sets-dir=name????字符集文件的目錄路徑(非正常字符集使用)
-C, --compress????啟用壓縮模式(減少帶寬使用)
-d db_name,--database=db_name????只列出該數(shù)據(jù)庫(kù)的條目(只用本地日志)。
--debug-check????檢查內(nèi)存和打開(kāi)的文件使用情況并退出。
--debug-info????打印一些調(diào)試信息并退出。
--default-auth=name????默認(rèn)的客戶端身份驗(yàn)證插件路徑
-D,disable-logs-bin????禁用二進(jìn)制日志。如果使用--to-last-logs選項(xiàng)將輸出發(fā)送給同一臺(tái)MySQL服務(wù)器,可以避免無(wú)限循環(huán)。該選項(xiàng)在崩潰恢復(fù)時(shí)也很有用,可以避免復(fù)制已經(jīng)記錄的語(yǔ)句。注釋:該選項(xiàng)要求有SUPER權(quán)限。
-F, --force-if-open????強(qiáng)制打開(kāi)沒(méi)有正常關(guān)閉的二進(jìn)制日志文件,(默認(rèn)開(kāi)啟,通過(guò)--skip-force-if-open關(guān)閉)
-f, --force-read????強(qiáng)制打開(kāi)不能識(shí)別的二進(jìn)制日志事件,如果使用該選項(xiàng),mysqlbinlog預(yù)到不能識(shí)別的二進(jìn)制日志事件,它會(huì)打印警告,忽略該事件并繼續(xù)。沒(méi)有該選項(xiàng),mysqlbinlog讀到此類事件則停止。
-H, --hexdump????在注釋中顯示日志的十六進(jìn)制轉(zhuǎn)儲(chǔ)。該輸出可以幫助復(fù)制過(guò)程中的調(diào)試。
-h, --host=name????獲取給定主機(jī)上的MySQL服務(wù)器的二進(jìn)制日志。
-l, --local-load=name????為指定目錄中的LOAD DATA INFILE預(yù)處理本地臨時(shí)文件。
-o, --offset=#????跳過(guò)前 N個(gè)條目。
-p, --password[=name]????連接服務(wù)器時(shí)使用密碼。如果使用短選項(xiàng)形式(-p),選項(xiàng)和密碼之間不能有空格。如果在命令行中–password或-p選項(xiàng)后面沒(méi)有密碼值,則提示輸入一個(gè)密碼。
--plugin-dir=name????客戶端插件目錄
-P, --port=#????用于連接遠(yuǎn)程服務(wù)器的TCP/IP端口號(hào)。
--protocol=name????使用那種連接協(xié)議,可以是:tcp, socket, pipe,memory
-R, --read-from-remote-server????從MySQL服務(wù)器讀二進(jìn)制日志。如果沒(méi)有加入該選項(xiàng),任何連接服務(wù)器的參數(shù)選項(xiàng)將無(wú)效。這些選項(xiàng)是–host、–password、–port、–protocol、–socket和–user。可代替read-from-remote-master=BINLOG-DUMP-NON-GTIDS.
--read-from-remote-master=name????從MySQL服務(wù)器讀二進(jìn)制日志.通過(guò)設(shè)置COM_BINLOG_DUMP或COM_BINLOG_DUMP_GTID命令來(lái)設(shè)定參數(shù)BINLOG-DUMP-NON-GTIDS或BINLOG-DUMP-GTIDS,如果設(shè)置--read-from-remote-master=BINLOG-DUMP-GTIDS并結(jié)合--exclude-gtids,可以省一些網(wǎng)絡(luò)流量
--raw????需要配合-R使用。輸出原始二進(jìn)制日志數(shù)據(jù),而不是SQL,并輸出到日志文件。
-r, --result-file=name????將輸出指向給定的文件。和--raw一起使用的話,這是一個(gè)文件前序.
--secure-auth????如果客戶端低于pre-4.1.1,將拒絕連接,默認(rèn)開(kāi)啟,可以通過(guò)--skip-secure-auth來(lái)關(guān)閉
--server-id=#????只提取給定服務(wù)器ID的二進(jìn)制日志,指my.cnf的server-id的ID值
--server-id-bits=#????把server-id設(shè)置在顯著位置
--set-charset=name????輸出時(shí)添加SET NAMES character_set提示設(shè)定字符集
-s, --short-form????只顯示日志中包含的語(yǔ)句,不顯示其它信息。這僅用于測(cè)試,不應(yīng)被使用在生產(chǎn)系統(tǒng)中。如果要禁止base64-output的輸出,可以考慮使用--base64-output=never?instead.
-S, --socket=name????使用套接字socket來(lái)連接,通常是本機(jī)
--ssl????使用ssl協(xié)議來(lái)連接(一般不會(huì)用)
--ssl-ca=name????使用ca證書方式的SLL來(lái)連接,同理,下面幾個(gè)選項(xiàng)是各種證書和密鑰驗(yàn)證方式的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????從二進(jìn)制日志中第1個(gè)日期時(shí)間等于或晚于datetime參量的事件開(kāi)始讀取。datetime值相對(duì)于運(yùn)行mysqlbinlog的機(jī)器上的本地時(shí)區(qū)。該值格式應(yīng)符合DATETIME或TIMESTAMP數(shù)據(jù)類型。例如:mysqlbinlog –start-datetime="2004-12-2511:25:56" binlog.000003
-j, --start-position=#????從二進(jìn)制日志中第1個(gè)位置等于N參量時(shí)的事件開(kāi)始讀。
--stop-datetime=datetime????從二進(jìn)制日志中第1個(gè)日期時(shí)間等于或晚于datetime參量的事件起停止讀。和--start-datetime選項(xiàng)配合使用設(shè)定導(dǎo)出特定的時(shí)間段信息,有助于減少結(jié)果輸出。
--stop-never????等待更多的日志傳輸而不是退出當(dāng)前命令,直到斷開(kāi)服務(wù)器連接為止,隱式設(shè)置--to-last-log
--stop-never-slave-server-id=#????當(dāng)前命令的從庫(kù)ID值,當(dāng)用到--read-from-remote-server或--stop-never時(shí),命令就會(huì)像從庫(kù)一樣拉取binlog數(shù)據(jù),所以需要一個(gè)唯一的server-id值來(lái)標(biāo)識(shí)他.
--stop-position=#????從二進(jìn)制日志中第1個(gè)位置等于和大于N參量時(shí)的事件起停止讀。和--start-position選項(xiàng)配合使用設(shè)定導(dǎo)出特定的position間隔的binlog信息,有助于減少結(jié)果輸出.
-t, --to-last-log????在MySQL服務(wù)器中請(qǐng)求的二進(jìn)制日志的結(jié)尾處不停止,而是繼續(xù)打印直到最后一個(gè)二進(jìn)制日志的結(jié)尾。如果將輸出發(fā)送給同一臺(tái)MySQL服務(wù)器,會(huì)導(dǎo)致無(wú)限循環(huán)。該選項(xiàng)要求–read-from-remote-server。
-u, --user=name????連接遠(yuǎn)程服務(wù)器時(shí)使用的MySQL用戶名。
-v, --verbose????詳細(xì)模式,顯示statement模式帶來(lái)的sql語(yǔ)句,-vv表示增加列類型的注釋.
-V, --version????顯示版本信息并退出
--open-files-limit=#????指定要保留的打開(kāi)的文件描述符的數(shù)量
-c, --verify-binlog-checksum????驗(yàn)證校驗(yàn)binlog日志
--binlog-row-event-max-size=#????最大binlog日志文件容量大小,此值必須是256的倍數(shù)。
--skip-gtids????不打印全局事務(wù)標(biāo)識(shí)符信息(GTID),例如:SET GTID_NEXT=... etc
--include-gtids=name????打印給定值的GTID的信息
--exclude-gtids=name????打印給定值以外的GTID的信息
--rewrite-db=name????更新數(shù)據(jù)庫(kù)時(shí)給出一個(gè)和原來(lái)不一樣的數(shù)據(jù)庫(kù)名,例如:rewrite-db='from->to'.
—help,-?????顯示幫助消息并退出。
使用binlog恢復(fù)數(shù)據(jù)
由于binlog可以直接解析成sql語(yǔ)句的,一般來(lái)說(shuō)直接執(zhí)行是可行的.
但是有時(shí)候我們不想做的那么復(fù)雜,加上一個(gè)參數(shù),直接執(zhí)行,通過(guò)管道符就可以了.mysqlbinlog?--start-position='530050688'?--stop-position='601156037'?-d?test?/opt/mysql-bin.000019?|mysql?-uroot?-p123?--binary-mode
binlog server的創(chuàng)建:
用過(guò)mysql的都知道m(xù)ysql支持主從架構(gòu),有些時(shí)候我們單純只想異地備份binlog日志,但是特地搭一個(gè)從庫(kù)貌似不科學(xué),而且mysql機(jī)制上也并不是把binlog拉下來(lái)就算,還要寫進(jìn)數(shù)據(jù)庫(kù)占用一定空間,以前會(huì)引入blackhold引擎,而現(xiàn)在就方便多了,因?yàn)閙ysql5.6后引入了mysql的binlog server,相當(dāng)方便,相當(dāng)簡(jiǎn)單,binlog就被拉過(guò)來(lái)了,而且只要進(jìn)程不掉,就一直拉.
因?yàn)榉椒ê芎?jiǎn)單,就是一條命令過(guò)去,所以不用很緊張,至于參數(shù)的意思,請(qǐng)看上面
命令如下,記得加后臺(tái)運(yùn)行命令符噢:#先看看當(dāng)前的master狀態(tài),可以忽略GTID,因?yàn)榭梢圆挥迷O(shè)置GTID
mysql>?show?master?status\G
***************************?1.?row?***************************
File:?mysql-bin.000007
Position:?56789
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:?3edae34c-6299-11e6-8999-8038bc0c67be:1-6754,
4cdc2a74-6299-7555-95ce-008cfaf595bc:1-7941248
1?row?in?set?(0.00?sec)
#開(kāi)啟binlog?server
mysqlbinlog?-R?--raw?--host=*.*.*.*?--user=root?--password=x?xxxxxxxxx?--stop-never?--stop-never-slave-server-id=56789?mysql-bin.000007?&
#binlog就過(guò)來(lái)了,看看目錄
ll?./*
-rw-rw----?1?root?root?1073741921?5月??29?19:15?mysql-bin.000007
-rw-rw----?1?root?root?1073741954?6月???2?12:14?mysql-bin.000008
-rw-rw----?1?root?root?1073743557?6月???8?10:03?mysql-bin.000009
-rw-rw----?1?root?root?1073742035?6月??12?16:33?mysql-bin.000010
-rw-rw----?1?root?root?1073742000?6月??16?10:38?mysql-bin.000011
-rw-rw----?1?root?root?1073742053?6月??20?09:18?mysql-bin.000012
#看看進(jìn)程,正在運(yùn)行,這就完成了
ps?aux?|grep?mysql
root?????19683??0.0??0.2??59836??4764?pts/1????S????14:39???0:00?mysqlbinlog?-R?--raw?--host=x.x.x.x?-uroot?-P3306?-px?xxxxxxxxxxxxxx?--stop-never?--stop-never-slave-server-id=21305198?mysql-bin.000007
root?????19697??0.0??0.0?112648???976?pts/1????S+???14:45???0:00?grep?--color=auto?mysql
原來(lái)我已經(jīng)跑那么多了,呵呵~!
再看看數(shù)據(jù)庫(kù)狀態(tài)show?processlist;
|????66379?|?tencentroot?|?10.*.*.*:47303???|?NULL????|?Binlog?Dump?|?6932150?|?Master?has?sent?all?binlog?to?slave;?waiting?for?binlog?to?be?updated?|?NULL?????????????|
|?14277762?|?tencentroot?|?127.0.0.1:53878?????|?NULL????|?Sleep???????|??????25?|???????????????????????????????????????????????????????????????????????|?NULL?????????????|
|?20949882?|?root????????|?10.*.*.*:2080??|?NULL????|?Binlog?Dump?|?2937110?|?Master?has?sent?all?binlog?to?slave;?waiting?for?binlog?to?be?updated?|?NULL
有兩個(gè)進(jìn)程在拉binlog,毫無(wú)疑問(wèn),其中一個(gè)是真正的從庫(kù),另一個(gè)就是我的binlogserver了.
完畢.
總結(jié)
以上是生活随笔為你收集整理的mysql binlog sql统计_mysql的binlog详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微信小程序 CSS filter(滤镜)
- 下一篇: 只读属性怎么来的初值_设置Mysql表只