DataBase / MySQL / レポート取得ガイド
SHOW STATUS / SHOW VARIABLES による取得とセクション定義
MySQL 組み込みの SHOW GLOBAL STATUS・SHOW GLOBAL VARIABLES
コマンドを使って、Oracle AWR の Instance Activity・接続統計・バッファプール統計・
初期化パラメータに相当する情報を取得する方法と主要変数のセクション定義を解説します。
1. SHOW STATUS と SHOW VARIABLES の概要
-- グローバルステータス変数一覧(累積カウンタ)
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時点の差分を取る必要があります。 セッションスコープ(
ステータス変数は MySQL 起動時点からの累積カウンタです。 特定期間の統計を得るには2時点の差分を取る必要があります。 セッションスコープ(
SHOW SESSION STATUS)では現セッションのみの値が取得できます。
2. 接続・スレッド統計(AWR: Instance Activity 相当)
セクション定義: Threads_* / Connections 系変数
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 相当)
セクション定義: Innodb_buffer_pool_* 変数
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% 以上が目標値です。ヒット率が低い場合は
一般的に 99% 以上が目標値です。ヒット率が低い場合は
innodb_buffer_pool_size の拡大を検討してください。
OLTP システムでは物理メモリの 60〜80% 程度を割り当てることが多いです。
4. クエリ・DML 統計
セクション定義: Com_* / Questions / Slow_queries 変数
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. レプリケーション統計
セクション定義: SHOW REPLICA STATUS
-- レプリケーション遅延と状態(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 相当)
セクション定義: SHOW GLOBAL VARIABLES
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時点で値を取得し、差分を計算します。
-- スナップショット保存テーブルを作成
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;