ログファイルから実際のクエリを再実行して、別のMySQLインスタンスのパフォーマンスを評価したいと思います。ランダムで自動生成されたクエリを生成するmysqlslapなどのツールを知っていますが、実際のクエリでシステムをテストしたいと思います。
新しいシステムのベンチマークを行うために、遅いログまたは一般的なログを使用してすべてのクエリを収集し、新しいシステムでクエリを再生するのが理想的です。
クエリをフィルタリングすることが可能である必要があります。たとえば、SELECTステートメントのみを再生したいとします。ウォームアップまたはベンチマーク機能を実現するためのアクティブに維持されている手順またはベストプラクティスが存在するかどうか疑問に思っています。
Perconaは、その目的のために設計されたように見えるいくつかのツールを提供しました。それらはすべて、現在のPercona Toolkitから削除されました。これらのツールは次のとおりです。
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
パーコナ再生も試しましたが、あまり積極的にメンテナンスされていないようです。これは素晴らしいツールですが、ほとんど文書化されておらず、他のDMLステートメントを実行したくないので、SELECTステートメントのみをフィルタリングする方法を見つけることができませんでした。 Percona Serverが読み取り専用オプションを有効にするためのフラグを提供しているのを見ただけですが、これはVanilla MySQLまたはAWS RDSでは使用できません。
ただし、保守されていないツールに依存しない手順を使用したいと思います。
これを達成するためのツールはありますか?遅いクエリログをフィルタリングする最良の方法は何ですか?クエリを正しく再生するにはどうすればよいですか?
私は自分の問題の解決策を見つけました。これは、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
出力として、必要なクエリのみを含む新しいスローログファイルを取得します。
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
その結果、クエリの実行時間とウォームアップされたデータベースの概要がわかります。
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).
これが同様の問題を抱えている人に役立つことを願っています。
現在のバージョンには、ライブラリパスを変更する必要があるバグがあります。
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/
ファイルを編集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