mysqlsla使用介紹


什么是mysqlsla?
Mysqlsla 是daniel-nichter 用perl 寫的一個腳本,專門用於處理分析Mysql的日志而存在。
mysqlsla 能解決什么問題?
作為一名Mysql DBA,日常工作中處理日志是再正常不過的事情了。 通過Mysql的日志主要分為:General log,slow log,binary log三種。
通過query日志,我們可以分析業務的邏輯,業務特點。通過slow log,我們可以找到服務器的瓶頸。通過binary log,我們可以恢復數據。
Mysqlsla可以處理其中的任意日志,這也是我喜歡它的最主要原因之一。
為什么選擇mysqlsla?
分析mysql日志的工具當然不止mysqlsla一種,據我所知的有:
mysqldumpslow
mysqlbinlog
myprofi
mysql-explain-slow-log
mysql-log-filter
pt-query-digest
mysqlsla

下面做一個對比:

工具 一般統計 高級統計 語言 優勢 針對log
mysqldumpslow 支持 不支持 perl mysql官方自帶 slow
myprofi 支持 不支持 php 簡單 slow
mysql-log-filter 支持 部分支持 python 簡單 slow
mysql-explain-slow-log 支持 不支持 perl slow
mysqlbinlog 支持 不支持 二進制 mysql官方自帶 binary log
mysqlsla 支持 支持 perl 總能強大,使用簡單,自定義能力強 所有日志,包括自定義日志
pt-query-digest 支持 支持 perl 總能強大,使用簡單,自定義能力強 所有日志,包括自定義日志

根據以上特點,最適合的工具非 mysqlsla 與 pt-query-digest 莫屬。 mysqlsla與pt-query-digest的作者是同一個人。現在主打開發pt系列工具。被其強大的功能所吸引,可以完成DBA工作的99%的需求,所以這里詳細介紹mysqlsla的使用

mysqlsla介紹


大致將mysqlsla 分解出來分為: Mysqlsla的安裝,Mysqlsla的功能,Mysqlsla的用法,Mysqlsla 的filter,Mysqlsla的report,Mysqlsla的replay,Mysqlsla的user-defined-Logs。 其中最核心的當然是:filter以及report。

大致流程是: LOGS(UDL,defalut) -> parse -> filter -> sort -> reprot -> replay .

mysqlsla_pic

這里說的,Mysqlsla可以處理任意日志。默認可以處理mysql的三種常見日志。

如:General log,binary log,slow log

  • Slow log: mysqlsla ­lt slow slow.log
  • General log: mysqlsla ­lt general general.log
  • Binary log: mysqlbinlog bin.log | mysqlsla ­lt binary ­

mysqlsla安裝

1、獲取源碼

源碼路徑:https://github.com/daniel-nichter/hackmysql.com
源碼存放路徑:/usr/local/src

yum -y install perl-ExtUtils-Embed perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-Time-HiRes perl-DBI perl-DBD-MySQL git

cd /usr/local/src

git clone https://github.com/daniel-nichter/hackmysql.com.git

mkdir -p /opt/monitorMySQL

cp -Rf hackmysql.com /opt

cd /opt/hackmysql.com

cp -Rf . /opt/monitorMySQL

rm -rf hackmysql.com

cd /opt/monitorMySQL/mysqlsla

perl Makefile.PL

make && make install

mysqlsla的基本使用


  • .mysqlsla Config File

~.mysqlsla 這個文件,類似Mysql 里面的配置文件.cnf。 mysqlsla 啟動都會讀取這個全局配置文件。如:

atomic­-statements
statement­-filter=+UPDATE,INSERT 

注意點: 這里的參數,不能加 -- 或者 -

  • 基本命令和使用

這里羅列一下在Mysql工作中最最最常用的命令,使用率在80%

