Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


5.4.1.10 ロックプローブ

ロックプローブは、テーブルのエンジンタイプによって定義されるテーブル上の対応するロックメカニズムを使用する、テーブルについての外部ロックが MySQL によってリクエストされるたびに呼び出されます。ロックには、読み取りロック、書き込みロック、およびロック解除操作という 3 つの異なるタイプがあります。プローブを使用することで、外部ロックルーチンの期間 (つまり、別のロックが解放されるのを待機する時間も含む、ストレージエンジンがロックを実装するために要する時間) およびロックとロック解除プロセスの合計期間を調査することができます。

handler-rdlock-start(database, table)
handler-rdlock-done(status)

handler-wrlock-start(database, table)
handler-wrlock-done(status)

handler-unlock-start(database, table)
handler-unlock-done(status)
  • handler-rdlock-start: 指定された database および table に読み取りロックがリクエストされたときにトリガーされます。

  • handler-wrlock-start: 指定された database および table に書き込みロックがリクエストされたときにトリガーされます。

  • handler-unlock-start: 指定された database および table にロック解除リクエストが実行されたときにトリガーされます。

  • handler-rdlock-done: 読み取りロックリクエストが完了したときにトリガーされます。status は、ロック操作が正常な場合は 0 で、失敗した場合は >0 です。

  • handler-wrlock-done: 書き込みロックリクエストが完了したときにトリガーされます。status は、ロック操作が正常な場合は 0 で、失敗した場合は >0 です。

  • handler-unlock-done: ロック解除リクエストが完了したときにトリガーされます。status は、ロック解除操作に成功した場合は 0 で、失敗した場合は >0 です。

次のスクリプトを使用して、個々のテーブルのロックおよびロック解除をモニターするための配列を使用し、テーブルロック全体の期間を計算することができます。

#!/usr/sbin/dtrace -s

#pragma D option quiet

mysql*:::handler-rdlock-start
{
   self->rdlockstart = timestamp;
   this->lockref = strjoin(copyinstr(arg0),strjoin("@",copyinstr(arg1)));
   self->lockmap[this->lockref] = self->rdlockstart;
   printf("Start: Lock->Read   %s.%s\n",copyinstr(arg0),copyinstr(arg1));
}

mysql*:::handler-wrlock-start
{
   self->wrlockstart = timestamp;
   this->lockref = strjoin(copyinstr(arg0),strjoin("@",copyinstr(arg1)));
   self->lockmap[this->lockref] = self->rdlockstart;
   printf("Start: Lock->Write  %s.%s\n",copyinstr(arg0),copyinstr(arg1));
}

mysql*:::handler-unlock-start
{
   self->unlockstart = timestamp;
   this->lockref = strjoin(copyinstr(arg0),strjoin("@",copyinstr(arg1)));
   printf("Start: Lock->Unlock %s.%s (%d ms lock duration)\n",
          copyinstr(arg0),copyinstr(arg1),
          (timestamp - self->lockmap[this->lockref])/1000000);
}

mysql*:::handler-rdlock-done
{
   printf("End:   Lock->Read   %d ms\n",
          (timestamp - self->rdlockstart)/1000000);
}

mysql*:::handler-wrlock-done
{
   printf("End:   Lock->Write  %d ms\n",
          (timestamp - self->wrlockstart)/1000000);
}

mysql*:::handler-unlock-done
{
   printf("End:   Lock->Unlock %d ms\n",
          (timestamp - self->unlockstart)/1000000);
}

これを実行すると、ロック処理自体の期間と、特定のテーブルのロックの期間の両方に関する情報が得られるはずです。

Start: Lock->Read   test.t2
End:   Lock->Read   0 ms
Start: Lock->Unlock test.t2 (25743 ms lock duration)
End:   Lock->Unlock 0 ms
Start: Lock->Read   test.t2
End:   Lock->Read   0 ms
Start: Lock->Unlock test.t2 (1 ms lock duration)
End:   Lock->Unlock 0 ms
Start: Lock->Read   test.t2
End:   Lock->Read   0 ms
Start: Lock->Unlock test.t2 (1 ms lock duration)
End:   Lock->Unlock 0 ms
Start: Lock->Read   test.t2
End:   Lock->Read   0 ms