天天看點

mysqlsla 源碼解析

目的: 通過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

設定保留字

mysqlsla 源碼解析

先設定各種變量,判斷作業系統,讀取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 無法精準過濾

新功能的添加