天天看点

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 无法精准过滤

新功能的添加