目的: 通過mysqlsla的源碼分析,能夠更加深入了解其内部實作機制
mysqlsla 主要分為三個大的packages,我們先大緻了解一下package 都包含什麼,都做什麼
分析 main 函數,一步步了解主要流程
針對一條線進行分析,比如slow log 的解析
(mysql::log::)parsefilter
函數名
功能簡介
get_meta_filter
擷取meta fileter
get_statement_filter
擷取statement fileter
set_save_meta_values
設定meta
set_save_all_values
設定所有
set_in_abstraction
設定是否in_abstraction
set_values_abstraction
設定是否values_abstraction
set_atomic_statements
沒用過
set_db_inheritance
db 繼承
set_grep
設定是否grep
set_meta_filter
-mf,設定過濾meta
set_statement_filter
-sf,設定過濾sql
set_udl_format
設定自定義格式
parse_binary_logs
解析binary日志
parse_general_logs
解析general日志
parse_slow_logs
解析slow 日志
parse_udl_logs
解析udl 日志
check_stmt
檢查stamt合法性,規範化stmt
abstract_stmt
抽象stmt
compact_in
對in 做特殊處理
compact_values
對values 做特殊處理
passes_statement_filter
判斷是否sf
passes_meta_filter
判斷是否mf
calc_final_values
計算最終的value
apply_final_meta_filters
應用最後的mf
set_debug
是否debug
_d
debug日志
_p
百分比
reportformats
get_report_format
擷取log type
report_formats{slow}
slow 報表
report_formats{general}
general 報表
report_formats{binary}
binary 報表
report_formats{msl}
msl 報表
report_formats{udl}
udl 報表
logtype
new
new 對象
get_log_type
得到日志類型
lines_match_log_type
得到日志類型2
name_for
得到日志類型3
debug
queryrewriter
strip_comments
沒用到
fingerprint
sql指紋,沒用到
convert_to_select
轉換select
convert_select_list
轉換select list
__delete_to_select
dml -> select
__insert_to_select
__update_to_select
wrap_in_derived
main
help_and_exit
檢視幫助
read_mycnf
讀取mysql 配置檔案
read_dot_mysqlsla
讀取mysqlsla 配置檔案
connect_to_mysql
連接配接mysql
parse_logs
解析日志
refilter_replay
replay 功能
calc_nthp
統計nthp
calc_dist
統計百分比
explain_queries
explain 功能
get_create_table
得到create table
get_row_count
得到rc
parse_table_aliases
解析表别名
get_table_ref
得到表的reference
time_each_query
-report-file 的一種
time_profile
calc_rows_read
統計有多少行被讀取過
sort_and_prune
排序和統計
make_reports
制作報表的入口函數
standard_report
标準report
dump_report
dump report
time_all_report
time_all report
print_all_report
print——unique 的變相report
print_unique_report
print-uniq 的report
resolve_coded_value
轉換code value
parse_report_format
解析報表format
save_replay
保持replay結果
beautify
美化
stmt_users_summary
統計users特殊變量,主要用于标準格式報表
explain_summary
expplian的統計
schema_summary
結構的統計
avg
平均值
p
format_u_time
格式化u time
make_short
簡單模式
d
get_options
擷取指令行參數
set_mysql_reserved_words
設定保留字

先設定各種變量,判斷作業系統,讀取mysql 配置檔案
讀取mysqlsla 自己的内部初始化檔案 ./mysqlsla
接下來就是将指令行的參數讀取進來,并且覆寫掉~/.mysqlsla中的參數
然後,參數讀取到之後,就開始解析參數。 當然,第一個肯定就是判斷日志類型了。
接下來開始判斷 資料格式
接下來讀取 mycnf 檔案,并且用 指令行參數接收到的value 直接覆寫掉 mycnf變量
設定一些重要的meta 值
當我們調用set_statement_filter前,必須檢查的一個參數 -r,即 --reports
接下來開始日志parsing 階段,調用的是:parse_slow_logs 這個函數。 這裡重點講解slow 是如何解析的
check_stmt: 用于檢測statment合法性,并且合并sql
abstract_stmt: 抽象化sql,我個人感覺這是slow 分析的最最最重要的地方
統計grand 值,用于report
最後作meta 過濾
之後進入 分析階段,主要是統計百分比,應用日志階段
然後進入 report 階段,包括排序,explain,制作報表
sort_and_prune()
最後一步,産生報表
以上,就是slow log分析的全部過程,其他的日志分析和slow 基本上差不多,是以不做多講
select xx from table where id in (n,n,n) 這種類似的語句,沒有辦法歸類,主要會影響slow的排序。
特殊格式的sql 抽象解析有誤
insert into xx values('s'),('s').....('s') 會導緻sql 沒辦法分類
原始sql 語句的注釋會幹擾 slow分析
meta-property filter 無法精準過濾
新功能的添加