MySQL の SHOW STATUS でサーバー状態を確認する
MySQL サーバーの状態を把握するために、SHOW STATUS コマンドは欠かせません。数百もの変数がありますが、特に重要なものを厳選して解説します。
SHOW STATUS の基本
-- すべてのステータス変数を表示
SHOW GLOBAL STATUS;
-- 特定の変数だけ表示
SHOW GLOBAL STATUS LIKE 'Threads%';GLOBAL を付けるとサーバー全体、付けないとセッション単位の値が表示されます。サーバーの健全性を見るには GLOBAL を使います。
接続関連
SHOW GLOBAL STATUS LIKE 'Threads_%';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW GLOBAL STATUS LIKE 'Connections';| 変数 | 意味 | 注目ポイント |
|---|---|---|
| Threads_connected | 現在の接続数 | max_connections に近いと危険 |
| Threads_running | 実行中のスレッド数 | 高いとCPU負荷の可能性 |
| Max_used_connections | ピーク接続数 | 上限設計の参考に |
| Connections | 累計接続数 | 異常な増加は調査要 |
Threads_running が常に高い状態は、クエリが詰まっているか、スロークエリが多いことを示唆します。
クエリ関連
SHOW GLOBAL STATUS LIKE 'Questions';
SHOW GLOBAL STATUS LIKE 'Com_%';
SHOW GLOBAL STATUS LIKE 'Slow_queries';サーバーに送られたクエリの総数です。単位時間あたりの QPS(Queries Per Second)を計算するのに使います。
各種クエリの実行回数です。どのタイプのクエリが多いかわかります。
スロークエリログに記録されたクエリの数です。増加傾向なら調査が必要です。
InnoDB バッファプール
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';特に重要なのは以下の変数です。
| 変数 | 意味 |
|---|---|
| Innodb_buffer_pool_read_requests | バッファプールへの読み取りリクエスト数 |
| Innodb_buffer_pool_reads | ディスクから読み込んだ回数 |
| Innodb_buffer_pool_pages_free | 空きページ数 |
| Innodb_buffer_pool_pages_dirty | ダーティページ数 |
キャッシュヒット率は以下の式で計算できます。
99% 以上が理想です。
一時テーブル
SHOW GLOBAL STATUS LIKE 'Created_tmp%';| Created_tmp_tables | メモリ一時テーブルの作成数 |
| Created_tmp_disk_tables | ディスク一時テーブルの作成数 |
| Created_tmp_files | 一時ファイルの作成数 |
ディスク一時テーブルの割合が高い場合は、クエリの最適化や tmp_table_size の調整を検討します。
テーブルオープン
SHOW GLOBAL STATUS LIKE 'Open%tables';
SHOW GLOBAL STATUS LIKE 'Opened_tables';現在オープンしているテーブル数です。
サーバー起動後にオープンされたテーブルの累計数です。これが急増していると、table_open_cache が小さすぎる可能性があります。
ソート関連
SHOW GLOBAL STATUS LIKE 'Sort%';| 変数 | 意味 |
|---|---|
| Sort_rows | ソートされた行数 |
| Sort_scan | テーブルスキャンでのソート回数 |
| Sort_merge_passes | マージソートのパス回数 |
Sort_merge_passes が多い場合、sort_buffer_size の増加で改善することがあります。
ロック関連
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%';
SHOW GLOBAL STATUS LIKE 'Table_locks%';| Innodb_row_lock_waits | 行ロック待ちの発生回数 |
| Innodb_row_lock_time_avg | 行ロック待ちの平均時間(ミリ秒) |
| Table_locks_waited | テーブルロック待ちの発生回数 |
ロック待ちが多い場合は、トランザクションの見直しやインデックスの追加を検討します。
レプリケーション
SHOW GLOBAL STATUS LIKE 'Rpl%';
SHOW REPLICA STATUS\Gレプリカの遅延を確認するには Seconds_Behind_Source(MySQL 8.0.22 以降)または Seconds_Behind_Master を見ます。
定期監視のスクリプト例
重要な指標をまとめて取得するクエリです。
SELECT
(SELECT Variable_value FROM performance_schema.global_status WHERE Variable_name = 'Threads_connected') AS threads_connected,
(SELECT Variable_value FROM performance_schema.global_status WHERE Variable_name = 'Threads_running') AS threads_running,
(SELECT Variable_value FROM performance_schema.global_status WHERE Variable_name = 'Questions') AS questions,
(SELECT Variable_value FROM performance_schema.global_status WHERE Variable_name = 'Slow_queries') AS slow_queries;監視ツールとの連携
本番環境では、手動で SHOW STATUS を実行するのではなく、監視ツールに任せましょう。
これらのツールは SHOW STATUS の値を定期的に収集し、グラフ化やアラートを設定できます。
継続的な監視により、問題が発生する前に兆候を捉えることができます。SHOW STATUS の出力を理解しておくことは、監視ツールのメトリクスを正しく解釈するためにも重要です。