web-dev-qa-db-ja.com

MySQLの一般的なログでキャプチャされたクエリを使用してMySQLのストレステストを行う

MySQLの一般的なログによって作成されたログファイルを使用してストレステストを実行できるツールはありますか?グーグルでたくさん検索した後、私はストレステストのためにいくつかのベンチマークのみを使用するストレステストツールをいくつか見つけました。 1つの解決策は、Apache JMeterを使用することですが、MySQLログファイルからテスト計画を作成せず、すべてのクエリに対してカスタムテスト計画を作成するには時間がかかりすぎます。
または、少なくともMySQLログから.sqlファイルを作成できるツールはありますか?

2
Ruchit Rami

これは完全な解決策ではなくトレースにすぎません。「あなたの」解決策はあなたのファンタジー(およびいくつかの作業)に基づいています;)

一般的なクエリログによって生成されたこの種のテストキャプチャおよびクリーニングクエリを実行し、 sysbench 0.5 を使用して自分のluaファイルを書き込んだ後、公式でいくつかのサンプルを見つけることができます- ソースコード 、私のデータベースのミラー上(ハードウェアとスキーマ/データ-スナップショット。データの元のステータスをすぐに復元できるようにするためです。-)。

次に、次のようなコマンドを実行できます。

_./sysbench --mysql-table-engine=myisam --mysql-db=<yourdb> --mysql-user=<user> --mysql-Host=<Host> --mysql-password=<pass> --test=tests/db/<yourlua>.lua --num-threads=8 --max-requests=8 run_

結果を収集してグラフ化し、同時実行性と要求を変更して、データベースとHWステータスを監視します。

私のluaファイルには約80.000のクエリが含まれており、挿入、更新、削除によって構成されています

アップデート#1

あなたが試すことができる良い出発点は、次のようにluaファイルを(単純に)書き始めることです:

_pathtest = string.match(test, "(.*/)") or ""

dofile(pathtest .. "common.lua")

function thread_init(thread_id)
   set_vars()

   if (db_driver == "mysql" and mysql_table_engine == "myisam") then
      -- begin_query = "LOCK TABLES ".. table_name .." WRITE"
      -- commit_query = "UNLOCK TABLES"
      begin_query = "SELECT 1>0"
      commit_query = "SELECT 1>0"
   else
      begin_query = "BEGIN"
      commit_query = "COMMIT"
   end
end

function event(thread_id)
    local table_name
    db_query(begin_query)
    rs = db_query("INSERT INTO .....")
    rs = db_query("INSERT INTO .....")
    rs = db_query("SELECT ... FROM ...")
    rs = db_query("DELETE ...")
    db_query(commit_query)
end
_

クエリをdb_query("")関数に入れて、この種のプロセスの一般的なクエリログをクリーニングするには、少し作業が必要です

上記のような「パーソナル」_luaファイルの簡単な出力は、9つのクエリ、7つの挿入、2つの選択、+ 2 BEGIN/COMMITです。

_sysbench 0.5:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 8
Random number generator seed is 0 and will be ignored


Threads started!

OLTP test statistics:
    queries performed:
        read:                            32
        write:                           56
        other:                           0
        total:                           88
    transactions:                        0      (0.00 per sec.)
    deadlocks:                           0      (0.00 per sec.)
    read/write requests:                 88     (7728.11 per sec.)
    other operations:                    0      (0.00 per sec.)

General statistics:
    total time:                          0.0114s
    total number of events:              8
    total time taken by event execution: 0.0252s
    response time:
         min:                                  2.87ms
         avg:                                  3.15ms
         max:                                  3.65ms
         approx.  95 percentile:               3.65ms

Threads fairness:
    events (avg/stddev):           1.0000/0.00
    execution time (avg/stddev):   0.0032/0.00
_

お役に立てれば

2
Cristian Porta

これは、brute forec mysqlを使用したより直接的なアプローチです。MyISAMテーブルとして一般をセットアップします。インストール時に、テーブルmysql.general_logがCSVテーブルとして見つかります。

ホイールを再発明し、タイピングの多くを行うのではなく、私の過去の投稿を読んでください:

MyISAMにmysql.general_logが変換され、クエリが記録されたら、他のMyISAMテーブルと同様にログにアクセスします。

MyISAMバージョンのmysql.general_logの構造は次のとおりです

mysql> show create table mysql.general_log\G
*************************** 1. row ***************************
       Table: general_log
Create Table: CREATE TABLE `general_log` (
  `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_Host` mediumtext NOT NULL,
  `thread_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `command_type` varchar(64) NOT NULL,
  `argument` mediumtext NOT NULL,
  KEY `event_time` (`event_time`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

ここから、クエリで始まるすべてのコンテンツを記述します。

SQLSTMT="SELECT argument FROM mysql.general_log"
SQLSTMT="${SQLSTMT} WHERE LEFT(argument,6) IN"
SQLSTMT="${SQLSTMT} ('INSERT','UPDATE','DELETE','SELECT')"
mysql -uroot -p -ANe"${SQLSTMT}" > SQLCommands.sql

どうぞ。

試してみる !!!

4
RolandoMySQLDBA