*row-{start,done}
プローブは、行操作がストレージエンジンにプッシュダウンされるたびトリガーされます。たとえば、100 行のデータについて INSERT
ステートメントを実行するとき、それぞれの行挿入に対して insert-row-start
および insert-row-done
プローブがどちらも 100 回トリガーされます。
insert-row-start(database, table)
insert-row-done(status)
update-row-start(database, table)
update-row-done(status)
delete-row-start(database, table)
delete-row-done(status)
insert-row-start
: 行がテーブルに挿入される前にトリガーされます。insert-row-done
: 行がテーブルに挿入されたあとにトリガーされます。update-row-start
: 行がテーブル内で更新される前にトリガーされます。update-row-done
: 行がテーブル内で更新される前にトリガーされます。delete-row-start
: 行がテーブルから削除される前にトリガーされます。delete-row-done
: 行がテーブルから削除される前にトリガーされます。
プローブによってサポートされる引数は、それぞれの場合で対応する start
および done
プローブと一貫性があります。
database
: データベース名。table
: テーブル名。status
: ステータスで、正常なら 0、失敗なら 1。
行レベルのプローブは個々の行アクセスごとにトリガーされるため、これらのプローブは毎秒数千回トリガーされる可能性があり、モニタリングスクリプトおよび MySQL の両方に有害な影響を及ぼす場合があります。DTrace 環境ではパフォーマンスへの悪影響を防ぐために、これらのプローブのトリガーを制限するようにしてください。プローブの使用を控えるようにするか、これらのプローブをレポートするためのカウンタ関数または集計関数を使用し、スクリプトが終了したときか、query-done
または query-exec-done
プローブの一部としてサマリーを提供するようにしてください。
次のスクリプト例は、大規模なクエリー内でのそれぞれの行操作の期間を要約します。
#!/usr/sbin/dtrace -s
#pragma D option quiet
dtrace:::BEGIN
{
printf("%-2s %-10s %-10s %9s %9s %-s \n",
"St", "Who", "DB", "ConnID", "Dur ms", "Query");
}
mysql*:::query-start
{
self->query = copyinstr(arg0);
self->who = strjoin(copyinstr(arg3),strjoin("@",copyinstr(arg4)));
self->db = copyinstr(arg2);
self->connid = arg1;
self->querystart = timestamp;
self->rowdur = 0;
}
mysql*:::query-done
{
this->elapsed = (timestamp - self->querystart) /1000000;
printf("%2d %-10s %-10s %9d %9d %s\n",
arg0, self->who, self->db,
self->connid, this->elapsed, self->query);
}
mysql*:::query-done
/ self->rowdur /
{
printf("%34s %9d %s\n", "", (self->rowdur/1000000), "-> Row ops");
}
mysql*:::insert-row-start
{
self->rowstart = timestamp;
}
mysql*:::delete-row-start
{
self->rowstart = timestamp;
}
mysql*:::update-row-start
{
self->rowstart = timestamp;
}
mysql*:::insert-row-done
{
self->rowdur += (timestamp-self->rowstart);
}
mysql*:::delete-row-done
{
self->rowdur += (timestamp-self->rowstart);
}
mysql*:::update-row-done
{
self->rowdur += (timestamp-self->rowstart);
}
データをテーブルに挿入するクエリーと一緒に前述のスクリプトを実行すると、生の行挿入を実行するのに費やした正確な時間をモニターすることができます。
St Who DB ConnID Dur ms Query
0 @localhost test 13 20767 insert into t1(select * from t2)
4827 -> Row ops