Git Product home page Git Product logo

sqlreplayer's Introduction

简体中文|English

sqlreplayer是什么

sqlreplayer能从mysql的general log,slow log以及csv文件获取raw sql,并在多个支持mysql协议的数据库上回放,得到sql执行的统计分析报告。

analyze部分支持 mysql 5.6,5.7,8.0下的general log,slow log

为什么需要sqlreplayer

这个工具使用的初衷是需要比较业务sql在多个数据库下的性能差异,并生成简单比对结果。 主要涉及到两个部分,一个是sql采集,工具支持从mysql的全量日志、慢日志、csv文件进行raw sql的采集,汇总。另一个sql回放,sql回放支持在多个数据源对raw sql进行回放,并得到比对结果。

安装

sqlreplayer目录下: go build

三种模式

analyze:采集日志的raw sql,也可以对这部分raw sql按照sqlid进行聚合,给出建议统计报告
replay:将指定的raw sql在多个数据源上回放,给出在多个数据源执行结果比对
both:analyze和replay的结合

analyze

analyze部分能够从mysql的全量日志,慢日志以及csv文件中获取raw sql,并以csv格式的文件输出

./sqlreplayer -exec analyze -f test_general_1.log -logtype genlog
[analyze]2023/12/28 17:20:50 begin to read genlog test_general_1.log
[analyze]2023/12/28 17:20:50 finish reading genlog test_general_1.log
[analyze]2023/12/28 17:20:50 raw sql save to 20231228_172050_rawsql.csv

抓取原始sql的时候,可以增加一些条件来筛选sql,如下面的命令能够抓取10点到10点半之间的慢查询

./sqlreplayer -exec analyze -f slow_8.0.log -logtype slowlog -begin "2024-01-01 10:00:00" -end "2024-01-01 10:30:00"

分析原始sql的时候,指定-generate-report,对sql分布按照sqlid进行简单统计

./sqlreplayer -exec analyze -f slow.log -logtype slowlog -generate-report
[analyze]2024/01/15 11:03:26 begin to read slowlog slow.log
[analyze]2024/01/15 11:03:26 finish reading slowlog slow.log
[analyze]2024/01/15 11:03:26 raw sql save to 20240115_110326_rawsql.csv
[analyze]2024/01/15 11:03:26 raw sql save to 20240115_110326_analyze_report.csv

20240115_110326_rawsql.csv保存了日志当中原始sql,执行时间,消耗时间。20240115_110326_analyze_report.csv则是对sql按照指纹化之后进行简要的统计和分析结果。下面是20240115_110326_analyze_report.csv内容截图。

analyze统计结果

上图A列为sqlid,是对sql模板化之后标识,B列是模板化后的sql,D列是这类型SQL最小执行秒数,E列是最小执行秒数对应的带有具体参数的原始SQL(需要打开-save-raw-sql参数,但是会占用较大内存,与日志执行SQL总量有关)。F-O列,p25,p50,p75,p99代表的是该类SQL在对应分位值的耗时。以红框内这行记录为例,04BDF42927323356这条sql执行次数为335次,其中99%的耗时均小于2ms。

replay

replay对raw sql进行的回放,比如下面命令行讲raw sql在ip1:port1和ip2:port2两个数据源上进行回放,以此来比较性能差异

./sqlreplayer -exec replay -f test.csv -conn 'user1:passwd1:ip1:port1:db1,user2:passwd2:ip2:port2:db2'
[init]2023/12/28 16:57:02 conn 0 [user1:passwd1:ip1:port1:db1]
[init]2023/12/28 16:57:02 conn 1 [user2:passwd2:ip2:port2:db2]
[replay]2023/12/28 16:57:08 reach the end of log file.
[replay]2023/12/28 16:57:14 sql replay finish ,num of raw sql 3,time elasped 12.573019s
[replay]2023/12/28 16:57:14 save replay result to 20231228_173023_replay_stats.csv

