目的: 通过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 无法精准过滤
新功能的添加