概要
Performance Schema は MySQL 5.5 以降で導入されたパフォーマンス監視・診断機能です。
MySQLサーバーが自動的に作成・管理するシステムデータベースで、リアルタイムでサーバーの内部動作を監視できるメタデータロックの確認が可能です。
メタデータロックの確認方法
メタデータロックテーブルの取得は以下のクエリで実行できます:
SELECT * FROM performance_schema.metadata_locks;
テーブルの各カラムについて
基本情報カラム
1. OBJECT_TYPE
メタデータロックの対象となるオブジェクトの種類
値 | 説明 |
---|---|
TABLE |
テーブル |
SCHEMA |
データベーススキーマ |
GLOBAL |
グローバルロック |
TABLESPACE |
テーブルスペース |
USER LEVEL LOCK |
ユーザー定義ロック |
2. OBJECT_SCHEMA
ロック対象のオブジェクトが属するデータベース名
- 値の例:
minne_production
,information_schema
など - NULL: グローバルロックの場合
3. OBJECT_NAME
ロック対象の具体的なオブジェクト名
- 値の例:
campaigns
,users
,campaign_restrictions
など(テーブル名) - NULL: スキーマレベルのロックの場合
4. COLUMN_NAME
ロック対象のカラム名(カラムレベルロックの場合)
- 通常:
NULL
(テーブルレベルロックが一般的)
5. OBJECT_INSTANCE_BEGIN
オブジェクトのメモリアドレス(内部識別用)
- 用途: 同一名の異なるオブジェクトインスタンスを区別
- 通常: 数値のメモリアドレス
⭐️ 重要な監視項目
6. LOCK_TYPE(ロックの種類)
メタデータロックの種類
ロックタイプ | 説明 | 危険度 |
---|---|---|
SHARED_READ |
読み取り用共有ロック | 低 |
SHARED_WRITE |
書き込み用共有ロック | 中 |
SHARED_UPGRADE |
アップグレード用共有ロック | 中 |
EXCLUSIVE |
排他ロック(最も強い) | 高 |
INTENTION_EXCLUSIVE |
排他意図ロック | 高 |
7. LOCK_DURATION(ロック保持期間)
ロックの保持期間
期間 | 説明 | 影響度 |
---|---|---|
STATEMENT |
ステートメント実行中のみ | 低 |
TRANSACTION |
トランザクション終了まで | 中〜高 |
EXPLICIT |
明示的に解放されるまで | 非常に高 |
8. LOCK_STATUS(ロック状態)
ロックの現在の状態
ステータス | 説明 | 対応の緊急度 |
---|---|---|
GRANTED |
ロック取得済み | 通常 |
PENDING |
ロック待機中 | 🚨 要注意 |
VICTIM |
デッドロック検出でキャンセル対象 | 🚨 緊急 |
その他の診断情報
9. SOURCE
ロックを要求したソースコードの場所
- 値の例:
sql_parse.cc:6031
など - 用途: デバッグ・トラブルシューティング
10. OWNER_THREAD_ID
ロックを保持しているスレッドのID
- 用途:
performance_schema.threads
テーブルと結合してプロセス情報を取得
11. OWNER_EVENT_ID
ロックを取得したイベントのID
- 用途: パフォーマンススキーマでの詳細な分析
実践的な監視クエリ例
ロック待機の検出
SELECT
OBJECT_SCHEMA,
OBJECT_NAME,
LOCK_TYPE,
LOCK_DURATION,
LOCK_STATUS,
OWNER_THREAD_ID
FROM performance_schema.metadata_locks
WHERE LOCK_STATUS = 'PENDING';
長時間保持されているロック
SELECT
ml.*,
t.THREAD_ID,
t.PROCESSLIST_ID,
t.PROCESSLIST_USER,
t.PROCESSLIST_HOST
FROM performance_schema.metadata_locks ml
JOIN performance_schema.threads t ON ml.OWNER_THREAD_ID = t.THREAD_ID
WHERE LOCK_DURATION = 'TRANSACTION'
AND LOCK_STATUS = 'GRANTED';
まとめ
Performance Schema の metadata_locks
テーブルを活用することで:
- リアルタイムでのロック状況監視
- パフォーマンスボトルネックの早期発見
- デッドロック問題の原因特定
- データベース運用の最適化
が可能になります。
特に LOCK_STATUS = 'PENDING'
の状態を定期的に監視することで、深刻なパフォーマンス問題を未然に防ぐことができます。
大規模なWEBアプリケーションにおけるマイグレーション実行時などは考慮する必要がありますので、頭の片隅に置いておくと良いでしょう。