* ­­--log­-type (-­lt) TYPE LOGS 用於指定解析的是什么類型的日志,不過放心,即便你不指定,它默認也會自動去判斷基本的日志,slow,general,binary,msl or udl。 * ­­--db-­inheritance 這個參數還是通過源碼發現的,之前沒認真讀文檔。這個參數十分重要,之前對這個參數用的不多,但是如果你不指定,解析出來的日志中,很有可能對應的SQL語句,找不到database來源。 * ­­--explain (­-ex) 默認是disable的,並且必須report格式為standard。作用就是對每一條uniq的SQL進行explain分析,非常實用。 * --­­grep PATTERN 正則匹配功能。您可以對你的report做任意的正則匹配。比如:我想查關於‘table_lc’,'table_cl'這兩張表的所有分析結果。 普通的方式,是沒有辦法查到的,但是您可以這樣做: mysqlsla --grep '(\btable_lc\b)|(\btable_cl\b)' db10-037.log * --­­meta-­filter (­-mf) CONDTIONS 這是filter中的一種,這里簡單介紹,詳細介紹看filter章節。 這里的meta,指的是meta-property,meta-property后面介紹。典型的就是:c_sum,指的是SQL數量的總和。 基本使用情況: [meta][op][value] 特別要注意這里的op, 沒有別的,就三種, >,<,=. 之前自以為事,>=,死活得不到自己想要的結果。 這里[op]有個特殊用法:t_sum between 10 and 100 , 可以這樣寫: 't_sum>10,t_sum<100' 舉例說明: 我想查看ark_db的所有結果 mysqlsla -mf 'db=ark_db' --top 100 slow_1.log slow_2.log ­­* --statement-­filter (­-sf) CONDTIONS 這是filter中的另一種 別的不說,直接看使用形式:[+-][type],[type] [TYPE] 的值就是 :SELECT,CREATE,DROP,UPDATE,INSERT,etc. 舉例說明:如果我只想查看select,create類型的SQL。 mysqsla -sf '+SELECT,CREATE' slow.log 舉例說明:如果我想查看除了select以外的所有結果。 mysqlsla -sf '-SELECT' 類型的SQL。 * --top N 顯示默認降序的top N, default 為10. * --sort META 根據Meta的值,進行排序。默認slow log的meta 為t_sum,至於t_sum是什么,請看filter章節。 * ­­--report-­format (-­rf) FILE 這里可以自定義報表。但是必須按照固定的格式,以便mysqlsla來解析。 如: (extra command line options) HEADER (header line format) (header line values) REPORT report line format report line values 這個非常有用,尤其是后期可以用腳本來處理自己自定義的報表,非常方便。這也是其強大功能的一個體現。 * ­­--reports (­-R) REPORTS 可以指定以某種格式進行輸出報表。 固定報表形式有:standard,time-­all,print-­unique,print-­all,dump 必須注意的地方:如果你選擇的是time-­all,time­-each­-query,這里會默認是safetySQL statement filter of"+SELECT,USE"。 但是,如果你自定義了-statment-fileter,那么這些dml語句就會在生產環境中真實的執行,會污染線上的數據,非常危險,請特別注意和小心。 * --­­udl­-format (­-uf) FILE 可以自定義log,讓mysqlsla來解析。這個比較復雜,在后面的章節講。 * ­­--replay FILE 可以重新replay file里面的SQL。實用,但是我一般不會用,擔心數據安全。 總結: 基本上,以上的命令,可以解決你50%的需求,而且是非常常用的功能,自己去試試吧。 這里可以簡單舉幾個例子: 1)列出以用戶是usr_rx,含有ac_開頭的,非SELECT類型的 前100000條記錄。 --默認m/P/io 大小寫敏感 mysqlsla --grep '\bac_.*\b' -mf user='usr_rx' -sf '-SELECT' --top 100000 slow.log 2) 列出含有broker_system_messages_bj 或者 broker_system_messages_oth的記錄. --關鍵是需要打上括號。 mysqlsla --grep '(\bbroker_system_messages_bj\b)|(\bbroker_system_messages_oth.*\b)' slow.log 3) 列出ajk_propertys的所有查詢,且按照SQL的rows_exam排序。 mysqlsla --grep '\bajk_propertys\b' -sf '+SELECT' --sort='re_sum' --db-inheritance slow.log

lt:表示日志類型,有slow, general, binary, msl, udl。
sf:[+-][TYPE],[TYPE]有SELECT, CREATE, DROP, UPDATE, INSERT,例如”+SELECT,INSERT”,不出現的默認是-,即不包括。
db:要處理哪個庫的日志。
top:表示取按規則排序的前多少條。
sort:按某種規則排序,t_sum:按總時間排序;c_sum:按總次數排序;c_sum_p: sql語句執行次數占總執行次數的百分比。

#執行時間最長的20條sql語句(默認按時長)
[root@localhost mysqllog]# mysqlsla -lt slow --sort t_sum --top 20 slow.log


#統計慢查詢文件中所有select的慢查詢sql,並顯示執行時間最長的20條sql語句
[root@localhost mysqllog]# mysqlsla -lt slow -sf "+select" -top 20 slow.log


#統計慢查詢文件中的數據庫為test的所有select和update的慢查詢sql,並查詢次數最多的20條sql語句
[root@localhost mysqllog]# mysqlsla -lt slow -sf "+select,update" -top 20 -sort c_sum -db test slow.log

mysqlsla -lt slow -sf "+select,insert,update,delete" -top 10 -sort t_sum -db tps138_com slow.log

