Amazon Aurora — Performance Schema / pg_stat_* ビューによる取得とセクション定義
Aurora MySQL は MySQL の Performance Schema、Aurora PostgreSQL は pg_stat_* ビューと pg_stat_statements 拡張を使って SQL レベルの詳細統計・待機イベント・ロック・バッファ情報を取得できます。 Oracle AWR の SQL Statistics・Wait Event・Buffer Pool に最も近いエンジン固有の情報源です。 本記事では両エンジンのセクション定義と代表的な取得 SQL を解説します。
1. Aurora MySQL: Performance Schema の有効化
Aurora MySQL では Performance Schema はデフォルトで有効です。 ただし一部のインスツルメントやコンシューマが無効の場合があるため、パラメータグループで確認します。
-- Performance Schema の有効状態を確認
SHOW VARIABLES LIKE 'performance_schema';
-- 主要インスツルメントの有効化(セッション中のみ有効)
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE 'statement/%'
OR NAME LIKE 'wait/%';
-- コンシューマの有効化
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME IN (
'events_statements_history_long',
'events_waits_history_long',
'events_waits_current'
);
セッション中のみの変更ではインスタンス再起動で初期化されます。 永続化するには Aurora パラメータグループで
performance_schema を 1 に設定し、
インスタンスを再起動してください。
2. セクション定義(Aurora MySQL):SQL Statistics
Aurora MySQL AWR対応 SQL Statistics(Elapsed Time 順)
events_statements_summary_by_digest — SQL ダイジェスト別集計
| カラム | 説明 | AWR 対応 |
|---|---|---|
| DIGEST_TEXT | 正規化(リテラル → ?)された SQL テキスト | SQL Text |
| COUNT_STAR | 実行回数 | Executions |
| SUM_TIMER_WAIT | 累積実行時間(ピコ秒) | Elapsed Time |
| SUM_TIMER_WAIT / COUNT_STAR | 1回あたりの平均実行時間 | Elapsed Time per Exec |
| SUM_ROWS_EXAMINED | 累積の検査行数 | Rows Processed |
| SUM_ROWS_SENT | 累積の返却行数 | Rows Processed |
| SUM_NO_INDEX_USED | インデックス未使用の実行回数。フルスキャンの指標。 | — |
-- 累積実行時間が長い上位20 SQL
SELECT
DIGEST_TEXT AS sql_text,
COUNT_STAR AS executions,
ROUND(SUM_TIMER_WAIT / 1e12, 3) AS total_sec,
ROUND(SUM_TIMER_WAIT / COUNT_STAR / 1e12, 6) AS avg_sec,
SUM_ROWS_EXAMINED AS rows_examined,
SUM_NO_INDEX_USED AS no_index_cnt
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT IS NOT NULL
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 20;
3. セクション定義(Aurora MySQL):待機イベント
Aurora MySQL AWR対応 Top 5 Timed Events
-- 待機時間が長い上位イベント(AWR の Top 5 Timed Events 相当)
SELECT
EVENT_NAME AS wait_event,
COUNT_STAR AS wait_count,
ROUND(SUM_TIMER_WAIT / 1e12, 3) AS total_wait_sec,
ROUND(AVG_TIMER_WAIT / 1e9, 3) AS avg_wait_ms
FROM performance_schema.events_waits_summary_global_by_event_name
WHERE SUM_TIMER_WAIT > 0
AND EVENT_NAME NOT LIKE 'idle%'
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;
4. セクション定義(Aurora MySQL):ロック統計
Aurora MySQL AWR対応 Wait Events(enq: TX - row lock contention)
-- 現在ロック待ちが発生しているトランザクションを確認
SELECT
r.trx_id AS waiting_trx_id,
r.trx_mysql_thread_id AS waiting_thread,
r.trx_query AS waiting_query,
b.trx_id AS blocking_trx_id,
b.trx_mysql_thread_id AS blocking_thread,
b.trx_query AS blocking_query,
TIMESTAMPDIFF(SECOND, r.trx_wait_started, NOW()) AS wait_secs
FROM information_schema.innodb_lock_waits w
JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id
JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
ORDER BY wait_secs DESC;
5. Aurora PostgreSQL: pg_stat_statements の有効化
Aurora PostgreSQL では pg_stat_statements 拡張をパラメータグループで有効化します。
# カスタムパラメータグループに pg_stat_statements を追加
aws rds modify-db-cluster-parameter-group \
--db-cluster-parameter-group-name my-aurora-pg-params \
--parameters \
"ParameterName=shared_preload_libraries,ParameterValue=pg_stat_statements,ApplyMethod=pending-reboot"
# DB 再起動後に拡張を有効化
# (DB に接続して実行)
# CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- 拡張の確認
SELECT * FROM pg_extension WHERE extname = 'pg_stat_statements';
-- 統計リセット(計測開始時)
SELECT pg_stat_reset();
SELECT pg_stat_statements_reset();
6. セクション定義(Aurora PostgreSQL):SQL Statistics
Aurora PostgreSQL AWR対応 SQL Statistics(Elapsed Time 順)
| カラム | 説明 | AWR 対応 |
|---|---|---|
| query | 正規化(リテラル → $N)された SQL テキスト | SQL Text |
| calls | 実行回数 | Executions |
| total_exec_time | 累積実行時間(ミリ秒) | Elapsed Time |
| mean_exec_time | 1回あたりの平均実行時間(ミリ秒) | Elapsed Time per Exec |
| shared_blks_hit | 共有バッファヒット数 | Buffer Gets |
| shared_blks_read | 共有バッファからの物理読み取り数 | Physical Reads |
| rows | 累積返却行数 | Rows Processed |
-- 累積実行時間が長い上位20 SQL
SELECT
LEFT(query, 100) AS sql_text,
calls,
ROUND(total_exec_time::numeric, 3) AS total_ms,
ROUND(mean_exec_time::numeric, 3) AS avg_ms,
shared_blks_hit,
shared_blks_read,
ROUND(100.0 * shared_blks_hit
/ NULLIF(shared_blks_hit + shared_blks_read, 0), 2) AS cache_hit_pct,
rows
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;
7. セクション定義(Aurora PostgreSQL):待機イベント・ロック
Aurora PostgreSQL AWR対応 Top 5 Timed Events / Lock Statistics
-- 現在アクティブなセッションの待機イベント(Top 5 Timed Events 相当)
SELECT
wait_event_type,
wait_event,
COUNT(*) AS session_count,
STRING_AGG(LEFT(query, 60), ' | ') AS queries
FROM pg_stat_activity
WHERE state = 'active'
AND wait_event IS NOT NULL
GROUP BY wait_event_type, wait_event
ORDER BY session_count DESC;
-- ロック待ちセッションの一覧
SELECT
blocked.pid AS blocked_pid,
blocked.query AS blocked_query,
blocking.pid AS blocking_pid,
blocking.query AS blocking_query,
AGE(NOW(), blocked.query_start) AS wait_duration
FROM pg_stat_activity AS blocked
JOIN pg_stat_activity AS blocking
ON blocking.pid = ANY(pg_blocking_pids(blocked.pid))
ORDER BY wait_duration DESC;
pg_stat_database — データベース全体統計
-- DB 全体のキャッシュヒット率・デッドロック・ロールバック数
SELECT
datname AS database_name,
numbackends AS connections,
xact_commit AS commits,
xact_rollback AS rollbacks,
blks_hit,
blks_read,
ROUND(100.0 * blks_hit / NULLIF(blks_hit + blks_read, 0), 2) AS cache_hit_pct,
deadlocks,
conflicts
FROM pg_stat_database
WHERE datname NOT IN ('template0', 'template1', 'postgres')
ORDER BY xact_commit DESC;
8. セクション定義まとめ
| エンジン | セクション | 主なビュー/テーブル | Oracle AWR 対応 |
|---|---|---|---|
| Aurora MySQL | SQL Statistics | events_statements_summary_by_digest | SQL ordered by Elapsed Time |
| Aurora MySQL | 待機イベント | events_waits_summary_global_by_event_name | Top 5 Timed Events |
| Aurora MySQL | ロック統計 | innodb_lock_waits・innodb_trx | Wait Events(Row Lock) |
| Aurora PostgreSQL | SQL Statistics | pg_stat_statements | SQL ordered by Elapsed Time |
| Aurora PostgreSQL | 待機イベント | pg_stat_activity(wait_event) | Top 5 Timed Events |
| Aurora PostgreSQL | DB 全体統計 | pg_stat_database | Instance Activity / Buffer Pool |