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';
Questions

サーバーに送られたクエリの総数です。単位時間あたりの QPS(Queries Per Second)を計算するのに使います。

Com_select / Com_insert / Com_update / Com_delete

各種クエリの実行回数です。どのタイプのクエリが多いかわかります。

Slow_queries

スロークエリログに記録されたクエリの数です。増加傾向なら調査が必要です。

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';
Open_tables

現在オープンしているテーブル数です。

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 を実行するのではなく、監視ツールに任せましょう。

Prometheus + mysqld_exporter
Datadog
Zabbix
Percona Monitoring and Management(PMM)

これらのツールは SHOW STATUS の値を定期的に収集し、グラフ化やアラートを設定できます。

継続的な監視により、問題が発生する前に兆候を捉えることができます。SHOW STATUS の出力を理解しておくことは、監視ツールのメトリクスを正しく解釈するためにも重要です。