下面是test.csv文件的内容。这个文件内容可以通过analyze阶段进行生成,也可以通过手动来维护需要进行回放的sql

"select 1,sleep(1)"
"select 2,sleep(2)"
"select 3,sleep(3)"
"select 1"
"select 2"
"select 3"

回放结果如下面表格所示。raw sql会按照sqlID进行聚合,并展示在多个数据源下的一些基本性能指标。用于比较sql在不同数据源下的性能差异。

sqlid sqltype conn_0_min(ms) conn_0_min-sql conn_0_p99(ms) conn_0_p99-sql conn_0_max(ms) conn_0_max-sql conn_0_avg(ms) conn_0_execution conn_1_min(ms) conn_1_min-sql conn_1_p99(ms) conn_1_p99-sql conn_1_max(ms) conn_1_max-sql conn_1_avg(ms) conn_1_execution
16219655761820A2 44 select 1 44 select 2 45 select 3 44.33 3 44 select 2 44 select 3 45 select 1 44.33 3
EE3DCDA8BEC5E966 1189 select 1,sleep(1) 2046 select 2,sleep(2) 3047 select 3,sleep(3) 2094.00 3 1186 select 1,sleep(1) 2046 select 2,sleep(2) 3048 select 3,sleep(3) 2093.33 3

回放显示结果和分析阶段生成的analyze_report相似。第一行为SQLID为16219655761820A2在各个数据源上的执行结果。 conn_0_execution表示该类型的SQL在conn0上执行了3次,conn_0_p99(ms)表示在conn0上99%的执行结果时间是小于等于44ms的,99分位值对应的sql为select 1。可以直观比较sql在各个数据源上的执行结果。

replay相关的其他参数

-m: 回放倍数,每个raw sql执行次数,默认是1
-threads: 回放并发数,默认是1
-select-only: 是否只回访select语句,默认是false -charset: 默认为utf8mb4

both

both模式是analyze和replay阶段结合,从日志采集到raw sql之后直接在配置的数据源下进行回放。

参数说明

执行类型 -exec string
exec type [analyze|replay|both]
analyze:generate raw sql from log file.
replay:replay raw sql in connections.

analyze

分析日志时候加入时间条件
-begin string
filter sql according to specified begin time from log,format 2023-01-01 13:01:01 (default "0000-01-01 00:00:00")
-end string
filter sql according to specified end time from log,format 2023-01-01 13:01:01 (default "9999-12-31 23:59:59")

分析日志路径
-f string
filename

日志格式
-logtype string
log type [genlog|slowlog|csv]

生成raw sql的报告,按照sqlid进行汇总,主要是针对slowlog带有运行时间的日志格式,其他格式只能进行汇总,统计次数
-generate-report
generate report for analyze phrase

生成报告是否保存raw sql信息,可以输出各个分位值的raw sql,对于raw sql数据量很大,打开这个选项会导致内存占用过多
-save-raw-sql
save raw sql in report

replay

连接charset
-charset string
charset of connection (default "utf8mb4")

数据库连接
-conn string
mysql connection string,support multiple connections seperated by ',' which can be used for comparation,format user1:passwd1:ip1:port1:db1[,user2:passwd2:ip2:port2:db2]

回放文件
-f string
filename

回放倍数
-m int
number of times a raw sql to be executed while replaying (default 1)

只回访查询语句
-select-only
replay select statement only

并发数
-threads int
thread num while replaying (default 1)

replay报告是否保存raw sql信息,可以输出各个分位值的raw sql,对于raw sql数据量很大,打开这个选项会导致内存占用过多 -save-raw-sql
save raw sql in report

按照sqlid绘制raw sql响应时间散点图
-draw-pic
draw elasped picture for each sqlid

散点图实例

回放阶段不统计信息 -dry-run
replay raw sql without collecting any extra info

sqlreplayer's People

Contributors

luijianfie avatar

Stargazers

lmy avatar  avatar Jian Huang avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.