#mysqlsla輸出格式說明:
queries total: 總查詢次數,unique: 去重后的sql數量
Sorted by: 輸出報表的內容排序
Count : sql的執行次數及占總的slow log數量的百分比
Time : 執行時間, 包括總時間, 平均時間, 最小, 最大時間, 時間占到總慢sql時間的百分比
95% of Time : 去除最快和最慢的sql, 覆蓋率占95%的sql的執行時間
Lock Time : 等待鎖的時間
95% of Lock : 95%的慢sql等待鎖時間
Rows sent : 結果行統計數量, 包括平均, 最小, 最大數量
Rows examined : 掃描的行數量
Database : 屬於哪個數據庫
Users : 哪個用戶,IP,占到所有用戶執行的sql百分比
Query abstract: 抽象后的sql語句
Query sample : sql樣例語句



mysqlsla的核心功能之filter


filter 分為兩種:

* meta-property filter * statment filter 

statment , 上面已經詳細介紹過,這里詳細介紹meta-property filter。
meta[value] , 這里詳細介紹什么是meta,meta有哪些值。
由於種類實在是太多,所以這里也只會列出工作中,最最最常用的meta參數,基本可以解決99%的需求。

log類型 meta 解釋 限制
all c_sum SQL次數總和
all db db名稱 只能用作meta-filter,不能用作sort
all exec 真實執行時間 只能用做sort,不能filter
all exec_sum c_sum*exec 只能作用sort,不能filter
slow host 主機名 只能用作meta-filter,不能用作sort
slow ip ip地址 只能用作meta-filter,不能用作sort
slow l_avg 鎖的平均等待時間
slow re_sum rows_examined的總和
slow re_avg rows_examined的平均值
slow rs_sum rows_sent的總和
slow rs_avg rows_sent的平均值
slow t_sum SQL執行時間的總和
slow t_avg SQL執行時間的平均值
slow user 用戶名
general cid 連接id
general host 主機名
general user 用戶名
binary ext 執行時間
udl

詳細過濾的過程,請參考 MySQL::Log::ParseFilter 模塊。
上列出的meta-property name,不僅僅用於filter,更加可以用於sort,所以sort我就不重復,使用規則請參考filter。

mysqlsla的核心功能之report


基本格式為:standard,但是你可以自己覆蓋掉standard格式輸出。這里的report format,為了兼容所有人,這里都是用sprintf 進行輸出,而不是用perl 自己的格式,所以通用性非常的強。

比如用--report-­format (-rf)FILE 可以替換。

然后基本模板如下:

 (extra command line options) HEADER (header line format) (header line values) REPORT report line format report line values

一個自定義的slow標准模板

-nthp HEADER Report for %s logs: %s lt:op logs %s queries total, %s unique total_queries:short total_unique_queries:short Sorted by '%s' sort:op Grand Totals: Time %s s, Lock %s s, Rows sent %s, Rows Examined %s gt_t:short gt_l:short gt_rs:short gt_re:short REPORT ______________________________________________________________________ %03d ___ sort_rank Count : %s (%.2f%%) c_sum:short c_sum_p Time : %s total, %s avg, %s to %s max (%.2f%%) t_sum:micro t_avg:micro t_min:micro t_max:micro t_sum_p ? %3s%% of Time : %s total, %s avg, %s to %s max nthp:op t_sum_nthp:micro t_avg_nthp:micro t_min_nthp:micro t_max_nthp:micro ? Distribution : %s t_dist Lock Time (s) : %s total, %s avg, %s to %s max (%.2f%%) l_sum:micro l_avg:micro l_min:micro l_max:micro l_sum_p ? %3s%% of Lock : %s total, %s avg, %s to %s max nthp:op l_sum_nthp:micro l_avg_nthp:micro l_min_nthp:micro l_max_nthp:micro Rows sent : %s avg, %s to %s max (%.2f%%) rs_avg:short rs_min:short rs_max:short rs_sum_p Rows examined : %s avg, %s to %s max (%.2f%%) re_avg:short re_min:short re_max:short re_sum_p Database : %s db Users : %s users ?Table:#rows : %s tcount ?Table schemas : %s tschema ?EXPLAIN : %s explain Query abstract: _ %s query:cap Query sample: _ %s sample 

一個自定義的general log標准模板

HEADER Report for %s logs: %s lt:op logs %s queries total, %s unique total_queries:short total_unique_queries:short Sorted by '%s' sort:op REPORT ______________________________________________________________________ %03d ___ sort_rank Count : %s (%.2f%%) c_sum:short c_sum_p Connection ID : %d cid Database : %s db Users : %s users ?Table:#rows : %s tcount ?Table schemas : %s tschema ?EXPLAIN : %s explain Query abstract: _ %s query:cap Query sample: _ %s sample 

一個自定義的binary log標准模板

