web-dev-qa-db-ja.com

ログファイルからのMySQL SELECTクエリの再生(再実行)

MySQLベンチマーク

ログファイルから実際のクエリを再実行して、別のMySQLインスタンスのパフォーマンスを評価したいと思います。ランダムで自動生成されたクエリを生成するmysqlslapなどのツールを知っていますが、実際のクエリでシステムをテストしたいと思います。

新しいシステムのベンチマークを行うために、遅いログまたは一般的なログを使用してすべてのクエリを収集し、新しいシステムでクエリを再生するのが理想的です。

クエリをフィルタリングすることが可能である必要があります。たとえば、SELECTステートメントのみを再生したいとします。ウォームアップまたはベンチマーク機能を実現するためのアクティブに維持されている手順またはベストプラクティスが存在するかどうか疑問に思っています。

必要条件

  • 実行中のMySQLインスタンスから収集された実際のクエリを再生(再実行)
  • ステートメントタイプ(INSERT、UPDATE、DELETE)とDMLでステートメントをフィルターする
  • 統計情報を取得する(移行の前後でクエリが実行された時間など)

問題:ツールが古い

Perconaは、その目的のために設計されたように見えるいくつかのツールを提供しました。それらはすべて、現在のPercona Toolkitから削除されました。これらのツールは次のとおりです。

  • pt-log-player
  • 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

パーコナ再生も試しましたが、あまり積極的にメンテナンスされていないようです。これは素晴らしいツールですが、ほとんど文書化されておらず、他のDMLステートメントを実行したくないので、SELECTステートメントのみをフィルタリングする方法を見つけることができませんでした。 Percona Serverが読み取り専用オプションを有効にするためのフラグを提供しているのを見ただけですが、これはVanilla MySQLまたはAWS RDSでは使用できません。

ただし、保守されていないツールに依存しない手順を使用したいと思います。

想像上のワークフロー

  1. スロークエリログまたは一般ログを有効にする
  2. ログファイルの解析と分析
  3. 関連クエリをフィルタリングする
  4. クエリを再実行する
  5. 結果を比較する

これを達成するためのツールはありますか?遅いクエリログをフィルタリングする最良の方法は何ですか?クエリを正しく再生するにはどうすればよいですか?

4
Stefan

私は自分の問題の解決策を見つけました。これは、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).

これが同様の問題を抱えている人に役立つことを願っています。

Percona Playbackのインストール

現在のバージョンには、ライブラリパスを変更する必要があるバグがあります。

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

ここに背景のあるリンクがあります

3
Stefan