DataBase  /  MySQL  /  レポート取得ガイド

SHOW STATUS / SHOW VARIABLES による取得とセクション定義

MySQL 組み込みの SHOW GLOBAL STATUSSHOW GLOBAL VARIABLES コマンドを使って、Oracle AWR の Instance Activity・接続統計・バッファプール統計・ 初期化パラメータに相当する情報を取得する方法と主要変数のセクション定義を解説します。

1. SHOW STATUS と SHOW VARIABLES の概要

SQL — 基本コマンド
-- グローバルステータス変数一覧(累積カウンタ)
SHOW GLOBAL STATUS;

-- グローバル設定変数一覧(初期化パラメータ)
SHOW GLOBAL VARIABLES;

-- キーワードで絞り込み
SHOW GLOBAL STATUS LIKE 'Innodb_buffer%';
SHOW GLOBAL VARIABLES LIKE 'innodb%';

-- information_schema 経由(SQL で加工可能)
SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM information_schema.GLOBAL_STATUS
WHERE VARIABLE_NAME LIKE 'Threads%';

SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM information_schema.GLOBAL_VARIABLES
WHERE VARIABLE_NAME LIKE 'innodb_buffer%';
💡 SHOW STATUS は累積値
ステータス変数は MySQL 起動時点からの累積カウンタです。 特定期間の統計を得るには2時点の差分を取る必要があります。 セッションスコープ(SHOW SESSION STATUS)では現セッションのみの値が取得できます。

2. 接続・スレッド統計(AWR: Instance Activity 相当)

SQL — 接続・スレッド統計
SHOW GLOBAL STATUS WHERE Variable_name IN (
    'Threads_connected',
    'Threads_running',
    'Threads_created',
    'Threads_cached',
    'Connections',
    'Max_used_connections',
    'Aborted_connects',
    'Aborted_clients',
    'Connection_errors_max_connections'
);
変数名説明Oracle AWR 対応
Threads_connected 現在接続中のクライアントスレッド数。max_connections に対する使用率を確認する。 Sessions
Threads_running 現在クエリを実行中(スリープでない)スレッド数。CPU 競合の指標。 Active Sessions
Threads_created 累計スレッド作成数。thread_cache_size が小さいと増加し、オーバーヘッドが発生する。
Connections 起動後の累計接続試行数。 User Calls 累計 相当
Max_used_connections 起動後のピーク時接続数。
Aborted_connects 認証失敗・タイムアウト等で正常に確立できなかった接続数。
Connection_errors_max_connections max_connections 上限超過によって拒否された接続数。頻発する場合は設定を見直す。

3. InnoDB バッファプール統計(AWR: Buffer Pool 相当)

SQL — バッファプール統計
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';

