从日志文件中重放(重新执行)MySQL SELECT 查询

Ste*_*fan 6 mysql performance benchmark logs slow-log

MySQL 基准测试

我想通过从日志文件重新执行真实查询来评估不同 MySQL 实例的性能。我知道像 mysqlslap 这样的工具会产生随机和自动生成的查询,但我更愿意用真实的查询来测试系统。

为了对新系统进行基准测试,我最好使用慢日志或一般日志收集所有查询,然后将查询重播到新系统。

应该可以过滤查询,例如我只想重放 SELECT 语句。我想知道是否存在积极维护的程序或最佳实践来实现预热或基准测试功能。

要求

  • 重放(重新执行)从正在运行的 MySQL 实例中收集的真实查询
  • 按语句类型(INSERT、UPDATE、DELETE)和 DML 过滤语句
  • 获取统计信息(在迁移之前、之后查询运行了多长时间等)

问题:工具已过时

Percona 提供了几种似乎是为此目的而设计的工具。所有这些都已从当前的 Percona 工具包中删除。这些工具是:

  • pt-日志播放器
  • pt-query-digest 的重播选项
  • 查询回放

潜在的解决方案

使用 Debian Wheezy docker 容器可以轻松访问提供 pt-log-player 的旧 Percona Toolkit 版本。运行容器docker run -it --network="host" --name wheezy debian:wheezy /bin/bash并在其中安装旧版本的工作原理:

apt-get update
apt-get install percona-toolkit mysql-client
Run Code Online (Sandbox Code Playgroud)

我也尝试过 percona-playback,但它似乎也没有得到非常积极的维护。这将是一个很棒的工具,但它几乎没有记录,而且我找不到仅过滤 SELECT 语句的方法,因为我不想运行其他 DML 语句。我只看到 Percona Server 提供了一个启用只读选项的标志,但这不适用于 vanilla MySQL 或 AWS RDS。

但是,我更愿意使用不依赖于未维护工具的程序。

想象的工作流程

  1. 启用慢查询日志或一般日志
  2. 解析和分析日志文件
  3. 过滤相关查询
  4. 重新执行查询
  5. 比较结果

有什么工具可以实现这一目标吗?过滤慢查询日志的最佳方法是什么?如何理智地重播查询?

Ste*_*fan 4

我找到了解决我的问题的方法。它是 Percona pt-query-digest 和 Percona 播放的组合。

首先,我按数据库名称过滤慢速日志,并排除所有不以select.

cat mysql-slow.log |  pt-query-digest --filter '(($event->{db}) =~ /my_database/) && $event->{arg} =~ m/^select/i' --output slowlog > my_database_selects.log
Run Code Online (Sandbox Code Playgroud)

作为输出,我得到一个新的慢速日志文件,其中仅包含所需的查询。

percona-playback --mysql-max-retries 1 --mysql-host example.org --mysql-port 3306 --mysql-username warmup --mysql-password S-E-C-R-E-T --ignore-row-result-diffs --query-log-file ~/my_database_selects.log
Run Code Online (Sandbox Code Playgroud)

结果,我得到了查询执行时间和预热数据库的概览。

Detailed Report
----------------
SELECTs  : 41666 queries (33379 faster, 8287 slower)
INSERTs  : 0 queries (0 faster, 0 slower)
UPDATEs  : 0 queries (0 faster, 0 slower)
DELETEs  : 0 queries (0 faster, 0 slower)
REPLACEs : 0 queries (0 faster, 0 slower)
DROPs    : 0 queries (0 faster, 0 slower)


Report
------
Executed 41666 queries
Spent 00:00:45.795945 executing queries versus an expected 00:02:07.966942 time.
33379 queries were quicker than expected, 8287 were slower
A total of 0 queries had errors.
Expected 79870 rows, got 79868 (a difference of 2)
Number of queries where number of rows differed: 0.

Average of 265.39 queries per connection (157 connections).
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助有类似问题的人。

安装 Percona 播放

当前版本中有一个错误,需要更改库路径。

sudo apt-get install libtbb-dev libmysqlclient-dev libboost-program-options-dev libboost-thread-dev libboost-regex-dev libboost-system-dev libboost-chrono-dev pkg-config cmake  libssl-dev
git clone https://github.com/Percona-Lab/query-playback.git
cd query-playback/
Run Code Online (Sandbox Code Playgroud)

编辑文件CMakeLists.txt (在目录 ~/git/query-playback/percona_playback/mysql_client/CMakeLists.txt中)并将 find_library(MYSQL_LIB"mysqlclient_r" PATH_SUFFIXES "mysql")替换为find_library(MYSQL_LIB "mysqlclient" PATH_SUFFIXES "mysql ")(删除 _r 后缀)。

mkdir build_dir
cd build_dir
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
make
sudo make install
Run Code Online (Sandbox Code Playgroud)

这是一个带有一些背景的链接