InnoDB 履歴リストの長さが大幅に増加しました
date
を過ぎると、行変更の履歴リストが大幅に増加し、db-instance
では最大 length
になりました。この増加は、クエリとデータベースのシャットダウンパフォーマンスに影響します。
サポート対象エンジンバージョン
このインサイト情報は、Aurora MySQL のすべてのバージョンでサポートされています。
Context
InnoDB トランザクションシステムは、マルチバージョン同時実行制御 (MVCC) を維持します。行が変更されると、変更中のデータの修正前のバージョンが、undo レコードとして undo ログに保存されます。すべての undo レコードには、以前の redo レコードへの参照があり、リンクリストを形成します。
InnoDB 履歴リストは、コミットされたトランザクションの undo ログのグローバルリストです。MySQL は、トランザクションで履歴が不要になったときに、履歴リストを使用してレコードとログページを削除します。履歴リストの長さは、履歴リスト内の変更を含む undo ログの総数です。各ログには、1 つ以上の変更が含まれます。InnoDB 履歴リストの長さが大きくなりすぎると、古い行バージョンが多数存在することになり、クエリやデータベースのシャットダウンが遅くなります。
この問題の考えられる原因
履歴リストが長くなる一般的な原因には次のものがあります。
-
実行時間の長いトランザクション (読み取りまたは書き込み)
-
書き込み負荷が高い
アクション
インサイトの原因に応じて、異なるアクションをお勧めします。
トピック
InnoDB 履歴リストが減るまで、データベースのシャットダウンを伴う操作を開始しない
InnoDB 履歴リストが長くなるとデータベースのシャットダウンが遅くなるため、データベースシャットダウンを伴う操作を開始する前にリストサイズを小さくしてください。これらの操作には、データベースのメジャーバージョンのアップグレードが含まれます。
長時間実行されるトランザクションを特定して終了する
information_schema.innodb_trx
クエリを実行すると、実行時間の長いトランザクションを見つけることができます。
注記
リードレプリカで長時間実行されるトランザクションも必ず探してください。
長時間実行されるトランザクションを特定して終了するには
-
SQL クライアントで次のクエリを実行します。
SELECT a.trx_id, a.trx_state, a.trx_started, TIMESTAMPDIFF(SECOND,a.trx_started, now()) as "Seconds Transaction Has Been Open", a.trx_rows_modified, b.USER, b.host, b.db, b.command, b.time, b.state FROM information_schema.innodb_trx a, information_schema.processlist b WHERE a.trx_mysql_thread_id=b.id AND TIMESTAMPDIFF(SECOND,a.trx_started, now()) > 10 ORDER BY trx_started
-
ストアドプロシージャ mysql.rds_kill を使用して、長時間実行している各トランザクションを終了します。
Performance Insights を使用して、上位ホストと上位ユーザーを特定します。
トランザクションを最適化して、変更された多数の行がすぐにコミットされるようにします。
関連するメトリクス
このインサイトに関連するメトリクスは次のとおりです。
-
trx_rseg_history_len
– このカウンターメトリクスは、Performance Insights およびINFORMATION_SCHEMA.INNODB_METRICS
テーブルで表示できます。詳細については、MySQL ドキュメントの「InnoDB INFORMATION_SCHEMA metrics table」を参照してください。 -
RollbackSegmentHistoryListLength
- この Amazon CloudWatch メトリクスは、コミットされたトランザクションが削除とマークされたレコードを記録する UNDO ログを測定します。これらのレコードは、InnoDB のパージオペレーションによって処理されるようにスケジュールされています。メトリクスtrx_rseg_history_len
の値はRollbackSegmentHistoryListLength
と同じです。 -
PurgeBoundary
– InnoDB パージ可能領域の最後のトランザクション番号。この CloudWatch メトリクスが長く進まない場合は、InnoDB パージが長時間実行中のトランザクションによってブロックされていることを示す良い目安となります。調査するには、Aurora MySQL DB クラスターのアクティブなトランザクション数を確認します。このメトリクスは、Aurora MySQL バージョン 2.11 以降およびバージョン 3.08 以降で利用できます。 -
PurgeFinishedPoint
– InnoDB パージが実行される領域の最後のトランザクション番号。この CloudWatch メトリクスは、InnoDB パージの進行速度を調べるのに役立ちます。このメトリクスは、Aurora MySQL バージョン 2.11 以降およびバージョン 3.08 以降で利用できます。 -
TransactionAgeMaximum
– 最も古いアクティブな実行中トランザクションの経過時間。この CloudWatch メトリクスは、Aurora MySQL バージョン 3.08 以降でのみ使用できます。 -
TruncateFinishedPoint
– 切り捨てを元に戻す操作が実行される最後のトランザクション番号。この CloudWatch メトリクスは、Aurora MySQL バージョン 2.11 以降、およびバージョン 3.08 以降でのみ使用できます。
CloudWatch のメトリクスの詳細については、「Amazon Aurora のインスタンスレベルのメトリクス」を参照してください。