HEADER Report for %s logs: %s lt:op logs %s queries total, %s unique total_queries:short total_unique_queries:short Sorted by '%s' sort:op REPORT ______________________________________________________________________ %03d ___ sort_rank Count : %s (%.2f%%) c_sum:short c_sum_p Connection ID : %d cid Server ID : %d sid Error code : %d err Execution Time (s): %d total, %d avg, %d to %d max ext_sum ext_avg ext_min ext_max ? %3s%% of Ex Time: %d total, %d avg, %d to %d max nthp:op ext_sum_nthp ext_avg_nthp ext_min_nthp ext_max_nthp Database : %s db Users : %s users Query abstract: _ %s query:cap Query sample: _ %s sample 

一個自定義的msl log標准模板

HEADER Report for %s logs: %s lt:op logs %s queries total, %s unique total_queries:short total_unique_queries:short Sorted by '%s' sort:op Grand Totals: Time %.3f s, Lock %.3f s, Rows sent %s, Rows Examined %s gt_t gt_l gt_rs:short gt_re:short REPORT ______________________________________________________________________ %03d ___ sort_rank Count : %s (%.2f%%) c_sum:short c_sum_p Time : %s total, %s avg, %s to %s max (%.2f%%) t_sum:micro t_avg:micro t_min:micro t_max:micro t_sum_p ? %3s%% of Time : %s total, %s avg, %s to %s max nthp:op t_sum_nthp:micro t_avg_nthp:micro t_min_nthp:micro t_max_nthp:micro Lock Time : %s total, %s avg, %s to %s max (%.2f%%) l_sum:micro l_avg:micro l_min:micro l_max:micro l_sum_p ? %3s%% of Lock : %s total, %s avg, %s to %s max nthp:op l_sum_nthp:micro l_avg_nthp:micro l_min_nthp:micro l_max_nthp:micro Rows sent : %s avg, %s to %s max (%.2f%%) rs_avg:short rs_min:short rs_max:short rs_sum_p Rows examined : %s avg, %s to %s max (%.2f%%) re_avg:short re_min:short re_max:short re_sum_p Database : %s db Users : %s users ?Table:#rows : %s tcount ?Table schemas : %s tschema ?EXPLAIN : %s explain ?QC hit : %d%% (%d) qchit_t_p qchit_t ?Full scan : %d%% (%d) fullscan_t_p fullscan_t ?Full join : %d%% (%d) fulljoin_t_p fulljoin_t ?Tmp table : %d%% (%d) tmptable_t_p tmptable_t ?Disk tmp table: %d%% (%d) disktmptable_t_p disktmptable_t ?Filesort : %d%% (%d) filesort_t_p filesort_t ?Disk filesort : %d%% (%d) diskfilesort_t_p diskfilesort_t ?Merge passes : %s total, %s avg, %s to %s max merge_sum:short merge_avg:short merge_min:short merge_max:short ?IO r ops : %s total, %s avg, %s to %s max (%.2f%%) iorops_sum:short iorops_avg:short iorops_min:short iorops_max:short iorops_sum_p ?IO r bytes : %s total, %s avg, %s to %s max (%.2f%%) iorbytes_sum:short iorbytes_avg:short iorbytes_min:short iorbytes_max:short iorbytes_sum_p ?IO r wait : %s total, %s avg, %s to %s max (%.2f%%) iorwait_sum:micro iorwait_avg:micro iorwait_min:micro iorwait_max:micro iorwait_sum_p ?Rec lock wait : %s total, %s avg, %s to %s max (%.2f%%) reclwait_sum:micro reclwait_avg:micro reclwait_min:micro reclwait_max:micro reclwait_sum_p ?Queue wait : %s total, %s avg, %s to %s max (%.2f%%) qwait_sum:micro qwait_avg:micro qwait_min:micro qwait_max:micro qwait_sum_p ?Pages distinct: %s total, %s avg, %s to %s max (%.2f%%) pages_sum:short pages_avg:short pages_min:short pages_max:short pages_sum_p Query abstract: _ %s query:cap Query sample: _ %s sample 

一個自定義的udl log標准模板

HEADER Report for %s logs: %s lt:op logs %s queries total, %s unique total_queries:short total_unique_queries:short Sorted by '%s' sort:op REPORT ______________________________________________________________________ %03d ___ sort_rank Count : %s (%.2f%%) c_sum:short c_sum_p Database : %s db ?Table:#rows : %s tcount ?Table schemas : %s tschema ?EXPLAIN : %s explain Query abstract: _ %s query:cap Query sample: _ %s sample

這也就是平時看到的默認格式。個人覺得這個功能非常好用,當然標准格式就已經滿足90%的需求,當然對於比較特殊的需求,可以做特殊的格式化輸出。
非常強大,誰用誰知道。

mysqlsla的其他高級功能: replay,user-defined-logs


這些高級功能,我用的比較少,所以這里不多介紹。如果大家實在想用,可以參考官方文檔。

最后


這里,基本上已經將mysqlsla的使用都介紹了一遍,如果你還沒有使用,那就趕緊使用吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM