MySQLの一般的なログによって作成されたログファイルを使用してストレステストを実行できるツールはありますか?グーグルでたくさん検索した後、私はストレステストのためにいくつかのベンチマークのみを使用するストレステストツールをいくつか見つけました。 1つの解決策は、Apache JMeterを使用することですが、MySQLログファイルからテスト計画を作成せず、すべてのクエリに対してカスタムテスト計画を作成するには時間がかかりすぎます。
または、少なくともMySQLログから.sqlファイルを作成できるツールはありますか?
これは完全な解決策ではなくトレースにすぎません。「あなたの」解決策はあなたのファンタジー(およびいくつかの作業)に基づいています;)
一般的なクエリログによって生成されたこの種のテストキャプチャおよびクリーニングクエリを実行し、 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のクエリが含まれており、挿入、更新、削除によって構成されています
あなたが試すことができる良い出発点は、次のように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
_
お役に立てれば
これは、brute forec mysqlを使用したより直接的なアプローチです。MyISAMテーブルとして一般をセットアップします。インストール時に、テーブルmysql.general_logがCSVテーブルとして見つかります。
ホイールを再発明し、タイピングの多くを行うのではなく、私の過去の投稿を読んでください:
Nov 16, 2011
: MySQL DB変更クエリとユーザーのログFeb 11, 2012
: MySQL一般ログJan 08, 2012
: MySQL一般ログを有効にする方法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
どうぞ。
試してみる !!!