-- バッファプールヒット率を計算
SELECT
    (1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100
        AS buffer_pool_hit_rate_pct
FROM (
    SELECT
        MAX(CASE WHEN Variable_name = 'Innodb_buffer_pool_reads'
            THEN VARIABLE_VALUE + 0 END) AS Innodb_buffer_pool_reads,
        MAX(CASE WHEN Variable_name = 'Innodb_buffer_pool_read_requests'
            THEN VARIABLE_VALUE + 0 END) AS Innodb_buffer_pool_read_requests
    FROM information_schema.GLOBAL_STATUS
    WHERE Variable_name IN (
        'Innodb_buffer_pool_reads',
        'Innodb_buffer_pool_read_requests'
    )
) t;
変数名説明Oracle AWR 対応
Innodb_buffer_pool_size バッファプールの合計サイズ(バイト)。Oracle の db_cache_size 相当。 Buffer Cache Size
Innodb_buffer_pool_pages_total バッファプールの合計ページ数(デフォルト16KB/ページ)。 Total Buffer
Innodb_buffer_pool_pages_free 空きページ数。0 に近いとバッファプールが飽和している。 Free Buffer
Innodb_buffer_pool_pages_dirty ダーティページ数(変更済みだがまだディスクに書かれていないページ)。 Dirty Buffers
Innodb_buffer_pool_read_requests バッファプールへの論理読み取り要求数(累計)。 Logical Reads
Innodb_buffer_pool_reads ディスクから読み取った物理 I/O 回数(累計)。少ないほどヒット率が高い。 Physical Reads
Innodb_buffer_pool_write_requests バッファプールへの書き込み要求数(累計)。 Logical Writes
Innodb_buffer_pool_pages_flushed バッファプールからフラッシュ(書き出し)されたページ数(累計)。 Physical Writes
バッファプールヒット率の目安
一般的に 99% 以上が目標値です。ヒット率が低い場合は innodb_buffer_pool_size の拡大を検討してください。 OLTP システムでは物理メモリの 60〜80% 程度を割り当てることが多いです。

4. クエリ・DML 統計

SQL — クエリ・DML 統計
SHOW GLOBAL STATUS WHERE Variable_name IN (
    'Questions',
    'Com_select',
    'Com_insert',
    'Com_update',
    'Com_delete',
    'Com_commit',
    'Com_rollback',
    'Slow_queries',
    'Select_full_join',
    'Select_full_range_join',
    'Select_scan',
    'Sort_merge_passes',
    'Created_tmp_disk_tables',
    'Created_tmp_tables'
);
変数名説明Oracle AWR 対応
Questions サーバーが受け付けたステートメント数(累計)。スループット指標。 User Calls
Com_select SELECT 文の実行回数(累計)。
Com_commit COMMIT 実行回数(累計)。Oracle の Transactions 指標に相当。 Transactions
Com_rollback ROLLBACK 実行回数(累計)。頻発する場合はアプリのエラーハンドリングを確認。 Rollbacks
Slow_queries long_query_time を超えたクエリ数(累計)。Slow Query Log と連動。 —(重い SQL 発生数)
Select_full_join インデックスを使用しないジョインの回数。ゼロが理想。 —(フルスキャン指標)
Select_scan フルテーブルスキャンを伴う SELECT の回数。多いほど I/O 負荷が高い。 —(Full Table Scan)
Sort_merge_passes ソート処理でマージパスが発生した回数。sort_buffer_size 不足のサイン。 —(Temp Space 使用相当)
Created_tmp_disk_tables ディスク上に作成された一時テーブル数(累計)。メモリ不足の指標。 —(Temp Segment 相当)

5. レプリケーション統計

SQL — レプリケーション状態確認
-- レプリケーション遅延と状態(MySQL 8.0+)
SHOW REPLICA STATUS\G
-- Seconds_Behind_Source : レプリカの遅延秒数(0が理想)
-- Replica_IO_Running     : IO スレッドが動いているか
-- Replica_SQL_Running    : SQL スレッドが動いているか

-- InnoDB redo ログ書き込み統計
SHOW GLOBAL STATUS LIKE 'Innodb_os_log%';
SHOW GLOBAL STATUS LIKE 'Innodb_log%';

6. 主要初期化パラメータ(AWR: Init Params 相当)

SQL — 主要パラメータ取得
SHOW GLOBAL VARIABLES WHERE Variable_name IN (
    'innodb_buffer_pool_size',
    'innodb_log_file_size',
    'innodb_log_buffer_size',
    'innodb_flush_log_at_trx_commit',
    'innodb_flush_method',
    'innodb_io_capacity',
    'innodb_io_capacity_max',
    'max_connections',
    'thread_cache_size',
    'query_cache_size',
    'sort_buffer_size',
    'join_buffer_size',
    'tmp_table_size',
    'max_heap_table_size',
    'long_query_time',
    'slow_query_log',
    'binlog_format',
    'transaction_isolation'
);
変数名説明Oracle AWR 対応
innodb_buffer_pool_size InnoDB バッファプールサイズ。データとインデックスのキャッシュ領域。 db_cache_size
innodb_log_file_size InnoDB redo ログファイルのサイズ。大きいほどチェックポイント頻度が下がる。 log_buffer_size
innodb_flush_log_at_trx_commit redo ログのフラッシュタイミング。1=毎コミット(完全耐久性)、2=1秒間隔。
innodb_io_capacity InnoDB バックグラウンド I/O の IOPS 上限。ストレージに合わせて設定する。
max_connections 同時接続の最大数。 sessions
long_query_time Slow Query Log への記録閾値(秒)。
transaction_isolation トランザクション分離レベル。デフォルトは REPEATABLE-READ。

7. 差分取得パターン

Oracle AWR のスナップショット差分に相当する情報を取得するには、 計測開始時と終了時の2時点で値を取得し、差分を計算します。

SQL — 差分取得用スナップショットテーブル
-- スナップショット保存テーブルを作成
CREATE TABLE IF NOT EXISTS mysql_status_snapshot (
    snap_id   INT AUTO_INCREMENT PRIMARY KEY,
    snap_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    var_name  VARCHAR(128),
    var_value BIGINT
);

-- スナップショット取得
INSERT INTO mysql_status_snapshot (var_name, var_value)
SELECT VARIABLE_NAME, VARIABLE_VALUE + 0
FROM information_schema.GLOBAL_STATUS
WHERE VARIABLE_NAME IN (
    'Questions', 'Com_commit', 'Com_rollback',
    'Innodb_buffer_pool_reads', 'Innodb_buffer_pool_read_requests',
    'Slow_queries', 'Threads_connected'
);

-- 2スナップショット間の差分計算(snap_id = 1 と 2 の差)
SELECT
    a.var_name,
    b.var_value - a.var_value AS delta,
    b.snap_time,
    a.snap_time,
    TIMESTAMPDIFF(SECOND, a.snap_time, b.snap_time) AS elapsed_sec
FROM mysql_status_snapshot a
JOIN mysql_status_snapshot b ON a.var_name = b.var_name
WHERE a.snap_id = 1 AND b.snap_id = 2;