

# Amazon Aurora MySQL の操作
<a name="Aurora.AuroraMySQL"></a><a name="mysql"></a>

Amazon Aurora MySQL は、フルマネージド型で MySQL　互換のリレーショナルデータベースエンジンです。ハイエンドの商用データベースにあるスピードと信頼性を、オープンソースデータベースのシンプルさとコスト効率によりご提供します。MySQL を Aurora MySQL に差し替えることで、新規および既存の MySQL のデプロイを簡単に、コスト効率よく設定、操作、スケーリングできるようになり、ユーザーは本来のビジネスやアプリケーションに専念できます。Amazon RDS ではプロビジョニング、パッチ適用、バックアップ、復旧、障害検出、あるいは修復など、データベース関連の日常的なタスクを処理することで Aurora を管理します。また、Amazon RDS には、既存の Amazon RDS for MySQL アプリケーションから Aurora MySQL への変換をボタン操作のみで行える、移行ツールも用意されています。

**Topics**
+ [Amazon Aurora MySQL の概要](Aurora.AuroraMySQL.Overview.md)
+ [Amazon Aurora MySQL でのセキュリティ](AuroraMySQL.Security.md)
+ [新しい TLS 証明書を使用して Aurora MySQL DB クラスターに接続するようにアプリケーションを更新する](ssl-certificate-rotation-aurora-mysql.md)
+ [Aurora MySQL での Kerberos 認証の使用](aurora-mysql-kerberos.md)
+ [Amazon Aurora MySQL DB クラスターへのデータの移行](AuroraMySQL.Migrating.md)
+ [Amazon Aurora MySQL の管理](AuroraMySQL.Managing.md)
+ [Aurora MySQL のチューニング](AuroraMySQL.Managing.Tuning.md)
+ [Amazon Aurora MySQL の並列クエリ](aurora-mysql-parallel-query.md)
+ [Amazon Aurora MySQL DB クラスターでのアドバンストな監査の使用](AuroraMySQL.Auditing.md)
+ [Amazon Aurora MySQL でのレプリケーション](AuroraMySQL.Replication.md)
+ [Amazon Aurora MySQL DB クラスターでのローカル書き込み転送の使用](aurora-mysql-write-forwarding.md)
+ [Amazon Aurora MySQL と他の AWS のサービスの統合](AuroraMySQL.Integrating.md)
+ [Amazon Aurora MySQL ラボモード](AuroraMySQL.Updates.LabMode.md)
+ [Amazon Aurora MySQL を使用する際のベストプラクティス](AuroraMySQL.BestPractices.md)
+ [Amazon Aurora MySQL データベースのパフォーマンスのトラブルシューティング](aurora-mysql-troubleshooting.md)
+ [Amazon Aurora MySQL のリファレンス](AuroraMySQL.Reference.md)
+ [Amazon Aurora MySQL のデータベースエンジンの更新](AuroraMySQL.Updates.md)

# Amazon Aurora MySQL の概要
<a name="Aurora.AuroraMySQL.Overview"></a>

ここで示している各セクションで、Amazon Aurora MySQL の概要を学習できます。

**Topics**
+ [Amazon Aurora MySQL パフォーマンスの拡張](#Aurora.AuroraMySQL.Performance)
+ [Amazon Aurora MySQL と空間データ](#Aurora.AuroraMySQL.Spatial)
+ [Aurora MySQL バージョン 3 は MYSQL 8.0 との互換性があります。](AuroraMySQL.MySQL80.md)
+ [MySQL 5.7 互換 Aurora MySQL バージョン 2](AuroraMySQL.CompareMySQL57.md)

## Amazon Aurora MySQL パフォーマンスの拡張
<a name="Aurora.AuroraMySQL.Performance"></a>

Amazon Aurora には、ハイエンドな商用データベースのさまざまなニーズをサポートするパフォーマンスエクステンションがあります。

### 高速挿入
<a name="Aurora.AuroraMySQL.Performance.FastInsert"></a>

高速挿入は、プライマリキーによってソートされたパラレル挿入を加速し、特に `LOAD DATA` および `INSERT INTO ... SELECT ...` ステートメントに適用されます。高速挿入は、ステートメントの実行中にインデックストラバーサルのカーソル位置をキャッシュします。これによって、再度インデックスをトラバースする必要がなくなります。

高速挿入は、Aurora MySQL バージョン 3.03.2 以降の通常の InnoDB テーブルでのみ有効です。この最適化は、InnoDB 一時テーブルでは機能しません。Aurora MySQL バージョン 2 では、すべての 2.11 および 2.12 バージョンで無効になっています。高速挿入の最適化は、アダプティブハッシュインデックスの最適化が無効になっている場合にのみ機能します。

次のメトリクスをモニタリングして、DB クラスターに対する高速挿入の効果を判断できます。
+ `aurora_fast_insert_cache_hits`: キャッシュされたカーソルが正常に取得され検証された時に増加するカウンター。
+ `aurora_fast_insert_cache_misses`: キャッシュされたカーソルがすでに有効ではなく、Aurora が通常のインデックストラバーサルを実行したときに増加するカウンター。

次のコマンドを使用して、高速挿入メトリクスの現在の値を取得できます。

```
mysql> show global status like 'Aurora_fast_insert%';
```

以下のような出力結果が取得できます。

```
+---------------------------------+-----------+
| Variable_name                   | Value     |
+---------------------------------+-----------+
| Aurora_fast_insert_cache_hits   | 3598300   |
| Aurora_fast_insert_cache_misses | 436401336 |
+---------------------------------+-----------+
```

## Amazon Aurora MySQL と空間データ
<a name="Aurora.AuroraMySQL.Spatial"></a>

以下のリストでは、主要な Aurora MySQL 空間機能の概要を説明し、それらが MySQL の空間機能にどのように対応しているかを解説しています。
+ Aurora MySQL バージョン 2 は、MySQL 5.7 と同じ空間データ型および空間関係関数をサポートします。これらのデータ型および関数の詳細については、MySQL 5.7 のドキュメントの[空間データ型](https://dev.mysql.com/doc/refman/5.7/en/spatial-types.html)および[空間関係関数](https://dev.mysql.com/doc/refman/5.7/en/spatial-relation-functions-object-shapes.html)を参照してください。
+ Aurora MySQL バージョン 3 は、MySQL 8.0 と同じ空間データ型および空間関係関数をサポートします。これらのデータ型および関数の詳細については、MySQL 8.0 のドキュメントの[空間データ型](https://dev.mysql.com/doc/refman/8.0/en/spatial-types.html)および[空間関係関数](https://dev.mysql.com/doc/refman/8.0/en/spatial-relation-functions-object-shapes.html)を参照してください。
+ Aurora MySQL は、InnoDB テーブルの空間インデックス作成をサポートします。空間インデックス作成では、空間的データのクエリにおける大規模なデータセットのクエリパフォーマンスが向上します。MySQL では、InnoDB テーブルの空間インデックス作成は MySQL 5.7 と 8.0 で使用できます。

  Aurora MySQL は、空間クエリで高度なパフォーマンスを得るために MySQL とは異なる空間インデックスの戦略を使用します。Aurora 空間インデックスの実装は、B-tree のスペースのフィルカーブを使用します。これは、R-tree よりも高度なパフォーマンスを空間範囲スキャンに提供することを目的としています。
**注記**  
Aurora MySQL では、空間リファレンス識別子 (SRID) が含まれているカラムで空間インデックスが定義されているテーブルのトランザクションを、別のトランザクションで更新するために選択されている領域に挿入することはできません。

次のデータ定義言語 (DDL) ステートメントは空間的なデータ型を使用する列にインデックスを作成するためにサポートされています。

### CREATE TABLE
<a name="Aurora.AuroraMySQL.Spatial.create_table"></a>

`SPATIAL INDEX` ステートメントの `CREATE TABLE` キーワードを使用して、空間インデックスを新しいテーブルの列に追加することができます。次に例を示します。

```
CREATE TABLE test (shape POLYGON NOT NULL, SPATIAL INDEX(shape));
```

### ALTER TABLE
<a name="Aurora.AuroraMySQL.Spatial.alter_table"></a>

`SPATIAL INDEX` ステートメントの `ALTER TABLE` キーワードを使用して、空間インデックスを既存のテーブルの列に追加することができます。次に例を示します。

```
ALTER TABLE test ADD SPATIAL INDEX(shape);
```

### CREATE INDEX
<a name="Aurora.AuroraMySQL.Spatial.create_index"></a>

`SPATIAL` ステートメントの `CREATE INDEX` キーワードを使用して、空間インデックスを既存のテーブルの列に追加することができます。次に例を示します。

```
CREATE SPATIAL INDEX shape_index ON test (shape);
```

# Aurora MySQL バージョン 3 は MYSQL 8.0 との互換性があります。
<a name="AuroraMySQL.MySQL80"></a>

 Aurora MySQL バージョン 3 を使用して、MySQL 互換の最新機能、パフォーマンスの強化、およびバグ修正を入手できます。以下では、MySQL 8.0 の互換性を持つ Aurora MySQL バージョン 3 について学ぶことができます。クラスターとアプリケーションを Aurora MySQL バージョン 3 にアップグレードする方法を学ぶことができます。

 Aurora Serverless v2 など、Aurora の一部の機能は、Aurora MySQL バージョン 3 を必要とします。

**Topics**
+ [MySQL 8.0 コミュニティエディションからの機能](#AuroraMySQL.8.0-features-community)
+ [Aurora MySQL サーバーレス v2 の前提条件である Aurora MySQL バージョン 3](#AuroraMySQL.serverless-v2-8.0-prereq)
+ [Aurora MySQL バージョン 3 のリリースノート](#AuroraMySQL.mysql80-bugs-fixed)
+ [新しいパラレルクエリの最適化](#AuroraMySQL.8.0-features-pq)
+ [データベースの再起動時間を短縮するための最適化](#ReducedRestartTime)
+ [Aurora MySQL バージョン 3 での新しい一時テーブルの動作](ams3-temptable-behavior.md)
+ [Aurora MySQL バージョン 2 と Aurora MySQL バージョン 3 の比較](AuroraMySQL.Compare-v2-v3.md)
+ [Aurora MySQL バージョン 3 と MySQL 8.0 コミュニティエディションの比較](AuroraMySQL.Compare-80-v3.md)
+ [Aurora MySQL バージョン 3 へのアップグレード](AuroraMySQL.mysql80-upgrade-procedure.md)

## MySQL 8.0 コミュニティエディションからの機能
<a name="AuroraMySQL.8.0-features-community"></a>

 Aurora MySQL バージョン 3 の初期リリースは、MySQL 8.0.23 コミュニティエディションと互換性があります。MySQL 8.0 では、以下を含むいくつかの新機能が導入されています。
+ アトミックデータ定義言語 (DDL) のサポート。詳細については、「[アトミックデータ定義言語 (DDL) のサポート](AuroraMySQL.Compare-v2-v3.md#AuroraMySQL.Compare-v2-v3-atomic-ddl)」を参照してください。
+ JSON 関数。使用に関する情報については、*MySQL リファレンスマニュアル* の[JSON 関数](https://dev.mysql.com/doc/refman/8.0/en/json-functions.html)を参照してください。
+ ウィンドウ関数。使用に関する情報については、*MySQL リファレンスマニュアル* の[Window 関数](https://dev.mysql.com/doc/refman/8.0/en/window-functions.html)を参照してください。
+ `WITH` 句を使用した共通テーブル表現 (CTE)。使用に関する情報については、*MySQL リファレンスマニュアル*の [WITH (共通テーブル表現)](https://dev.mysql.com/doc/refman/8.0/en/with.html)を参照してください。
+ `ALTER TABLE` ステートメントの、最適化された `ADD COLUMN` と `RENAME COLUMN` 句 。これらの最適化は「インスタント DDL」と呼ばれます。Aurora MySQL バージョン 3 はコミュニティ MySQL インスタント DDL 特徴と互換性があります。旧 Aurora 高速 DDL特徴は使用されていません。インスタント DDL の使用情報については、[インスタント DDL (Aurora MySQL バージョン 3)](AuroraMySQL.Managing.FastDDL.md#AuroraMySQL.mysql80-instant-ddl) を参照してください。
+ 降順、機能、不可視インデックス。使用に関する情報については、*MySQL リファレンスマニュアル*の[非表示インデックス](https://dev.mysql.com/doc/refman/8.0/en/invisible-indexes.html)、[降順インデックス](https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html)、および[CREATE INDEX インデックス](https://dev.mysql.com/doc/refman/8.0/en/create-index.html#create-index-functional-key-parts)を参照してください。
+ SQL 文で制御されるロールベースの権限。権限モデルの変更については、[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model) を参照してください。
+ `SELECT ... FOR SHARE` 文の`NOWAIT` と `SKIP LOCKED` 句。これらの句は、他のトランザクションが行ロックを解放するのを待つことを避けます。使用の詳細については、*MySQL リファレンスマニュアル*の[読み取りロック](https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html)を参照してください。
+ バイナリログ (binlog) のレプリケーションの改善。Aurora MySQL の詳細については、[バイナリログレプリケーション](AuroraMySQL.Compare-v2-v3.md#AuroraMySQL.mysql80-binlog) を参照してください。特に、フィルタリングされたレプリケーションを実行できます。使用方法については、*MySQL リファレンスマニュアル*の[サーバがレプリケーションフィルタ規則を評価する方法](https://dev.mysql.com/doc/refman/8.0/en/replication-rules.html)を参照してください。
+ ヒント。MySQL 8.0 互換ヒントのいくつかは、既に Aurora MySQL バージョン 2 にバックポートされています。Aurora MySQL でのヒントの使用については、[Aurora MySQL のヒント](AuroraMySQL.Reference.Hints.md) を参照してください。コミュニティ MySQL 8.0 でのヒントの詳細なリストは、*MySQL リファレンスマニュアル*の[オプティマイザーヒント](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html)を参照してください。

MySQL 8.0 コミュニティエディションに追加された機能の完全なリストについては、ブログ記事 [MySQL 8.0 の新機能の完全なリスト](https://dev.mysql.com/blog-archive/the-complete-list-of-new-features-in-mysql-8-0/) を参照してください。

Aurora MySQL バージョン 3 には、コミュニティ MySQL 8.0.26 からバックポートされた、包括的言語キーワードの変更も含まれています。これらの変更の詳細については、[Aurora MySQL バージョン 3 に対する包括的な言語変更](AuroraMySQL.Compare-v2-v3.md#AuroraMySQL.8.0-inclusive-language) を参照してください。

## Aurora MySQL サーバーレス v2 の前提条件である Aurora MySQL バージョン 3
<a name="AuroraMySQL.serverless-v2-8.0-prereq"></a>

 Aurora MySQL バージョン 3 は、Aurora MySQL サーバーレス v2 クラスター内のすべての DB インスタンスの前提条件です。Aurora MySQL サーバーレス v2 には、DB クラスター内のリーダーインスタンスのサポートと、Aurora MySQL サーバーレス v1 では利用できない Aurora 機能のサポートが含まれています。また、Aurora MySQL サーバーレス v1 よりも高速かつきめ細かなスケーリングも備えています。

## Aurora MySQL バージョン 3 のリリースノート
<a name="AuroraMySQL.mysql80-bugs-fixed"></a>

 すべての Aurora MySQL バージョン 3 リリースのリリースノートについては、*Aurora MySQL のリリースノート*の「[Amazon Aurora MySQL バージョン 3 のデータベースエンジンの更新](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html)」を参照してください。

## 新しいパラレルクエリの最適化
<a name="AuroraMySQL.8.0-features-pq"></a>

 Aurora パラレルクエリの最適化は、より多くの SQL 操作に適用されるようになりました。
+  パラレルクエリは、`TEXT`、`BLOB`、`JSON`、`GEOMETRY`、`VARCHAR`、そして 768 バイトより長い `CHAR` のデータ型を含んだテーブルに適用されるようになりました。
+  パラレルクエリは、パーティショニングテーブルを含むクエリを最適化できます。
+  パラレルクエリは、選択リストと `HAVING` 句内でする集計関数の呼び出を伴うクエリを最適化できます。

 強化の詳細については、[Aurora MySQL バージョン 3 への パラレルクエリクラスターのアップグレード](aurora-mysql-parallel-query-optimizing.md#aurora-mysql-parallel-query-upgrade-pqv2) を参照してください。Aurora パラレルクエリの一般情報については、[Amazon Aurora MySQL の並列クエリ](aurora-mysql-parallel-query.md) を参照してください。

## データベースの再起動時間を短縮するための最適化
<a name="ReducedRestartTime"></a>

Aurora MySQL DB クラスターは、計画的な停止時と計画外の停止時の両方で高い可用性を備えている必要があります。

データベース管理者は時折データベースのメンテナンスを行う必要があります。このメンテナンスには、データベースのパッチ適用、アップグレード、手動での再起動が必要なデータベースパラメータの変更、インスタンスクラスの変更にかかる時間を短縮するためのフェイルオーバーの実行などが含まれます。これらの計画的なアクションには、ダウンタイムが伴います。

ただし、基盤となるハードウェア障害やデータベースリソースのスロットリングによる予期しないフェイルオーバーなど、計画外のアクションによってもダウンタイムが発生することもあります。これらの計画的なアクションでも、計画外のアクションでも、必ずデータベースの再起動が必要です。

Aurora MySQL バージョン 3.05 以降では、データベースの再起動時間を短縮するための最適化が導入されました。これらの最適化により、最適化を行わない場合と比べてダウンタイムが最大 65% 短縮され、再起動後のデータベースワークロードの中断も少なくなります。

データベースのスタートアップ時には、多くの内部メモリコンポーネントが初期化されます。これらの中で最大のものは [InnoDB バッファープール](https://aws.amazon.com/blogs/database/best-practices-for-amazon-aurora-mysql-database-configuration/)で、Aurora MySQL ではデフォルトでインスタンスのメモリサイズの 75% です。テストの結果、初期化時間は InnoDB バッファプールのサイズに比例し、DB インスタンスクラスのサイズに合わせて調整されることがわかりました。この初期化フェーズでは、データベースは接続を受け付けられないため、再起動時のダウンタイムが長くなります。Aurora MySQL 高速再起動の第 1 フェーズでは、バッファープールの初期化が最適化されます。これにより、データベースの初期化時間が短縮され、全体的な再起動時間が短縮されます。

詳細については、ブログ「[Amazon Aurora MySQL データベースの再起動時間の最適化によってダウンタイムを削減する](https://aws.amazon.com/blogs/database/reduce-downtime-with-amazon-aurora-mysql-database-restart-time-optimizations/)」を参照してください。

# Aurora MySQL バージョン 3 での新しい一時テーブルの動作
<a name="ams3-temptable-behavior"></a>

Aurora MySQL バージョン 3 では、一時テーブルの処理方法は、以前の Aurora MySQL バージョンとは異なります。この新しい動作は MySQL 8.0 コミュニティエディションから継承されています。Aurora MySQL バージョン 3 で作成できる一時テーブルには、次の 2 つのタイプがあります。
+ 内部 (または*黙示的*) 一時テーブル — 集計の並べ替え、派生テーブル、共通テーブル式 (CTE) などの操作を処理するために Aurora MySQL エンジンによって作成されます。
+ ユーザー作成 (または*明示的*) 一時テーブル — Aurora MySQL エンジンが`CREATE TEMPORARY TABLE`表示されます。

Aurora Reader DB インスタンスの内部およびユーザー作成一時テーブルの両方について、その他の考慮事項があります。これらについては、以降のセクションで説明します。

**Topics**
+ [内部 (黙示的) 一時テーブルのストレージエンジン](#ams3-temptable-behavior-engine)
+ [内部メモリ内一時テーブルのサイズを制限する](#ams3-temptable-behavior-limit)
+ [Aurora レプリカの内部一時テーブルのフルネス問題の緩和](#ams3-temptable-behavior-mitigate)
+ [Aurora MySQL DB インスタンスでの temptable\$1max\$1mmap パラメータの最適化](#ams-optimize-temptable_max_mmap)
+ [リーダー DB インスタンスでユーザーが作成した (明示的な) 一時テーブル](#ams3-temptable-behavior.user)
+ [一時テーブル作成エラーと軽減](#ams3-temptable-behavior.errors)

## 内部 (黙示的) 一時テーブルのストレージエンジン
<a name="ams3-temptable-behavior-engine"></a>

中間結果セットを生成するとき、Aurora MySQL は最初にメモリ内一時テーブルへの書き込みを試みます。データ型に互換性がないか、制限が設定されていることが原因で、これがうまくいかない可能性があります。その場合、一時テーブルはメモリに保持されるのではなく、ディスク上の一時テーブルに変換されます。これについての詳細は、MySQL ドキュメントの「[MySQL での内部一時テーブルの使用](https://dev.mysql.com/doc/refman/8.0/en/internal-temporary-tables.html)」を参照してください。

Aurora MySQL バージョン 3 では、内部一時テーブルの動作方法は、以前の Aurora MySQL バージョンとは異なります。このような一時テーブルの InnoDB ストレージエンジンと MyISAM ストレージエンジンのいずれかを選択する代わりに、現在は `TempTable` ストレージエンジンと `MEMORY` ストレージエンジンのいずれかを選択します。

`TempTable` ストレージエンジンを使用すると、特定のデータの処理方法について追加の選択を行うことができます。影響を受けるデータは、DB インスタンスのすべての内部一時テーブルを保持するメモリプールをオーバーフローします。

これらの選択は、大量の一時データを生成するクエリのパフォーマンスに影響します。例えば、ラージ テーブルの `GROUP BY` のような集約を実行している場合などです。

**ヒント**  
ワークロードに内部一時テーブルを生成するクエリが含まれている場合は、ベンチマークを実行し、パフォーマンス関連のメトリックをモニタリングして、この変更によるアプリケーションの動作を確認します。  
場合によっては、一時データ量は `TempTable` メモリプールに収まるか、または少量だけメモリプールから溢れます。このような場合は、内部一時テーブルおよびメモリマップファイルの `TempTable` 設定を使用して、オーバーフローデータを保持することをお勧めします。この設定はデフォルトです。

`TempTable` ストレージエンジンがデフォルトです。`TempTable` は、テーブルあたりの最大メモリ制限ではなく、このエンジンを使うすべての一時テーブルの共通メモリプールを使用します。このメモリプールのサイズは、[temptable\$1max\$1ram](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram) パラメータで特定されます。16 GB 以上のメモリを持つ DB インスタンスでは 1 GB、メモリが 16 GB 未満の DB インスタンスでは 16 MB がデフォルトになります。メモリプールのサイズは、セッションレベルのメモリ消費に影響します。

`TempTable` ストレージエンジンを使用するときに、一時データがメモリプールのサイズを超えることがあります。その場合、Aurora MySQL は二次的なメカニズムを使用してオーバーフローデータを保存します。

[temptable\$1max\$1mmap](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap) パラメータを設定して、メモリマップテ一時ファイルまたはディスク上の InnoDB 内部一時テーブルのどちらにデータがオーバーフローするか、指定することができます。これらのオーバーフローメカニズムの異なるデータ形式とオーバーフロー基準は、クエリのパフォーマンスに影響を与える可能性があります。例えば、ディスクに書き込まれるデータ量や、ディスクストレージのスループットに対する要求に影響します。

Aurora MySQL バージョン 3 は、オーバーフローデータを次の方法で保存します。
+ ライター DB インスタンスでは、InnoDB 内部の一時テーブルまたはメモリマップド一時ファイルにオーバーフローするデータは、インスタンスのローカルストレージに存在します。
+ リーダー DB インスタンスでは、オーバーフローデータは常にローカルストレージ上のメモリマップド一時ファイルに存在します。

  読み取り専用インスタンスでは Aurora クラスターボリュームにデータを保存できません。

内部一時テーブルに関連する設定パラメータは、クラスター内のライターインスタンスとリーダーインスタンスに対して異なる方法で適用されます。
+ リーダーインスタンスの場合、Aurora MySQL は常に `TempTable` ストレージエンジンを使用します。
+ `temptable_max_mmap` のデフォルトサイズは、DB インスタンスのメモリサイズに関係なく、ライターインスタンスとリーダーインスタンスの両方で 1 GB です。この値はライターインスタンスとリーダーインスタンスの両方で調整できます。
+ `temptable_max_mmap` を `0` に設定すると、ライターインスタンスでのメモリマップされた一時ファイルの使用がオフになります。
+ リーダーインスタンスでは、`temptable_max_mmap` を `0` に設定することはできません。

**注記**  
[temptable\$1use\$1mmap](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_use_mmap) パラメーターの使用はお勧めしません。これは非推奨であり、将来の MySQL リリースでサポートが削除される予定です。

## 内部メモリ内一時テーブルのサイズを制限する
<a name="ams3-temptable-behavior-limit"></a>

[内部 (黙示的) 一時テーブルのストレージエンジン](#ams3-temptable-behavior-engine) で説明したように、[temptable\$1max\$1ram](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram) および [temptable\$1max\$1mmap](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap) 設定を使用して、一時テーブルリソースをグローバルに制御できます。

また、[tmp\$1table\$1size](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmp_table_size) DB パラメータを使用して、個々の内部メモリ内一時テーブルのサイズを制限することもできます。この制限は、個々のクエリがグローバル一時テーブルリソースを大量に消費し、これらのリソースを必要とする同時クエリのパフォーマンスに影響を与えるのを防ぐことを目的としています。

`tmp_table_size` パラメータは、Aurora MySQL バージョン 3 の `MEMORY` ストレージエンジンによって作成される一時テーブルの最大サイズを定義します。

Aurora MySQL バージョン 3.04 以降では、`tmp_table_size` は、`aurora_tmptable_enable_per_table_limit` DB パラメータが `ON` に設定されているときに `TempTable` ストレージエンジンによって作成される一時テーブルの最大サイズも定義します。この動作はデフォルトでは無効になっています (`OFF`)、これは Aurora MySQL バージョン 3.03 以前のバージョンと同じ動作です。
+ `aurora_tmptable_enable_per_table_limit` が `OFF` のとき、`tmp_table_size` は、`TempTable` ストレージエンジンによって作成される内部メモリ内一時テーブルでは考慮されません。

  ただし、その場合でも、グローバル `TempTable` リソース制限は適用されます。Aurora MySQL は、グローバル `TempTable` リソース制限に達すると、次のように動作します。
  + ライター DB インスタンス — Aurora MySQL は、メモリ内一時テーブルを InnoDB オンディスク一時テーブルに自動的に変換します。
  + リーダー DB インスタンス — クエリはエラーで終了します。

    ```
    ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sqlxx_xxx' is full
    ```
+ `aurora_tmptable_enable_per_table_limit` が `ON` のとき、Aurora MySQL は、`tmp_table_size` 制限に達すると、次のように動作します。
  + ライター DB インスタンス — Aurora MySQL は、メモリ内一時テーブルを InnoDB オンディスク一時テーブルに自動的に変換します。
  + リーダー DB インスタンス — クエリはエラーで終了します。

    ```
    ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sqlxx_xxx' is full
    ```

    この場合、グローバル `TempTable` リソース制限とテーブルごとの制限の両方が適用されます。

**注記**  
`aurora_tmptable_enable_per_table_limit` パラメータは、[ internal\$1tmp\$1mem\$1storage\$1engine](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_internal_tmp_mem_storage_engine) が `MEMORY` に設定されたときには、効果がありません。この場合、メモリ内一時テーブルの最大サイズは、[tmp\$1table\$1size](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmp_table_size) または [max\$1heap\$1table\$1size](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_heap_table_size) のいずれか小さい方の値によって定義されます。

以下の例は、ライター DB インスタンスとリーダー DB インスタンスについて、`aurora_tmptable_enable_per_table_limit` パラメータの動作を示しています。

**Example `aurora_tmptable_enable_per_table_limit` が `OFF` に設定されたライター DB インスタンス**  
メモリ内一時テーブルは InnoDB オンディスク一時テーブルに変換されません。  

```
mysql> set aurora_tmptable_enable_per_table_limit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@temptable_max_ram,@@temptable_max_mmap;
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
| @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@temptable_max_ram | @@temptable_max_mmap |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
|                  0 | 3.04.0           |                                        0 |          1073741824 |           1073741824 |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
1 row in set (0.00 sec)

mysql> show status like '%created_tmp_disk%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
+-------------------------+-------+
1 row in set (0.00 sec)

mysql> set cte_max_recursion_depth=4294967295;
Query OK, 0 rows affected (0.00 sec)

mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 60000000) SELECT max(n) FROM cte;
+----------+
| max(n)   |
+----------+
| 60000000 |
+----------+
1 row in set (13.99 sec)

mysql> show status like '%created_tmp_disk%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
+-------------------------+-------+
1 row in set (0.00 sec)
```

**Example `aurora_tmptable_enable_per_table_limit` が `ON` に設定されたライター DB インスタンス**  
メモリ内一時テーブルは InnoDB オンディスク一時テーブルに変換されます。  

```
mysql> set aurora_tmptable_enable_per_table_limit=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@tmp_table_size;
+--------------------+------------------+------------------------------------------+------------------+
| @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@tmp_table_size |
+--------------------+------------------+------------------------------------------+------------------+
|                  0 | 3.04.0           |                                        1 |         16777216 |
+--------------------+------------------+------------------------------------------+------------------+
1 row in set (0.00 sec)

mysql> set cte_max_recursion_depth=4294967295;
Query OK, 0 rows affected (0.00 sec)

mysql> show status like '%created_tmp_disk%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
+-------------------------+-------+
1 row in set (0.00 sec)

mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 6000000) SELECT max(n) FROM cte;
+---------+
| max(n)  |
+---------+
| 6000000 |
+---------+
1 row in set (4.10 sec)

mysql> show status like '%created_tmp_disk%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 1     |
+-------------------------+-------+
1 row in set (0.00 sec)
```

**Example `aurora_tmptable_enable_per_table_limit` が `OFF` に設定されたリーダー DB インスタンス**  
`tmp_table_size` は適用されず、グローバル `TempTable` リソースの上限に達していないため、クエリはエラーなしで終了します。  

```
mysql> set aurora_tmptable_enable_per_table_limit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@temptable_max_ram,@@temptable_max_mmap;
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
| @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@temptable_max_ram | @@temptable_max_mmap |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
|                  1 | 3.04.0           |                                        0 |          1073741824 |           1073741824 |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
1 row in set (0.00 sec)

mysql> set cte_max_recursion_depth=4294967295;
Query OK, 0 rows affected (0.00 sec)

mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 60000000) SELECT max(n) FROM cte;
+----------+
| max(n)   |
+----------+
| 60000000 |
+----------+
1 row in set (14.05 sec)
```

**Example `aurora_tmptable_enable_per_table_limit` が `OFF` に設定されたリーダー DB インスタンス**  
`aurora_tmptable_enable_per_table_limit` が OFF に設定されている場合、このクエリはグローバル TempTable リソース制限に達します。クエリはリーダーインスタンスのエラーで終了します。  

```
mysql> set aurora_tmptable_enable_per_table_limit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@temptable_max_ram,@@temptable_max_mmap;
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
| @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@temptable_max_ram | @@temptable_max_mmap |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
|                  1 | 3.04.0           |                                        0 |          1073741824 |           1073741824 |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
1 row in set (0.00 sec)

mysql> set cte_max_recursion_depth=4294967295;
Query OK, 0 rows affected (0.01 sec)

mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 120000000) SELECT max(n) FROM cte;
ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sqlfd_1586_2' is full
```

**Example `aurora_tmptable_enable_per_table_limit` が `ON` に設定されたリーダー DB インスタンス**  
`tmp_table_size` 制限に達すると、クエリはエラーで終了します。  

```
mysql> set aurora_tmptable_enable_per_table_limit=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@tmp_table_size;
+--------------------+------------------+------------------------------------------+------------------+
| @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@tmp_table_size |
+--------------------+------------------+------------------------------------------+------------------+
|                  1 | 3.04.0           |                                        1 |         16777216 |
+--------------------+------------------+------------------------------------------+------------------+
1 row in set (0.00 sec)

mysql> set cte_max_recursion_depth=4294967295;
Query OK, 0 rows affected (0.00 sec)

mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 6000000) SELECT max(n) FROM cte;
ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sqlfd_8_2' is full
```

## Aurora レプリカの内部一時テーブルのフルネス問題の緩和
<a name="ams3-temptable-behavior-mitigate"></a>

一時テーブルのサイズ制限の問題を回避するには、`temptable_max_ram` と `temptable_max_mmap`パラメータを、ワークロードの要件に適合する値を組み合わせて指定します。

`temptable_max_ram` パラメータの値を設定するときは注意してください。この値の設定が高すぎると、データベースインスタンスの使用可能なメモリが減少し、メモリ不足状態が発生する可能性があります。DB インスタンスの平均空きメモリ量を監視します。インスタンスには十分な量の空きメモリが残るように `temptable_max_ram` の適切な値を決定します。詳細については、「[Amazon Aurora の解放可能なメモリの問題](CHAP_Troubleshooting.md#Troubleshooting.FreeableMemory)」を参照してください。

また、ローカルストレージのサイズと一時テーブル領域の消費量をモニタリングすることも重要です。特定の DB インスタンスで使用できる一時ストレージをモニタリングするには、`FreeLocalStorage` Amazon CloudWatch メトリクスを使用できます。詳細については、「[Amazon Aurora の Amazon CloudWatch メトリクス](Aurora.AuroraMonitoring.Metrics.md)」を参照してください。

**注記**  
この手順は、`aurora_tmptable_enable_per_table_limit` パラメータが `ON` に設定されているときには機能しません。詳細については、「[内部メモリ内一時テーブルのサイズを制限する](#ams3-temptable-behavior-limit)」を参照してください。

**Example 1**  
一時テーブルの累積サイズが 20 GiB になることがわかっています。インメモリ一時テーブルを 2 GiB に設定し、ディスク上で最大 20 GiB に拡張します。  
`temptable_max_ram` を **2,147,483,648** に、`temptable_max_mmap` を **21,474,836,480** に設定します。これらの値はバイト単位です。  
これらのパラメータ設定により、一時テーブルが累積合計 22 GiB に拡張できます。

**Example 2**  
現在のインスタンスサイズは 16xlarge 以上です。必要な一時テーブルの合計サイズが不明です。最大 4 GiB のメモリと、ディスク上の使用可能な最大ストレージサイズまで使用できるようにしたいと思っています。  
`temptable_max_ram` を **4,294,967,296** に、`temptable_max_mmap` を **1,099,511,627,776** に設定します。これらの値はバイト単位です。  
`temptable_max_mmap` を 1 TiB に設定します。これは、16 倍の大きな Aurora DB インスタンスの最大ローカルストレージである 1.2 TiB 未満です。  
小さいインスタンスサイズで、使用可能なローカルストレージがいっぱいにならないように `temptable_max_mmap` の値を調整します。例えば、2xlarge インスタンスで使用できるローカルストレージは 160 GiB のみです。したがって、値を 160 GiB 未満に設定することをお勧めします。DB インスタンスサイズで使用可能なローカルストレージの詳細については、「[Aurora MySQL 用の一時ストレージの制限一時ストレージの制限](AuroraMySQL.Managing.Performance.md#AuroraMySQL.Managing.TempStorage)」を参照してください。

## Aurora MySQL DB インスタンスでの temptable\$1max\$1mmap パラメータの最適化
<a name="ams-optimize-temptable_max_mmap"></a>

Aurora MySQL の `temptable_max_mmap` パラメータは、ディスク上の InnoDB 一時テーブルにオーバーフローする (ライター DB インスタンス) 前、またはエラーを発生させる (リーダー DB インスタンス) 前に、メモリマップファイルで利用可能なローカルディスク領域の最大量を制御します。この DB インスタンスパラメータを適切に設定すると、DB インスタンスのパフォーマンスを最適化するのに役立ちます。

**前提条件**  

1. パフォーマンススキーマが有効になっていることを確認します。次の SQL コマンドを実行して、これを検証できます。

   ```
   SELECT @@performance_schema;
   ```

   出力値 `1` は、有効になっていることを示します。

1. 一時テーブルのメモリ計測が有効になっていることを確認します。次の SQL コマンドを実行して、これを検証できます。

   ```
   SELECT name, enabled FROM performance_schema.setup_instruments WHERE name LIKE '%memory%temptable%';
   ```

   `enabled` 列は、関連する一時テーブルのメモリ計測エントリに対して `YES` を示しています。

**一時テーブルの使用量のモニタリング**  
`temptable_max_mmap` の初期値を設定するときは、使用している DB インスタンスクラスのローカルストレージサイズの 80% から開始することをお勧めします。これにより、一時テーブルが効率的に動作するために十分なディスク容量が確保され、インスタンス上の他のディスク使用量のための容量も確保されます。  
DB インスタンスクラスのローカルストレージサイズを確認するには、「[Aurora MySQL 用の一時ストレージの制限一時ストレージの制限](AuroraMySQL.Managing.Performance.md#AuroraMySQL.Managing.TempStorage)」を参照してください。  
例えば、db.r5.large DB インスタンスクラスを使用している場合、ローカルストレージサイズは 32 GiB です。この場合、最初に `temptable_max_mmap` パラメータを 32 GiB の 80%、つまり 25.6 GiB に設定します。  
`temptable_max_mmap` の初期値を設定したら、Aurora MySQL インスタンスでピークワークロードを実行します。次の SQL クエリを使用して、一時テーブルの現在のディスク使用量と高いディスク使用量をモニタリングします。  

```
SELECT event_name, current_count, current_alloc, current_avg_alloc, high_count, high_alloc, high_avg_alloc
FROM sys.memory_global_by_current_bytes WHERE event_name LIKE 'memory/temptable/%';
```
このクエリによって以下の情報を取得します。  
+ `event_name` – 一時テーブルのメモリまたはディスク使用量イベントの名前。
+ `current_count` – 割り当てられている一時テーブルのメモリまたはディスクブロックの現在の数。
+ `current_alloc` – 一時テーブルに割り当てられているメモリまたはディスクの現在の量。
+ `current_avg_alloc` – 一時テーブルのメモリまたはディスクブロックの現在の平均サイズ。
+ `high_count` – 割り当てられている一時テーブルのメモリまたはディスクブロックの最大数。
+ `high_alloc` – 一時テーブルに割り当てられているメモリまたはディスクの最大量。
+ `high_avg_alloc` – 一時テーブルのメモリまたはディスクブロックの最大平均サイズ。
この設定を使用してクエリが Table is full エラーで失敗する場合、ワークロードが一時テーブルオペレーションにより多くのディスク容量を必要とすることを示します。この場合、DB インスタンスのサイズを、ローカルストレージ容量がより多いインスタンスサイズに増やすことを検討してください。

**最適な `temptable_max_mmap` 値の設定**  
`temptable_max_mmap` パラメータをモニタリングして適切なサイズを設定するには、次の手順に従います。  

1. 前のクエリの出力を確認し、`high_alloc` 列で示されている、一時テーブルのピークディスク使用量を特定します。

1. 一時テーブルのピークディスク使用量に基づいて、Aurora MySQL DB インスタンスの DB パラメータグループの `temptable_max_mmap` パラメータを調整します。

   将来の増加に対応するために、一時テーブルのピークディスク使用量よりもわずかに高い値を設定します。

1. DB インスタンスにパラメータグループの変更を適用します。

1. ピークワークロード中に一時テーブルのディスク使用量を再度モニタリングして、新しい `temptable_max_mmap` 値が適切であることを確認します。

1. 必要に応じて前のステップを繰り返して、`temptable_max_mmap` パラメータを微調整します。

## リーダー DB インスタンスでユーザーが作成した (明示的な) 一時テーブル
<a name="ams3-temptable-behavior.user"></a>

`CREATE TABLE` ステートメントの `TEMPORARY` キーワードを使用して、明示的な一時テーブルを作成できます。Aurora DB クラスター内のライター DB インスタンスでは、明示的な一時テーブルがサポートされています。リーダー DB インスタンスで明示的な一時テーブルを使用することもできますが、テーブルでは InnoDB ストレージエンジンの使用を強制することはできません。

Aurora MySQL Reader DB インスタンスで明示的な一時テーブルを作成する際のエラーを回避するには、次の方法のいずれか、または両方で、すべての `CREATE TEMPORARY TABLE` ステートメントを実行してください。
+ `ENGINE=InnoDB` 句を指定しないでください。
+ SQL モードを `NO_ENGINE_SUBSTITUTION` に設定しないでください。

## 一時テーブル作成エラーと軽減
<a name="ams3-temptable-behavior.errors"></a>

受け取るエラーは、プレーン `CREATE TEMPORARY TABLE` ステートメントまたはバリエーション `CREATE TEMPORARY TABLE AS SELECT` を使うかどうかによって異なります。次の例では、さまざまなタイプのエラーを示しています。

この一時テーブルの動作は、読み取り専用インスタンスにのみ適用されます。この初期の例では、セッションが接続されているインスタンスの種類を確認します。

```
mysql> select @@innodb_read_only;
+--------------------+
| @@innodb_read_only |
+--------------------+
|                  1 |
+--------------------+
```

プレーン `CREATE TEMPORARY TABLE` ステートメントの場合、`NO_ENGINE_SUBSTITUTION` SQL モードが有効になっているとステートメントは失敗します。メトリクス `NO_ENGINE_SUBSTITUTION` がオフ (デフォルト) の場合、適切なエンジン置換が行われ、一時テーブルの作成は成功します。

```
mysql> set sql_mode = 'NO_ENGINE_SUBSTITUTION';

mysql>  CREATE TEMPORARY TABLE tt2 (id int) ENGINE=InnoDB;
ERROR 3161 (HY000): Storage engine InnoDB is disabled (Table creation is disallowed).

mysql> SET sql_mode = '';

mysql> CREATE TEMPORARY TABLE tt4 (id int) ENGINE=InnoDB;

mysql> SHOW CREATE TABLE tt4\G
*************************** 1. row ***************************
       Table: tt4
Create Table: CREATE TEMPORARY TABLE `tt4` (
  `id` int DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
```

`CREATE TEMPORARY TABLE AS SELECT` ステートメントの場合、`NO_ENGINE_SUBSTITUTION` SQL モードが有効になっていると、ステートメントは失敗します。メトリクス `NO_ENGINE_SUBSTITUTION` がオフ (デフォルト) の場合、適切なエンジン置換が行われ、一時テーブルの作成は成功します。

```
mysql> set sql_mode = 'NO_ENGINE_SUBSTITUTION';

mysql> CREATE TEMPORARY TABLE tt1 ENGINE=InnoDB AS SELECT * FROM t1;
ERROR 3161 (HY000): Storage engine InnoDB is disabled (Table creation is disallowed).

mysql> SET sql_mode = '';

mysql> show create table tt3;
+-------+----------------------------------------------------------+
| Table | Create Table                                             |
+-------+----------------------------------------------------------+
| tt3   | CREATE TEMPORARY TABLE `tt3` (
  `id` int DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+----------------------------------------------------------+
1 row in set (0.00 sec)
```

Aurora MySQL バージョン 3 での一時テーブルのストレージ側面とパフォーマンスへの影響の詳細については、ブログ記事「[Amazon RDS for MySQL および Amazon Aurora MySQL の TempTable ストレージエンジンを使用する](https://aws.amazon.com/blogs/database/use-the-temptable-storage-engine-on-amazon-rds-for-mysql-and-amazon-aurora-mysql/)」を参照してください。

# Aurora MySQL バージョン 2 と Aurora MySQL バージョン 3 の比較
<a name="AuroraMySQL.Compare-v2-v3"></a>

Aurora MySQL バージョン 2 クラスターをバージョン 3 にアップグレードする際に注意すべき変更については、以下を参照してください。

**Topics**
+ [アトミックデータ定義言語 (DDL) のサポート](#AuroraMySQL.Compare-v2-v3-atomic-ddl)
+ [Aurora MySQL バージョン 2 と 3 の特徴の違い](#AuroraMySQL.Compare-v2-v3-features)
+ [インスタンスクラスのサポート](#AuroraMySQL.mysql80-instance-classes)
+ [Aurora MySQL バージョン 3 のパラメータ変更](#AuroraMySQL.mysql80-parameter-changes)
+ [ステータス可変](#AuroraMySQL.mysql80-status-vars)
+ [Aurora MySQL バージョン 3 に対する包括的な言語変更](#AuroraMySQL.8.0-inclusive-language)
+ [AUTO\$1INCREMENT 値](#AuroraMySQL.mysql80-autoincrement)
+ [バイナリログレプリケーション](#AuroraMySQL.mysql80-binlog)

## アトミックデータ定義言語 (DDL) のサポート
<a name="AuroraMySQL.Compare-v2-v3-atomic-ddl"></a>

MySQL 5.7 から 8.0 への最大の変更の 1 つは、[アトミックデータディクショナリ](https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html)の導入です。MySQL 8.0 より前では、MySQL データディクショナリはファイルベースのアプローチを使用して、テーブル定義 (.frm)、トリガー (.trg)、関数などのメタデータをストレージエンジンのメタデータ (InnoDB など) とは別に保存していました。これには、DDL オペレーション中に予期しない事態が発生した場合にテーブルが "[孤立](https://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html)" し、ファイルベースとストレージエンジンのメタデータが同期しなくなるリスクなど、いくつかの問題がありました。

これを修正するために、MySQL 8.0 は、`mysql` スキーマ内の内部 InnoDB テーブルのセットにすべてのメタデータを保存するアトミックデータディクショナリを導入しました。この新しいアーキテクチャは、古いファイルベースのアプローチから "アトミック DDL" 問題を解決し、データベースメタデータを管理するトランザクションの [ACID](https://en.wikipedia.org/wiki/ACID) 準拠の方法を提供します。アトミックデータディクショナリの詳細については、「MySQL リファレンスマニュアル」の「[Removal of file-based metadata storage](https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html)」と「[Atomic data definition statement support](https://dev.mysql.com/doc/refman/8.0/en/atomic-ddl.html)」を参照してください。**

このアーキテクチャの変更により、Aurora MySQL バージョン 2 からバージョン 3 にアップグレードする際には、次の点を考慮する必要があります。
+ バージョン 2 からのファイルベースのメタデータは、バージョン 3 へのアップグレードプロセス中に新しいデータディクショナリテーブルに移行する必要があります。移行されるデータベースオブジェクトの数によっては、時間がかかる場合があります。
+ また、この変更により、MySQL 5.7 から 8.0 にアップグレードする前に対処する必要がある可能性のある新しい非互換性が導入されました。例えば、8.0 には、既存のデータベースオブジェクト名と競合する可能性のある新しい予約キーワードがいくつかあります。

エンジンをアップグレードする前にこれらの非互換性を特定するため、Aurora MySQL は一連のアップグレード互換性チェック (事前チェック) を実行して、データディクショナリのアップグレードを実行する前に、データベースディクショナリに互換性のないオブジェクトがあるかどうかを判断します。事前チェックの詳細については、「[Aurora MySQL のメジャーバージョンアップグレードの事前チェック](AuroraMySQL.upgrade-prechecks.md)」を参照してください。

## Aurora MySQL バージョン 2 と 3 の特徴の違い
<a name="AuroraMySQL.Compare-v2-v3-features"></a>

次の Amazon Aurora MySQL 機能は Aurora MySQL 5.7 でサポートされていますが、これらの機能は現在 MySQL 8.0 の Aurora MySQL ではサポートされていません。
+ Aurora Serverless v1 クラスターに Aurora MySQL バージョン 3 を使用することはできません。Aurora MySQL バージョン 3 は Aurora Serverless v2 で動作します。
+ ラボモードは Aurora MySQL バージョン 3 には適用されません。Aurora MySQL バージョン 3 には、ラボモードの機能はありません。インスタント DDL は、過去にラボモードで使用可能だった高速オンライン DDL特徴よりも優先されます。例については、「[インスタント DDL (Aurora MySQL バージョン 3)](AuroraMySQL.Managing.FastDDL.md#AuroraMySQL.mysql80-instant-ddl)」を参照してください。
+ クエリキャッシュはコミュニティ MySQL 8.0 から削除され、Aurora MySQL バージョン 3 からも削除されます。
+ Aurora MySQL バージョン 3 はコミュニティ MySQL ハッシュ統合特徴と互換性があります。ハッシュ結合の Aurora 固有の実装は Aurora MySQL バージョン 2 では使用されていません。ハッシュ結合を Aurora パラレルクエリで使用する方法については、[パラレルクエリクラスターのハッシュ結合の有効化](aurora-mysql-parallel-query-enabling.md#aurora-mysql-parallel-query-enabling-hash-join) および [Aurora MySQL のヒント](AuroraMySQL.Reference.Hints.md) を参照してください。ハッシュ結合の一般的な使用方法については、*MySQL リファレンスマニュアル*の[ハッシュ結合の最適化](https://dev.mysql.com/doc/refman/8.0/en/hash-joins.html)を参照してください。
+ Aurora MySQL バージョン 2 で非推奨であったた `mysql.lambda_async` ストアドプロシージャは、バージョン 3 で削除されます。バージョン 3 では、非同期関数 `lambda_async` を代わりに使用します。
+ Aurora MySQL バージョン 3 のデフォルト文字セットは `utf8mb4` です。Aurora MySQL バージョン 2 のデフォルト文字セットは `latin1` です。この文字セットの詳細については、*MySQL リファレンスマニュアル*の[utf8mb4 文字セット (4 バイトの UTF-8 Unicode エンコード)](https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb4.html)を参照してください。

Aurora MySQL の一部の機能は、AWS リージョンと DB エンジンのバージョンの特定の組み合わせで利用可能です。詳細については、「[AWS リージョン と Aurora DB エンジンにより Amazon Aurora でサポートされている機能](Concepts.AuroraFeaturesRegionsDBEngines.grids.md)」を参照してください。

## インスタンスクラスのサポート
<a name="AuroraMySQL.mysql80-instance-classes"></a>

Aurora MySQL バージョン 3 では、Aurora MySQL バージョン 2 とは異なるインスタンスクラスのセットがサポートされています。
+ 大規模なインスタンスの場合は、`db.r5` や `db.r6g`、`db.x2g` のような最新のインスタンスクラスを使用できます。
+ 小規模なインスタンスの場合は、`db.t3` や `db.t4g` のような最新のインスタンスクラスを使用できます。
**注記**  
T DB インスタンスクラスは、開発サーバーおよびテストサーバー、またはその他の本稼働以外のサーバーにのみ使用することをお勧めします。T インスタンスクラスの詳細については、「[開発やテストのための T インスタンスクラスの使用](AuroraMySQL.BestPractices.Performance.md#AuroraMySQL.BestPractices.T2Medium)」を参照してください。

Aurora MySQL バージョン 2 の以下のインスタンスクラスは、Aurora MySQL バージョン 3 では使用できません。
+  `db.r4` 
+  `db.r3` 
+  `db.t3.small` 
+  `db.t2` 

 Aurora MySQL DB インスタンスを作成する CLI ステートメントを、すべて作成していないかどうかを管理スクリプトでチェックします。Aurora MySQL バージョン 3 では利用できないインスタンスクラス名をハードコードします。必要に応じて、Aurora MySQL バージョン 3 がサポートするインスタンス名に、インスタンスクラス名を変更します。

**ヒント**  
 Aurora MySQL バージョンと AWS リージョンの特定の組み合わせに使えるインスタンスクラスをチェックするには、`describe-orderable-db-instance-options` AWS CLI コマンドを使用して下さい。

 Aurora インスタンスクラスの詳細については、[Amazon Aurora DB インスタンスクラス](Concepts.DBInstanceClass.md) を参照してください。

## Aurora MySQL バージョン 3 のパラメータ変更
<a name="AuroraMySQL.mysql80-parameter-changes"></a>

Aurora MySQL バージョン 3 には、新しいクラスターレベルおよびインスタンスレベルの設定パラメータが含まれています。Aurora MySQL バージョン 3 では、Aurora MySQL バージョン 2 に存在していたいくつかのパラメータも削除されます。一部のパラメータ名は、包括語のイニシアチブの結果として変更されます。下位互換性のために、古い名前または新しい名前を使用してパラメータ値を取得できます。ただし、カスタム パラメータグループ内のパラメータ値を指定するには、新しい名前を使用する必要があります。

Aurora MySQL バージョン 3 では、`lower_case_table_names` パラメータ値はクラスターの作成時に永続的に設定されます。このオプションにデフォルト以外の値を使用する場合は、アップグレードする前に Aurora MySQL バージョン 3 のカスタム パラメータグループを設定します。次に、クラスターの作成またはスナップショットの復元操作中にパラメータグループを指定します。

**注記**  
Aurora MySQL に基づく Aurora グローバルデータベースでは、`lower_case_table_names` パラメータがオンの場合、Aurora MySQL バージョン 2 からバージョン 3 へのインプレースアップグレードを実行できません。代わりに、スナップショット復元方法を使用してください。

Aurora MySQL バージョン 3 では、`init_connect` および `read_only` パラメータは `CONNECTION_ADMIN` 権限を持つユーザーには適用されません。これには Aurora マスターユーザーが含まれます。詳細については、「[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model)」を参照してください。

すべての Aurora MySQL クラスターパラメータのリストについては、「[クラスターレベルのパラメータ](AuroraMySQL.Reference.ParameterGroups.md#AuroraMySQL.Reference.Parameters.Cluster)」を参照してください。この表では、Aurora MySQL バージョン 2 および 3 のすべてのパラメータについて説明します。この表には、Aurora MySQL バージョン 3 で新しく追加されたパラメータや Aurora MySQL バージョン 3 から削除されたパラメータを示す注記が含まれています。

すべての Aurora MySQL インスタンスパラメータのリストについては、「[インスタンスレベルのパラメータ](AuroraMySQL.Reference.ParameterGroups.md#AuroraMySQL.Reference.Parameters.Instance)」を参照してください。この表では、Aurora MySQL バージョン 2 および 3 のすべてのパラメータについて説明します。この表には、Aurora MySQL バージョン 3 で新しく追加されたパラメータがどれか、また Aurora MySQL バージョン 3 から削除されたパラメータはどれかを示した注記が含まれています。また、Aurora MySQL バージョン 3 ではなく、以前のバージョンで変更可能なパラメータを示す注記も含まれています。

変更されたパラメータ名の詳細については、[Aurora MySQL バージョン 3 に対する包括的な言語変更](#AuroraMySQL.8.0-inclusive-language) を参照してください。

## ステータス可変
<a name="AuroraMySQL.mysql80-status-vars"></a>

Aurora MySQL に適用できないステータス可変の詳細については、[Aurora MySQL に適応されない MySQL ステータス可変](AuroraMySQL.Reference.GlobalStatusVars.md#AuroraMySQL.Reference.StatusVars.Inapplicable) を参照してください。

## Aurora MySQL バージョン 3 に対する包括的な言語変更
<a name="AuroraMySQL.8.0-inclusive-language"></a>

 Aurora MySQL バージョン 3 は MySQL コミュニティ エディションのバージョン 8.0.23 と互換性があります。Aurora MySQL バージョン 3 には、包括語のキーワードやシステムスキーマに関連した MySQL 8.0.26 からの変更も含まれています。例えば、今では `SHOW SLAVE STATUS` の代わりに`SHOW REPLICA STATUS` コマンドが優先されるようになりました。

 次の Amazon CloudWatch メトリクスには、Aurora MySQL バージョン 3 の新しい名前が付けられています。

 Aurora MySQL バージョン 3 では、新しいメトリクス名のみを使用できます。Aurora MySQL バージョン 3 にアップグレードするときは、メトリクス名に依存するアラームやその他のオートメーションを必ず更新してください。


|  現在の名前  |  新しい名前  | 
| --- | --- | 
|  ForwardingMasterDMLLatency  |  ForwardingWriterDMLLatency  | 
|  ForwardingMasterOpenSessions  |  ForwardingWriterOpenSessions  | 
|  AuroraDMLRejectedMasterFull  |  AuroraDMLRejectedWriterFull  | 
|  ForwardingMasterDMLThroughput  |  ForwardingWriterDMLThroughput  | 

 Aurora MySQL バージョン 3 では、次のステータス可変に新しい名前が追加されました。

 Aurora MySQL バージョン 3 の初期のリリースでは、互換性のためにいずれかの名前を使用できます。古いステータス可変名は、将来のリリースで削除される予定です。


|  削除される名前  |  新しい名前または優先される名  | 
| --- | --- | 
|  Aurora\$1fwd\$1master\$1dml\$1stmt\$1duration  |  Aurora\$1fwd\$1writer\$1dml\$1stmt\$1duration  | 
|  Aurora\$1fwd\$1master\$1dml\$1stmt\$1count  |  Aurora\$1fwd\$1writer\$1dml\$1stmt\$1count  | 
|  Aurora\$1fwd\$1master\$1select\$1stmt\$1duration  |  Aurora\$1fwd\$1writer\$1select\$1stmt\$1duration  | 
|  Aurora\$1fwd\$1master\$1select\$1stmt\$1count  |  Aurora\$1fwd\$1writer\$1select\$1stmt\$1count  | 
|  Aurora\$1fwd\$1master\$1errors\$1session\$1timeout  |  Aurora\$1fwd\$1writer\$1errors\$1session\$1timeout  | 
|  Aurora\$1fwd\$1master\$1open\$1sessions  |  Aurora\$1fwd\$1writer\$1open\$1sessions  | 
|  Aurora\$1fwd\$1master\$1errors\$1session\$1limit  |  Aurora\$1fwd\$1writer\$1errors\$1session\$1limit  | 
|  Aurora\$1fwd\$1master\$1errors\$1rpc\$1timeout  |  Aurora\$1fwd\$1writer\$1errors\$1rpc\$1timeout  | 

Aurora MySQL バージョン 3 では、次の設定パラメータに新しい名前が付けられました。

互換性のため、`mysql` クライアントのパラメータ値をチェックするには、Aurora MySQL バージョン 3 の初期のリリースでいずれかの名前を使用します。カスタムパラメータグループ内の値を変更する場合、新しい名前のみ使用できます。古いパラメータ名は、将来のリリースで削除される予定です。


|  削除される名前  |  新しい名前または優先される名  | 
| --- | --- | 
|  aurora\$1fwd\$1master\$1idle\$1timeout  |  aurora\$1fwd\$1writer\$1idle\$1timeout  | 
|  aurora\$1fwd\$1master\$1max\$1connections\$1pct  |  aurora\$1fwd\$1writer\$1max\$1connections\$1pct  | 
|  master\$1verify\$1checksum  |  source\$1verify\$1checksum  | 
|  sync\$1master\$1info  |  sync\$1source\$1info  | 
|  init\$1slave  |  init\$1replica  | 
|  rpl\$1stop\$1slave\$1timeout  |  rpl\$1stop\$1replica\$1timeout  | 
|  log\$1slow\$1slave\$1statements  |  log\$1slow\$1replica\$1statements  | 
|  slave\$1max\$1allowed\$1packet  |  replica\$1max\$1allowed\$1packet  | 
|  slave\$1compressed\$1protocol  |  replica\$1compressed\$1protocol  | 
|  slave\$1exec\$1mode  |  replica\$1exec\$1mode  | 
|  slave\$1type\$1conversions  |  replica\$1type\$1conversions  | 
|  slave\$1sql\$1verify\$1checksum  |  replica\$1sql\$1verify\$1checksum  | 
|  slave\$1parallel\$1type  |  replica\$1parallel\$1type  | 
|  slave\$1preserve\$1commit\$1order  |  replica\$1preserve\$1commit\$1order  | 
|  log\$1slave\$1updates  |  log\$1replica\$1updates  | 
|  slave\$1allow\$1batching  |  replica\$1allow\$1batching  | 
|  slave\$1load\$1tmpdir  |  replica\$1load\$1tmpdir  | 
|  slave\$1net\$1timeout  |  replica\$1net\$1timeout  | 
|  sql\$1slave\$1skip\$1counter  |  sql\$1replica\$1skip\$1counter  | 
|  slave\$1skip\$1errors  |  replica\$1skip\$1errors  | 
|  slave\$1checkpoint\$1period  |  replica\$1checkpoint\$1period  | 
|  slave\$1checkpoint\$1group  |  replica\$1checkpoint\$1group  | 
|  slave\$1transaction\$1retries  |  replica\$1transaction\$1retries  | 
|  slave\$1parallel\$1workers  |  replica\$1parallel\$1workers  | 
|  slave\$1pending\$1jobs\$1size\$1max  |  replica\$1pending\$1jobs\$1size\$1max  | 
|  pseudo\$1slave\$1mode  |  pseudo\$1replica\$1mode  | 

 Aurora MySQL バージョン 3 では、次のストアドプロシージャは新しい名前になっています。

 Aurora MySQL バージョン 3 の初期のリリースでは、互換性のためにいずれかの名前を使用できます。以前のプロシージャ名は、将来のリリースで削除される予定です。


|  削除される名前  |  新しい名前または優先される名  | 
| --- | --- | 
|  mysql.rds\$1set\$1master\$1auto\$1position  |  mysql.rds\$1set\$1source\$1auto\$1position  | 
|  mysql.rds\$1set\$1external\$1master  |  mysql.rds\$1set\$1external\$1source  | 
|  mysql.rds\$1set\$1external\$1master\$1with\$1auto\$1position  |  mysql.rds\$1set\$1external\$1source\$1with\$1auto\$1position  | 
|  mysql.rds\$1reset\$1external\$1master  |  mysql.rds\$1reset\$1external\$1source  | 
|  mysql.rds\$1next\$1master\$1log  |  mysql.rds\$1next\$1source\$1log  | 

## AUTO\$1INCREMENT 値
<a name="AuroraMySQL.mysql80-autoincrement"></a>

 Aurora MySQL バージョン 3 では、各 DB インスタンスを再起動する際、Aurora は 各テーブルの `AUTO_INCREMENT` 値を保持します。Aurora MySQL バージョン 2 では、再起動後に `AUTO_INCREMENT` 値が保持されませんでした。

 スナップショットからの復元や、ポイントインタイムリカバリの実行、およびクラスターのクローン作成によって新しいクラスターを設定した場合、`AUTO_INCREMENT` 値は保持されません。この場合の `AUTO_INCREMENT` 値は、スナップショットが作成された時点のテーブル内の最大列値に基づいた値に初期化されます。この動作は、RDS for MySQL 8.0 では異なり、`AUTO_INCREMENT` 値はこれらのオペレーション中に保持されます。

## バイナリログレプリケーション
<a name="AuroraMySQL.mysql80-binlog"></a>

 MySQL 8.0 コミュニティエディションでは、バイナリログのレプリケーションがデフォルトで有効になっています。Aurora MySQL バージョン 3 では、バイナリログレプリケーションはデフォルトで無効になっています。

**ヒント**  
 Aurora 組み込みレプリケーション機能によって高可用性要件が満たされている場合は、バイナリログレプリケーションをオフにしておくことができます。これにより、バイナリログレプリケーションのパフォーマンスオーバーヘッドを回避できます。また、バイナリログレプリケーションの管理に必要な、関連するモニタリングおよびトラブルシューティングを回避することもできます。

 Aurora は MySQL 5.7 互換出典から Aurora MySQL バージョン 3 へのバイナリログレプリケーションをサポートしています。出典システムは、Aurora MySQL DB クラスター、RDS for MySQL DB インスタンス、またはオンプレミス MySQL インスタンスです。

 コミュニティ MySQL と同様に、Aurora MySQL は特定のバージョンを実行している出典から、同じメジャーバージョンまたは 1 つ以上のメジャーバージョンを実行するターゲットへのレプリケーションをサポートします。例えば、MySQL 5.6 互換システムから Aurora MySQL バージョン 3 へのレプリケーションはサポートされていません。Aurora MySQL バージョン 3 から MySQL 5.7 互換または MySQL 5.6 互換システムへのレプリケーションはサポートされていません。バイナリログのレプリケーションの詳細については、[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md) を参照してください。

 Aurora MySQL バージョン 3 には、フィルタリングされたレプリケーションなど、コミュニティ MySQL 8.0 でのバイナリログレプリケーションの改善が含まれています。コミュニティ MySQL 8.0 の改善の詳細については、*MySQL リファレンスマニュアル*の[サーバーがレプリケーションフィルタ規則を評価する方法](https://dev.mysql.com/doc/refman/8.0/en/replication-rules.html)を参照してください。

### バイナリログレプリケーションのトランザクション圧縮
<a name="AuroraMySQL.binlog-transaction-compression"></a>

 バイナリログ圧縮の使用方法については、MySQL リファレンスマニュアルの[バイナリログトランザクションの圧縮](https://dev.mysql.com/doc/refman/8.0/en/binary-log-transaction-compression.html)を参照してください。

 Aurora MySQL バージョン 3 のバイナリログ圧縮には、次の制限が適用されます。
+  バイナリログデータが最大許容パケットサイズより大きいトランザクションは圧縮されません。これは、Aurora MySQL バイナリログ圧縮設定が有効になっているかどうかに関係ありません。このようなトランザクションは、圧縮されずに複製されます。
+  MySQL 8.0 をまだサポートしていない変更データキャプチャ (CDC) にコネクターを使用している場合、この特徴は使用できません。サードパーティーのコネクターをバイナリログ圧縮でしっかりテストした後に、バイナリログ圧縮を有効にすることをお勧めします。また、CDC の binlog レプリケーションを使用するシステムでバイナリログ圧縮を有効にすることをお勧めします。

# Aurora MySQL バージョン 3 と MySQL 8.0 コミュニティエディションの比較
<a name="AuroraMySQL.Compare-80-v3"></a>

次の情報を使用して、別の MySQL 8.0 互換システムから Aurora MySQL バージョン 3 に変換する際の、注意すべき変更について知ることができます。

 一般に、Aurora MySQL バージョン 3 はコミュニティ MySQL 8.0.23 の特徴セットをサポートしています。MySQL 8.0 コミュニティエディションの一部の新機能は Aurora MySQL には適用されません。これらの機能の一部は、Aurora ストレージアーキテクチャなど Aurora の一部の側面と互換性がありません。Amazon RDS 管理サービスで同等の機能が提供されるため、その他の機能は必要ありません。コミュニティ MySQL 8.0 の次の機能は、Aurora MySQL バージョン 3 でサポートされていない、あるいは異なる動作をします。

 すべての Aurora MySQL バージョン 3 リリースのリリースノートについては、*Aurora MySQL のリリースノート*の「[Amazon Aurora MySQL バージョン 3 のデータベースエンジンの更新](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html)」を参照してください。

**Topics**
+ [MySQL 8.0 の機能はAurora MySQL バージョン 3 では利用できません](#AuroraMySQL.Compare-80-v3-features)
+ [ロールベースの特権モデル](#AuroraMySQL.privilege-model)
+ [データベースサーバー ID の確認](#AuroraMySQL.server-id)
+ [認証](#AuroraMySQL.mysql80-authentication)

## MySQL 8.0 の機能はAurora MySQL バージョン 3 では利用できません
<a name="AuroraMySQL.Compare-80-v3-features"></a>

コミュニティ MySQL 8.0 の次の機能は、Aurora MySQL バージョン 3 では利用できないか、異なる動作をします。
+ リソースグループと関連付けられた SQL ステートメントは、Aurora MySQL ではサポートされていません。
+ Aurora MySQL は、ユーザー定義の UNDO テーブルスペースおよび関連する SQL ステートメント (`CREATE UNDO TABLESPACE`、`ALTER UNDO TABLESPACE ... SET INACTIVE` および `DROP UNDO TABLESPACE` など) をサポートしていません。
+ Aurora MySQL は 3.06 より前のバージョンの Aurora MySQL の UNDO テーブルスペースの切り捨てをサポートしていません。Aurora MySQL バージョン 3.06 以降では、[UNDO テーブルスペースの自動切り捨て](https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html#truncate-undo-tablespace)がサポートされています。
+ パスワード検証プラグインがサポートされています。
+ パスワード検証プラグインを含め、MySQL プラグインの設定を変更することはできません。
+ X プラグインはサポートされていません。
+ マルチソースレプリケーションはサポートされません。

## ロールベースの特権モデル
<a name="AuroraMySQL.privilege-model"></a>

Aurora MySQL バージョン 3 では、`mysql` データベースのテーブルを直接変更できません。特に、`mysql.user` テーブルへの挿入によるユーザ設定ができません。代わりに、SQL 文を使用してロールベースの権限を付与します。また、`mysql` データベースでストアドプロシージャなど、他の種類のオブジェクトを作成することはできません。`mysql` テーブルにクエリを実行することはできます。バイナリログ レプリケーションを使用する場合、出典 クラスターの `mysql` テーブルへの直接的な変更は、ターゲット クラスターにレプリケートされません。

 場合によっては、`mysql` テーブルに挿入することで、アプリケーションがショートカットを使用して、ユーザーやその他のオブジェクトを作成する場合があります。その場合は、アプリケーションコードを変更して、`CREATE USER` などの対応したステートメントを使用します。アプリケーションが `mysql` データベースでストアドプロシージャまたはその他のオブジェクトを作成する場合は、代わりに別のデータベースを使用してください。

外部 MySQL データベースからの移行中にデータベースユーザーのメタデータをエクスポートするには、`mysqldump` の代わりに MySQL Shell コマンドを使用します。詳細については、「[インスタンスダンプユーティリティ、スキーマダンプユーティリティ、テーブルダンプユーティリティ](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-dump-instance-schema.html#mysql-shell-utilities-dump-about)」を参照してください。

多くのユーザーまたはアプリケーションの権限の管理を簡素化するには、`CREATE ROLE` ステートメントを使用して、一連の権限を持つロールを作成します。その後、`GRANT` および `SET ROLE` ステートメントと `current_role` 関数を使用して、ユーザーまたはアプリケーションにロールを割り当てたり、現在のロールを切り替えたり、有効なロールをチェックしたりできます。MySQL 8.0 でのロールベースのアクセス許可システムの詳細については、MySQL リファレンスマニュアルの[ロールの使用](https://dev.mysql.com/doc/refman/8.0/en/roles.html)を参照してください。

**重要**  
アプリケーションではマスターユーザーを直接使用しないことを強くお勧めします。代わりに、アプリケーションに必要な最小の特権で作成されたデータベースユーザーを使用するというベストプラクティスに従ってください。

**Topics**
+ [rds\$1superuser\$1role](#AuroraMySQL.privilege-model.rds_superuser_role)
+ [バイナリログレプリケーションの権限チェックユーザー](#AuroraMySQL.privilege-model.binlog)
+ [他の AWS サービスにアクセスするためのロール](#AuroraMySQL.privilege-model.other)

### rds\$1superuser\$1role
<a name="AuroraMySQL.privilege-model.rds_superuser_role"></a>

Aurora MySQL バージョン 3 には、以下のすべての権限を持つ特別なロールが含まれています。ロールの名前は `rds_superuser_role` です。各クラスターのプライマリ管理ユーザーには、既にこのロールが付与されています。`rds_superuser_role` ロールには、すべてのデータベースオブジェクトに対する次の権限が含まれます。
+ `ALTER`
+ `APPLICATION_PASSWORD_ADMIN`
+ `ALTER ROUTINE`
+ `CONNECTION_ADMIN`
+ `CREATE`
+ `CREATE ROLE`
+ `CREATE ROUTINE`
+ `CREATE TEMPORARY TABLES`
+ `CREATE USER`
+ `CREATE VIEW`
+ `DELETE`
+ `DROP`
+ `DROP ROLE`
+ `EVENT`
+ `EXECUTE`
+ `FLUSH_OPTIMIZER_COSTS` (Aurora MySQL バージョン 3.09 以降)
+ `FLUSH_STATUS` (Aurora MySQL バージョン 3.09 以降)
+ `FLUSH_TABLES` (Aurora MySQL バージョン 3.09 以降)
+ `FLUSH_USER_RESOURCES` (Aurora MySQL バージョン 3.09 以降)
+ `INDEX`
+ `INSERT`
+ `LOCK TABLES`
+ `PROCESS`
+ `REFERENCES`
+ `RELOAD`
+ `REPLICATION CLIENT`
+ `REPLICATION SLAVE`
+ `ROLE_ADMIN`
+ `SET_USER_ID`
+ `SELECT`
+ `SHOW DATABASES`
+ `SHOW_ROUTINE` (Aurora MySQL バージョン 3.04 以降)
+ `SHOW VIEW`
+ `TRIGGER`
+ `UPDATE`
+ `XA_RECOVER_ADMIN`

ロール定義には `WITH GRANT OPTION` が含まれるため、管理ユーザーはそのロールを他のユーザーに付与することができます。特に、Aurora MySQL クラスターをターゲットとしてバイナリログレプリケーションを実行するために必要な権限を、管理者は付与する必要があります。

**ヒント**  
権限の詳細全体を表示するには、次のステートメントを入力します。  

```
SHOW GRANTS FOR rds_superuser_role@'%';
SHOW GRANTS FOR name_of_administrative_user_for_your_cluster@'%';
```

### バイナリログレプリケーションの権限チェックユーザー
<a name="AuroraMySQL.privilege-model.binlog"></a>

Aurora MySQL バージョン 3 には、バイナリログ (binlog) レプリケーションの権限チェックユーザー `rdsrepladmin_priv_checks_user` が含まれています。`rds_superuser_role` の権限に加えて、このユーザーには `replication_applier` 権限があります。

`mysql.rds_start_replication` ストアドプロシージャを呼び出してバイナリログレプリケーションを有効にすると、`rdsrepladmin_priv_checks_user` が作成されます。

`rdsrepladmin_priv_checks_user@localhost` ユーザーは予約済みユーザーです。変更しないでください。

### 他の AWS サービスにアクセスするためのロール
<a name="AuroraMySQL.privilege-model.other"></a>

Aurora MySQL バージョン 3 には、他の AWS サービスにアクセスするために使用できるロールが含まれています。権限を付与する代わりに、これらのロールの多くを設定できます。例えば、`GRANT INVOKE LAMBDA ON *.* TO user` の代わりに `GRANT AWS_LAMBDA_ACCESS TO user` を指定します。他の AWS サービスにアクセスする手順については、[Amazon Aurora MySQL と他の AWS のサービスの統合](AuroraMySQL.Integrating.md) を参照してください。Aurora MySQLバージョン 3 には、他の AWS サービスへのアクセスに関連する次のロールが含まれています。
+ `AWS_LAMBDA_ACCESS` – `INVOKE LAMBDA` の権限の代替。使用に関する情報については、「[Amazon Aurora MySQL DB クラスターからの Lambda 関数の呼び出し](AuroraMySQL.Integrating.Lambda.md)」を参照してください。
+ `AWS_LOAD_S3_ACCESS` – `LOAD FROM S3` の権限の代替。使用に関する情報については、「[Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード](AuroraMySQL.Integrating.LoadFromS3.md)」を参照してください。
+ `AWS_SELECT_S3_ACCESS` – `SELECT INTO S3` の権限の代替。使用に関する情報については、「[Amazon Aurora MySQL DB クラスターから Amazon S3 バケット内のテキストファイルへのデータの保存](AuroraMySQL.Integrating.SaveIntoS3.md)」を参照してください。
+ `AWS_COMPREHEND_ACCESS` – `INVOKE COMPREHEND` の権限の代替。使用に関する情報については、「[データベースユーザーに Aurora 機械学習へのアクセスを許可する](mysql-ml.md#aurora-ml-sql-privileges)」を参照してください。
+ `AWS_SAGEMAKER_ACCESS` – `INVOKE SAGEMAKER` の権限の代替。使用に関する情報については、「[データベースユーザーに Aurora 機械学習へのアクセスを許可する](mysql-ml.md#aurora-ml-sql-privileges)」を参照してください。
+ `AWS_BEDROCK_ACCESS` – Amazon Bedrock には類似した `INVOKE` の権限はありません。使用に関する情報については、「[データベースユーザーに Aurora 機械学習へのアクセスを許可する](mysql-ml.md#aurora-ml-sql-privileges)」を参照してください。

Aurora MySQL バージョン 3 でロールを使用してアクセスを許可する場合は、`SET ROLE role_name` または `SET ROLE ALL` ステートメントを使用してロールも有効化します。以下の例のように指定します。`AWS_SELECT_S3_ACCESS` 用に適切なロール名を置き換えます。

```
# Grant role to user.

mysql> GRANT AWS_SELECT_S3_ACCESS TO 'user'@'domain-or-ip-address'

# Check the current roles for your user. In this case, the AWS_SELECT_S3_ACCESS role has not been activated.
# Only the rds_superuser_role is currently in effect.
mysql> SELECT CURRENT_ROLE();
+--------------------------+
| CURRENT_ROLE()           |
+--------------------------+
| `rds_superuser_role`@`%` |
+--------------------------+
1 row in set (0.00 sec)

# Activate all roles associated with this user using SET ROLE.
# You can activate specific roles or all roles.
# In this case, the user only has 2 roles, so we specify ALL.
mysql> SET ROLE ALL;
Query OK, 0 rows affected (0.00 sec)

# Verify role is now active
mysql> SELECT CURRENT_ROLE();
+-----------------------------------------------------+
| CURRENT_ROLE()                                      |
+-----------------------------------------------------+
| `AWS_SELECT_S3_ACCESS`@`%`,`rds_superuser_role`@`%` |
+-----------------------------------------------------+
```

## データベースサーバー ID の確認
<a name="AuroraMySQL.server-id"></a>

バイナリログ (binlog) レプリケーションには、データベースサーバー ID (`server_id`) が必要です。サーバー ID を確認する方法は、Aurora MySQL とコミュニティ MySQL では異なります。

コミュニティ MySQL では、サーバー ID は数字であり、サーバーにログインしている間に次の構文を使用して取得します。

```
mysql> select @@server_id;

+-------------+
| @@server_id |
+-------------+
| 2           |
+-------------+
1 row in set (0.00 sec)
```

Aurora MySQL では、サーバー ID は DB インスタンス ID であり、DB インスタンスにログインしている間に次の構文を使用して取得します。

```
mysql> select @@aurora_server_id;

+------------------------+
| @@aurora_server_id     |
+------------------------+
| mydbcluster-instance-2 |
+------------------------+
1 row in set (0.00 sec)
```

バイナリログレプリケーションの詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。

## 認証
<a name="AuroraMySQL.mysql80-authentication"></a>

コミュニティ MySQL 8.0 では、デフォルトの認証プラグインは `caching_sha2_password` です。Aurora MySQL バージョン 3 では、依然として `mysql_native_password` プラグインを使用します。`default_authentication_plugin` 設定は変更できません。ただし、新しいユーザーの作成と現在のユーザーの変更は可能であり、個々のパスワードでは新しい認証プラグインを使用します。次に例を示します。

```
mysql> CREATE USER 'testnewsha'@'%' IDENTIFIED WITH caching_sha2_password BY 'aNewShaPassword';
Query OK, 0 rows affected (0.74 sec)
```

# Aurora MySQL バージョン 3 へのアップグレード
<a name="AuroraMySQL.mysql80-upgrade-procedure"></a>

Aurora MySQL バージョン 2 からバージョン 3 にデータベースをアップグレードする方法については、「[Amazon Aurora MySQL DB クラスターのメジャーバージョンのアップグレード](AuroraMySQL.Updates.MajorVersionUpgrade.md)」を参照してください。

# MySQL 5.7 互換 Aurora MySQL バージョン 2
<a name="AuroraMySQL.CompareMySQL57"></a>

このトピックでは、Aurora MySQL バージョン 2 と MySQL 5.7 コミュニティエディションの違いについて説明します。

**重要**  
Aurora MySQL バージョン 2 は、2024 年 10 月 31 日 に標準サポートが終了しました。詳細については、「[Amazon Aurora MySQL 互換エディションバージョン 2 の標準サポート終了に向けて準備する](Aurora.MySQL57.EOL.md)」を参照してください。

## Aurora MySQL バージョン 2 ではサポートされていない機能
<a name="AuroraMySQL.CompareV2Community"></a>

次の機能は MySQL 5.7 ではサポートされていますが、現在、Aurora MySQL バージョン 2 ではサポートされていません。
+ `CREATE TABLESPACE` SQL ステートメント
+ グループのレプリケーションプラグイン
+ ページサイズの増加
+ 起動時の InnoDB バッファープールのロード
+ InnoDB フルテキストパーサープラグイン
+ マルチソースレプリケーション
+ オンラインバッファープールのサイズ変更
+ パスワード検証プラグイン – プラグインをインストールできますが、サポートされていません。プラグインをカスタマイズすることはできません。
+ クエリ書き換えプラグイン
+ レプリケーションフィルタリング
+ X プロトコル

これらの機能のの詳細については、[MySQL 5.7 のドキュメント](https://dev.mysql.com/doc/refman/5.7/en/)を参照してください。

## Aurora MySQL バージョン 2 での一時テーブルスペースの動作
<a name="AuroraMySQL.TempTables57"></a>

MySQL 5.7 では、一時テーブルスペースは自動的に拡張され、ディスク上の一時テーブルに対応できるように必要に応じてサイズが大きくなります。一時テーブルが削除されると、空いたスペースを新しい一時テーブルに再利用できますが、一時テーブルスペースは拡張されたサイズのままで縮小しません。一時テーブルスペースは、エンジンを再起動すると削除され、再作成されます。

Aurora MySQL バージョン 2 では、以下の動作が適用されます。
+ バージョン 2.10 以降で作成された新しい Aurora MySQL DB クラスターの場合、一時テーブルスペースは、データベースを再起動したときに削除され、再作成されます。これにより、動的なサイズ変更機能でストレージスペースを再利用できます。
+ 既存の Aurora MySQL DB クラスターを以下のようにアップグレードした場合:
  + バージョン 2.10 以上 - 一時テーブルスペースは、データベースを再起動したときに削除され、再作成されます。これにより、動的なサイズ変更機能でストレージスペースを再利用できます。
  + バージョン 2.09 — データベースを再起動しても、一時テーブルスペースは削除されません。

Aurora MySQL バージョン 2 の DB クラスターの一時テーブルスペースのサイズは、次のクエリを使用して確認できます。

```
SELECT
    FILE_NAME,
    TABLESPACE_NAME,
    ROUND((TOTAL_EXTENTS * EXTENT_SIZE) / 1024 / 1024 / 1024, 4) AS SIZE
FROM
    INFORMATION_SCHEMA.FILES
WHERE
    TABLESPACE_NAME = 'innodb_temporary';
```

詳細については、MySQL ドキュメントの「[一時テーブルスペース](https://dev.mysql.com/doc/refman/5.7/en/innodb-temporary-tablespace.html)」を参照してください。

## オンディスク一時テーブルのストレージエンジン
<a name="AuroraMySQL.StorageEngine57"></a>

Aurora MySQL バージョン 2 は、インスタンスのロールに応じて、オンディスク内部一時テーブルに異なるストレージエンジンを使用します。
+ ライターインスタンスでは、オンディスク一時テーブルはデフォルトで InnoDB ストレージエンジンを使用します。これらは Aurora クラスターボリュームの一時テーブルスペースに保存されます。

  DB パラメータ `internal_tmp_disk_storage_engine` の値を変更することで、ライターインスタンスのこの動作を変更できます。詳細については、「[インスタンスレベルのパラメータ](AuroraMySQL.Reference.ParameterGroups.md#AuroraMySQL.Reference.Parameters.Instance)」を参照してください。
+ リーダーインスタンスでは、オンディスク一時テーブルはローカルストレージを使用する MyISAM ストレージエンジンを使用します。これは、読み取り専用インスタンスでは Aurora クラスターボリュームにデータを保存できないためです。

# Amazon Aurora MySQL でのセキュリティ
<a name="AuroraMySQL.Security"></a>

Amazon Aurora MySQL のセキュリティは次の 3 つのレベルで管理されます。
+ Aurora MySQL DB クラスターと DB インスタンスに対する Amazon RDS 管理アクションを実行できるユーザーを管理するには、AWS Identity and Access Management (IAM) を使用します。IAM 認証情報を使用して AWS に接続している場合、AWS アカウントには、Amazon RDS の管理オペレーションを実行するためのアクセス許可を付与する IAM ポリシーが必要です。詳細については、[Amazon Aurora での Identity and Access Management](UsingWithRDS.IAM.md)を参照してください。

  IAM を使用して Amazon RDS コンソールにアクセスする場合は、まず、IAM ユーザーの認証情報を使用して AWS マネジメントコンソール にサインインしてください。次に、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) に移動します。
+ Amazon VPC サービスに基づいて仮想パブリッククラウド (VPC) に Aurora MySQL DB クラスターを作成します。VPC 内の Aurora MySQL DB クラスター用の DB インスタンスのエンドポイントとポートに対して接続を開くことができるデバイスと Amazon EC2 インスタンスを制御するには、VPC セキュリティグループを使用します。これらのエンドポイントおよびポート接続には、Transport Layer Security (TLS) を使用できます。さらに、会社のファイアウォールルールでも、社内のいずれのデバイスが DB インスタンスへの接続を開くことができるかを制御できます。VPC の詳細については、「[Amazon VPC と Amazon Aurora](USER_VPC.md)」を参照してください。

  サポートされている VPC テナンシーは、Aurora MySQL DB クラスターで使用している DB インスタンスクラスによって異なります。`default` VPC テナントでは、VPC は共有ハードウェアで実行されます。`dedicated` VPC テナンシーでは、VPC は専有のハードウェアインスタンスで実行されます。バースト可能パフォーマンス DB インスタンスクラスは、デフォルト VPC テナンシーのみをサポートしています。バースト可能パフォーマンス DB インスタンスクラスには、db.t2、db.t3、および db.t4g DB インスタンスクラスが含まれます。その他すべての Aurora MySQL DB インスタンスクラスでは、デフォルトおよび専用 VPC テナンシーの両方がサポートされています。
**注記**  
T DB インスタンスクラスは、開発サーバーおよびテストサーバー、またはその他の本稼働以外のサーバーにのみ使用することをお勧めします。T インスタンスクラスの詳細については、「[開発やテストのための T インスタンスクラスの使用](AuroraMySQL.BestPractices.Performance.md#AuroraMySQL.BestPractices.T2Medium)」を参照してください。

  インスタンスクラスの詳細については、「[Amazon Aurora DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。`default` および `dedicated` VPC テナントの詳細については、*Amazon Elastic Compute Cloud ユーザーガイド*の「[ハードウェア専有インスタンス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html)」を参照してください。
+ Amazon Aurora MySQL DB クラスターへのログインとアクセス権限を認証するには、以下の方法のいずれかを使用するか、複数を組み合わせて使用します。
  + MySQL のスタンドアロンインスタンスの場合と同じ方法を使用できます。

    `CREATE USER`、`RENAME USER`、`GRANT`、`REVOKE`、`SET PASSWORD` などのコマンドは、オンプレミスデータベースでの方法と同様に、データベーススキーマテーブルを直接変更します。詳細については、MySQL ドキュメントの「[アクセス制御およびアカウントマネジメント](https://dev.mysql.com/doc/refman/8.0/en/access-control.html)」を参照してください。
  + IAM データベース認証を使用することもできます。

    IAM データベース認証を使用する場合は、IAM ユーザーと IAM ロールのいずれかと認証トークンを使用して、DB クラスターを認証します。*認証トークン* は、署名バージョン 4 の署名プロセスを使用して生成されている一意の値です。IAM データベース認証では、同一の認証情報を使用して AWS リソースおよびデータベースへのアクセスを制御できます。詳細については、「[ の IAM データベース認証](UsingWithRDS.IAMDBAuth.md)」を参照してください。

**注記**  
詳細については、「[ Amazon Aurora でのセキュリティ](UsingWithRDS.md)」を参照してください。

以下のセクションでは、Aurora MySQL DB クラスターとの Aurora MySQL および TLS 接続のユーザーアクセス許可に関する情報を参照してください。

**Topics**
+ [Amazon Aurora MySQL でのマスターユーザー特権](#AuroraMySQL.Security.MasterUser)
+ [Aurora MySQL DB クラスターへの接続](#AuroraMySQL.Security.SSL)

## Amazon Aurora MySQL でのマスターユーザー特権
<a name="AuroraMySQL.Security.MasterUser"></a>

Amazon Aurora MySQL DB インスタンスを作成すると、マスターユーザーには [マスターユーザーアカウント権限](UsingWithRDS.MasterAccounts.md) にリストされているデフォルト権限が付与されます。

各 DB クラスターに管理サービスを提供するために、DB クラスターの作成時に `admin` および `rdsadmin` ユーザーが作成されます。`rdsadmin` アカウントの削除、名前の変更、パスワードの変更、または権限の変更を行おうとすると、エラーになります。

Aurora MySQL バージョン 2 の DB クラスターでは、DB クラスターの作成時に `admin` および `rdsadmin` ユーザーが作成されます。Aurora MySQL バージョン 3 の DB クラスターでは、`admin`、`rdsadmin`、および `rds_superuser_role` ユーザーが作成されます。

**重要**  
アプリケーションではマスターユーザーを直接使用しないことを強くお勧めします。代わりに、アプリケーションに必要な最小の特権で作成されたデータベースユーザーを使用するというベストプラクティスに従ってください。

Aurora MySQL DB クラスターの管理では、スタンダード的なコマンド `kill` と `kill_query` の使用は制限されています。Aurora MySQL DB インスタンスのユーザーセッションまたはクエリを終了するには、Amazon RDS の `rds_kill` コマンドと `rds_kill_query` コマンドを代わりに使用します。

**注記**  
データベースインスタンスおよびスナップショットの暗号化は、中国 (寧夏) リージョンではサポートされていません。

## Aurora MySQL DB クラスターへの接続
<a name="AuroraMySQL.Security.SSL"></a>

Amazon Aurora MySQL DB クラスターは、RDS for MySQL DB インスタンスと同じプロセスと公開鍵を使用したアプリケーションからの Transport Layer Security (TLS) 接続をサポートします。

Amazon RDS は、Amazon RDS がインスタンスをプロビジョニングするときに、TLS 証明書を作成し、その証明書を DB インスタンスにインストールします。これらの証明書は認証局によって署名されます。TLS 証明書には、なりすまし攻撃から保護するために、TLS 証明書の共通名 (CN) として DB インスタンスのエンドポイントが含まれています。その結果、クライアントがサブジェクト代替名 (SAN) をサポートしている場合は、DB クラスターエンドポイントのみを使用して、TLS を使用する DB クラスターに接続できます。それ以外の場合は、書き込みインスタンスのインスタンスを使用する必要があります。

証明書のダウンロードについては、[SSL/TLS を使用した DB クラスターへの接続の暗号化](UsingWithRDS.SSL.md) を参照してください。

TLS での SAN をサポートするクライアントとして、AWS JDBC ドライバーを推奨します。AWS JDBC ドライバーおよびその使用方法の詳細については、「[Amazon Web Services (AWS) JDBC ドライバー GitHub リポジトリ](https://github.com/aws/aws-advanced-jdbc-wrapper)」を参照してください。

**Topics**
+ [Aurora MySQL DB クラスターへの TLS 接続の要求](#AuroraMySQL.Security.SSL.RequireSSL)
+ [Aurora MySQL の TLS バージョン](#AuroraMySQL.Security.SSL.TLS_Version)
+ [Aurora PostgreSQL DB クラスターへの接続用暗号スイートを設定する](#AuroraMySQL.Security.SSL.ConfiguringCipherSuites)
+ [Aurora MySQL DB クラスターへの接続の暗号化](#AuroraMySQL.Security.SSL.EncryptingConnections)

### Aurora MySQL DB クラスターへの TLS 接続の要求
<a name="AuroraMySQL.Security.SSL.RequireSSL"></a>

`require_secure_transport` DB クラスターパラメータを使用することによって、Aurora MySQL DB クラスターへのすべてのユーザー接続が TLS を使用するように要求できます。デフォルトでは、`require_secure_transport` パラメータが `OFF` に設定されています。`require_secure_transport` パラメータを `ON` に設定して、DB クラスターへの接続で TLS を必須にすることができます。

`require_secure_transport` パラメータの値は、DB クラスターの DB クラスターパラメータグループを更新することで設定できます。変更を有効にするために、DB クラスターを再起動する必要はありません。パラメータグループの詳細については、「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。

**注記**  
`require_secure_transport` パラメータは、Aurora MySQL バージョン 2 および 3 で使用できます。このパラメータは、カスタム DB クラスターのパラメータグループで設定できます。このパラメータは、DB インスタンスパラメータグループでは使用できません。

DB クラスターに対して `require_secure_transport` パラメータが `ON` に設定されている場合、データベースクライアントが暗号化された接続を確立できれば、データベースクライアントはそのクラスターに接続できます。それ以外の場合は、次のようなエラーメッセージがクライアントに返されます。

```
MySQL Error 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.
```

### Aurora MySQL の TLS バージョン
<a name="AuroraMySQL.Security.SSL.TLS_Version"></a>

Aurora MySQL は Transport Layer Security (TLS) バージョン 1.0、1.1、1.2、および 1.3 をサポートしています。Aurora MySQL バージョン 3.04.0 以降では、TLS 1.3 プロトコルを使用して接続を保護できます。次の表は、Aurora MySQL バージョンの TLS サポートを示しています。


****  

| Aurora MySQL バージョン | TLS 1.0 | TLS 1.1 | TLS 1.2 | TLS 1.3 | デフォルト | 
| --- | --- | --- | --- | --- | --- | 
|  Aurora MySQL バージョン 2  | 廃止 | 廃止 |  サポート対象  | サポートされていません | サポートされているすべての TLS バージョン | 
|  Aurora MySQL バージョン 3 (3.04.0 より前)  | 廃止 | 廃止 | サポート対象 | サポートされていません | サポートされているすべての TLS バージョン | 
|  Aurora MySQL バージョン 3 (3.04.0 以降)  | サポートされません  | サポート外  | サポート対象 | サポート | サポートされているすべての TLS バージョン | 

**重要**  
バージョン 2 と 3.04.0 より前のバージョンの Aurora MySQL クラスターでカスタムパラメータグループを使用している場合、TLS 1.0 と 1.1 は安全性が低いため、TLS 1.2 を使用することをお勧めします。MySQL 8.0.26 と Aurora MySQL 3.03 のコミュニティエディションとそのマイナーバージョンでは、TLS バージョン 1.1 と 1.0 のサポートが廃止されました。  
MySQL 8.0.28 のコミュニティエディションと互換性のある Aurora MySQL バージョン 3.04.0 以降は、TLS 1.1 と TLS 1.0 をサポートしていません。Aurora MySQL バージョン 3.04.0 以降を使用している場合は、カスタムパラメータグループで TLS プロトコルを 1.0 と 1.1 に設定しないでください。  
Aurora MySQL バージョン 3.04.0 以降では、デフォルト設定は TLS 1.3 と TLS 1.2 です。

`tls_version` DB クラスターパラメータを使用して、許可されたプロトコルバージョンを指定できます。ほとんどのクライアントツールまたはデータベースドライバには、同様のクライアントパラメータがあります。古いクライアントの中には、新しい TLS バージョンをサポートしていないものもあります。デフォルトでは、DB クラスターは、サーバーとクライアントの設定の両方で許可されている最高の TLS プロトコルバージョンを使用しようとします。

`tls_version` DB クラスターパラメータを次のいずれかの値に設定します。
+ `TLSv1.3` 
+ `TLSv1.2` 
+ `TLSv1.1`
+ `TLSv1`

`tls_version` パラメータは、カンマで区切られたリストの文字列として設定することもできます。TLS 1.2 プロトコルと TLS 1.3 プロトコルの両方を使用する場合は、最下位プロトコルから最上位プロトコルまでのすべてのプロトコルを `tls_version` パラメータに含める必要があります。この場合、`tls_version` は次のように設定されます。

```
tls_version=TLSv1.2,TLSv1.3
```

DB クラスターのパラメータグループの変更については、「[Amazon Aurora での DB クラスターパラメータグループのパラメータの変更](USER_WorkingWithParamGroups.ModifyingCluster.md)」を参照してください。AWS CLI を使用する場合、`tls_version` DB クラスターのパラメータの変更には、`ApplyMethod` に `pending-reboot` を設定している必要があります。アプリケーションのメソッドが `pending-reboot` の場合は、パラメータグループに関連付けられている DB クラスターを停止および再起動した後に、パラメータの変更が適用されます。

### Aurora PostgreSQL DB クラスターへの接続用暗号スイートを設定する
<a name="AuroraMySQL.Security.SSL.ConfiguringCipherSuites"></a>

設定可能な暗号スイートを使用すると、データベース接続のセキュリティをより詳細に制御できます。データベースへのクライアント TLS 接続を保護するために許可する暗号スイートのリストを指定できます。設定可能な暗号スイートを使用すると、データベースサーバーが受け入れる接続暗号化を制御できます。これにより、安全でない暗号や非推奨の暗号の使用を防ぐことができます。

設定可能な暗号スイートは、Aurora MySQL バージョン 3 および Aurora MySQL バージョン 2 でサポートされています。接続を暗号化するために許容できる TLS 1.2、TLS 1.1、TLS 1.0 暗号のリストを指定するには、`ssl_cipher` クラスターパラメータを変更します。AWS マネジメントコンソール、AWS CLI、または RDS API を使用して、クラスターパラメータグループ内の `ssl_cipher` パラメータを設定します。

`ssl_cipher` パラメータを、TLS バージョンのカンマ区切りの暗号値の文字列に設定します。クライアントアプリケーションでは、データベースに接続するときに `--ssl-cipher` オプションを使用することによって、暗号化接続に使用する暗号を指定できます。データベースへの接続の詳細については、「[Amazon Aurora MySQL DB クラスターへの接続](Aurora.Connecting.md#Aurora.Connecting.AuroraMySQL)」を参照してください。

Aurora MySQL バージョン 3.04.0 以降では、TLS 1.3 暗号スイートを指定できるようになりました。許容される TLS 1.3 暗号スイートを指定するには、パラメータグループの `tls_ciphersuites` パラメータを変更します。TLS 1.3 では、命名規則が変更され、鍵交換メカニズムと証明書が使用されなくなったため、使用可能な暗号スイートの数が減少しました。`tls_ciphersuites` パラメータを、カンマ区切りの TLS 1.3 の暗号値の文字列に設定します。

次の表に、サポートされている暗号と、各暗号の TLS 暗号化プロトコルおよび有効な Aurora MySQL エンジンのバージョンを示します。


| 暗号 | 暗号化プロトコル | サポートされている Aurora MySQL バージョン | 
| --- | --- | --- | 
| `ECDHE-RSA-AES128-SHA` | TLS 1.0 | 3.04.0 以降、2.11.0 以降 | 
| `ECDHE-RSA-AES128-SHA256` | TLS 1.2 | 3.04.0 以降、2.11.0 以降 | 
| `ECDHE-RSA-AES128-GCM-SHA256` | TLS 1.2 | 3.04.0 以降、2.11.0 以降 | 
| `ECDHE-RSA-AES256-SHA` | TLS 1.0 | 3.04.0 以降、2.11.0 以降 | 
| `ECDHE-RSA-AES256-GCM-SHA384` | TLS 1.2 | 3.04.0 以降、2.11.0 以降 | 
| `ECDHE-RSA-CHACHA20-POLY1305` | TLS 1.2 | 3.04.0 以降、2.11.0 以降 | 
| `ECDHE-ECDSA-AES128-SHA` | TLS 1.0 | 3.04.0 以降、2.11.0 以降 | 
| `ECDHE-ECDSA-AES256-SHA` | TLS 1.0 | 3.04.0 以降、2.11.0 以降 | 
| `ECDHE-ECDSA-AES128-GCM-SHA256` | TLS 1.2 | 3.04.0 以降、2.11.0 以降 | 
| `ECDHE-ECDSA-AES256-GCM-SHA384` | TLS 1.2 | 3.04.0 以降、2.11.0 以降 | 
| `ECDHE-ECDSA-CHACHA20-POLY1305` | TLS 1.2 | 3.04.0 以降、2.11.0 以降 | 
| `TLS_AES_128_GCM_SHA256` | TLS 1.3 | 3.04.0 以上 | 
| `TLS_AES_256_GCM_SHA384` | TLS 1.3 | 3.04.0 以上 | 
| `TLS_CHACHA20_POLY1305_SHA256` | TLS 1.3 | 3.04.0 以上 | 

DB クラスターのパラメータグループの変更については、「[Amazon Aurora での DB クラスターパラメータグループのパラメータの変更](USER_WorkingWithParamGroups.ModifyingCluster.md)」を参照してください。CLI を使用して `ssl_cipher` DB クラスターのパラメータを変更する場合には、`ApplyMethod` を `pending-reboot` に設定してください。アプリケーションのメソッドが `pending-reboot` の場合は、パラメータグループに関連付けられている DB クラスターを停止および再起動した後に、パラメータの変更が適用されます。

また、CLI コマンドの [describe-engine-default-cluster-parameters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-engine-default-cluster-parameters.html) を使用して、特定のパラメータグループファミリーで現在サポートされている暗号スイートを特定することもできます。次の例は、Aurora MySQL バージョン 2 の `ssl_cipher` クラスターパラメータで許可される値を取得する方法を示しています。

```
aws rds describe-engine-default-cluster-parameters --db-parameter-group-family aurora-mysql5.7

        ...some output truncated...
	{
        "ParameterName": "ssl_cipher",
        "ParameterValue": "ECDHE-RSA-AES128-SHA,ECDHE-RSA-AES128-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-SHA,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-RSA-CHACHA20-POLY1305,ECDHE-ECDSA-AES256-SHA,ECDHE-ECDSA-CHACHA20-POLY1305,ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA",
        "Description": "The list of permissible ciphers for connection encryption.",
        "Source": "system",
        "ApplyType": "static",
        "DataType": "list",
        "AllowedValues": "ECDHE-RSA-AES128-SHA,ECDHE-RSA-AES128-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-SHA,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-RSA-CHACHA20-POLY1305,ECDHE-ECDSA-AES256-SHA,ECDHE-ECDSA-CHACHA20-POLY1305,ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA",
        "IsModifiable": true,
        "SupportedEngineModes": [
            "provisioned"
        ]
    },
       ...some output truncated...
```

暗号の詳細については、MySQL ドキュメントの「[ssl\$1cipher](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_ssl_cipher)」を参照してください。暗号スイートの形式の詳細については、OpenSSL ウェブサイトの「[openssl 暗号リスト形式](https://www.openssl.org/docs/manmaster/man1/openssl-ciphers.html#CIPHER-LIST-FORMAT)」と「[openssl 暗号文字列形式](https://www.openssl.org/docs/manmaster/man1/openssl-ciphers.html#CIPHER-STRINGS)」のドキュメントを参照してください。

### Aurora MySQL DB クラスターへの接続の暗号化
<a name="AuroraMySQL.Security.SSL.EncryptingConnections"></a>

デフォルトの `mysql` クライアントを使用して接続を暗号化するには、以下の例のように、`--ssl-ca` パラメータを使用して mysql クライアントを起動します。

MySQL 5.7 および 8.0 向け:

```
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com
--ssl-ca=full_path_to_CA_certificate --ssl-mode=VERIFY_IDENTITY
```

MySQL 5.6 向け:

```
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com
--ssl-ca=full_path_to_CA_certificate --ssl-verify-server-cert
```

*full\$1path\$1to\$1CA\$1certificate* を、認証局 (CA) の証明書に対する完全なパスに置き換えます。証明書のダウンロードについては、「[SSL/TLS を使用した DB クラスターへの接続の暗号化](UsingWithRDS.SSL.md)」を参照してください。

特定のユーザーアカウントに対して TLS 接続を要求できます。例えば、MySQL バージョンに応じて以下のいずれかのステートメントを使用し、ユーザーアカウント `encrypted_user` に対して TLS 接続を要求できます。

MySQL 5.7 および 8.0 向け:

```
ALTER USER 'encrypted_user'@'%' REQUIRE SSL;            
```

MySQL 5.6 向け:

```
GRANT USAGE ON *.* TO 'encrypted_user'@'%' REQUIRE SSL;
```

 RDS プロキシを使用する場合は、通常のクラスターエンドポイントではなく、プロキシエンドポイントに接続します。Aurora DB クラスターへの直接接続の場合と同様に、プロキシへの SSL/TLS 接続を必須またはオプションにすることができます。RDS プロキシの使用の詳細については、「[Amazon RDS Proxy for Aurora](rds-proxy.md)」を参照してください。

**注記**  
MySQL での TLS 接続の詳細については、[MySQL ドキュメント](https://dev.mysql.com/doc/refman/5.7/en/using-encrypted-connections.html)を参照してください。

# 新しい TLS 証明書を使用して Aurora MySQL DB クラスターに接続するようにアプリケーションを更新する
<a name="ssl-certificate-rotation-aurora-mysql"></a>

202323 年 1 月 13 日に、Amazon RDS は、Transport Layer Security（TLS）を使用して Aurora DB クラスターに接続するための新しい認証局（CA）証明書を公開しました。ここでは、新しい証明書を使用するためのアプリケーションの更新について説明します。

このトピックでは、クライアントアプリケーションが DB クラスターへの接続に TLS を使用するかどうかを判断する方法を説明します。該当する場合はさらに、それらのアプリケーションの接続に証明書の検証が必要かどうかを確認できます。

**注記**  
一部のアプリケーションは、サーバー上の証明書を正常に検証できる場合にのみ、Aurora MySQL DB クラスターに接続されるように設定されています。  
そのようなアプリケーションの場合は、新しい CA 証明書を含むように、クライアントアプリケーションの信頼ストアを更新する必要があります。

クライアントアプリケーションの信頼ストアで CA 証明書を更新した後、DB クラスターで証明書をローテーションできます。これらの手順を開発環境またはステージング環境でテストしてから、本番環境で実装することを強くお勧めします。

証明書のローテーションの詳細については、「[SSL/TLS 証明書のローテーション](UsingWithRDS.SSL-certificate-rotation.md)」を参照してください。証明書のダウンロードの詳細については、[SSL/TLS を使用した DB クラスターへの接続の暗号化](UsingWithRDS.SSL.md) を参照してください。Aurora MySQL DB クラスターで TLS を使用する方法については、「[Aurora MySQL DB クラスターへの接続](AuroraMySQL.Security.md#AuroraMySQL.Security.SSL)」を参照してください。

**Topics**
+ [アプリケーションが TLS を使用して Aurora MySQL DB クラスターに接続しているかどうかの確認](#ssl-certificate-rotation-aurora-mysql.determining-server)
+ [クライアントが接続するために証明書の検証が必要かどうかの確認](#ssl-certificate-rotation-aurora-mysql.determining-client)
+ [アプリケーション信頼ストアの更新](#ssl-certificate-rotation-aurora-mysql.updating-trust-store)
+ [TLS 接続を確立するための Java コードの例](#ssl-certificate-rotation-aurora-mysql.java-example)

## アプリケーションが TLS を使用して Aurora MySQL DB クラスターに接続しているかどうかの確認
<a name="ssl-certificate-rotation-aurora-mysql.determining-server"></a>

Aurora MySQL バージョン 2（MySQL 5.7 と互換性あり）を使用しており、パフォーマンススキーマが有効になっている場合は、次のクエリを実行すると、接続で TLS が使用されているかどうかを確認できます。Performance Schemaを有効にする方法については、MySQL ドキュメントの「[Performance Schemaクイックスタート](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-quick-start.html)」を参照してください。

```
mysql> SELECT id, user, host, connection_type
       FROM performance_schema.threads pst
       INNER JOIN information_schema.processlist isp
       ON pst.processlist_id = isp.id;
```

この出力例では、`webapp1` が TLS を使用しているため、ユーザー独自のセッション (`admin`) と、ログインしているアプリケーションの両方を確認できます。

```
+----+-----------------+------------------+-----------------+
| id | user            | host             | connection_type |
+----+-----------------+------------------+-----------------+
|  8 | admin           | 10.0.4.249:42590 | SSL/TLS         |
|  4 | event_scheduler | localhost        | NULL            |
| 10 | webapp1         | 159.28.1.1:42189 | SSL/TLS         |
+----+-----------------+------------------+-----------------+
3 rows in set (0.00 sec)
```

## クライアントが接続するために証明書の検証が必要かどうかの確認
<a name="ssl-certificate-rotation-aurora-mysql.determining-client"></a>

JDBC クライアントおよび MySQL クライアントを接続するために証明書の検証が必要かどうかを確認できます。

### JDBC
<a name="ssl-certificate-rotation-aurora-mysql.determining-client.jdbc"></a>

MySQL Connector/J 8.0 を使用した次の例では、アプリケーションの JDBC 接続プロパティをチェックして、正常な接続に有効な証明書が必要かどうかを確認する 1 つの方法を示します。MySQL のすべての JDBC 接続オプションの詳細については、MySQL ドキュメントの「[設定プロパティ](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html)」を参照してください。

MySQL Connector/J 8.0 を使用するとき、次の例のように、接続プロパティで `sslMode` が `VERIFY_CA` または `VERIFY_IDENTITY` に設定されている場合、TLS 接続にはサーバー CA 証明書に対する検証が必要です。

```
Properties properties = new Properties();
properties.setProperty("sslMode", "VERIFY_IDENTITY");
properties.put("user", DB_USER);
properties.put("password", DB_PASSWORD);
```

**注記**  
MySQL Java Connector v5.1.38 以降または MySQL Java Connector v8.0.9 以降を使用してデータベースに接続する場合、データベースへの接続時に TLS を使用するようにアプリケーションを明示的に設定しなくても、これらのクライアントドライバーはデフォルトで TLS を使用します。また、TLS の使用時に部分的な証明書検証が実行され、データベースサーバー証明書の有効期限が切れている場合、接続に失敗します。

### MySQL
<a name="ssl-certificate-rotation-aurora-mysql.determining-client.mysql"></a>

MySQL クライアントの以下の例では、スクリプトの MySQL 接続をチェックして、正常な接続に有効な証明書が必要かどうかを確認する 2 つの方法を示します。MySQL クライアントで使用するすべての接続オプションの詳細については、MySQL ドキュメントの「[ Client-Side Configuration for Encrypted Connections](https://dev.mysql.com/doc/refman/8.0/en/using-encrypted-connections.html#using-encrypted-connections-client-side-configuration)」を参照してください。

MySQL 5.7 または MySQL 8.0 クライアントを使用しているとき、次の例のように、`--ssl-mode` オプションに `VERIFY_CA` または `VERIFY_IDENTITY` を指定した場合、TLS 接続にはサーバー CA 証明書に対する検証が必要です。

```
mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-mode=VERIFY_CA
```

MySQL 5.6 クライアントを使用するとき、次の例のように、`--ssl-verify-server-cert` オプションを指定する場合、SSL 接続にはサーバー CA 証明書に対する検証が必要です。

```
mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-verify-server-cert
```

## アプリケーション信頼ストアの更新
<a name="ssl-certificate-rotation-aurora-mysql.updating-trust-store"></a>

MySQL アプリケーションの信頼ストアの更新については、MySQL ドキュメントの「[Installing SSL Certificates](https://dev.mysql.com/doc/mysql-monitor/8.0/en/mem-ssl-installation.html)」を参照してください。

**注記**  
信頼ストアを更新するとき、新しい証明書を追加できるだけでなく、古い証明書を保持できます。

### JDBC のアプリケーション信頼ストアの更新
<a name="ssl-certificate-rotation-aurora-mysql.updating-trust-store.jdbc"></a>

TLS 接続に JDBC を使用するアプリケーションの信頼ストアを更新できます。

ルート証明書のダウンロードについては、[SSL/TLS を使用した DB クラスターへの接続の暗号化](UsingWithRDS.SSL.md) を参照してください。

証明書をインポートするサンプルスクリプトについては、[証明書を信頼ストアにインポートするためのサンプルスクリプト](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-sample-script) を参照してください。

アプリケーションで mysql JDBC ドライバーを使用している場合は、アプリケーションで以下のプロパティを設定します。

```
System.setProperty("javax.net.ssl.trustStore", certs);
System.setProperty("javax.net.ssl.trustStorePassword", "password");
```

**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

アプリケーションを起動するとき、以下のプロパティを設定します。

```
java -Djavax.net.ssl.trustStore=/path_to_truststore/MyTruststore.jks -Djavax.net.ssl.trustStorePassword=my_truststore_password com.companyName.MyApplication
```

## TLS 接続を確立するための Java コードの例
<a name="ssl-certificate-rotation-aurora-mysql.java-example"></a>

次のコード例では、JDBC を使用してサーバー証明書を検証する SSL 接続のセットアップ方法を示します。

```
public class MySQLSSLTest {

        private static final String DB_USER = "user name";
        private static final String DB_PASSWORD = "password";
        // This key store has only the prod root ca.
        private static final String KEY_STORE_FILE_PATH = "file-path-to-keystore";
        private static final String KEY_STORE_PASS = "keystore-password";

    public static void test(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");


        System.setProperty("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH);
        System.setProperty("javax.net.ssl.trustStorePassword", KEY_STORE_PASS);

        Properties properties = new Properties();
        properties.setProperty("sslMode", "VERIFY_IDENTITY");
        properties.put("user", DB_USER);
        properties.put("password", DB_PASSWORD);

        Connection connection = DriverManager.getConnection("jdbc:mysql://jagdeeps-ssl-test.cni62e2e7kwh.us-east-1.rds.amazonaws.com:3306",properties);
        Statement stmt=connection.createStatement();

        ResultSet rs=stmt.executeQuery("SELECT 1 from dual");

        return;
    }
}
```

**重要**  
データベース接続で TLS を使用することを決定し、アプリケーションの信頼ストアを更新したら、rds-ca-rsa2048-g1 証明書を使用するようにデータベースを更新できます。ステップについては、「[DB インスタンスの変更による CA 証明書の更新](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-updating)」のステップ 3 を参照してください。

# Aurora MySQL での Kerberos 認証の使用
<a name="aurora-mysql-kerberos"></a>

Aurora MySQL DB クラスターに接続するユーザーを Kerberos 認証を使用して認証できるようになりました。そのためには、Kerberos 認証に AWS Directory Service for Microsoft Active Directory を使用するように DB クラスターを設定します。AWS Directory Service for Microsoft Active Directory は AWS Managed Microsoft AD とも呼ばれます。これは、Directory Service で利用できる機能です。詳細については、「*AWS Directory Service 管理ガイド*」の「[Directory Service とは](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/what_is.html)」を参照してください。

まず、ユーザー認証情報を格納する AWS Managed Microsoft AD ディレクトリを作成します。次に、Active Directory のドメインおよびその他の情報を Aurora MySQL DB クラスターに提供します。ユーザーが Aurora MySQL クラスターを使用して認証を実行すると、認証要求は AWS Managed Microsoft AD ディレクトリに転送されます。

同じディレクトリにすべての認証情報を保持することで時間と労力を節約できます。この方法により、複数の DB クラスターの認証情報を一元的に保存および管理できます。また、ディレクトリを使用することで、セキュリティプロファイル全体を向上できます。

また、独自のオンプレミスの Microsoft Active Directory から認証情報にアクセスできます。そのためには、信頼するドメイン関係を作成して、AWS Managed Microsoft AD ディレクトリがオンプレミスの Microsoft Active Directory を信頼するようにします。これにより、ユーザーは、オンプレミスネットワークのワークロードにアクセスするときと同じ Windows シングルサインオン (SSO) の使い方で、Aurora MySQL クラスターにアクセスできます。

データベースは Kerberos、AWS Identity and Access Management (IAM)、または Kerberos 認証と IAM 認証の両方。ただし、Kerberos 認証と IAM 認証では異なる認証方法が提供されるため、特定のユーザーは、どちらか一方の認証方法のみを使用してデータベースにログインできますが、両方を使用することはできません。IAM 認証の詳細については、「[ の IAM データベース認証](UsingWithRDS.IAMDBAuth.md)」を参照してください。

**Contents**
+ [Aurora MySQL DB クラスターの Kerberos 認証の概要](#aurora-mysql-kerberos-setting-up-overview)
+ [Aurora MySQL の Kerberos 認証の制限事項](#aurora-mysql-kerberos.limitations)
+ [Aurora MySQL DB クラスターの Kerberos 認証の設定](aurora-mysql-kerberos-setting-up.md)
  + [ステップ 1: AWS Managed Microsoft AD を使用してディレクトリを作成する](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-directory)
  + [ステップ 2: (オプション) オンプレミスの Active Directory の信頼を作成する](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-trust)
  + [ステップ 3: Amazon Aurora 用の IAM ロールを作成する](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.CreateIAMRole)
  + [ステップ 4: ユーザーを作成して設定する](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-users)
  + [ステップ 5: Aurora MySQL DB クラスターを作成または変更する](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-modify)
  + [ステップ 6: Kerberos 認証を使用する Aurora MySQL ユーザーを作成する](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-logins)
    + [既存の Aurora MySQL ログインの変更](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos.modify-login)
  + [ステップ 7: MySQL クライアントを設定する](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.configure-client)
  + [ステップ 8: (オプション) 大文字と小文字を区別しないユーザー名比較の設定](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.case-insensitive)
+ [Kerberos 認証を使用した Aurora MySQL への接続](aurora-mysql-kerberos-connecting.md)
  + [Aurora MySQL Kerberos ログインを使用して DB クラスターに接続する](aurora-mysql-kerberos-connecting.md#aurora-mysql-kerberos-connecting.login)
  + [Aurora グローバルデータベースで Kerberos 認証を使用する](aurora-mysql-kerberos-connecting.md#aurora-mysql-kerberos-connecting.global)
  + [RDS for MySQL から Aurora MySQL への移行](aurora-mysql-kerberos-connecting.md#aurora-mysql-kerberos-connecting.rds)
  + [チケットキャッシュの防止](aurora-mysql-kerberos-connecting.md#aurora-mysql-kerberos.destroy-tickets)
  + [Kerberos 認証用のログ記録](aurora-mysql-kerberos-connecting.md#aurora-mysql-kerberos.logging)
+ [ドメイン内の DB クラスターの管理](aurora-mysql-kerberos-managing.md)
  + [ドメインのメンバーシップを理解する](aurora-mysql-kerberos-managing.md#aurora-mysql-kerberos-managing.understanding)

## Aurora MySQL DB クラスターの Kerberos 認証の概要
<a name="aurora-mysql-kerberos-setting-up-overview"></a>

Aurora MySQL DB クラスターに Kerberos 認証を設定するには、以下の一般的なステップを完了します。これらのステップについては、後で詳細を説明します。

1. AWS Managed Microsoft AD を使用して AWS Managed Microsoft AD ディレクトリを作成します。AWS マネジメントコンソール、AWS CLI、Directory Service を使用して、ディレクトリを作成できます。詳しい手順については、AWS Directory Service 管理ガイドの「[AWS Managed Microsoft AD ディレクトリの作成](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started_create_directory.html)」を参照してください。

1. マネージド IAM ポリシー `AmazonRDSDirectoryServiceAccess` を使用する AWS Identity and Access Management (IAM) ロールの作成 このロールにより Amazon Aurora はディレクトリを呼び出すことができます。

   ロールによるアクセスを許可するには、AWS Security Token Service (AWS STS) エンドポイントを AWS アカウントの AWS リージョン でアクティベートする必要があります。AWS STS エンドポイントは、すべての AWS リージョン でデフォルトでアクティブになっているため、他のアクションを実行せずに、エンドポイントを使用することができます。詳細については、*IAM ユーザーガイド*の「[AWS リージョン でのアクティブ化と非アクティブ化](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#sts-regions-activate-deactivate)」を参照してください。

1. Microsoft Active Directory のツールを使用して、AWS Managed Microsoft AD ディレクトリでユーザーとグループを作成し、設定します。Active Directory にユーザーを作成する方法の詳細については、*AWS 管理ガイド*の「[AWS Directory Service マネージド Microsoft AD でユーザーとグループを管理する](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_manage_users_groups.html)」を参照してください。

1. Aurora MySQL DB クラスターを作成または変更する 作成リクエストで CLI または RDS API を使用する場合は、`Domain` パラメータでドメイン識別子を指定します。ディレクトリの作成時に生成された `d-*` 識別子と、作成した IAM ロールの名前を使用します。

   既存の Aurora MySQL DB クラスターを変更して Kerberos 認証を使用する場合は、DB クラスターのドメインパラメータと IAM ロールパラメータを設定します。ドメインディレクトリと同じ VPC で DB クラスターを見つけます。

1. Amazon RDS プライマリユーザー認証情報を使用して、Aurora MySQL DB クラスターに接続します。[ステップ 6: Kerberos 認証を使用する Aurora MySQL ユーザーを作成する](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-logins) の手順に従って、Aurora MySQL でデータベースユーザーを作成します。

   この方法で作成したユーザーは、Kerberos 認証を使用して Aurora MySQL DB クラスターにログインできます。詳細については、「[Kerberos 認証を使用した Aurora MySQL への接続](aurora-mysql-kerberos-connecting.md)」を参照してください。

オンプレミスまたはセルフホスト型の Microsoft Active Directory を使用して Kerberos 認証を取得するには、*フォレストの信頼関係*を確立する必要があります。フォレストの信頼関係とは、2 つのドメイングループ間の信頼関係です。信頼は、一方向または双方向にすることができます。Directory Service を使用してフォレストの信頼関係を設定する方法の詳細については、*AWS Directory Service 管理ガイド*の「[信頼関係を作成する場合](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_setup_trust.html)」を参照してください。

## Aurora MySQL の Kerberos 認証の制限事項
<a name="aurora-mysql-kerberos.limitations"></a>

Aurora MySQL の Kerberos 認証には、以下の制限が適用されます。
+ Kerberos 認証は、Aurora MySQL バージョン 3.03 以降でサポートされています。

  AWS リージョン でのサポートの詳細については、「[Aurora MySQL で Kerberos 認証を使用する](Concepts.Aurora_Fea_Regions_DB-eng.Feature.KerberosAuthentication.md#Concepts.Aurora_Fea_Regions_DB-eng.Feature.KerberosAuthentication.amy)」を参照してください。
+ Aurora MySQL で Kerberos 認証を使用するには、MySQL クライアントまたはコネクタが Unix プラットフォームではバージョン 8.0.26 以上、Windows では 8.0.27 以降を使用する必要があります。それ以外の場合は、クライアント側の `authentication_kerberos_client` プラグインが利用できず、認証できません。
+ AWS Managed Microsoft AD は、Aurora MySQL でのみサポートされています。ただし、同じ AWS リージョン の異なるアカウントによって所有されている共有の Managed Microsoft AD ドメインに、Aurora MySQL DB クラスターを接続できます。

  また、独自のオンプレミスの Active Directory を使用できます。詳細については、「[ステップ 2: (オプション) オンプレミスの Active Directory の信頼を作成する](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-trust)」を参照してください。
+ MySQL クライアントから、または Windows オペレーティングシステムのドライバーから Aurora MySQL クラスターに接続するユーザーを Kerberos を使用して 認証する場合、デフォルトでは、データベースユーザー名の大文字と小文字は Active Directory のユーザーのものと一致する必要があります。例えば、Active Directory のユーザーが `Admin` として表示されている場合、データベースユーザー名は `Admin` である必要があります。

  ただし、`authentication_kerberos` プラグインでは、大文字と小文字を区別しないユーザー名の比較が可能になりました。詳細については、「[ステップ 8: (オプション) 大文字と小文字を区別しないユーザー名比較の設定](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.case-insensitive)」を参照してください。
+ `authentication_kerberos` プラグインをインストールする機能を有効にした後は、リーダー DB インスタンスを再起動する必要があります。
+ `authentication_kerberos` プラグインをサポートしていない DB インスタンスに複製すると、複製が失敗する可能性があります。
+ Aurora グローバルデータベースで Kerberos 認証を使用するには、グローバルデータベース内のすべての DB クラスターに認証を設定する必要があります。
+ ドメイン名は 62 文字未満にする必要があります。
+ Kerberos 認証を有効にした後は、DB クラスターポートを変更しないでください。ポートを変更すると、Kerberos 認証が機能しなくなります。

# Aurora MySQL DB クラスターの Kerberos 認証の設定
<a name="aurora-mysql-kerberos-setting-up"></a>

AWS Managed Microsoft AD を使用して、Aurora MySQL DB クラスターに Kerberos 認証を設定します。Kerberos 認証をセットアップするには、次のステップに従います。

**Topics**
+ [ステップ 1: AWS Managed Microsoft AD を使用してディレクトリを作成する](#aurora-mysql-kerberos-setting-up.create-directory)
+ [ステップ 2: (オプション) オンプレミスの Active Directory の信頼を作成する](#aurora-mysql-kerberos-setting-up.create-trust)
+ [ステップ 3: Amazon Aurora 用の IAM ロールを作成する](#aurora-mysql-kerberos-setting-up.CreateIAMRole)
+ [ステップ 4: ユーザーを作成して設定する](#aurora-mysql-kerberos-setting-up.create-users)
+ [ステップ 5: Aurora MySQL DB クラスターを作成または変更する](#aurora-mysql-kerberos-setting-up.create-modify)
+ [ステップ 6: Kerberos 認証を使用する Aurora MySQL ユーザーを作成する](#aurora-mysql-kerberos-setting-up.create-logins)
+ [ステップ 7: MySQL クライアントを設定する](#aurora-mysql-kerberos-setting-up.configure-client)
+ [ステップ 8: (オプション) 大文字と小文字を区別しないユーザー名比較の設定](#aurora-mysql-kerberos-setting-up.case-insensitive)

## ステップ 1: AWS Managed Microsoft AD を使用してディレクトリを作成する
<a name="aurora-mysql-kerberos-setting-up.create-directory"></a>

Directory Service はフルマネージド型の Active Directory を AWS クラウド内に作成します。AWS Managed Microsoft AD ディレクトリを作成すると、Directory Service がユーザーに代わって 2 つのドメインコントローラーと 2 つのドメインネームシステム (DNS) サーバーを作成します。ディレクトリサーバーは、VPC 内の異なるサブネットで作成されます。この冗長性によって、障害が発生してもディレクトリにアクセス可能な状態を維持できます。

AWS Managed Microsoft AD ディレクトリを作成すると、Directory Service がユーザーに代わって自動的に以下のタスクを実行します。
+ VPC 内に Active Directory を設定します。
+ ユーザー名 `Admin` と指定されたパスワードで、ディレクトリ管理者アカウントを作成します。このアカウントはディレクトリの管理に使用します。
**注記**  
このパスワードは必ず保存してください。Directory Service は保存しません。パスワードはリセットできますが、取得することはできません。
+ ディレクトリコントローラー用セキュリティグループを作成します。

AWS Managed Microsoft AD を起動すると、AWS は組織単位 (OU) を作成します。OU にはディレクトリのオブジェクトがすべて含まれています。この OU は、ディレクトリの作成時に入力した NetBIOS 名です。AWS が所有および管理するドメインルートにあります。

`Admin` ディレクトリに作成された AWS Managed Microsoft AD アカウントには、OU に対して頻繁に実行される、次のような管理行為の権限が含まれています。
+ ユーザーを作成、更新、削除する
+ ファイルやプリントサーバーなどのドメインにリソースを追加して、追加したリソースへのアクセス許可を OU のユーザーとグループに割り当てる
+ 追加の OU やコンテナを作成する
+ 権限を委譲する
+ 削除されたオブジェクトを Active Directory のごみ箱から元に戻す
+ Active Directory Web Service で AD と DNS Windows PowerShell モジュールを実行する 

`Admin` アカウントには、ドメイン全体に関係するアクティビティを実行する権限もあります。
+ DNS 設定 (レコード、ゾーン、フォワーダーの追加、削除、更新) を管理する
+ DNS イベントログを参照する
+ セキュリティイベントログを参照する

**AWS Managed Microsoft AD でディレクトリを作成するには**

1. AWS マネジメントコンソール にサインインし、Directory Service コンソール ([https://console.aws.amazon.com/directoryservicev2/](https://console.aws.amazon.com/directoryservicev2/))を開きます。

1. ナビゲーションペインで、[**Directories**]、[**Set up Directory**] の順に選択します。

1. [**AWS Managed Microsoft AD**] を選択します。現状では、AWS Managed Microsoft AD が Amazon RDS で使用できる唯一のオプションです。

1. 次の情報を入力します。  
**ディレクトリの DNS 名**  
ディレクトリの完全修飾名 (例: **corp.example.com**)。  
**ディレクトリの NetBIOS 名**  
ディレクトリの短縮名 (例: **CORP**)。  
**ディレクトリの説明**  
(オプション) ディレクトリの説明。  
**Admin パスワード**  
ディレクトリ管理者のパスワードです。ディレクトリの作成プロセスでは、ユーザー名 Admin とこのパスワードで管理者アカウントが作成されます。  
ディレクトリ管理者のパスワードに「admin」の単語を含めることはできません。パスワードは大文字と小文字を区別し、8-64 文字にします。また、以下の 4 つのカテゴリうち 3 つから少なくとも 1 文字を含める必要があります。  
   + 小文字 (a～z)
   + 大文字 (A～Z)
   + 数字 (0～9)
   + アルファベット以外の文字 (\$1\$1@\$1\$1%^&\$1\$1-\$1=`\$1\$1()\$1\$1[]:;"'<>,.?/)  
**[Confirm password] (パスワードを確認)**  
管理者パスワードが再入力されました。

1. [**次へ**] を選択します。

1.  [**Networking** ] セクションに次の情報を入力し、[**Next**] を選択します。  
**VPC**  
ディレクトリ用の VPC。この同じ VPC に Aurora MySQL DB クラスターを作成します。  
**サブネット**  
ディレクトリサーバーのサブネット。2 つのサブネットは、異なるアベイラビリティーゾーンに存在している必要があります。

1. ディレクトリ情報を確認し、必要な変更を加えます。情報が正しい場合は、[**Create directory (ディレクトリの作成)**] を選択します。  
![\[作成中のディレクトリ詳細ページ\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/WinAuth2.png)

ディレクトリが作成されるまで、数分かかります。正常に作成されると、[**Status**] 値が [**Active**] に変わります。

ディレクトリに関する情報を表示するには、ディレクトリの一覧で、ディレクトリ名を選択します。**[Directory ID]** の値を書き留めます。この値は、Aurora MySQL DB クラスターを作成または変更するときに必要になります。

![\[[ディレクトリの詳細] ページのディレクトリ ID\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/WinAuth3.png)


## ステップ 2: (オプション) オンプレミスの Active Directory の信頼を作成する
<a name="aurora-mysql-kerberos-setting-up.create-trust"></a>

独自のオンプレミスの Microsoft Active Directory を使用する予定がない場合は、[ステップ 3: Amazon Aurora 用の IAM ロールを作成する](#aurora-mysql-kerberos-setting-up.CreateIAMRole) に進みます。

オンプレミスの Active Directory を使用して Kerberos 認証を取得するには、オンプレミスの Microsoft Active Directory と (AWS Managed Microsoft AD で作成された) [ステップ 1: AWS Managed Microsoft AD を使用してディレクトリを作成する](#aurora-mysql-kerberos-setting-up.create-directory) ディレクトリとの間に、フォレストの信頼を使用して、信頼するドメイン関係を作成する必要があります。信頼は一方向にすることができます。この場合、AWS Managed Microsoft AD ディレクトリはオンプレミスの Microsoft Active Directory を信頼します。信頼は、両方の Active Directory が相互に信頼する双方向にすることもできます。Directory Service を使用して信頼関係を設定する方法の詳細については、「*AWS Directory Service 管理ガイド*」の「[信頼関係を作成する場合](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_setup_trust.html)」を参照してください。

**注記**  
オンプレミスの Microsoft Active Directory を使用している場合:  
Windows クライアントは、Aurora カスタムエンドポイントを使用すると接続できません。詳細については[Amazon Aurora エンドポイント接続](Aurora.Overview.Endpoints.md)を参照してください。
[グローバルデータベース](aurora-global-database.md)の場合:  
Windows クライアントは、グローバルデータベースのプライマリ AWS リージョン リージョンにあるインスタンスエンドポイントまたはクラスターエンドポイントを使用する場合に限り接続できます。
Windows クライアントは、セカンダリ AWS リージョン のクラスターエンドポイントを使用して接続できません。

オンプレミスの Microsoft Active Directory ドメイン名に、新しく作成された信頼関係に対応する DNS サフィックスルーティングが含まれていることを確認してください。次のスクリーンショットは、例を示しています。

![\[作成された信頼に対応している DNS ルーティング\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/kerberos-auth-trust.png)


## ステップ 3: Amazon Aurora 用の IAM ロールを作成する
<a name="aurora-mysql-kerberos-setting-up.CreateIAMRole"></a>

Amazon Aurora が Directory Service を呼び出すには、マネージド IAM ポリシー `AmazonRDSDirectoryServiceAccess` を使用する AWS Identity and Access Management (IAM) ロールが必要です。このロールにより、Aurora は Directory Service を呼び出すことができます。

AWS マネジメントコンソール を使用して DB クラスターを作成し、`iam:CreateRole` アクセス許可を持っている場合、コンソールではこのロールを自動的に作成します。この場合、ロール名は `rds-directoryservice-kerberos-access-role` です。それ以外の場合は、IAM ロールを手動で作成する必要があります。IAM ロールを作成する場合、[`Directory Service`] を選択し、それに AWS マネージドポリシー `AmazonRDSDirectoryServiceAccess` をアタッチします。

サービス用の IAM ロールを作成する方法の詳細については、「*IAM ユーザーガイド*」の「[AWS のサービスにアクセス許可を委任するロールの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)」を参照してください。

マネージド IAM ポリシー `AmazonRDSDirectoryServiceAccess` を使用する代わりに、必要なアクセス許可を使用してポリシーを作成することもできます。これを行うには、IAM ロールに次の IAM 信頼ポリシーが必要です。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "directoryservice.rds.amazonaws.com",
          "rds.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

また、ロールには、以下の IAM ロールポリシーも必要です。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "ds:DescribeDirectories",
        "ds:AuthorizeApplication",
        "ds:UnauthorizeApplication",
        "ds:GetAuthorizedApplicationDetails"
      ],
    "Effect": "Allow",
    "Resource": "*"
    }
  ]
}
```

------

## ステップ 4: ユーザーを作成して設定する
<a name="aurora-mysql-kerberos-setting-up.create-users"></a>

Active Directory ユーザーとコンピュータツールを使用してユーザーを作成できます。このツールは、Active Directory Domain Services ツールおよび Active Directory Lightweight Directory Services ツールの一部です。ユーザーとは、ディレクトリにアクセスできる個別の人物、またはエンティティのことです。

Directory Service ディレクトリにユーザーを作成するには、Directory Service ディレクトリに接続している Microsoft Windows ベースのオンプレミスまたは Amazon EC2 インスタンスを使用します。ユーザーを作成する権限を持つユーザーとして、インスタンスにログインする必要があります。詳細については、*AWS Managed Microsoft AD Directory Service 管理ガイド*の[AWS のユーザーとグループの管理](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/creating_ad_users_and_groups.html)を参照してください。

## ステップ 5: Aurora MySQL DB クラスターを作成または変更する
<a name="aurora-mysql-kerberos-setting-up.create-modify"></a>

ディレクトリ用の Aurora MySQL DB クラスターを作成または変更します。コンソール、AWS CLI、RDS API を使用して DB クラスターとディレクトリを関連付けることができます。このタスクを実行するには、以下の 2 つの方法があります。
+ コンソール、[create-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html) CLI コマンド、または [CreateDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBCluster.html) RDS API オペレーションを使用して、新しい Aurora MySQL DB クラスターを作成します。

  手順については、「[Amazon Aurora DB クラスターの作成](Aurora.CreateInstance.md)」を参照してください。
+ コンソール、[modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html) CLI コマンド、または [ModifyDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBCluster.html) RDS API オペレーションを使用して、既存の Aurora MySQL DB クラスターを変更します。

  手順については、「[Amazon Aurora DB クラスターの変更](Aurora.Modifying.md)」を参照してください。
+ コンソール、[restore-db-cluster-from-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-from-snapshot.html) CLI コマンド、または [RestoreDBClusterFromSnapshot](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBClusterFromSnapshot.html) RDS API オペレーションを使用して、DB スナップショットから Aurora MySQL DB クラスターを復元します。

  手順については、「[DB クラスタースナップショットからの復元](aurora-restore-snapshot.md)」を参照してください。
+ コンソール、[restore-db-cluster-to-point-in-time](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-to-point-in-time.html) CLI コマンド、[RestoreDBClusterToPointInTime](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBClusterToPointInTime.html) RDS API オペレーションを使用して、Aurora MySQL DB クラスターをポイントインタイムに復元します。

  手順については、「[DB クラスターを指定の時点の状態に復元する](aurora-pitr.md)」を参照してください。

Kerberos 認証は、VPC 内の Aurora MySQL DB クラスターでのみサポートされています。DB クラスターは、ディレクトリと同じ VPC または異なる VPC 内にあります。DB クラスターの VPC には、ディレクトリへのアウトバウンド通信を許可する VPC セキュリティグループが必要です。

### コンソール
<a name="aurora-mysql-kerberos-setting-up.create-modify.CON"></a>

DB クラスターを作成、変更または復元するためにコンソールを使用する場合は、[**データベースの認証**] セクションの [**Kerberos 認証**] を選択します。[**ディレクトリの参照**] を選択してディレクトリを選択するか、[**新しいディレクトリの作成**] を選択します。

![\[DB クラスター作成時の Kerberos 認証設定\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/kerberos-auth-create-cluster.png)


### AWS CLI
<a name="aurora-mysql-kerberos-setting-up.create-modify.CLI"></a>

コンソール、AWS CLI、RDS API を使用する場合は、DB クラスターとディレクトリを関連付けます。作成したドメインディレクトリを使用するには、DB クラスターに以下のパラメータが必要です。
+ `--domain` パラメータには、ディレクトリの作成時に生成されたドメイン識別子 ("d-\$1" 識別子) を使用します。
+ `--domain-iam-role-name` パラメータには、マネージド IAM ポリシー `AmazonRDSDirectoryServiceAccess` を使用する作成済みのロールを使用します。

例えば、以下の CLI コマンドはディレクトリを使用するように DB クラスターを変更します。

Linux、macOS、Unix の場合:

```
aws rds modify-db-cluster \
    --db-cluster-identifier mydbcluster \
    --domain d-ID \
    --domain-iam-role-name role-name
```

Windows の場合:

```
aws rds modify-db-cluster ^
    --db-cluster-identifier mydbcluster ^
    --domain d-ID ^
    --domain-iam-role-name role-name
```

**重要**  
DB クラスターを変更して Kerberos 認証を有効にした場合、変更後、その DB クラスターを再起動します。

## ステップ 6: Kerberos 認証を使用する Aurora MySQL ユーザーを作成する
<a name="aurora-mysql-kerberos-setting-up.create-logins"></a>

DB クラスターは、AWS Managed Microsoft AD ドメインに接続されています。したがって、このドメインの Active Directory ユーザーから Aurora MySQL ユーザーを作成できます。データベースへのアクセス許可は、これらのユーザーに対して付与および取り消される標準の Aurora MySQL アクセス許可を通じて管理されます。

Active Directory ユーザーに対して Aurora MySQL での認証を許可できます。これを行うには、まず Amazon RDS プライマリユーザーの認証情報を使用して、他の DB クラスターと同様に Aurora MySQL DB クラスターに接続します。ログインしたら、次に示すように、Aurora MySQL で Kerberos 認証された外部認証ユーザーを作成します。

```
CREATE USER user_name@'host_name' IDENTIFIED WITH 'authentication_kerberos' BY 'realm_name';
```
+ `user_name` をユーザー名で置き換えます。ドメインのユーザー (人とアプリケーションの両方) は、Kerberos 認証を使用して、クライアントマシンを結合したドメインから DB クラスターに接続できるようになりました。
+ `host_name` をホスト名に置き換えます。ワイルドカードとして `%` を使用できます。ホスト名には、特定の IP アドレスを使用することもできます。
+ *realm\$1name* をドメインディレクトリの領域名に置き換えます。領域名は、通常 `CORP.EXAMPLE.COM` のように大文字の DNS ドメイン名と同じです。領域とは、同じ Kerberos Key Distribution Center を使用するシステムのグループです。

次の例では、領域名 `MYSQL.LOCAL` の Active Directory に対して認証する名前 `Admin` のデータベースユーザーを作成します。

```
CREATE USER Admin@'%' IDENTIFIED WITH 'authentication_kerberos' BY 'MYSQL.LOCAL';
```

### 既存の Aurora MySQL ログインの変更
<a name="aurora-mysql-kerberos.modify-login"></a>

また、次の構文を使用して、既存の Aurora MySQL ログインを Kerberos 認証を使用するように変更できます。

```
ALTER USER user_name IDENTIFIED WITH 'authentication_kerberos' BY 'realm_name';
```

## ステップ 7: MySQL クライアントを設定する
<a name="aurora-mysql-kerberos-setting-up.configure-client"></a>

MySQL クライアントを設定するには、次のステップを実行します。

1. ドメインを指す `krb5.conf` ファイル (または同等) を作成します。

1. クライアントホストと Directory Service 間でトラフィックが流れることを確認します。次の目的で Netcat などのネットワークユーティリティを使用します。
   + ポート 53 の DNS 経由のトラフィックを確認します。
   + ポート 53 および Kerberos の TCP/UDP 上のトラフィックを確認します。これには、Directory Service の場合ポート 88 および 464 が含まれます。

1. データベースポートを介してクライアントホストと DB インスタンス間でトラフィックが流れることを確認します。例えば、`mysql` を使用してデータベースに接続し、アクセスします。

以下は、AWS Managed Microsoft AD の `krb5.conf` の内容のサンプルです。

```
[libdefaults]
 default_realm = EXAMPLE.COM
[realms]
 EXAMPLE.COM = {
  kdc = example.com
  admin_server = example.com
 }
[domain_realm]
 .example.com = EXAMPLE.COM
 example.com = EXAMPLE.COM
```

以下は、オンプレミスの Microsoft Active Directory 向けの `krb5.conf` の内容のサンプルです。

```
[libdefaults]
 default_realm = EXAMPLE.COM
[realms]
 EXAMPLE.COM = {
  kdc = example.com
  admin_server = example.com
 }
 ONPREM.COM = {
  kdc = onprem.com
  admin_server = onprem.com
 }
[domain_realm]
 .example.com = EXAMPLE.COM
 example.com = EXAMPLE.COM
 .onprem.com = ONPREM.COM
 onprem.com = ONPREM.COM  
 .rds.amazonaws.com = EXAMPLE.COM
 .amazonaws.com.cn = EXAMPLE.COM
 .amazon.com = EXAMPLE.COM
```

## ステップ 8: (オプション) 大文字と小文字を区別しないユーザー名比較の設定
<a name="aurora-mysql-kerberos-setting-up.case-insensitive"></a>

デフォルトでは、MySQL データベースユーザー名の大文字と小文字は、Active Directory ログインのものと一致する必要があります。ただし、`authentication_kerberos` プラグインでは、大文字と小文字を区別しないユーザー名の比較が可能になりました。そのためには、`authentication_kerberos_caseins_cmp` DB クラスターパラメーターを `true` に設定します。

**大文字と小文字を区別しないユーザー名比較を使用するには**

1. カスタム DB クラスターのパラメータグループを作成します。「[Amazon Aurora での DB クラスターパラメータグループの作成](USER_WorkingWithParamGroups.CreatingCluster.md)」の手順に従います。

1. 新しいパラメータグループを編集して、`authentication_kerberos_caseins_cmp` の値を `true` に設定します。「[Amazon Aurora での DB クラスターパラメータグループのパラメータの変更](USER_WorkingWithParamGroups.ModifyingCluster.md)」の手順に従います。

1. DB クラスターパラメータグループを Aurora MySQL DB クラスターに関連付けます。「[Amazon Aurora での DB クラスターパラメータグループと DB クラスターの関連付け](USER_WorkingWithParamGroups.AssociatingCluster.md)」の手順に従います。

1. DB クラスターを再起動します。

# Kerberos 認証を使用した Aurora MySQL への接続
<a name="aurora-mysql-kerberos-connecting"></a>

エラーを回避するため、Unix プラットフォームではバージョン 8.0.26 以降、Windows では 8.0.27 以降の MySQL クライアントを使用してください。

## Aurora MySQL Kerberos ログインを使用して DB クラスターに接続する
<a name="aurora-mysql-kerberos-connecting.login"></a>

Kerberos 認証で Aurora MySQL に接続するには、[ステップ 6: Kerberos 認証を使用する Aurora MySQL ユーザーを作成する](aurora-mysql-kerberos-setting-up.md#aurora-mysql-kerberos-setting-up.create-logins) の手順に従って作成したデータベースユーザーとしてログインします。

コマンドプロンプトで、Aurora MySQL DB クラスターに関連付けられているエンドポイントの 1 つに接続します。パスワードの入力を求められたら、そのユーザー名に関連付けられている Kerberos パスワードを入力します。

Kerberos で認証すると、*ticket-granting ticket* (TGT) がまだ存在しない場合は、TGT が生成されます。`authentication_kerberos` プラグインによって TGT を使用して*サービスチケット*を取得し、そのチケットが Aurora MySQL データベースサーバーに提示されます。

MySQL クライアントを使用すると、Windows または Unix を使用して Kerberos 認証によって Aurora MySQL に接続できます。

### Unix
<a name="aurora-mysql-kerberos-connecting.login.unix"></a>

接続するには、次のいずれかの方法を使用します。
+ TGT を手動で入手します。この場合、MySQL クライアントにパスワードを指定する必要はありません。
+ Active Directory ログイン用のパスワードを MySQL クライアントに直接指定します。

クライアント側のプラグインは、Unix プラットフォームでは MySQL クライアントバージョン 8.0.26 以降でサポートされています。

**TGT を手動で取得して接続するには**

1. コマンドラインインターフェイスで、次のコマンドを使用して TGT を取得します。

   ```
   kinit user_name
   ```

1. 次の `mysql` コマンドを使用して、DB クラスターの DB インスタンスエンドポイントにログインします。

   ```
   mysql -h DB_instance_endpoint -P 3306 -u user_name -p
   ```
**注記**  
DB インスタンスでキータブがローテーションされると、認証が失敗する可能性があります。この場合は、`kinit` を再実行して新しい TGT を取得します。

**直接接続するには**

1. コマンドラインインターフェイスで、次の `mysql` コマンドを使用して、DB クラスターの DB インスタンスエンドポイントにログインします。

   ```
   mysql -h DB_instance_endpoint -P 3306 -u user_name -p
   ```

1. Active Directory ユーザーのパスワードを入力します。

### Windows
<a name="aurora-mysql-kerberos-connecting.login.win"></a>

Windows では、通常、認証はログイン時に行われるため、Aurora MySQL DB クラスターに接続するために TGT を手動で取得する必要はありません。データベースユーザー名の大文字と小文字は、Active Directory のユーザーのものと一致する必要があります。例えば、Active Directory のユーザーが `Admin` として表示されている場合、データベースユーザー名は `Admin` である必要があります。

クライアント側のプラグインは、Windows では MySQL クライアントバージョン 8.0.27 以降でサポートされています。

**直接接続するには**
+ コマンドラインインターフェイスで、次の `mysql` コマンドを使用して、DB クラスターの DB インスタンスエンドポイントにログインします。

  ```
  mysql -h DB_instance_endpoint -P 3306 -u user_name
  ```

## Aurora グローバルデータベースで Kerberos 認証を使用する
<a name="aurora-mysql-kerberos-connecting.global"></a>

Aurora MySQL の Kerberos 認証は、Aurora グローバルデータベースでサポートされています。プライマリ DB クラスターの Active Directory を使用してセカンダリ DB クラスターのユーザーを認証するには、Active Directory をセカンダリ AWS リージョン に複製します。プライマリクラスターと同じドメイン ID を使用して、セカンダリクラスターの Kerberos 認証を有効にします。AWS Managed Microsoft AD レプリケーションは、エンタープライズバージョンの Active Directory でのみサポートされます。詳細については、*AWS Directory Service 管理ガイド*の「[マルチリージョンレプリケーション](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_configure_multi_region_replication.html)」を参照してください。

## RDS for MySQL から Aurora MySQL への移行
<a name="aurora-mysql-kerberos-connecting.rds"></a>

Kerberos 認証を有効にした RDS for MySQL から Aurora MySQL への移行後、`auth_pam` プラグインで作成されたユーザーを `authentication_kerberos` プラグインを使用するように変更します。例:

```
ALTER USER user_name IDENTIFIED WITH 'authentication_kerberos' BY 'realm_name';
```

## チケットキャッシュの防止
<a name="aurora-mysql-kerberos.destroy-tickets"></a>

MySQL クライアントアプリケーションの起動時に有効な TGT が存在しない場合、アプリケーションは TGT を取得してキャッシュできます。TGT がキャッシュされないようにするには、`/etc/krb5.conf` ファイルに設定パラメータを設定します。

**注記**  
この設定は UNIX を実行しているクライアントホストにのみ適用され、Windows には適用されません。

**TGT キャッシュを防止するには**
+ 次のように、`/etc/krb5.conf` に `[appdefaults]` セクションを追加します。

  ```
  [appdefaults]
    mysql = {
      destroy_tickets = true
    }
  ```

## Kerberos 認証用のログ記録
<a name="aurora-mysql-kerberos.logging"></a>

`AUTHENTICATION_KERBEROS_CLIENT_LOG` 環境変数によって、Kerberos 認証のログ記録レベルを設定します。ログはクライアント側のデバッグに使用できます。

指定できる値は 1～5 です。ログメッセージは、標準エラー出力に書き込まれます。次の表に各ログ記録レベルの説明を示します。


| Logging level | 説明 | 
| --- | --- | 
| 1 または未設定 | ログ記録なし | 
| 2 | エラーメッセージ | 
| 3 | エラーと警告メッセージ | 
| 4 | エラー、警告、情報メッセージ | 
| 5 | エラー、警告、情報メッセージ、デバッグメッセージ | 

# ドメイン内の DB クラスターの管理
<a name="aurora-mysql-kerberos-managing"></a>

AWS CLI または RDS API を使用して、DB クラスターとマネージド Active Directory との関係を管理できます。例えば、Kerberos 認証用に Active Directory を関連付けたり、Active Directory の関連付けを解除して Kerberos 認証を有効にしたりできます。さらに、DB クラスターを外部認証する Active Directory を別の Active Directory に変更することもできます。

例えば、Amazon RDS API を使用して次を実行できます。
+ メンバーシップが失敗した Kerberos 認証を再度有効化するには、`ModifyDBInstance` API オペレーションを使用し、現在のメンバーシップのディレクトリ ID を指定します。
+ メンバーシップの IAM ロール名を更新するには、`ModifyDBInstance` API オペレーションを使用し、現在のメンバーシップのディレクトリ ID と新しい IAM ロールを指定します。
+ DB クラスターの Kerberos 認証を無効にするには、`ModifyDBInstance` API オペレーションを使用し、ドメインパラメータとして `none` を指定します。
+ ドメイン間で DB クラスターを移動するには、`ModifyDBInstance` API オペレーションを使用し、新しいドメインのドメイン識別子をドメインパラメータとして指定します。
+ 各 DB クラスターのメンバーシップを一覧表示するには、`DescribeDBInstances` API オペレーションを使用します。

## ドメインのメンバーシップを理解する
<a name="aurora-mysql-kerberos-managing.understanding"></a>

DB クラスターを作成または変更すると、そのインスタンスはドメインのメンバーになります。DB クラスターのドメインメンバーシップのステータスを表示するには、[describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) CLI コマンドを実行します。DB クラスターのステータスは、次のいずれかです。
+ `kerberos-enabled` — DB クラスターでは Kerberos 認証が有効になっています。
+  `enabling-kerberos` — AWS は、この DB クラスターで Kerberos 認証を有効化中です。
+ `pending-enable-kerberos` — この DB クラスターでは、Kerberos 認証の有効化が保留になっています。
+ `pending-maintenance-enable-kerberos` - AWS は、次に予定されているメンテナンス期間で、DB クラスターの Kerberos 認証の有効化を試みます。
+ `pending-disable-kerberos` — この DB クラスターでは、Kerberos 認証の無効化が保留になっています。
+ `pending-maintenance-disable-kerberos` - AWS は、次に予定されているメンテナンス期間で、DB クラスターの Kerberos 認証の無効化を試みます。
+ `enable-kerberos-failed` - 設定の問題により、AWS は DB クラスター上の Kerberos 認証を有効化できませんでした。DB クラスターの変更コマンドを再発行する前に、設定を確認して修正してください。
+ `disabling-kerberos` — AWS は、この DB クラスターで Kerberos 認証を無効化中です。

ネットワーク接続の問題や正しくない IAM ロールのために、Kerberos 認証を有効化するリクエストは失敗する可能性があります。例えば、DB クラスターを作成するか、既存の DB クラスターを変更し、Kerberos 認証を有効化しようとして失敗したとします。この場合は、変更コマンドを再発行するか、新しく作成した DB クラスターを変更してドメインに参加させます。

# Amazon Aurora MySQL DB クラスターへのデータの移行
<a name="AuroraMySQL.Migrating"></a>

既存のデータベースから Amazon Aurora MySQL DB クラスターにデータを移行するために、複数のオプションがあります。また、移行オプションは、移行元のデータベースおよび移行するデータのサイズによっても異なります。

移行には物理と論理の 2 つのタイプがあります。物理移行とは、データベースファイルの物理コピーを使用してデータベースを移行することです。論理的な移行とは、挿入、更新、削除などの論理的な変更を適用することでデータベースを移行することです。

物理移行には以下の利点があります。
+ 物理移行は、特にデータベースのサイズが大きい場合、論理的な移行よりも高速です。
+ 物理移行用にバックアップを作成するとき、データベースのパフォーマンスが低下しません。
+ 物理移行では、複雑なデータベースコンポーネントを含め、出典データベースのすべての内容を移行できます。

物理移行には以下の制限があります。
+ `innodb_page_size` パラメータは、デフォルト値 (`16KB`) に設定する必要があります。
+ `innodb_data_file_path` パラメータは、デフォルトのデータファイル名 `"ibdata1:12M:autoextend"` を使用するデータファイル 1 つのみで設定する必要があります。2 つのデータファイルを持つデータベースや名前が異なるデータファイルを持つデータベースは、この方法では移行できません。

  `"innodb_data_file_path=ibdata1:50M; ibdata2:50M:autoextend"` や `"innodb_data_file_path=ibdata01:50M:autoextend"` などのファイル名は使用できません。
+ `innodb_log_files_in_group` パラメータは、デフォルト値 (`2`) に設定する必要があります。

論理的な移行には以下の利点があります。
+ 特定のテーブルやテーブルの一部など、データベースのサブセットを移行できます。
+ データは、物理ストレージ構造に関係なく移行できます。

論理的な移行には以下の制限があります。
+ 論理的な移行は通常、物理移行よりも低速です。
+ 複雑なデータベースコンポーネントにより、論理的な移行プロセスの速度が遅くなることがあります。場合によっては、複雑なデータベースコンポーネントにより、論理的な移行がブロックされることさえあります。

以下の表に示しているのは、移行のオプションと各オプションで使用する移行のタイプです。


| 移行元 | 移行タイプ | ソリューション | 
| --- | --- | --- | 
| RDS for MySQL DB インスタンス | 物理 |  まず MySQL DB インスタンスの Aurora MySQL リードレプリカを作成することで、RDS for MySQL DB インスタンスから移行できます。MySQL DB インスタンスと Aurora MySQL リードレプリカとの間のレプリカラグが 0 の場合は、クライアントアプリケーションで Aurora リードレプリカから読み取り、レプリケーションを停止することで、Aurora MySQL リードレプリカを読み取りと書き込み用のスタンドアロンの Aurora MySQL DB クラスターにすることができます。詳細については、「[Aurora リードレプリカを使用した、RDS for MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターへのデータの移行](AuroraMySQL.Migrating.RDSMySQL.Replica.md)」を参照してください。  | 
| RDS for MySQL DB スナップショット | 物理 |  RDS for MySQL DB スナップショットから Amazon Aurora MySQL DB クラスターに直接データを移行できます。詳細については、「[Aurora への RDS for MySQL スナップショットの移行](AuroraMySQL.Migrating.RDSMySQL.Snapshot.md)」を参照してください。  | 
| Amazon RDS 外部の MySQL データベース | 論理 |  `mysqldump` ユーティリティを使用してデータのダンプを作成し、そのデータを既存の Amazon Aurora MySQL DB クラスターにインポートできます。詳細については、「[mysqldump を使用した MySQL から Amazon Aurora MySQL への論理的移行](AuroraMySQL.Migrating.ExtMySQL.mysqldump.md)」を参照してください。 外部 MySQL データベースからの移行中にデータベースユーザーのメタデータをエクスポートするには、`mysqldump` の代わりに MySQL Shell コマンドを使用することもできます。詳細については、「[インスタンスダンプユーティリティ、スキーマダンプユーティリティ、テーブルダンプユーティリティ](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-dump-instance-schema.html#mysql-shell-utilities-dump-about)」を参照してください。  MySQL 8.0.34 以降、[mysqlpump](https://dev.mysql.com/doc/refman/8.0/en/mysqlpump.html) ユーティリティは廃止されました。   | 
| Amazon RDS 外部の MySQL データベース | 物理 |  データベースから Amazon Simple Storage Service (Amazon S3) バケットにバックアップファイルをコピーし、これらのファイルから Amazon Aurora MySQL DB クラスターを復元できます。このオプションは、`mysqldump` を使用したデータの移行よりもかなり高速になる場合があります。詳細については、「[Percona XtraBackup と Amazon S3 を使用した MySQL からの物理的な移行](AuroraMySQL.Migrating.ExtMySQL.S3.md)」を参照してください。  | 
| Amazon RDS 外部の MySQL データベース | 論理 |  データベースのデータをテキストファイルとして保存し、そのファイルを Amazon S3 バケットにコピーできます。次に、`LOAD DATA FROM S3` MySQL コマンドを使用して、そのデータを既存の Aurora MySQL DB クラスター内にロードできます。詳細については、「[Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード](AuroraMySQL.Integrating.LoadFromS3.md)」を参照してください。  | 
| MySQL と互換性がないデータベース | 論理 |  AWS Database Migration Service (AWS DMS) は、MySQL との互換性がないデータベースからのデータを移行するのに使用できます。AWS DMS の詳細については、「[AWS Database Migration Service とは](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html)」を参照してください。 | 

**注記**  
外部の MySQL データベースを Amazon RDS に移行する場合、表で説明している移行のオプションは、データベースが InnoDB または MyISAM テーブルスペースをサポートしている場合にのみサポートされます。  
Aurora MySQL に移行中の MySQL データベースで `memcached` が使用されている場合は、移行前に `memcached` を削除します。  
8.0.11、8.0.13、8.0.15 などの一部の古い MySQL 8.0 バージョンからは Aurora MySQL バージョン 3.05 以上に移行できません。移行する前に MySQL バージョン 8.0.28 にアップグレードすることをお勧めします。

# 外部の MySQL データベースから Amazon Aurora MySQL DB クラスターへのデータ移行
<a name="AuroraMySQL.Migrating.ExtMySQL"></a>

データベースが InnoDB または MyISAM のテーブルスペースをサポートしている場合、これらのオプションを使用して、データを Amazon Aurora MySQL DB クラスターに移行できます。
+ `mysqldump` ユーティリティを使用してデータのダンプを作成し、そのデータを既存の Amazon Aurora MySQL DB クラスターにインポートできます。詳細については、「[mysqldump を使用した MySQL から Amazon Aurora MySQL への論理的移行](AuroraMySQL.Migrating.ExtMySQL.mysqldump.md)」を参照してください。
+ これで、データベースから Amazon S3 バケットに完全および増分バックアップファイルをコピーし、これらのファイルから Amazon Aurora MySQL DB クラスターを復元できます。このオプションは、`mysqldump` を使用したデータの移行よりもかなり高速になる場合があります。詳細については、「[Percona XtraBackup と Amazon S3 を使用した MySQL からの物理的な移行](AuroraMySQL.Migrating.ExtMySQL.S3.md)」を参照してください。

**Topics**
+ [Percona XtraBackup と Amazon S3 を使用した MySQL からの物理的な移行](AuroraMySQL.Migrating.ExtMySQL.S3.md)
+ [mysqldump を使用した MySQL から Amazon Aurora MySQL への論理的移行](AuroraMySQL.Migrating.ExtMySQL.mysqldump.md)

# Percona XtraBackup と Amazon S3 を使用した MySQL からの物理的な移行
<a name="AuroraMySQL.Migrating.ExtMySQL.S3"></a>

完全バックアップファイルと増分バックアップファイルをソース MySQL バージョン 5.7 または 8.0 データベースから AmazonAmazon S3 バケットにコピーします。その後、それらのファイルから同じメジャー DB エンジンバージョンの Amazon Aurora MySQL DB クラスターに復元できます。

このオプションは、`mysqldump` を使用したデータ移行よりもかなり高速になる場合があります。これは、`mysqldump` を使用することですべてのコマンドが再生され、新しい Aurora MySQL DB クラスターの出典データベースからスキーマとデータが再作成されるためです。出典 MySQL データファイルをコピーすることで、Aurora MySQL はこれらのファイルを即座に Aurora MySQL DB クラスター用のデータとして使用できます。

また、移行プロセス中にバイナリログレプリケーションを使用してダウンタイムを最小化できます。バイナリログのレプリケーションを使用すると、Aurora MySQL DB クラスターにデータ移動中に外部 MySQL データベースがオープンのままになります。Aurora MySQL DB クラスターが作成されたら、バイナリログレプリケーションを使用して、Aurora MySQL DB クラスターとバックアップ後のトランザクションを同期します。Aurora MySQL DB クラスターが MySQL データベースに追いついたら、Aurora MySQL DB を新規のトランザクションに完全に切り替えて、移行を終了します。詳細については、「[レプリケーションを使用して、Amazon Aurora MySQL DB クラスターと MySQL データベースを同期する](#AuroraMySQL.Migrating.ExtMySQL.S3.RepSync)」を参照してください。

**Contents**
+ [制約事項と考慮事項](#AuroraMySQL.Migrating.ExtMySQL.S3.Limits)
+ [開始する前に](#AuroraMySQL.Migrating.ExtMySQL.S3.Prereqs)
  + [Percona XtraBackup のインストール](#AuroraMySQL.Migrating.ExtMySQL.S3.Prereqs.XtraBackup)
  + [必要なアクセス許可](#AuroraMySQL.Migrating.ExtMySQL.S3.Prereqs.Permitting)
  + [IAM サービスロールの作成](#AuroraMySQL.Migrating.ExtMySQL.S3.Prereqs.CreateRole)
+ [Amazon Aurora MySQL DB クラスターとして復元するファイルのバックアップ](#AuroraMySQL.Migrating.ExtMySQL.S3.Backup)
  + [Percona XtraBackup での完全バックアップの作成](#AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Full)
  + [Percona XtraBackup での増分バックアップの使用](#AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Incr)
  + [バックアップに関する考慮事項](#AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Considerations)
+ [Amazon S3 バケットからの Amazon Aurora MySQL DB クラスターの復元](#AuroraMySQL.Migrating.ExtMySQL.S3.Restore)
+ [レプリケーションを使用して、Amazon Aurora MySQL DB クラスターと MySQL データベースを同期する](#AuroraMySQL.Migrating.ExtMySQL.S3.RepSync)
  + [暗号化レプリケーション用に外部の MySQL データベースと Aurora MySQL DB クラスターを設定する](#AuroraMySQL.Migrating.ExtMySQL.S3.RepSync.ConfigureEncryption)
  + [Amazon Aurora MySQL DB クラスターと外部の MySQL データベースを同期する](#AuroraMySQL.Migrating.ExtMySQL.S3.RepSync.Synchronizing)
+ [Amazon Aurora MySQL への物理的な移行にかかる時間の短縮](AuroraMySQL.Migrating.ExtMySQL.Prechecks.md)
  + [サポートされていないテーブルタイプ](AuroraMySQL.Migrating.ExtMySQL.Prechecks.md#AuroraMySQL.Migrating.ExtMySQL.Prechecks.Tables)
  + [サポートされていない権限を持つユーザーアカウント](AuroraMySQL.Migrating.ExtMySQL.Prechecks.md#AuroraMySQL.Migrating.ExtMySQL.Prechecks.Users)
  + [Aurora MySQL バージョン 3 に対する動的権限](AuroraMySQL.Migrating.ExtMySQL.Prechecks.md#AuroraMySQL.Migrating.ExtMySQL.Prechecks.Dynamic)
  + [定義者として 'rdsadmin'@'localhost' を使用して保存されたオブジェクト](AuroraMySQL.Migrating.ExtMySQL.Prechecks.md#AuroraMySQL.Migrating.ExtMySQL.Prechecks.Objects)

## 制約事項と考慮事項
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Limits"></a>

Amazon S3 バケットから Amazon Aurora MySQL DB クラスターに移行する場合は、以下の制限と考慮事項が当てはまります。
+ データは既存の DB クラスターではなく、新しい DB クラスターにのみ移行できます。
+ Percona XtraBackup を使用してデータを S3 にバックアップする必要があります。詳細については、「[Percona XtraBackup のインストール](#AuroraMySQL.Migrating.ExtMySQL.S3.Prereqs.XtraBackup)」を参照してください。
+ Amazon S3 バケットと Aurora MySQL DB クラスターは同じ AWS リージョンに存在する必要があります。
+ 以下から復元することはできません。
  + DB クラスタースナップショットは、Amazon S3 にスナップショットをエクスポートします。また、DB クラスタースナップショットエクスポートから、S3 にデータを移行することはできません。
  + 暗号化されたソースデータベース、しかし移行するデータを暗号化することはできます。移行プロセス中にデータを非暗号化のまま維持することもできます。
  + MySQL 5.5 または 5.6 データベース
+ Percona Server for MySQL は、`mysql` スキーマに `compression_dictionary*` テーブルが含まれる場合があるため、ソースデータベースとしてはサポートされていません。
+ Aurora Serverless DB クラスターに復元することはできません。
+ 後方移行はメジャーバージョンとマイナーバージョンのどちらでもサポートされていません。例えば、MySQL バージョン 8.0 から Aurora MySQL バージョン 2 (MySQL 5.7 と互換性あり) への移行はできませんし、MySQL バージョン 8.0.32 から MySQL コミュニティバージョン 8.0.26 と互換性のある Aurora MySQL バージョン 3.03 への移行もできません。
+ 8.0.11、8.0.13、8.0.15 などの一部の古い MySQL 8.0 バージョンからは Aurora MySQL バージョン 3.05 以上に移行できません。移行する前に MySQL バージョン 8.0.28 にアップグレードすることをお勧めします。
+ Amazon S3 からのインポートは、db.t2.micro DB インスタンスクラスでサポートされていません。ただし、1 つの DB インスタンスクラスに復元し、後で別の DB インスタンスクラスを変更できます。DB インスタンスクラスの詳細については、「[Amazon Aurora DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。
+ Amazon S3 では、S3 バケットにアップロードするファイルのサイズが 5 TB に制限されます。バックアップファイルが 5 TB を超える場合は、バックアップファイルを小さいファイルに分割する必要があります。
+ Amazon RDS では、S3 バケットにアップロードするファイルの数が百万までに制限されます。データベースのバックアップデータ（すべての完全および増分バックアップを含む）が百万ファイルを超える場合は、Gzip (.gz)、tar (.tar.gz)、Percona xbstream (.xbstream) ファイルを使用して完全および増分バックアップファイルを S3 バケットに保存します。Percona XtrabackUp 8.0 は Percona xbstream のみを圧縮用にサポートしています。
+ 各 DB クラスターに管理サービスを提供するために、DB インスタンスの作成時に `rdsadmin` ユーザーが作成されます。これは RDS の予約ユーザーであるため、以下の制限が適用されます。
  + `'rdsadmin'@'localhost'` が定義子である関数、プロシージャ、ビュー、イベント、トリガーは、インポートされません。詳細については、「[定義者として 'rdsadmin'@'localhost' を使用して保存されたオブジェクト](AuroraMySQL.Migrating.ExtMySQL.Prechecks.md#AuroraMySQL.Migrating.ExtMySQL.Prechecks.Objects)」および「[Amazon Aurora MySQL でのマスターユーザー特権](AuroraMySQL.Security.md#AuroraMySQL.Security.MasterUser)」を参照してください。
  + Aurora MySQL DB クラスターを作成すると、サポートされている最大の権限を持つマスターユーザーが作成されます。バックアップから復元する際、インポート中のユーザーに割り当てられたサポートされていない権限は、インポート中に自動的に削除されます。

    この影響を受ける可能性のあるユーザーを特定するには、「[サポートされていない権限を持つユーザーアカウント](AuroraMySQL.Migrating.ExtMySQL.Prechecks.md#AuroraMySQL.Migrating.ExtMySQL.Prechecks.Users)」を参照してください。Aurora MySQL でサポートされる権限の詳細については、「[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model)」を参照してください。
+ Aurora MySQL バージョン 3 の場合、動的権限はインポートされません。Aurora がサポートする動的権限は、移行後にインポートできます。詳細については、「[Aurora MySQL バージョン 3 に対する動的権限](AuroraMySQL.Migrating.ExtMySQL.Prechecks.md#AuroraMySQL.Migrating.ExtMySQL.Prechecks.Dynamic)」を参照してください。
+ `mysql` スキーマのユーザー作成のテーブルは移行されません。
+ `innodb_data_file_path` パラメータは、デフォルトのデータファイル名 `ibdata1:12M:autoextend` を使用するデータファイル 1 つのみで設定する必要があります。2 つのデータファイルを持つデータベースや名前が異なるデータファイルを持つデータベースは、この方法では移行できません。

  `innodb_data_file_path=ibdata1:50M`、`ibdata2:50M:autoextend`、および `innodb_data_file_path=ibdata01:50M:autoextend` などのファイル名は使用できません。
+ デフォルトの MySQL データディレクトリ外で定義されたテーブルを含むソースデータベースから移行することはできません。
+ この方法を使用した非圧縮バックアップでサポートされる最大サイズは、現在 64 TiB に制限されています。圧縮バックアップの場合、圧縮解除に必要な容量を考慮してこの制限は小さくなります。このような場合、サポートされる最大バックアップサイズは (`64 TiB – compressed backup size`) です。
+ Aurora MySQL は MySQL やその他の外部コンポーネントやプラグインのインポートをサポートしていません。
+ Aurora MySQL は、データベースからすべてを復元するわけではありません。ソース MySQL データベースからデータベーススキーマと以下の項目の値を保存してから、作成後に復元された Aurora MySQL DB クラスターに追加することをお勧めします。
  + ユーザーアカウント
  + 関数
  + ストアドプロシージャ
  + タイムゾーン情報。タイムゾーン情報は、Aurora MySQL DB クラスターのローカルオペレーティングシステムからロードされます。詳細については、「[Amazon Aurora DB クラスターのローカルタイムゾーン](Concepts.RegionsAndAvailabilityZones.md#Aurora.Overview.LocalTimeZone)」を参照してください。

## 開始する前に
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Prereqs"></a>

Amazon S3 バケットにデータをコピーし、それらのファイルから DB クラスターを復元するには、事前に以下の作業を行う必要があります。
+ Percona XtraBackup をローカルサーバーにインストールします。
+ お客様に代わって Aurora MySQL が Amazon S3 バケットにアクセスすることを許可します。

### Percona XtraBackup のインストール
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Prereqs.XtraBackup"></a>

Amazon Aurora では、Percona XtraBackup を使用して作成されたファイルから DB クラスターを復元できます。Percona XtraBackup は、「[ソフトウェアのダウンロード - Percona](https://www.percona.com/downloads)」からインストールできます。

MySQL 5.7 の移行では、Percona XtraBackup 2.4 を使用します。

MySQL 8.0 の移行では、Percona XtraBackup 8.0 を使用します。Percona XtraBackup バージョンがソースデータベースのエンジンバージョンと互換性があることを確認してください。

### 必要なアクセス許可
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Prereqs.Permitting"></a>

MySQL データを Amazon Aurora MySQL DB クラスターに移行するには、複数のアクセス権限が必要です。
+ Amazon S3 バケットから新しいクラスターを作成することを Aurora に要求するユーザーは、AWS アカウントのバケットを一覧表示するためのアクセス許可を必要とします。このアクセス許可は、AWS Identity and Access Management (IAM) ポリシーを使用してユーザーに付与します。
+ Aurora は、ユーザーに代わって Amazon Aurora MySQL DB クラスターを作成するために必要なファイルが保存されている Amazon S3 バケットにアクセスするためのアクセス許可を必要とします。必要なアクセス許可を Aurora に付与するには、IAM サービスロールを使用します。
+ リクエストを実行するユーザーには、AWS アカウントの IAM ロールをリストするアクセス許可も必要です。
+ リクエスト元のユーザーが IAM サービスロールを自分で作成したり、(コンソールから) Aurora にIAM サービスロールを作成することを要求したりする場合、そのユーザーには AWS アカウントの IAM ロールを作成するためのアクセス許可が必要です。
+ 移行プロセス中にデータを暗号化する場合には、移行を実行するユーザーの IAM ポリシーを更新して、バックアップの暗号化に使用した AWS KMS keys へのアクセス権限を RDS に付与します。手順については、「[AWS KMS リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.KMSCreatePolicy.md)」を参照してください。

例えば、次の IAM ポリシーでは、コンソールを使用して IAM ロールの一覧表示、IAM ロールの作成、アカウントの Amazon S3 バケットの一覧表示、および KMS キーの一覧表示を行うために必要な最小限のアクセス許可をユーザーに付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:ListRoles",
                "iam:CreateRole",
                "iam:CreatePolicy",
                "iam:AttachRolePolicy",
                "s3:ListBucket",
                "kms:ListKeys"
            ],
            "Resource": "*"
        }
    ]
}
```

------

さらに、ユーザーが IAM ロールを Amazon S3 バケットに関連付けるためには、IAM ユーザーに、その IAM ロールの `iam:PassRole` アクセス権限が必要です。このアクセス権限により、ユーザーが Amazon S3 バケットに関連付けることができる IAM ロールを管理者が制限できます。

例えば、次の IAM ポリシーでは、`S3Access` という名前のロールをユーザーが Amazon S3 バケットに関連付けることができます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Sid":"AllowS3AccessRole",
            "Effect":"Allow",
            "Action":"iam:PassRole",
            "Resource":"arn:aws:iam::123456789012:role/S3Access"
        }
    ]
}
```

------

IAM ユーザーのアクセス許可の詳細については、「[ポリシーを使用したアクセスの管理](UsingWithRDS.IAM.md#security_iam_access-manage)」を参照してください。

### IAM サービスロールの作成
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Prereqs.CreateRole"></a>

[**新規ロールの作成**] オプション (このトピックで後述します) を選択して、AWS マネジメントコンソール でロールを作成することができます。このオプションを選択して新しいロールの名前を指定すると、この指定した名前を使用して Aurora から Amazon S3 バケットにアクセスするために必要な IAM サービスロールが Aurora で作成されます。

または、次の手順を使用して手動でロールを作成できます。

**Aurora から Amazon S3 にアクセスするための IAM ロールを作成するには**

1. 「[Amazon S3 リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.S3CreatePolicy.md)」の各ステップを実行します。

1. 「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」の各ステップを実行します。

1. 「[IAM ロールと Amazon Aurora MySQL DB クラスターの関連付け](AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.md)」の各ステップを実行します。

## Amazon Aurora MySQL DB クラスターとして復元するファイルのバックアップ
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Backup"></a>

Percona XtraBackup を使用して MySQL データベースファイルの完全バックアップを作成し、そのバックアップファイルを Amazon S3 バケットにアップロードできます。または、Percona XtraBackup を使用して MySQL データベースファイルをバックアップ済みである場合は、既存の完全および増分バックアップディレクトリおよびファイルを Amazon S3 バケットにアップロードできます。

**Topics**
+ [Percona XtraBackup での完全バックアップの作成](#AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Full)
+ [Percona XtraBackup での増分バックアップの使用](#AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Incr)
+ [バックアップに関する考慮事項](#AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Considerations)

### Percona XtraBackup での完全バックアップの作成
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Full"></a>

Aurora MySQL DB クラスターを作成するために Amazon S3 から復元できる、MySQL データベースファイルのフルバックアップを作成するには、Percona XtraBackup ユーティリティ (`xtrabackup`) を使用してデータベースをバックアップします。

例えば、次のコマンドは MySQL データベースのバックアップを作成し、ファイルを `/on-premises/s3-restore/backup` フォルダに保存します。

```
xtrabackup --backup --user=<myuser> --password=<password> --target-dir=</on-premises/s3-restore/backup>
```

バックアップを 1 つのファイル (必要に応じて分割できます) に圧縮する場合、以下のいずれかの形式を使用して `--stream` オプションを使用してバックアップを保存できます。
+ Gzip (.gz)
+ tar (.tar)
+ Percona xbstream (.xbstream)

次のコマンドでは、複数の Gzip ファイルに分割された MySQL データベースのバックアップを作成します。

```
xtrabackup --backup --user=<myuser> --password=<password> --stream=tar \
   --target-dir=</on-premises/s3-restore/backup> | gzip - | split -d --bytes=500MB \
   - </on-premises/s3-restore/backup/backup>.tar.gz
```

次のコマンドでは、複数の tar ファイルに分割された MySQL データベースのバックアップを作成します。

```
xtrabackup --backup --user=<myuser> --password=<password> --stream=tar \
   --target-dir=</on-premises/s3-restore/backup> | split -d --bytes=500MB \
   - </on-premises/s3-restore/backup/backup>.tar
```

例えば、次のコマンドでは、複数の xbstream ファイルに分割された MySQL データベースのバックアップを作成します。

```
xtrabackup --backup --user=<myuser> --password=<password> --stream=xbstream \
   --target-dir=</on-premises/s3-restore/backup> | split -d --bytes=500MB \
   - </on-premises/s3-restore/backup/backup>.xbstream
```

**注記**  
次のエラーが表示される場合は、コマンドにファイル形式が混在していることが原因となっている可能性があります。  

```
ERROR:/bin/tar: This does not look like a tar archive
```

Percona XtraBackup ユーティリティを使用して MySQL データベースをバックアップしたら、バックアップディレクトリおよびファイルを Amazon S3 バケットにコピーできます。

ファイルを作成して Amazon S3 バケットにアップロードする方法については、*Amazon S3 入門ガイド*の「[Amazon Simple Storage Service のスタート方法](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html)」を参照してください。

### Percona XtraBackup での増分バックアップの使用
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Incr"></a>

Amazon Aurora MySQL は、Percona XtraBackup を使用して作成された完全バックアップおよび増分バックアップの両方をサポートしています。Percona XtraBackup を使用して MySQL データベースファイルの完全および増分バックアップを作成済みである場合は、完全バックアップを作成して Amazon S3 にアップロードする必要はありません。代わりに、既存の完全および増分バックアップのディレクトリおよびファイルを Amazon S3 バケットにコピーして、多大な時間を節約できます。詳細については、Percona のウェブサイトで「[インクリメンタルバックアップを作成する](https://docs.percona.com/percona-xtrabackup/8.0/create-incremental-backup.html)」を参照してください。

既存の完全および増分バックアップファイルを Amazon S3 バケットにコピーするときは、ベースディレクトリのコンテンツを再帰的にコピーする必要があります。これらのコンテンツには、完全バックアップと、すべての増分バックアップディレクトリおよびファイルが含まれます。このコピーには、Amazon S3 バケットのディレクトリ構造を維持する必要があります。Aurora は、すべてのファイルとディレクトリを反復処理します。Aurora は、増分バックアップを含む `xtrabackup-checkpoints` ファイルを使用し、ベースディレクトリを識別します。また、ログシーケンス番号 (LSN) の範囲に従って増分バックアップを整列させます。

ファイルを作成して Amazon S3 バケットにアップロードする方法については、*Amazon S3 入門ガイド*の「[Amazon Simple Storage Service のスタート方法](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html)」を参照してください。

### バックアップに関する考慮事項
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Considerations"></a>

Aurora では、Percona XtraBackup を使用して作成された部分バックアップがサポートされていません。データベースの出典ファイルをバックアップするときに、`--tables`、`--tables-exclude`、`--tables-file`、`--databases`、`--databases-exclude`、または `--databases-file` オプションを使用して部分バックアップを作成することはできません。

Percona XtraBackup を使用したデータベースのバックアップの詳細については、Percona ウェブサイトの「[Percona XtraBackup - ドキュメント](https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html)」および「[バイナリログの使用](https://docs.percona.com/percona-xtrabackup/8.0/working-with-binary-logs.html)」を参照してください。

Aurora では、Percona XtraBackup を使用して作成された差分バックアップがサポートされています。詳細については、Percona のウェブサイトで「[インクリメンタルバックアップを作成する](https://docs.percona.com/percona-xtrabackup/8.0/create-incremental-backup.html)」を参照してください。

Aurora では、ファイル名に基づいてバックアップファイルを使用します。ファイル形式に基づいた適切なファイル拡張子でバックアップファイルの名前を付けてください。例えば、Percona xbstream 形式を使用して保存されるファイルでは、`.xbstream` のようにします。

Aurora では、アルファベット順および通常の数値順にバックアップファイルを使用します。バックアップファイルが適切な順序で書き込まれ、名前が付けられるように、`split` コマンドを発行するときは必ず `xtrabackup` オプションを使用します。

Amazon S3 では、Amazon S3 バケットにアップロードするファイルのサイズが 5 TB に制限されます。データベースのバックアップデータが 5 TB を超える場合は、`split` コマンドを使用して、それぞれが 5 TB 未満の複数のファイルにバックアップファイルを分割します。

Aurora から Amazon S3 バケットにアップロードする出典ファイルの数は百万までに制限されています。場合によっては、すべての完全および増分バックアップを含むデータベースのバックアップデータには多数のファイルがあることがあります。この場合、tarball (.tar.gz) ファイルを使用して完全および増分バックアップを Amazon S3 バケットに保存します。

Amazon S3 バケットにファイルをアップロードしたら、サーバー側の暗号化を使用してデータを暗号化します。その後、この暗号化されたファイルから Amazon Aurora MySQL DB クラスターを復元できます。Amazon Aurora MySQL は、以下のタイプのサーバー側の暗号化を使用して、暗号化されたファイルを含む DB クラスターを復元できます。
+ Amazon S3 管理キー (SSE-S3) によるサーバー側の暗号化。各オブジェクトは、強力な多要素暗号化を採用した一意のキーで暗号化されています。
+ AWS KMS 管理キー (SSE-KMS) によるサーバー側の暗号化 - SSE-S3 に類似していますが、ユーザーによる暗号キーの作成と管理オプションや、その他点で異なります。

Amazon S3 バケットにファイルをアップロードするときにサーバー側の暗号化を使用する方法については、*Amazon S3 デベロッパーガイド*の「[サーバー側の暗号化を使用したデータの保護](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)」を参照してください。

## Amazon S3 バケットからの Amazon Aurora MySQL DB クラスターの復元
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Restore"></a>

Amazon RDS コンソールを使用して、Amazon S3 バケットからバックアップファイルを復元して新しい Amazon Aurora MySQL DB クラスターを作成できます。

**Amazon S3 バケットのファイルから Amazon Aurora MySQL DB クラスターを復元するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. Amazon RDS コンソールの右上で、DB クラスターを作成する AWS リージョンを選択します。データベースバックアップを含む Amazon S3 バケットと同じ AWS リージョンを選択します。

1. ナビゲーションペインで、[**データベース**]、[**S3 から復元**] の順に選択します。

1. [**S3 から復元する**] を選択します。

   [**S3 から復元してデータベースを作成する**] ページが表示されます。  
![\[S3 から DB クラスターを復元するための詳細を指定するページ\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/AuroraMigrateS3_01.png)

1. **S3 送信先**で

   1. バックアップファイルを含む **S3 バケット**を選択します。

   1. (オプション) [**S3 フォルダパスプレフィックス**] で、Amazon S3 バケットに保存されているファイルのファイルパスのプレフィックスを入力します。

      プレフィックスを指定しない場合、RDS は S3 バケットのルートフォルダにあるすべてのファイルとフォルダを使用して DB インスタンスを作成します。プレフィックスを指定すると、RDS はファイルのパスが指定されたプレフィックスで始まる S3 バケットのファイルとフォルダを使用して DB インスタンスを作成します。

      例えば、複数のバックアップファイルのセットを S3 のサブフォルダ (backup) 内に保存し、各セットは独自のディレクトリ (gzip\$1backup1、gzip\$1backup2 など) 内にあるとします。この場合、プレフィックス backups/gzip\$1backup1 を指定して、gzip\$1backup1 フォルダのファイルから復元することができます。

1. [**エンジンオプション**]で

   1. [**エンジンのタイプ**] で [** Amazon Aurora**] を選択します。

   1. [**バージョン **] で、復元した DB インスタンスの Aurora MySQL エンジンのバージョンを選択します。

1. **IAM ロール**では、既存の IAM ロールを選択します。

1. (オプション) [**新しいロールを作成する**]を選択して、新しい IAM ロールを持つこともできます。その場合、

   1. **IAM ロール名**を入力します。

   1.  **KMS キーへのアクセスを許可する**かどうかを選択します。
      + バックアップファイルを暗号化していない場合には、[**いいえ**] を選択します。
      + Amazon S3 にバックアップファイルをアップロードした際に、このファイルを AES-256 (SSE-S3) で暗号化している場合には、[**いいえ**] を選択します。この設定により、データは自動的に復号化されます。
      + Amazon S3 にバックアップファイルをアップロードした際に、このファイルで AWS KMS (SSE-KMS) によるサーバー側の暗号化を実行した場合には、[**はい**] を選択します。次に、**AWS KMS key** の適切な KMS キーを選択します。

        AWS マネジメントコンソール は、Aurora によるデータの復号を許可する IAM ポリシーを作成します。

      詳細については、*Amazon S3 デベロッパーガイド*の「[サーバー側の暗号化を使用したデータの保護](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)」を参照してください。

1. DB クラスターストレージ設定、DB インスタンスクラス、DB クラスター識別子やログイン認証情報など、DB クラスターの設定を選択します。各設定の詳細については、「[Aurora DB クラスターの設定](Aurora.CreateInstance.md#Aurora.CreateInstance.Settings)」を参照してください。

1. 必要に応じて、Aurora MySQL DB クラスターの追加設定をカスタマイズします。

1. [**データベースの作成**] を選択して Aurora DB インスタンスを起動します。

Amazon RDS コンソールでは、新しい DB インスタンスが DB インスタンスのリストに表示されます。DB インスタンスが作成されて使用できるようになるまで、DB インスタンスのステータスは [**作成中**] となります。ステータスが [**available**] に変わったら、DB クラスターのプライマリインスタンスに接続できます。DB インスタンスクラスと割り当てられたストレージによっては、新しいインスタンスを使用できるようになるまで数分かかることがあります。

新しく作成したクラスターを表示するには、Amazon RDS コンソールで [**データベース**] ビューを選択し、DB クラスターを選択します。詳細については、「[Amazon Aurora DB クラスターの表示](accessing-monitoring.md#Aurora.Viewing)」を参照してください。

![\[Amazon Aurora DB インスタンスリスト\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/AuroraLaunch04.png)


DB クラスターのポートと書き込みエンドポイントをメモします。DB クラスターの書き込みエンドポイントとポートは、書き込みまたは読み取りオペレーションを実行するすべてのアプリケーションの JDBC 接続文字列と ODBC 接続文字列で使用します。

## レプリケーションを使用して、Amazon Aurora MySQL DB クラスターと MySQL データベースを同期する
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.RepSync"></a>

移行中のダウンタイムを減少あるいはなくすためには、Aurora MySQL DB クラスターに対して MySQL データベースで行われるトランザクションをレプリケートできます。レプリケーションは、移行中に発生する MySQL データベース上のトランザクションに DB クラスターが追いつくようにします。DB クラスターが完全に追いついたら、レプリケーションを停止し、Aurora MySQL への移行を終了できます。

**Topics**
+ [暗号化レプリケーション用に外部の MySQL データベースと Aurora MySQL DB クラスターを設定する](#AuroraMySQL.Migrating.ExtMySQL.S3.RepSync.ConfigureEncryption)
+ [Amazon Aurora MySQL DB クラスターと外部の MySQL データベースを同期する](#AuroraMySQL.Migrating.ExtMySQL.S3.RepSync.Synchronizing)

### 暗号化レプリケーション用に外部の MySQL データベースと Aurora MySQL DB クラスターを設定する
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.RepSync.ConfigureEncryption"></a>

データを安全に複製するには、暗号化されたレプリケーションを使用できます。

**注記**  
暗号化レプリケーションを使う必要がない場合、このステップをスキップして、「[Amazon Aurora MySQL DB クラスターと外部の MySQL データベースを同期する](#AuroraMySQL.Migrating.ExtMySQL.S3.RepSync.Synchronizing)」のステップに進むことができます。

暗号化レプリケーションを使用するための前提条件は次のとおりです。
+ Secure Sockets Layer (SSL) は、外部の MySQL プライマリデータベースで有効になっている必要があります。
+ クライアントのキーとクライアントの証明書が Aurora MySQL DB クラスター用に準備されている必要があります。

暗号化のレプリケーション中、Aurora MySQL DB クラスターはクライアントとして MySQL データベースサーバーに動作します。Aurora MySQL 用の証明書およびキーは、.pem 形式のファイルにあります。

**暗号化レプリケーションのために、外部の MySQL データベースおよび Aurora MySQL DB クラスターを設定するには**

1. 暗号化レプリケーションのための準備があることを確認してください。
   + 外部の MySQL プライマリデータベースで SSL が有効になっておらず、クライアントキーとクライアント証明書が準備されていない場合、MySQL データベースサーバーで SSL を有効にし、必要なクライアントキーとクライアントの証明書を生成します。
   + SSL が外部プライマリで有効になっている場合は、Aurora MySQL DB クラスターにクライアントキーおよび証明書を提供します。これらがない場合は、Aurora MySQL DB クラスター用に新しいキーと証明書を生成します。クライアント証明書に署名するには、外部の MySQL プライマリデータベースで SSL の設定に使用した認証局キーが必要です。

   詳細については、MySQL ドキュメントの「[openssl を使って SSL 証明書とキーを作成する](https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-files-using-openssl.html)」を参照してください。

   認証局証明書、クライアントキーおよびクライアント証明書が必要となります。

1. SSL を使用して、プライマリユーザーとして Aurora MySQL DB クラスターに接続します。

   SSL で Aurora MySQL DB クラスターに接続する詳細については、「[Aurora MySQL DB クラスターへの接続](AuroraMySQL.Security.md#AuroraMySQL.Security.SSL)」を参照してください。

1. [mysql.rds\$1import\$1binlog\$1ssl\$1material](mysql-stored-proc-replicating.md#mysql_rds_import_binlog_ssl_material) ストアドプロシージャを実行して、Aurora MySQL DB クラスターに SSL 情報をインポートします。

   `ssl_material_value` パラメータには、正しい JSON ペイロードで Aurora MySQL DB クラスター用の .pem 形式から情報を挿入します。

   次の例では、SSL 情報を Aurora MySQL DB クラスターにインポートします。.pem 形式ファイルでは、通常の場合、コード本文に例に示されるコード本文より長くなっています。

   ```
   call mysql.rds_import_binlog_ssl_material(
   '{"ssl_ca":"-----BEGIN CERTIFICATE-----
   AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V
   hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr
   lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ
   qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb
   BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE
   -----END CERTIFICATE-----\n","ssl_cert":"-----BEGIN CERTIFICATE-----
   AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V
   hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr
   lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ
   qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb
   BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE
   -----END CERTIFICATE-----\n","ssl_key":"-----BEGIN RSA PRIVATE KEY-----
   AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V
   hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr
   lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ
   qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb
   BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE
   -----END RSA PRIVATE KEY-----\n"}');
   ```

   詳細については、「[mysql.rds\$1import\$1binlog\$1ssl\$1material](mysql-stored-proc-replicating.md#mysql_rds_import_binlog_ssl_material)」および「[Aurora MySQL DB クラスターへの接続](AuroraMySQL.Security.md#AuroraMySQL.Security.SSL)」を参照してください。
**注記**  
手順を実行したあと、シークレットはファイルに保存されます。ファイルを後で消去するには、[mysql.rds\$1remove\$1binlog\$1ssl\$1material](mysql-stored-proc-replicating.md#mysql_rds_remove_binlog_ssl_material) ストアドプロシージャを実行できます。

### Amazon Aurora MySQL DB クラスターと外部の MySQL データベースを同期する
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.RepSync.Synchronizing"></a>

レプリケーションを使用して、Amazon Aurora MySQL DB クラスターと MySQL データベースを同期できます。

**レプリケーションを使用して、Aurora MySQL DB クラスターと MySQL データベースを同期するには**

1. 外部の MySQL データベース用の /etc/my.cnf ファイルに関連するエントリがあることを確認します。

   暗号化レプリケーションが求められない場合、外部 MySQL データベースがバイナリログ (binlogs) が有効化されて、SSL が無効化された状態でスタートすることを確認します。以下に示すのは、非暗号化データ用の /etc/my.cnf ファイルの関連するエントリです。

   ```
   log-bin=mysql-bin
   server-id=2133421
   innodb_flush_log_at_trx_commit=1
   sync_binlog=1
   ```

   暗号化レプリケーションが求められる場合、外部 MySQL データベースが SSL およびバイナリログ有効化された状態でスタートすることを確認します。/etc/my.cnf ファイルのエントリには、MySQL データベースサーバーのための .pem ファイルの場所が含まれます。

   ```
   log-bin=mysql-bin
   server-id=2133421
   innodb_flush_log_at_trx_commit=1
   sync_binlog=1
   
   # Setup SSL.
   ssl-ca=/home/sslcerts/ca.pem
   ssl-cert=/home/sslcerts/server-cert.pem
   ssl-key=/home/sslcerts/server-key.pem
   ```

   次のコマンドを使って、SSL が有効であることを確認できます。

   ```
   mysql> show variables like 'have_ssl';
   ```

   出力は次のようになります。

   ```
   +~-~-~-~-~-~-~-~-~-~-~-~-~-~--+~-~-~-~-~-~--+
   | Variable_name | Value |
   +~-~-~-~-~-~-~-~-~-~-~-~-~-~--+~-~-~-~-~-~--+
   | have_ssl      | YES   |
   +~-~-~-~-~-~-~-~-~-~-~-~-~-~--+~-~-~-~-~-~--+
   1 row in set (0.00 sec)
   ```

1. レプリケーションをスタートするバイナリログの位置を決定します。レプリケーションをスタートする位置は後のステップで指定します。

   ** の使用AWS マネジメントコンソール**

   1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

   1. ナビゲーションペインの [**Events**] を選択します。

   1. [**イベント**] リストで、[**Recovered from Binary log filename** (バイナリログのファイル名から復旧済み)] イベントの位置をメモします。  
![\[MySQL プライマリを表示\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/aurora-mysql-rep-binary-log-position.png)

   ** の使用AWS CLI**

   [describe-events](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-events.html) AWS CLI コマンドを使用sるうことにより、binlog ファイルの名前と場所を取得することもできます。`describe-events` コマンドの例を以下に示します。

   ```
   PROMPT> aws rds describe-events
   ```

   出力で、バイナリログの位置を示すイベントを特定します。

1. 外部の MySQL データベースに接続したら、レプリケーションに使用するユーザーを作成します。このアカウントはレプリケーション専用に使用され、セキュリティを強化するためにドメインに制限する必要があります。次に例を示します。

   ```
   mysql> CREATE USER '<user_name>'@'<domain_name>' IDENTIFIED BY '<password>';
   ```

   ユーザーには `REPLICATION CLIENT` および `REPLICATION SLAVE` 権限が必要です。ユーザーのこれらの権限を付与します。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO '<user_name>'@'<domain_name>';
   ```

   暗号化レプリケーションを使用する必要がある場合は、レプリケーションのユーザーに対して SSL 接続を要求します。例えば、以下のステートメントを使用して、ユーザーアカウント `<user_name>` に SSL 接続を要求できます。

   ```
   GRANT USAGE ON *.* TO '<user_name>'@'<domain_name>' REQUIRE SSL;
   ```
**注記**  
`REQUIRE SSL` が含まれていない場合には、レプリケーション接続がメッセージの表示なしで非暗号化接続に戻る場合があります。

1. Amazon RDS コンソールで、外部 MySQL データベースをホストするサーバーの IP アドレスを、Aurora MySQL DB クラスターの VPC セキュリティグループに追加します。VPC セキュリティグループの変更方法の詳細については、*Amazon Virtual Private Cloudユーザーガイド*の「[VPC のセキュリティグループ](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)」を参照してください。

   外部の MySQL データベースと通信できるようにするために、Aurora MySQL DB クラスターの IP アドレスからの接続を許可するようにローカルネットワークを設定することも必要になる場合があります。Aurora MySQL DB クラスターの IP アドレスを確認するには、`host` コマンドを使用します。

   ```
   host <db_cluster_endpoint>
   ```

   このホスト名は、Aurora MySQL DB クラスターのエンドポイントからの DNS 名です。

1. [mysql.rds\$1reset\$1external\$1master (Aurora MySQL バージョン 2)](mysql-stored-proc-replicating.md#mysql_rds_reset_external_master) または [mysql.rds\$1reset\$1external\$1source (Aurora MySQL バージョン 3)](mysql-stored-proc-replicating.md#mysql_rds_reset_external_source) ストアプロシージャを実行して、バイナリログレプリケーションを有効化します。このストアプロシージャの構文は次のとおりです。

   ```
   CALL mysql.rds_set_external_master (
     host_name
     , host_port
     , replication_user_name
     , replication_user_password
     , mysql_binary_log_file_name
     , mysql_binary_log_file_location
     , ssl_encryption
   );
   
   CALL mysql.rds_set_external_source (
     host_name
     , host_port
     , replication_user_name
     , replication_user_password
     , mysql_binary_log_file_name
     , mysql_binary_log_file_location
     , ssl_encryption
   );
   ```

   パラメータの詳細については、「[mysql.rds\$1reset\$1external\$1master (Aurora MySQL バージョン 2)](mysql-stored-proc-replicating.md#mysql_rds_reset_external_master)」および「[mysql.rds\$1reset\$1external\$1source (Aurora MySQL バージョン 3)](mysql-stored-proc-replicating.md#mysql_rds_reset_external_source)」を参照してください。

   `mysql_binary_log_file_name` および `mysql_binary_log_file_location` には、前のステップでメモした [**Recovered from Binary log filename** (バイナリログのファイル名から復旧済み)] イベントの位置を使用します。

   Aurora MySQL DB クラスターのデータが暗号化されていない場合には、`ssl_encryption` パラメータを `0` に設定する必要があります。このデータが暗号化されている場合、`ssl_encryption` パラメータを `1` に設定する必要があります。

   次の例では、暗号化されたデータがある Aurora MySQL DB クラスターの手順を実行します。

   ```
   CALL mysql.rds_set_external_master(
     'Externaldb.some.com',
     3306,
     'repl_user'@'mydomain.com',
     'password',
     'mysql-bin.000010',
     120,
     1);
   
   CALL mysql.rds_set_external_source(
     'Externaldb.some.com',
     3306,
     'repl_user'@'mydomain.com',
     'password',
     'mysql-bin.000010',
     120,
     1);
   ```

   このストアプロシージャは、外部の MySQL データベースに接続し、そのバイナリログを読み取るために Aurora MySQL DB クラスターが使用するパラメータを設定します。データが暗号化されている場合には、SSL 認証局証明書、クライアント証明書およびクライアントキーもローカルディスクにダウンロードされます。

1. [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) ストアプロシージャを実行して、バイナリログレプリケーションをスタートします。

   ```
   CALL mysql.rds_start_replication;
   ```

1. Aurora MySQL DB クラスターが MySQL レプリケーションプライマリーデータベースよりどれだけ遅れているかをモニタリングします。そのためには、Aurora MySQL DB クラスターに接続し、次のコマンドを実行します。

   ```
   Aurora MySQL version 2:
   SHOW SLAVE STATUS;
   
   Aurora MySQL version 3:
   SHOW REPLICA STATUS;
   ```

   このコマンドの出力の `Seconds Behind Master` フィールドには、Aurora MySQL DB クラスターがどれだけ MySQL プライマリより遅れているかが示されます。この値が `0` (ゼロ) の場合、Aurora MySQL DB クラスターがMySQL プライマリに追いついたことを示し、レプリケーションを停止するための次のステップに進むことができます。

1. MySQL レプリケーションのMySQL プライマリデータベースに接続して、レプリケーションを停止します。これを行うには、[mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) ストアドプロシージャを実行します。

   ```
   CALL mysql.rds_stop_replication;
   ```

# Amazon Aurora MySQL への物理的な移行にかかる時間の短縮
<a name="AuroraMySQL.Migrating.ExtMySQL.Prechecks"></a>

Amazon Aurora MySQL へのデータベース移行プロセスをスピードアップするために、以下のデータベース修正を行うことができます。

**重要**  
これらのアップデートは、本稼働データベースではなく、そのコピーに対して実行するようにしてください。このコピーをバックアップし、Aurora MySQL DB クラスターに復元することで、本稼働データベースのサービス停止を回避できます。

## サポートされていないテーブルタイプ
<a name="AuroraMySQL.Migrating.ExtMySQL.Prechecks.Tables"></a>

Aurora MySQL はデータベーステーブル用の InnoDB エンジンのみをサポートしています。データベース内に MyISAM テーブルがある場合は、Aurora MySQL に移行する前にそれらのテーブルを変換する必要があります。移行中の MyISAM から InnoDB への変換プロセスには、追加領域が必要です。

領域不足が発生する可能性を低く抑えて移行プロセスを高速化するには、すべての MyISAM テーブルを移行前に InnoDB テーブルに変換しておきます。処理後の InnoDB テーブルのサイズは、Aurora MySQL がそのテーブルに対して必要とするサイズと同じになります。MyISAM テーブルを InnoDB に変換するには、次のコマンドを実行します。

```
ALTER TABLE schema.table_name engine=innodb, algorithm=copy;
```

Aurora MySQL では、圧縮テーブルまたはページ (`ROW_FORMAT=COMPRESSED` または `COMPRESSION = {"zlib"|"lz4"}` を使用して作成されたテーブル) をサポートしていません。

スペースが不足する可能性を減らしたり、移行処理を高速化するには、`ROW_FORMAT` を `DEFAULT`、`COMPACT`、`DYNAMIC` または `REDUNDANT` に設定して圧縮テーブルを展開します。圧縮ページの場合は、`COMPRESSION="none"` を設定します。

詳細については、MySQL ドキュメントの「[InnoDB 行形式](https://dev.mysql.com/doc/refman/8.0/en/innodb-row-format.html)」および「[InnoDB テーブルおよびページ圧縮](https://dev.mysql.com/doc/refman/8.0/en/innodb-compression.html)」を参照してください。

既存の MySQL DB インスタンスで以下の SQL スクリプトを使用して、データベースの MyISAM テーブルまたは圧縮テーブルのリストを表示できます。

```
-- This script examines a MySQL database for conditions that block
-- migrating the database into Aurora MySQL.
-- It must be run from an account that has read permission for the
-- INFORMATION_SCHEMA database.

-- Verify that this is a supported version of MySQL.

select msg as `==> Checking current version of MySQL.`
from
  (
  select
    'This script should be run on MySQL version 5.6 or higher. ' +
    'Earlier versions are not supported.' as msg,
    cast(substring_index(version(), '.', 1) as unsigned) * 100 +
      cast(substring_index(substring_index(version(), '.', 2), '.', -1)
      as unsigned)
    as major_minor
  ) as T
where major_minor <> 506;


-- List MyISAM and compressed tables. Include the table size.

select concat(TABLE_SCHEMA, '.', TABLE_NAME) as `==> MyISAM or Compressed Tables`,
round(((data_length + index_length) / 1024 / 1024), 2) "Approx size (MB)"
from INFORMATION_SCHEMA.TABLES
where
  ENGINE <> 'InnoDB'
  and
  (
    -- User tables
    TABLE_SCHEMA not in ('mysql', 'performance_schema',
                         'information_schema')
    or
    -- Non-standard system tables
    (
      TABLE_SCHEMA = 'mysql' and TABLE_NAME not in
        (
          'columns_priv', 'db', 'event', 'func', 'general_log',
          'help_category', 'help_keyword', 'help_relation',
          'help_topic', 'host', 'ndb_binlog_index', 'plugin',
          'proc', 'procs_priv', 'proxies_priv', 'servers', 'slow_log',
          'tables_priv', 'time_zone', 'time_zone_leap_second',
          'time_zone_name', 'time_zone_transition',
          'time_zone_transition_type', 'user'
        )
    )
  )
  or
  (
    -- Compressed tables
       ROW_FORMAT = 'Compressed'
  );
```

## サポートされていない権限を持つユーザーアカウント
<a name="AuroraMySQL.Migrating.ExtMySQL.Prechecks.Users"></a>

Aurora MySQL でサポートされていない権限を持つユーザーアカウントは、サポートされていない権限なしでもインポートされます。サポートされている権限のリストについては、「[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model)」を参照してください。

ソースデータベースで次の SQL クエリを実行すると、サポートされていない権限を持つユーザーアカウントを一覧表示できます。

```
SELECT
    user,
    host
FROM
    mysql.user
WHERE
    Shutdown_priv = 'y'
    OR File_priv = 'y'
    OR Super_priv = 'y'
    OR Create_tablespace_priv = 'y';
```

## Aurora MySQL バージョン 3 に対する動的権限
<a name="AuroraMySQL.Migrating.ExtMySQL.Prechecks.Dynamic"></a>

動的権限はインポートされません。Aurora MySQL バージョン 3 は、以下の動的権限をサポートしています。

```
'APPLICATION_PASSWORD_ADMIN',
'CONNECTION_ADMIN',
'REPLICATION_APPLIER',
'ROLE_ADMIN',
'SESSION_VARIABLES_ADMIN',
'SET_USER_ID',
'XA_RECOVER_ADMIN'
```

次のサンプルスクリプトは、サポートされている動的権限を Aurora MySQL DB クラスターのユーザーアカウントに付与します。

```
-- This script finds the user accounts that have Aurora MySQL supported dynamic privileges 
-- and grants them to corresponding user accounts in the Aurora MySQL DB cluster.

/home/ec2-user/opt/mysql/8.0.26/bin/mysql -uusername -pxxxxx -P8026 -h127.0.0.1 -BNe "SELECT
  CONCAT('GRANT ', GRANTS, ' ON *.* TO ', GRANTEE ,';') AS grant_statement
  FROM (select GRANTEE, group_concat(privilege_type) AS GRANTS FROM information_schema.user_privileges 
      WHERE privilege_type IN (
        'APPLICATION_PASSWORD_ADMIN',
        'CONNECTION_ADMIN',
        'REPLICATION_APPLIER',
        'ROLE_ADMIN',
        'SESSION_VARIABLES_ADMIN',
        'SET_USER_ID',
        'XA_RECOVER_ADMIN')
      AND GRANTEE NOT IN (\"'mysql.session'@'localhost'\",\"'mysql.infoschema'@'localhost'\",\"'mysql.sys'@'localhost'\") GROUP BY GRANTEE)
      AS PRIVGRANTS; " | /home/ec2-user/opt/mysql/8.0.26/bin/mysql -u master_username -p master_password -h DB_cluster_endpoint
```

## 定義者として 'rdsadmin'@'localhost' を使用して保存されたオブジェクト
<a name="AuroraMySQL.Migrating.ExtMySQL.Prechecks.Objects"></a>

`'rdsadmin'@'localhost'` が定義子である関数、プロシージャ、ビュー、イベント、トリガーは、インポートされません。

ソース MySQL データベースで以下の SQL スクリプトを使用すると、サポートされていない定義子を持つストアド オブジェクトを一覧表示できます。

```
-- This SQL query lists routines with `rdsadmin`@`localhost` as the definer.

SELECT
    ROUTINE_SCHEMA,
    ROUTINE_NAME
FROM
    information_schema.routines
WHERE
    definer = 'rdsadmin@localhost';

-- This SQL query lists triggers with `rdsadmin`@`localhost` as the definer.

SELECT
    TRIGGER_SCHEMA,
    TRIGGER_NAME,
    DEFINER
FROM
    information_schema.triggers
WHERE
    DEFINER = 'rdsadmin@localhost';

-- This SQL query lists events with `rdsadmin`@`localhost` as the definer.

SELECT
    EVENT_SCHEMA,
    EVENT_NAME
FROM
    information_schema.events
WHERE
    DEFINER = 'rdsadmin@localhost';

-- This SQL query lists views with `rdsadmin`@`localhost` as the definer.
SELECT
    TABLE_SCHEMA,
    TABLE_NAME
FROM
    information_schema.views
WHERE
    DEFINER = 'rdsadmin@localhost';
```

# mysqldump を使用した MySQL から Amazon Aurora MySQL への論理的移行
<a name="AuroraMySQL.Migrating.ExtMySQL.mysqldump"></a>

Amazon Aurora MySQL は MySQL と互換性があるデータベースであるため、`mysqldump` ユーティリティを使用して MySQL データベースからデータをコピーしたり、`mariadb-dump` ユーティリティを使用して MariaDB データベースから既存の Aurora MySQL DB クラスターにデータをコピーしたりできます。

非常に大規模な MySQL または MariaDB データベースでこれを行う方法については、「*Amazon Relational Database Service ユーザーガイド*」の以下のトピックを参照してください。
+ MySQL – [Importing data to an Amazon RDS for MySQL database with reduced downtime](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-importing-data-reduced-downtime.html)
+ MariaDB – [Importing data to an Amazon RDS for MariaDB database with reduced downtime](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mariadb-importing-data-reduced-downtime.html)

データ量が少ない MySQL または MariaDB データベースについては、「*Amazon Relational Database Service ユーザーガイド*」の以下のトピックを参照してください。
+ MySQL – [Importing data from an external MySQL database to an Amazon RDS for MySQL DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-importing-data-external-database.html)
+ MariaDB – [Importing data from an external MariaDB database to an Amazon RDS for MariaDB DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mariadb-importing-data-external-database.html)

# RDS for MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターへのデータの移行
<a name="AuroraMySQL.Migrating.RDSMySQL"></a>

RDS for MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターにデータを移行 (コピー) できます。

**Topics**
+ [Aurora への RDS for MySQL スナップショットの移行](AuroraMySQL.Migrating.RDSMySQL.Snapshot.md)
+ [Aurora リードレプリカを使用した、RDS for MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターへのデータの移行](AuroraMySQL.Migrating.RDSMySQL.Replica.md)

**注記**  
Amazon Aurora MySQL は MySQL と互換性があるため、MySQL データベースと Amazon Aurora MySQL DB クラスターの間でレプリケーションをセットアップすることによって、MySQL データベースのデータを移行できます。詳細については、「[Amazon Aurora でのレプリケーション](Aurora.Replication.md)」を参照してください。

# Aurora への RDS for MySQL スナップショットの移行
<a name="AuroraMySQL.Migrating.RDSMySQL.Snapshot"></a>

RDS for MySQL DB インスタンスの DB スナップショットを移行して、Aurora MySQL DB クラスターを作成することができます。新しい Aurora MySQL DB クラスターには、元の RDS for MySQL DB インスタンスのデータが入力されます。DB スナップショットは、Aurora MySQL と互換性がある MySQL バージョンを実行している Amazon RDS DB インスタンスから作成されたものである必要があります。

手動で作成された DB スナップショットと自動的に作成された DB スナップショットのどちらも移行できます。DB クラスターが作成された後、オプションの Aurora レプリカを作成できます。

**注記**  
ソース RDS for MySQL DB インスタンスの Aurora リードレプリカを作成することにより、RDS for MySQL DB インスタンスを Aurora MySQL DB クラスターに移行することもできます。詳細については、「[Aurora リードレプリカを使用した、RDS for MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターへのデータの移行](AuroraMySQL.Migrating.RDSMySQL.Replica.md)」を参照してください。  
8.0.11、8.0.13、8.0.15 などの一部の古い MySQL 8.0 バージョンからは Aurora MySQL バージョン 3.05 以上に移行できません。移行する前に MySQL バージョン 8.0.28 にアップグレードすることをお勧めします。

実行する必要がある一般的なステップは次のとおりです。

1. Aurora MySQL DB クラスターをプロビジョニングするための容量を決定します。詳細については、「[必要な容量](#AuroraMySQL.Migrating.RDSMySQL.Space)」を参照してください。

1. コンソールを使用して、Amazon RDS MySQL インスタンスが置かれている AWS リージョン内にスナップショットを作成します。DB スナップショットの作成については、「[DB スナップショットの作成](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html)」を参照してください。

1. DB スナップショットが DB クラスターと同じ AWS リージョン内にない場合は、Amazon RDS コンソールを使用して DB スナップショットをその AWS リージョンにコピーします。DB スナップショットのコピーについては、「[DB スナップショットのコピー](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CopySnapshot.html)」を参照してください。

1. コンソールを使用して DB スナップショットを移行し、元の MySQL DB インスタンスと同じデータベースを持つ Aurora MySQL DB クラスターを作成します。

**警告**  
Amazon RDS では、各 AWS アカウントによる各 AWS リージョンへのスナップショットのコピーは 1 度に 1 つに制限されています。

## 必要な容量
<a name="AuroraMySQL.Migrating.RDSMySQL.Space"></a>

MySQL DB インスタンスのスナップショットを Aurora MySQL DB クラスターに移行するとき、Aurora は、スナップショットのデータを移行する前に Amazon Elastic Block Store (Amazon EBS) ボリュームを使用してそのデータの書式を設定します。移行するデータの書式を設定するために追加容量が必要になる場合があります。

MyISAM テーブルではないテーブルおよび圧縮されていないテーブルのサイズは、最大 16 TB が可能です。MyISAM テーブルの場合、Aurora では、Aurora MySQL と互換性のあるテーブルに変換するために、ボリュームに追加のスペースが必要になります。圧縮されたテーブルの場合、Aurora では、圧縮されたテーブルを Aurora クラスターボリュームに保存する前に展開するため、ボリュームに追加のスペースが必要になります。追加のスペースが必要になるため、MySQL DB インスタンスから移行される MyISAM テーブルおよび圧縮テーブルのサイズが 8 TB を超えていないことを確認する必要があります。

## Amazon Aurora MySQL にデータを移行するために必要な容量の削減
<a name="AuroraMySQL.Migrating.RDSMySQL.PreImport"></a>

Amazon Aurora に移行する前にデータベーススキーマを変更することもできます。このような変更は、次のような場合に便利です。
+ 移行プロセスを迅速化したい。
+ プロビジョニングするために必要な領域の量がわからない場合。
+ データを移行しようとしたが、プロビジョニング済み領域の不足で移行が失敗した場合。

以下の変更を行うことで、データベースを Amazon Aurora に移行するプロセスを改善できます。

**重要**  
これらの更新は、本稼働インスタンスではなく、本稼働データベースのスナップショットから復元された新しい DB インスタンスに対して実行します。その後、新しい DB インスタンスのスナップショットからデータを Aurora DB クラスターに移行することで、本稼働データベースに対するサービスの中断を回避できます。


| テーブルタイプ | 制限またはガイドライン | 
| --- | --- | 
|  MyISAM テーブル  |  Aurora MySQL は InnoDB テーブルのみをサポートします。データベース内に MyISAM テーブルがある場合は、Aurora MySQL に移行する前にそれらのテーブルを変換する必要があります。移行中の MyISAM から InnoDB への変換プロセスには、追加領域が必要です。 領域不足が発生する可能性を低く抑えて移行プロセスを高速化するには、すべての MyISAM テーブルを移行前に InnoDB テーブルに変換しておきます。処理後の InnoDB テーブルのサイズは、Aurora MySQL がそのテーブルに対して必要とするサイズと同じになります。MyISAM テーブルを InnoDB に変換するには、次のコマンドを実行します。 `alter table <schema>.<table_name> engine=innodb, algorithm=copy;`   | 
|  圧縮テーブル  |  Aurora MySQL では、圧縮テーブル (`ROW_FORMAT=COMPRESSED` を使用して作成されたテーブル) をサポートしていません。 スペースが不足する可能性を減らしたり、移行処理を高速化するには、`ROW_FORMAT` を `DEFAULT`、`COMPACT`、`DYNAMIC` または `REDUNDANT` に設定して圧縮テーブルを展開します。詳細については、MySQL ドキュメントの「[InnoDB 行形式](https://dev.mysql.com/doc/refman/8.0/en/innodb-row-format.html)」を参照してください。  | 

既存の MySQL DB インスタンスで以下の SQL スクリプトを使用して、データベースの MyISAM テーブルまたは圧縮テーブルのリストを表示できます。

```
-- This script examines a MySQL database for conditions that block
-- migrating the database into Amazon Aurora.
-- It needs to be run from an account that has read permission for the
-- INFORMATION_SCHEMA database.

-- Verify that this is a supported version of MySQL.

select msg as `==> Checking current version of MySQL.`
from
  (
  select
    'This script should be run on MySQL version 5.6 or higher. ' +
    'Earlier versions are not supported.' as msg,
    cast(substring_index(version(), '.', 1) as unsigned) * 100 +
      cast(substring_index(substring_index(version(), '.', 2), '.', -1)
      as unsigned)
    as major_minor
  ) as T
where major_minor <> 506;


-- List MyISAM and compressed tables. Include the table size.

select concat(TABLE_SCHEMA, '.', TABLE_NAME) as `==> MyISAM or Compressed Tables`,
round(((data_length + index_length) / 1024 / 1024), 2) "Approx size (MB)"
from INFORMATION_SCHEMA.TABLES
where
  ENGINE <> 'InnoDB'
  and
  (
    -- User tables
    TABLE_SCHEMA not in ('mysql', 'performance_schema',
                         'information_schema')
    or
    -- Non-standard system tables
    (
      TABLE_SCHEMA = 'mysql' and TABLE_NAME not in
        (
          'columns_priv', 'db', 'event', 'func', 'general_log',
          'help_category', 'help_keyword', 'help_relation',
          'help_topic', 'host', 'ndb_binlog_index', 'plugin',
          'proc', 'procs_priv', 'proxies_priv', 'servers', 'slow_log',
          'tables_priv', 'time_zone', 'time_zone_leap_second',
          'time_zone_name', 'time_zone_transition',
          'time_zone_transition_type', 'user'
        )
    )
  )
  or
  (
    -- Compressed tables
       ROW_FORMAT = 'Compressed'
  );
```

スクリプトでは、次の例のような出力が作成されます。この例では、MyISAM から InnoDB に変換する必要のある 2 つのテーブルを示しています。出力には、メガバイト (MB) 単位で示した各テーブルのおおよそのサイズも含まれています。

```
+---------------------------------+------------------+
| ==> MyISAM or Compressed Tables | Approx size (MB) |
+---------------------------------+------------------+
| test.name_table                 |          2102.25 |
| test.my_table                   |            65.25 |
+---------------------------------+------------------+
2 rows in set (0.01 sec)
```

## RDS for MySQL DB スナップショットを Aurora MySQL DB クラスターに移行する
<a name="migrate-snapshot-ams-cluster"></a>

RDS for MySQL DB インスタンスの DB スナップショットを移行して、AWS マネジメントコンソール または AWS CLI を使って、Aurora MySQL DB クラスターを作成することができます。新しい Aurora MySQL DB クラスターには、元の RDS for MySQL DB インスタンスのデータが入力されます。DB スナップショットの作成については、「[DB スナップショットの作成](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html)」を参照してください。

DB スナップショットがデータを検索する AWS リージョン内にない場合は、DB スナップショットをその AWS リージョンにコピーします。DB スナップショットのコピーについては、「[DB スナップショットのコピー](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CopySnapshot.html)」を参照してください。

### コンソール
<a name="AuroraMySQL.Migrating.RDSMySQL.Import.Console"></a>

AWS マネジメントコンソール を使用して DB スナップショットを移行すると、コンソールは DB クラスターのみの作成に必要なアクションを実行します。

新しい Aurora MySQL DB クラスターが、AWS KMS key を使用して保管中に暗号化されるよう選択することもできます。

**AWS マネジメントコンソール を使用して MySQL DB スナップショットを移行するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. MySQL DB インスタンスまたはスナップショットから移行をスタートします。

   DB インスタンスから移行をスタートするには:

   1. ナビゲーションペインで、[**データベース**] を選択し、MySQL DB インスタンスを選択します。

   1. [**アクション**]、[**最新のスナップショットの移行**] の順に選択します。

   スナップショットから移行をスタートするには:

   1. [**スナップショット**] を選択します。

   1. [**スナップショット**] ページで、Aurora MySQL DB クラスターに移行するスナップショットを選択します。

   1. [**スナップショットのアクション**]、[**スナップショットの移行**] の順に選択します。

   [**データベースの移行**] ページが表示されます。

1. [**データベースの移行**] ページで以下の値を設定します。
   + [**DB エンジンへの移行**] : `aurora` を選択します。
   + [**DB エンジンのバージョン**]: Aurora MySQL DB クラスターの DB エンジンのバージョンを選択します。
   + **DB インスタンスクラス**: データベースに必要なストレージと容量を持つ DB インスタンスクラス (`db.r3.large` など) を選択します。Aurora クラスターボリュームは、データベースのデータ量が増えるにつれて自動的に増加します。Aurora クラスターボリュームは、最大 128 tebibytes (TiB) のサイズまで増やすことができます。そのため、現在のストレージ要件を満たしている DB インスタンスクラスを選択する必要があります。詳細については、「[Amazon Aurora ストレージの概要](Aurora.Overview.StorageReliability.md#Aurora.Overview.Storage)」を参照してください。
   + **DB インスタンス識別子**: DB クラスター名を入力します。選択した AWS リージョン内で、自分のアカウントに対して一意であることが必要です。この識別子は、DB クラスター内のインスタンスのエンドポイントアドレスで使用されます。名前には、選択した AWS リージョンと DB エンジンなどを含めると理解しやすくなります (**aurora-cluster1** など)。

     DB インスタンス識別子には次の制約があります。
     + 1 ～ 63 文字の英数字またはハイフンを使用する必要があります。
     + 1 字目は文字である必要があります。
     + ハイフンを、文字列の最後に使用したり、2 つ続けて使用したりすることはできません。
     + 1 つの AWS アカウント、1 つの AWS リージョンにつき、すべての DB インスタンスにおいて一意である必要があります。
   + [**Virtual Private Cloud (VPC)**]: 既存の VPC がある場合は、その VPC 識別子 (`vpc-a464d1c1` など) を選択することで、その VPC を Aurora MySQL DB クラスターで使用できます。VPC の作成方法の詳細については、「[チュートリアル: DB クラスターで使用する VPC を作成する (IPv4 専用)](CHAP_Tutorials.WebServerDB.CreateVPC.md)」を参照してください。

     または、[**新しい VPC の作成**] を選択し、Aurora で自動的に VPC を作成します。
   + **DB サブネットグループ**: 既存のサブネットグループがある場合は、そのサブネットグループ識別子 (`gs-subnet-group1` など) を選択して、サブネットグループを Aurora MySQL DB クラスターで使用できます。

     または、[**新しいサブネットグループを作成**] を選択し、Aurora で自動的にサブネットグループを作成します。
   + **Public accessibility**: DB クラスターのインスタンスが VPC 内のリソースからのみアクセスできることを指定するには、[**いいえ**] を選択します。DB クラスターのインスタンスがパブリックネットワーク上のリソースからアクセスできることを指定するには、[**はい**] を選択します。デフォルトは [**はい**] です。
**注記**  
本番稼働用の DB クラスターは、お客様のアプリケーションサーバーのみがアクセスするため、パブリックサブネット内に配置する必要がない場合があります。DB クラスターをパブリックサブネットに配置する必要がない場合は、[**パブリックアクセス可能**] を [**いいえ**] に設定します。
   + [**アベイラビリティーゾーン**]: Aurora MySQL DB クラスターのプライマリインスタンスをホストするアベイラビリティーゾーンを選択します。Aurora で自動的にアベイラビリティーゾーンを選択するには、[**指定なし**] を選択します。
   + [**データベースのポート**]: Aurora MySQL DB クラスターのインスタンスへの接続に使用されるデフォルトのポートを入力します。デフォルトは `3306` です。
**注記**  
会社のファイアウォールで MySQL のデフォルトポートである 3306 などのデフォルトポートへのアクセスが許可されない場合があります。この場合は、会社のファイアウォールによって許可されるポート値を指定します。そのポート値を覚えておいてください。後で Aurora MySQL DB クラスターに接続するときに使用します。
   + [**暗号化**]: 新しい Aurora MySQL DB クラスターを保管時に暗号化するには、[**暗号を有効化**] を選択します。[**Enable Encryption**] (暗号化を有効化) を選択する場合、KMS キーを **AWS KMS key** 値として選択する必要があります。

     DB スナップショットが暗号化されていない場合は、暗号化キーを指定して保管時の DB クラスターを暗号化します。

     DB スナップショットが暗号化されている場合は、暗号化キーを指定し、その指定された暗号化キーを使用して保管時の DB クラスターを暗号化します。DB スナップショットで使用される暗号化キー、または別のキーを指定できます。暗号化された DB スナップショットから 非暗号化の DB クラスターを作成することはできません。
   + [**マイナーバージョン自動アップグレード**]: この設定は Aurora MySQL DB クラスターに適用されません。

     Aurora MySQL のエンジンに関する更新の詳細については、「[Amazon Aurora MySQL のデータベースエンジンの更新Amazon Aurora MySQL の長期サポート (LTS) とベータリリース](AuroraMySQL.Updates.md)」を参照してください。

1. [**移行**] を選択して、DB スナップショットを移行します。

1. [**インスタンス**] を選択して、矢印アイコンを選択して DB クラスターの詳細を表示し、移行の進行状況をモニタリングします。詳細ページで、DB クラスターのプライマリインスタンスへの接続に使用されているクラスターエンドポイントがわかります。Aurora MySQL DB クラスターとの接続の詳細については、「[Amazon Aurora DB クラスターへの接続](Aurora.Connecting.md)」を参照してください。

### AWS CLI
<a name="USER_ImportAuroraCluster.CLI"></a>

[https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-from-snapshot.html](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-from-snapshot.html) コマンドを次のパラメータで使用することで、RDS for MySQL DB インスタンスの DB スナップショットから Aurora DB クラスターを作成できます。
+ `--db-cluster-identifier` - 作成する DB クラスターの名前。
+ `--engine aurora-mysql` — MySQL 5.7 互換または 8.0 互換 DB クラスターの場合
+ `--kms-key-id` - DB スナップショットが暗号化されるかどうかに応じて、オプションで DB クラスターを暗号化するための AWS KMS key。
  + DB スナップショットが暗号化されていない場合は、暗号化キーを指定して保管時の DB クラスターを暗号化します。これを実行しない場合、DB クラスターは暗号化されません。
  + DB スナップショットが暗号化されている場合は、暗号化キーを指定し、その指定された暗号化キーを使用して保管時の DB クラスターを暗号化します。これを実行しない場合、保管時の DB クラスターは DB スナップショットの暗号化キーを使用して暗号化されます。
**注記**  
暗号化された DB スナップショットから 非暗号化の DB クラスターを作成することはできません。
+ `--snapshot-identifier` – 移行する DB スナップショットの Amazon リソースネーム (ARN)。Amazon RDS ARN の詳細については、「[Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-rds)」を参照してください。

`RestoreDBClusterFromSnapshot` コマンドを使用して DB スナップショットを移行すると、DB クラスターとプライマリインスタンスの両方がこのコマンドによって作成されます。

この例では、*mydbcluster* という名前の MySQL 5.7 互換 DB クラスターを ARN が *mydbsnapshotARN* に設定されている DB スナップショットから作成します。

Linux、macOS、Unix の場合:

```
aws rds restore-db-cluster-from-snapshot \
    --db-cluster-identifier mydbcluster \
    --snapshot-identifier mydbsnapshotARN \
    --engine aurora-mysql
```

Windows の場合:

```
aws rds restore-db-cluster-from-snapshot ^
    --db-cluster-identifier mydbcluster ^
    --snapshot-identifier mydbsnapshotARN ^
    --engine aurora-mysql
```

この例では、*mydbcluster* という名前の MySQL 5.7 互換 DB クラスターを ARN が *mydbsnapshotARN* に設定されている DB スナップショットから作成します。

Linux、macOS、Unix の場合:

```
aws rds restore-db-cluster-from-snapshot \
    --db-cluster-identifier mydbcluster \
    --snapshot-identifier mydbsnapshotARN \
    --engine aurora-mysql
```

Windows の場合:

```
aws rds restore-db-cluster-from-snapshot ^
    --db-cluster-identifier mydbcluster ^
    --snapshot-identifier mydbsnapshotARN ^
    --engine aurora-mysql
```

# Aurora リードレプリカを使用した、RDS for MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターへのデータの移行
<a name="AuroraMySQL.Migrating.RDSMySQL.Replica"></a>

Aurora は、MySQL DB エンジンのバイナリログレプリケーション機能を使用して、ソース RDS for MySQL DB インスタンスの Aurora リードレプリカと呼ばれる特殊なタイプの DB クラスターを作成します。ソース RDS for MySQL DB インスタンスに加えられた更新は、Aurora リードレプリカに非同期的にレプリケートされます。

ソース RDS for MySQL DB インスタンスの Aurora リードレプリカを作成して RDS for MySQL DB インスタンスから Aurora MySQL DB クラスターに移行する場合は、この機能を使用することをお勧めします。RDS for MySQL DB インスタンスと Aurora リードレプリカとの間のレプリカラグが 0 の場合は、クライアントアプリケーションを Aurora リードレプリカに誘導してからレプリケーションを停止することで、Aurora リードレプリカをスタンドアロンの Aurora MySQL DB クラスターにすることができます。移行では、データの 1 テビバイト (TiB) ごとに数時間程度の時間がかかります。

Aurora を使用できるリージョンの一覧は、*AWS 全般のリファレンス* の「[Amazon Aurora](https://docs.aws.amazon.com/general/latest/gr/rande.html#aurora)」を参照してください。

RDS for MySQL DB インスタンスの Aurora リードレプリカを作成すると、Amazon RDS により、ソース RDS for MySQL DB インスタンスの DB スナップショットが作成されます (このスナップショットは Amazon RDS に対してプライベートで、料金はかかりません)。その後 Amazon RDS は、DB スナップショットから Aurora リードレプリカにデータを移行します。DB スナップショットのデータが新しい Aurora MySQL DB クラスターに移行された後、Amazon RDS は、RDS for MySQL DB インスタンスと Aurora MySQL DB クラスターとの間でレプリケーションをスタートします。RDS for MySQL DB インスタンスに、InnoDB 以外のストレージエンジンを使用するテーブルまたは圧縮行形式を使用するテーブルが含まれている場合は、Aurora リードレプリカを作成する前に InnoDB ストレージエンジンと動的行形式が使用されるようにテーブルを変更することで、Aurora リードレプリカの作成プロセスをスピードアップできます。MySQL DB スナップショットを Aurora MySQL DB クラスターにコピーするプロセスの詳細については、「[RDS for MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターへのデータの移行](AuroraMySQL.Migrating.RDSMySQL.md)」を参照してください。

1 つの RDS for MySQL DB インスタンスに対して作成できる Aurora リードレプリカは、1 つだけです。

**注記**  
レプリケーションプライマリである RDS for MySQL DB インスタンスの MySQL データベースエンジンバージョンと Aurora MySQL との間に存在する特性の相違が原因で、レプリケーションの問題が発生することがあります。エラーが発生した場合のサポートについては、[Amazon RDS コミュニティフォーラム](https://forums.aws.amazon.com/forum.jspa?forumID=60)を参照するか、AWS サポートまでお問い合わせください。  
RDS for MySQL DB インスタンスに既に Aurora リードレプリカのソースがある場合は、Aurora リードレプリカを作成できません。  
8.0.11、8.0.13、8.0.15 などの一部の古い RDS for MySQL 8.0 バージョンからは Aurora MySQL バージョン 3.05 以上に移行できません。移行する前に RDS for MySQL バージョン 8.0.28 にアップグレードすることをお勧めします。

MySQL リードレプリカの詳細については、「[MariaDB、MySQL、PostgreSQL DB インスタンスのリードレプリカの使用](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ReadRepl.html)」を参照してください。

## Aurora リードレプリカの作成
<a name="AuroraMySQL.Migrating.RDSMySQL.Replica.Create"></a>

コンソール、AWS CLI、または RDS API を使用して、RDS for MySQL DB インスタンスの Aurora リードレプリカを作成できます。

### コンソール
<a name="AuroraMySQL.Migrating.RDSMySQL.Replica.Create.Console"></a>

**ソース RDS for MySQL DB インスタンスから Aurora リードレプリカを作成するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**データベース**] を選択します。

1. Aurora リードレプリカの出典として使用する MySQL DB インスタンスを選択します。

1. [**アクション**] で [**Aurora リードレプリカの作成**] を選択します。

1. 次の表の説明に従って、Aurora リードレプリカに使用する DB クラスターの仕様を選択します。    
<a name="aurora_read_replica_param_advice"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Migrating.RDSMySQL.Replica.html)

1. [**Create read replica**] を選択します。

### AWS CLI
<a name="AuroraMySQL.Migrating.RDSMySQL.Replica.Create.CLI"></a>

ソース RDS for MySQL DB インスタンスから Aurora リードレプリカを作成するには、AWS CLI コマンドの [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html) と [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) を使用して、新しい Aurora MySQL DB クラスターを作成します。`create-db-cluster` コマンドを呼び出すときは、`--replication-source-identifier` パラメータを含めて、出典 MySQL DB インスタンスの Amazon リソースネーム (ARN) を指定します。Amazon RDS ARN の詳細については、「[Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-rds)」を参照してください。

出典 MySQL DB インスタンスと同じマスターユーザーネーム、マスターパスワード、またはデータベース名を Aurora リードレプリカで指定しないでください。

Linux、macOS、Unix の場合:

```
aws rds create-db-cluster --db-cluster-identifier sample-replica-cluster --engine aurora \
    --db-subnet-group-name mysubnetgroup --vpc-security-group-ids sg-c7e5b0d2 \
    --replication-source-identifier arn:aws:rds:us-west-2:123456789012:db:primary-mysql-instance
```

Windows の場合:

```
aws rds create-db-cluster --db-cluster-identifier sample-replica-cluster --engine aurora ^
    --db-subnet-group-name mysubnetgroup --vpc-security-group-ids sg-c7e5b0d2 ^
    --replication-source-identifier arn:aws:rds:us-west-2:123456789012:db:primary-mysql-instance
```

コンソールを使用して Aurora リードレプリカを作成すると、DB クラスターの Aurora リードレプリカのプライマリインスタンスが Aurora によって自動的に作成されます。AWS CLI を使用して Aurora リードレプリカを作成する場合、使用する DB クラスターのプライマリインスタンスを明示的に作成する必要があります。プライマリ インスタンスは、DB クラスターで作成される初期の DB インスタンスです。

以下のパラメータを指定して [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) AWS CLI コマンドを使用することで、DB クラスターにプライマリインスタンスを作成できます。
+ `--db-cluster-identifier`

  DB クラスターの名前。
+ `--db-instance-class`

  プライマリインスタンスに使用するための DB インスタンス名。
+ `--db-instance-identifier`

  プライマリインスタンスの名前。
+ `--engine aurora`

この例では、*myinstanceclass* で指定される DB インスタンスクラスを使用して、*myreadreplicacluster* という名前の DB クラスターに *myreadreplicainstance* という名前のプライマリインスタンスを作成します。

**Example**  
Linux、macOS、Unix の場合:  

```
aws rds create-db-instance \
    --db-cluster-identifier myreadreplicacluster \
    --db-instance-class myinstanceclass \
    --db-instance-identifier myreadreplicainstance \
    --engine aurora
```
Windows の場合:  

```
aws rds create-db-instance ^
    --db-cluster-identifier myreadreplicacluster ^
    --db-instance-class myinstanceclass ^
    --db-instance-identifier myreadreplicainstance ^
    --engine aurora
```

### RDS API
<a name="Aurora.Migration.RDSMySQL.Create.API"></a>

ソース RDS for MySQL DB インスタンスから Aurora リードレプリカを作成するには、[https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBCluster.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBCluster.html) と [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) Amazon RDS API コマンドを使用して新しい Aurora DB クラスターとプライマリインスタンスを作成します。ソース RDS for MySQL DB インスタンスと同じマスターユーザーネーム、マスターパスワード、またはデータベース名と同じユーザーネーム、マスターパスワード、またはデータベース名を Aurora リードレプリカに指定しないでください。

以下のパラメータを指定して [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBCluster.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBCluster.html) Amazon RDS API コマンドを使用することで、RDS for MySQL DB インスタンスから Aurora リードレプリカに新しい Aurora DB クラスターを作成できます。
+ `DBClusterIdentifier`

  作成する DB クラスターの名前。
+ `DBSubnetGroupName`

  この DB クラスターに関連付ける DB サブネットグループの名前。
+ `Engine=aurora`
+ `KmsKeyId`

  MySQL DB インスタンスが暗号化されているかどうかによって、オプションで DB クラスターを暗号化する AWS KMS key。
  + MySQL DB インスタンスが暗号化されていない場合は、暗号化キーを指定して保管時の DB クラスターを暗号化します。これを実行しない場合、保管時の DB クラスターはデフォルトでアカウントの暗号化キーを使用して暗号化されます。
  + MySQL DB インスタンスが暗号化されている場合は、暗号化キーを指定し、その指定された暗号化キーを使用して保管時の DB クラスターを暗号化します。これを実行しない場合、保管時の DB クラスターは MySQL DB インスタンスの暗号化キーを使用して暗号化されます。
**注記**  
暗号化された MySQL DB インスタンスから 非暗号化の DB クラスターを作成することはできません。
+ `ReplicationSourceIdentifier`

  送信元の MySQL DB インスタンスの Amazon リソースネーム (ARN)。Amazon RDS ARN の詳細については、「[Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-rds)」を参照してください。
+ `VpcSecurityGroupIds`

  この DB クラスターに関連付ける EC2 VPC セキュリティグループのリスト。

この例では、ARN が *mysqlprimaryARN* に設定された元の MySQL DB インスタンスから、*mysubnetgroup* という名前の DB サブネットグループと *mysecuritygroup* という名前の VPC セキュリティグループに関連付けられる *myreadreplicacluster* という名前の DB クラスターを作成します。

**Example**  

```
https://rds.us-east-1.amazonaws.com/
    ?Action=CreateDBCluster
    &DBClusterIdentifier=myreadreplicacluster
    &DBSubnetGroupName=mysubnetgroup
    &Engine=aurora
    &ReplicationSourceIdentifier=mysqlprimaryARN
    &SignatureMethod=HmacSHA256
    &SignatureVersion=4
    &Version=2014-10-31
    &VpcSecurityGroupIds=mysecuritygroup
    &X-Amz-Algorithm=AWS4-HMAC-SHA256
    &X-Amz-Credential=AKIADQKE4SARGYLE/20150927/us-east-1/rds/aws4_request
    &X-Amz-Date=20150927T164851Z
    &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
    &X-Amz-Signature=6a8f4bd6a98f649c75ea04a6b3929ecc75ac09739588391cd7250f5280e716db
```

コンソールを使用して Aurora リードレプリカを作成すると、DB クラスターの Aurora リードレプリカのプライマリインスタンスが Aurora によって自動的に作成されます。AWS CLI を使用して Aurora リードレプリカを作成する場合、使用する DB クラスターのプライマリインスタンスを明示的に作成する必要があります。プライマリ インスタンスは、DB クラスターで作成される初期の DB インスタンスです。

以下のパラメータを指定して [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) Amazon RDS API コマンドを使用することで、DB クラスターにプライマリインスタンスを作成できます。
+ `DBClusterIdentifier`

  DB クラスターの名前。
+ `DBInstanceClass`

  プライマリインスタンスに使用するための DB インスタンス名。
+ `DBInstanceIdentifier`

  プライマリインスタンスの名前。
+ `Engine=aurora`

この例では、*myinstanceclass* で指定される DB インスタンスクラスを使用して、*myreadreplicacluster* という名前の DB クラスターに *myreadreplicainstance* という名前のプライマリインスタンスを作成します。

**Example**  

```
https://rds.us-east-1.amazonaws.com/
    ?Action=CreateDBInstance
    &DBClusterIdentifier=myreadreplicacluster
    &DBInstanceClass=myinstanceclass
    &DBInstanceIdentifier=myreadreplicainstance
    &Engine=aurora
    &SignatureMethod=HmacSHA256
    &SignatureVersion=4
    &Version=2014-09-01
    &X-Amz-Algorithm=AWS4-HMAC-SHA256
    &X-Amz-Credential=AKIADQKE4SARGYLE/20140424/us-east-1/rds/aws4_request
    &X-Amz-Date=20140424T194844Z
    &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
    &X-Amz-Signature=bee4aabc750bf7dad0cd9e22b952bd6089d91e2a16592c2293e532eeaab8bc77
```

## Aurora リードレプリカの表示
<a name="AuroraMySQL.Migrating.RDSMySQL.Replica.View"></a>

AWS マネジメントコンソール または AWS CLI を使用すると、Aurora MySQL DB クラスターでの、MySQL から Aurora MySQL へのレプリケーション関係を確認できます。

### コンソール
<a name="AuroraMySQL.Migrating.RDSMySQL.Replica.View.Console"></a>

**Aurora リードレプリカのプライマリ MySQL DB インスタンスを表示するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**データベース**] を選択します。

1. Aurora リードレプリカの DB クラスターを選択して、その詳細を表示します。プライマリの MySQL DB インスタンスの情報は、[**レプリケーション出典**] フィールドに表示されます。  
![\[MySQL プライマリを表示\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/aurora-repl6.png)

### AWS CLI
<a name="AuroraMySQL.Migrating.RDSMySQL.Replica.View.CLI"></a>

AWS CLI により、Aurora MySQL DB クラスターでの Aurora MySQL レプリケーションと MySQL の関係性を確認するには、[https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) および [https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) コマンドを使用します。

どの MySQL DB インスタンスがプライマリかを判別するには、[https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) を使用して、Aurora リードレプリカのクラスター識別子を `--db-cluster-identifier` オプションに指定します。レプリケーションのプライマリである DB インスタンスの ARN については、出力の `ReplicationSourceIdentifier` 要素を参照してください。

どの DB クラスターが Aurora リードレプリカであるかを判別するには、[https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) を使用して、MySQL DB インスタンスのインスタンス識別子を `--db-instance-identifier` オプションに指定します。Aurora リードレプリカの DB クラスター識別子については、出力の `ReadReplicaDBClusterIdentifiers` 要素を参照してください。

**Example**  
Linux、macOS、Unix の場合:  

```
aws rds describe-db-clusters \
    --db-cluster-identifier myreadreplicacluster
```

```
aws rds describe-db-instances \
    --db-instance-identifier mysqlprimary
```
Windows の場合:  

```
aws rds describe-db-clusters ^
    --db-cluster-identifier myreadreplicacluster
```

```
aws rds describe-db-instances ^
    --db-instance-identifier mysqlprimary
```

## Aurora リードレプリカの昇格
<a name="AuroraMySQL.Migrating.RDSMySQL.Replica.Promote"></a>

移行が完了したら、AWS マネジメントコンソール または AWS CLI を使って、Aurora リードレプリカをスタンドアロンの DB クラスターに昇格することができます。

次に、Aurora リードレプリカのエンドポイントにクライアントアプリケーションを誘導できます。Aurora エンドポイントの詳細については、「[Amazon Aurora エンドポイント接続](Aurora.Overview.Endpoints.md)」を参照してください。昇格はすばやく完了し、昇格中も Aurora リードレプリカに対する読み取り/書き込みを行うことができます。ただし昇格中に、プライマリ MySQL DB インスタンスを削除したり、DB インスタンスと Aurora リードレプリカのリンクを解除する操作は行うことができません。

Aurora リードレプリカを昇格する前に、出典 MySQL DB インスタンスに対するトランザクションの書き込みをすべて停止し、Aurora リードレプリカのレプリカラグが 0 になるまで待ちます。Aurora リードレプリカのレプリカラグを確認するには、`SHOW SLAVE STATUS` (Aurora MySQL バージョン 2) または `SHOW REPLICA STATUS` (Aurora MySQL バージョン 3) コマンドを Aurora リードレプリカに対して呼び出します。[**マスターから数秒遅れ**] 値をチェックします。

プライマリへの書き込みトランザクションが停止し、レプリカラグが 0 になったら、Aurora リードレプリカへの書き込みがスタートできるようになります。それより前に Aurora リードレプリカへの書き込みを行い、MySQL プライマリでも変更されているテーブルを変更した場合、Aurora へのレプリケーションが失われるおそれがあります。その場合は、Aurora リードレプリカを削除して再作成する必要があります。

### コンソール
<a name="AuroraMySQL.Migrating.RDSMySQL.Replica.Promote.Console"></a>

**Aurora リードレプリカを Aurora DB クラスターに昇格させるには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**データベース**] を選択します。

1. Aurora リードレプリカの DB クラスターを選択します。

1. [**アクション**] で、[**Promote (昇格)**] を選択します。

1. [**リードレプリカの昇格**] を選択します。

昇格したら、以下の手順を実行して昇格が完了したことを確認します。

**Aurora リードレプリカが昇格したことを確認するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインの [**Events**] を選択します。

1. [**イベント**] ページで、昇格したクラスターの `Promoted Read Replica cluster to a stand-alone database cluster` イベントがあることを確認します。

昇格が完了したら、プライマリ MySQL DB インスタンスと Aurora リードレプリカのリンクは解除され、DB インスタンスは必要に応じて安全に削除できるようになります。

### AWS CLI
<a name="AuroraMySQL.Migrating.RDSMySQL.Replica.Promote.CLI"></a>

Aurora リードレプリカをスタンドアロン DB クラスターに昇格させるには、AWS CLI の [https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica-db-cluster.html](https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica-db-cluster.html) コマンドを使用します。

**Example**  
Linux、macOS、Unix の場合:  

```
aws rds promote-read-replica-db-cluster \
    --db-cluster-identifier myreadreplicacluster
```
Windows の場合:  

```
aws rds promote-read-replica-db-cluster ^
    --db-cluster-identifier myreadreplicacluster
```

# Amazon Aurora MySQL の管理
<a name="AuroraMySQL.Managing"></a>

以下のセクションでは、Amazon Aurora MySQL DB クラスターの管理について説明します。

**Topics**
+ [Amazon Aurora MySQL のパフォーマンスとスケーリングの管理](AuroraMySQL.Managing.Performance.md)
+ [Aurora DB クラスターのバックトラック](AuroraMySQL.Managing.Backtrack.md)
+ [障害挿入クエリを使用した Amazon Aurora MySQL のテスト](AuroraMySQL.Managing.FaultInjectionQueries.md)
+ [高速 DDL を使用して Amazon Aurora のテーブルを変更する](AuroraMySQL.Managing.FastDDL.md)
+ [Aurora MySQL DB クラスターのボリュームステータスの表示](AuroraMySQL.Managing.VolumeStatus.md)

# Amazon Aurora MySQL のパフォーマンスとスケーリングの管理
<a name="AuroraMySQL.Managing.Performance"></a>

## Aurora MySQL DB インスタンスのスケーリング
<a name="AuroraMySQL.Managing.Performance.InstanceScaling"></a>

Aurora MySQL DB インスタンスは、インスタンススケーリングと読み取りスケーリングの 2 つの方法でスケールできます。読み取りスケーリングの詳細については、「[読み取りのスケーリング](Aurora.Managing.Performance.md#Aurora.Managing.Performance.ReadScaling)」を参照してください。

DB クラスター内の各 DB インスタンスの DB インスタンスクラスを変更することで、Aurora MySQL DB クラスターをスケーリングできます。Aurora MySQL は、Aurora 用に最適化された複数の DB インスタンスクラスをサポートしています サイズが 40 TB より大きい Aurora クラスターには、db.t2 または db.t3 インスタンスクラスを使用しないでください。Aurora MySQL でサポートされている DB インスタンスクラスの詳細な仕様については、「[Amazon Aurora DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。

**注記**  
T DB インスタンスクラスは、開発サーバーおよびテストサーバー、またはその他の本稼働以外のサーバーにのみ使用することをお勧めします。T インスタンスクラスの詳細については、「[開発やテストのための T インスタンスクラスの使用](AuroraMySQL.BestPractices.Performance.md#AuroraMySQL.BestPractices.T2Medium)」を参照してください。

## Aurora MySQL DB インスタンスへの最大接続数
<a name="AuroraMySQL.Managing.MaxConnections"></a><a name="max_connections"></a>

Aurora MySQL DB インスタンスへの許可されている接続の最大数は、DB インスタンスのインスタンスレベルパラメータグループの `max_connections` パラメータによって決まります。

次の表は、Aurora MySQL で使用できる DB インスタンスクラスごとの `max_connections` のデフォルト値です。Aurora MySQL DB インスタンスへの接続の最大数を増やすには、このインスタンスをメモリ量のより多い DB インスタンスクラスにスケールするか、インスタンスの DB パラメータグループの `max_connections` パラメータの値を最大 16,000 に設定できます。

**ヒント**  
アプリケーションが頻繁に接続を開いたり閉じたりする場合や、長時間の接続を多数開いたままにする場合は、Amazon RDS Proxy の使用を推奨します。RDS Proxy は、接続プーリングを使用してデータベース接続を安全かつ効率的に共有する、フルマネージドの高可用性データベースプロキシです。RDS Proxy の詳細については、[Amazon RDS Proxy for Aurora](rds-proxy.md) を参照してください。

 Aurora Serverless v2 インスタンスによるこのパラメータの処理方法については、「[Aurora Serverless v2 の最大接続数](aurora-serverless-v2.setting-capacity.md#aurora-serverless-v2.max-connections)」を参照してください。


| インスタンスクラス | max\$1connections のデフォルト値 | 
| --- | --- | 
|  db.t2.small  |  45  | 
|  db.t2.medium  |  90  | 
|  db.t3.small  |  45  | 
|  db.t3.medium  |  90  | 
|  db.t3.large  |  135  | 
|  db.t4g.medium  |  90  | 
|  db.t4g.large  |  135  | 
|  db.r3.large  |  1,000  | 
|  db.r3.xlarge  |  2000  | 
|  db.r3.2xlarge  |  3000  | 
|  db.r3.4xlarge  |  4000  | 
|  db.r3.8xlarge  |  5000  | 
|  db.r4.large  |  1,000  | 
|  db.r4.xlarge  |  2000  | 
|  db.r4.2xlarge  |  3000  | 
|  db.r4.4xlarge  |  4000  | 
|  db.r4.8xlarge  |  5000  | 
|  db.r4.16xlarge  |  6000  | 
|  db.r5.large  |  1,000  | 
|  db.r5.xlarge  |  2000  | 
|  db.r5.2xlarge  |  3000  | 
|  db.r5.4xlarge  |  4000  | 
|  db.r5.8xlarge  |  5000  | 
|  db.r5.12xlarge  |  6000  | 
|  db.r5.16xlarge  |  6000  | 
|  db.r5.24xlarge  |  7000  | 
| db.r6g.large | 1000 | 
| db.r6g.xlarge | 2000 | 
| db.r6g.2xlarge | 3000 | 
| db.r6g.4xlarge | 4000 | 
| db.r6g.8xlarge | 5000 | 
| db.r6g.12xlarge | 6000 | 
| db.r6g.16xlarge | 6000 | 
| db.r6i.large | 1,000 | 
| db.r6i.xlarge | 2000 | 
| db.r6i.2xlarge | 3000 | 
| db.r6i.4xlarge | 4000 | 
| db.r6i.8xlarge | 5000 | 
| db.r6i.12xlarge | 6000 | 
| db.r6i.16xlarge | 6000 | 
| db.r6i.24xlarge | 7000 | 
| db.r6i.32xlarge | 7000 | 
| db.r7g.large | 1,000 | 
| db.r7g.xlarge | 2000 | 
| db.r7g.2xlarge | 3000 | 
| db.r7g.4xlarge | 4000 | 
| db.r7g.8xlarge | 5000 | 
| db.r7g.12xlarge | 6000 | 
| db.r7g.16xlarge | 6000 | 
| db.r7i.large | 1,000 | 
| db.r7i.xlarge | 2000 | 
| db.r7i.2xlarge | 3000 | 
| db.r7i.4xlarge | 4000 | 
| db.r7i.8xlarge | 5000 | 
| db.r7i.12xlarge | 6000 | 
| db.r7i.16xlarge | 6000 | 
| db.r7i.24xlarge | 7000 | 
| db.r7i.48xlarge | 8000 | 
| db.r8g.large | 1,000 | 
| db.r8g.xlarge | 2000 | 
| db.r8g.2xlarge | 3000 | 
| db.r8g.4xlarge | 4000 | 
| db.r8g.8xlarge | 5000 | 
| db.r8g.12xlarge | 6000 | 
| db.r8g.16xlarge | 6000 | 
| db.r8g.24xlarge | 7000 | 
| db.r8g.48xlarge | 8000 | 
| db.x2g.large | 2000 | 
| db.x2g.xlarge | 3000 | 
| db.x2g.2xlarge | 4000 | 
| db.x2g.4xlarge | 5000 | 
| db.x2g.8xlarge | 6000 | 
| db.x2g.12xlarge | 7000 | 
| db.x2g.16xlarge | 7000 | 

**ヒント**  
`max_connections` パラメータ計算では、選択した Aurora MySQL インスタンスクラスで 2 を底とする対数 (自然対数とは異なる) とバイト単位の `DBInstanceClassMemory` 値を使用します。パラメータは整数値のみを受け入れ、小数点以下は計算から切り捨てられます。この式は、次のように接続制限を実装します。  
より大きな R3、R4、R5 インスタンスの場合は 1,000 ごとの接続の増分
T2 および T3 インスタンスメモリバリアントの場合は 45 ごとの接続の増分
例: db.r6g.large の場合、式の計算は 1,069.2 となりますが、システムは 1,000 を実装して一貫した増分パターンを維持します。

接続制限のデフォルトをカスタマイズする新しいパラメータグループを作成すると、`DBInstanceClassMemory` 値に基づく式を使用してデフォルトの接続制限が取得されます。前の表で示されているように、式は、メモリが段階的により大きな R3、R4、R5 インスタンスへと倍増すると 1000 ごとに増える接続最大数を、また T2 インスタンス、および T3 インスタンスの異なるメモリサイズでは 45 ごとに増える接続最大数を生成します。

`DBInstanceClassMemory` を計算する方法の詳細については、「[DB パラメータの指定](USER_ParamValuesRef.md)」を参照してください。

Aurora MySQL と RDS for MySQL DB インスタンスには、異なる量のメモリオーバーヘッドがあります。したがって、同じインスタンスクラスを使用する RDS for MySQL DB インスタンスと Aurora MySQL インスタンスでは、`max_connections` 値が異なる場合があります。テーブルの値は Aurora MySQL DB インスタンスにのみ適用されます。

**注記**  
T2 インスタンス、および T3 インスタンスの接続制限がかなり低いのは、Aurora では、これらのインスタンスが本番稼働のワークロードのためではなく、開発やテストシナリオのみを目的としているためです。

デフォルトの接続制限は、バッファプールやクエリのキャッシュといった多くのメモリを消費する他の処理のデフォルト値を使用するシステムに合わせて調整されています。クラスターのこれらの他の設定を変更する場合は、DB インスタンスで使用可能なメモリの増減に応じて接続制限を調整することを検討してください。

## Aurora MySQL 用の一時ストレージの制限
<a name="AuroraMySQL.Managing.TempStorage"></a>

Aurora MySQL は、Aurora ストレージサブシステムにテーブルとインデックスを格納します。Aurora MySQL は、非永続的な一時ファイルや非 InnoDB 一時テーブル用に、別個の一時ストレージまたはローカルストレージを使用します。ローカルストレージには、クエリ処理中の大きなデータセットのソートや、インデックスの作成オペレーションなどの目的に使用するファイルも含まれます。InnoDB 一時テーブルは含まれません。

Aurora MySQL バージョン 3 の一時テーブルの詳細については、「[Aurora MySQL バージョン 3 での新しい一時テーブルの動作](ams3-temptable-behavior.md)」を参照してください。バージョン 2 の一時テーブルの詳細については、「[Aurora MySQL バージョン 2 での一時テーブルスペースの動作](AuroraMySQL.CompareMySQL57.md#AuroraMySQL.TempTables57)」を参照してください。

これらのボリュームのデータと一時ファイルは、DB インスタンスの起動時と停止時、およびホストの交換時に失われます。

これらのローカルストレージボリュームは、Amazon Elastic Block Store (EBS) によってバックアップされ、より大きな DB インスタンスクラスを使用することで拡張できます。ストレージの詳細については、「[Amazon Aurora ストレージ](Aurora.Overview.StorageReliability.md)」を参照してください。

ローカルストレージは、`LOAD DATA FROM S3` や `LOAD XML FROM S3` を使用して Amazon S3 からデータをインポートする場合や、SELECT INTO OUTFILE S3 を使用して S3 にデータをエクスポートする場合にも使用します。S3 からのインポートと S3 へのエクスポートの詳細については、以下を参照してください。
+ [Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード](AuroraMySQL.Integrating.LoadFromS3.md)
+ [Amazon Aurora MySQL DB クラスターから Amazon S3 バケット内のテキストファイルへのデータの保存](AuroraMySQL.Integrating.SaveIntoS3.md)

Aurora MySQL は、ほとんどの Aurora MySQL DB インスタンスクラス (db.t2、db.t3、db.t4g などのバーストパフォーマンスインスタンスクラスタイプは除く) のエラーログ、一般ログ、スロークエリログ、監査ログに別個の永続ストレージを使用します。このボリュームのデータは、DB インスタンスの起動時や停止時、ホストの交換時に保持されます。

また、この永続的ストレージボリュームは Amazon EBS-backed であり、DB インスタンスクラスに応じた固定サイズを持ちます。より大きな DB インスタンスクラスを使用して拡張することはできません。

次の表は、Aurora MySQL DB インスタンスクラス別に使用可能な一時ストレージと永続的ストレージの最大量を示しています。Aurora の DB インスタンスクラスサポートの詳細については、「[Amazon Aurora DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。


| DB インスタンスクラス | 使用可能な一時ストレージ/ローカルストレージの最大量 (GiB) | ログファイルに使用可能な追加のストレージの最大量 (GiB) | 
| --- | --- | --- | 
| db.x2g.16xlarge | 1280 | 500 | 
| db.x2g.12xlarge | 960 | 500 | 
| db.x2g.8xlarge | 640 | 500 | 
| db.x2g.4xlarge | 320 | 500 | 
| db.x2g.2xlarge | 160 | 60 | 
| db.x2g.xlarge | 80 | 60 | 
| db.x2g.large | 40 | 60 | 
| db.r8g.48xlarge | 3840 | 500 | 
| db.r8g.24xlarge | 1920 | 500 | 
| db.r8g.16xlarge | 1280 | 500 | 
| db.r8g.12xlarge | 960 | 500 | 
| db.r8g.8xlarge | 640 | 500 | 
| db.r8g.4xlarge | 320 | 500 | 
| db.r8g.2xlarge | 160 | 60 | 
| db.r8g.xlarge | 80 | 60 | 
| db.r8g.large | 32 | 60 | 
| db.r7i.48xlarge | 3840 | 500 | 
| db.r7i.24xlarge | 1920 | 500 | 
| db.r7i.16xlarge | 1280 | 500 | 
| db.r7i.12xlarge | 960 | 500 | 
| db.r7i.8xlarge | 640 | 500 | 
| db.r7i.4xlarge | 320 | 500 | 
| db.r7i.2xlarge | 160 | 60 | 
| db.r7i.xlarge | 80 | 60 | 
| db.r7i.large | 32 | 60 | 
| db.r7g.16xlarge | 1280 | 500 | 
| db.r7g.12xlarge | 960 | 500 | 
| db.r7g.8xlarge | 640 | 500 | 
| db.r7g.4xlarge | 320 | 500 | 
| db.r7g.2xlarge | 160 | 60 | 
| db.r7g.xlarge | 80 | 60 | 
| db.r7g.large | 32 | 60 | 
| db.r6i.32xlarge | 2560 | 500 | 
| db.r6i.24xlarge | 1920 | 500 | 
| db.r6i.16xlarge | 1280 | 500 | 
| db.r6i.12xlarge | 960 | 500 | 
| db.r6i.8xlarge | 640 | 500 | 
| db.r6i.4xlarge | 320 | 500 | 
| db.r6i.2xlarge | 160 | 60 | 
| db.r6i.xlarge | 80 | 60 | 
| db.r6i.large | 32 | 60 | 
| db.r6g.16xlarge | 1280 | 500 | 
| db.r6g.12xlarge | 960 | 500 | 
| db.r6g.8xlarge | 640 | 500 | 
| db.r6g.4xlarge | 320 | 500 | 
| db.r6g.2xlarge | 160 | 60 | 
| db.r6g.xlarge | 80 | 60 | 
| db.r6g.large | 32 | 60 | 
| db.r5.24xlarge | 1920 | 500 | 
| db.r5.16xlarge | 1280 | 500 | 
| db.r5.12xlarge | 960 | 500 | 
| db.r5.8xlarge | 640 | 500 | 
| db.r5.4xlarge | 320 | 500 | 
| db.r5.2xlarge | 160 | 60 | 
| db.r5.xlarge | 80 | 60 | 
| db.r5.large | 32 | 60 | 
| db.r4.16xlarge | 1280 | 500 | 
| db.r4.8xlarge | 640 | 500 | 
| db.r4.4xlarge | 320 | 500 | 
| db.r4.2xlarge | 160 | 60 | 
| db.r4.xlarge | 80 | 60 | 
| db.r4.large | 32 | 60 | 
| db.t4g.large | 32 | – | 
| db.t4g.medium | 32 | – | 
| db.t3.large | 32 | – | 
| db.t3.medium | 32 | – | 
| db.t3.small | 32 | – | 
| db.t2.medium | 32 | – | 
| db.t2.small | 32 | – | 

**重要**  
 これらの値は、各 DB インスタンスの理論上の最大空きストレージ量を表します。実際に使用可能なローカルストレージは、これより小さい場合があります。Aurora は、管理プロセスにローカルストレージを使用します。DB インスタンスでは、データをロードする前でもローカルストレージを使用します。特定の DB インスタンスで使用できる一時ストレージをモニタリングするには、 `FreeLocalStorage` CloudWatch メトリクスを使用できます。詳細については、[Amazon Aurora の Amazon CloudWatch メトリクス](Aurora.AuroraMonitoring.Metrics.md) を参照してください。現時点での空きストレージの量を確認できます。空きストレージの量を時間の経過に合わせてグラフ化することもできます。時間の経過に合わせて空きストレージをモニタリングすると、値が増加または減少しているかどうかを判断したり、最小値、最大値、または平均値を確認したりするのに役立ちます。  
(これは Aurora Serverless v2 には適用されません。)

# Aurora DB クラスターのバックトラック
<a name="AuroraMySQL.Managing.Backtrack"></a>

Amazon Aurora MySQL 互換エディション では、バックアップからデータを復元しないで、DB クラスターを特定の時刻までバックトラックできます。

**Contents**
+ [バックトラックの概要](#AuroraMySQL.Managing.Backtrack.Overview)
  + [バックトラックウィンドウ](#AuroraMySQL.Managing.Backtrack.Overview.BacktrackWindow)
  + [バックトラック時間](#AuroraMySQL.Managing.Backtrack.Overview.BacktrackTime)
  + [バックトラックの制限事項](#AuroraMySQL.Managing.Backtrack.Limitations)
+ [利用可能なリージョンとバージョン](#AuroraMySQL.Managing.Backtrack.Availability)
+ [バックトラック対応クラスターのアップグレードに関する考慮事項](#AuroraMySQL.Managing.Backtrack.Upgrade)
+ [Aurora MySQL DB クラスターのバックトラックの設定](AuroraMySQL.Managing.Backtrack.Configuring.md)
+ [Aurora MySQL DB クラスターのバックトラックの実行](AuroraMySQL.Managing.Backtrack.Performing0.md)
+ [Aurora MySQL DB クラスターのバックトラックのモニタリング](AuroraMySQL.Managing.Backtrack.Monitoring.md)
+ [コンソールを使用したバックトラックイベントへのサブスクライブ](#AuroraMySQL.Managing.Backtrack.Event.Console)
+ [既存のバックトラックの取得](#AuroraMySQL.Managing.Backtrack.Retrieving)
+ [Aurora MySQL DB クラスターのバックトラックの無効化](AuroraMySQL.Managing.Backtrack.Disabling.md)

## バックトラックの概要
<a name="AuroraMySQL.Managing.Backtrack.Overview"></a>

バックトラックは、指定した時間まで DB クラスターを「巻き戻し」ます。バックトラックは、DB クラスターをバックアップして特定の時点の状態に復元する操作に代わるものではありません。ただし、バックトラックは、従来のバックアップと復元に比べて、以下の利点があります。
+ 簡単にエラーを取り消すことができます。WHERE 句なしの DELETE などの破壊的なアクションを間違えて実行した場合、サービスの中断を最小限に抑えながら、破壊的なアクション以前の時点まで DB クラスターをバックトラックできます。
+ DB クラスターのバックトラックは迅速に実行できます。DB クラスターを特定の時点の状態に復元するには、新しい DB クラスターを起動し、これに対してバックアップデータや DB クラスターのスナップショットから復元する必要があり、時間がかかります。DB クラスターのバックトラックでは、新しい DB クラスターを作成せずに、DB クラスターを数分で巻き戻します。
+ 以前のデータの変更を調べることができます。DB クラスターを前後に繰り返しバックトラックして、特定のデータの変更がどの時点で発生したかを確認できます。例えば、DB クラスターを 3 時間前までバックトラックし、そこから 1 時間後まで戻すことができます。この場合、バックトラック時間は元の時間の 2 時間前となります。

**注記**  
DB クラスターを特定の時点の状態に復元する方法については、「[Aurora DB クラスターのバックアップと復元の概要](Aurora.Managing.Backups.md)」を参照してください。

### バックトラックウィンドウ
<a name="AuroraMySQL.Managing.Backtrack.Overview.BacktrackWindow"></a>

バックトラックには、ターゲットバックトラックウィンドウと実際のバックトラックウィンドウがあります。
+ *ターゲットバックトラックウィンドウ*は、DB クラスターをバックトラックする所望時間です。*ターゲットバックトラックウィンドウ*は、バックトラックを有効化するときに指定します。例えば、DB クラスターを 1 日バックトラックする場合は、ターゲットバックトラックウィンドウとして 24 時間を指定します。
+ *実際のバックトラックウィンドウ*は、DB クラスターを実際にバックトラックできる時間であり、ターゲットバックトラックウィンドウより小さい値になることがあります。実際のバックトラックウィンドウは、ワークロードとストレージ (*変更レコード*と呼ばれるデータベースの変更に関する情報を保存) に基づきます。

バックトラックが有効になっている Aurora DB クラスターを更新すると、変更レコードが生成されます。Aurora は、ターゲットのバックトラックウィンドウの変更レコードを保持します。変更レコードの保存には利用料金 (時間単位) が発生します。DB クラスターのターゲットバックトラックウィンドウとワークロードの両方により、保存する変更レコード数が決まります。ワークロードは、特定の時間内に DB クラスターを変更する回数です。ワークロードが重い場合は、ワークロードが軽い場合と比べて、バックトラックウィンドウに保存される変更レコードが多くなります。

ターゲットバックトラックウィンドウは、DB クラスターをバックトラックできる最大の目標時間と考えることができます。通常、指定した最大時間までバックトラックできます。ただし、状況によっては、DB クラスターに保存できる変更レコードの数が少なくて、最大時間までバックトラックできない場合があります。この場合、実際のバックトラックウィンドウはターゲットより小さくなります。通常、DB クラスターのワークロードが非常に重い場合、実際のバックトラックウィンドウはターゲットより小さくなります。実際のバックトラックウィンドウがターゲットより小さい場合は、通知が送信されます。

DB クラスターのバックトラックが有効になっている場合、DB クラスターに保存されているテーブルを削除すると、そのテーブルは Aurora のバックトラック変更レコード内に保持されます。これにより、テーブルを削除する前の時点まで戻すことができます。バックトラックウィンドウ内のスペース不足でテーブルを保存できないと、テーブルは最終的にバックトラック変更レコードから削除される場合があります。

### バックトラック時間
<a name="AuroraMySQL.Managing.Backtrack.Overview.BacktrackTime"></a>

Aurora は、常に DB クラスターに即した時間までバックトラックします。これにより、トランザクションがコミットされないままバックトラックが完了するという事態が避けられます。バックトラック時間を指定すると、Aurora はそれに即した最も近い時間を自動的に選択します。このアプローチでは、最終的なバックトラック時間が、指定した時間と正確に一致しない場合があります。正確なバックトラック時間は、AWS CLI の [describe-db-cluster-backtracks](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-cluster-backtracks.html) コマンドを使用して確認できます。詳細については、「[既存のバックトラックの取得](#AuroraMySQL.Managing.Backtrack.Retrieving)」を参照してください。

### バックトラックの制限事項
<a name="AuroraMySQL.Managing.Backtrack.Limitations"></a>

バックトラックには以下の制限が適用されます。
+ バックトラックは、バックトラック機能を有効にして作成した DB クラスターでのみ使用できます。DB クラスターを変更せずにバックトラック機能を有効にすることはできません。バックトラック機能は、新しい DB クラスターの作成時または DB クラスターのスナップショットの復元時に有効化できます。
+ バックトトラックウィンドウの上限は 72 時間です。
+ バックトラックは、DB クラスター全体に影響します。例えば、1 つのテーブルや 1 つのデータ更新に限定してバックトラックすることはできません。
+ バックトラック対応クラスターからクロスリージョンリードレプリカを作成することはできませんが、クラスターでバイナリログ (binlog) レプリケーションを有効にすることはできます。バイナリログ記録が有効になっている DB クラスターをバックトラックしようとすると、バックトラックの強制を選択していない限り、通常はエラーが発生します。バックトラックを強制しようとすると、ダウンストリームのリードレプリカが壊れ、ブルー/グリーンデプロイなどの他のオペレーションが妨げられます。
+ データベースのクローンを、その作成時より前の時点までバックトラックすることはできません。ただし、元のデータベースを使用すると、クローン作成時より前の時点までバックトラックできます。データベースのクローンの詳細については、「[Amazon Aurora DB クラスターのボリュームのクローン作成](Aurora.Managing.Clone.md)」を参照してください。
+ バックトラックに伴って DB インスタンスがわずかに中断します。バックトラックオペレーションをスタートする前にアプリケーションを停止または一時停止し、新しい読み取り/書き込みリクエストを阻止する必要があります。Aurora は、バックトラックオペレーション時に、データベースを一時停止し、開いている接続をすべて閉じて、コミットされていない読み取りや書き込みをすべて削除します。その後、バックトラックオペレーションが完了するまで待ちます。
+ バックトラックをサポートしていない AWS リージョンでは、バックトラック対応クラスターのクロスリージョンスナップショットを復元できません。
+ バックトラック対応クラスターで Aurora MySQL バージョン 2 からバージョン 3 へのインプレースアップグレードを実行する場合、アップグレードを実行する前の時点にバックトラックすることはできません。

## 利用可能なリージョンとバージョン
<a name="AuroraMySQL.Managing.Backtrack.Availability"></a>

バックトラックは Aurora PostgreSQL では使用できません。

Aurora MySQL によるバックトラックでサポートされているエンジンとリージョンは以下のとおりです。


| リージョン | Aurora MySQL バージョン 3 | Aurora MySQL バージョン 2 | 
| --- | --- | --- | 
| 米国東部 (バージニア北部) | すべてのバージョン | すべてのバージョン | 
| 米国東部 (オハイオ) | すべてのバージョン | すべてのバージョン | 
| 米国西部 (北カリフォルニア) | すべてのバージョン | すべてのバージョン | 
| 米国西部 (オレゴン） | すべてのバージョン | すべてのバージョン | 
| アフリカ (ケープタウン) | – | – | 
| アジアパシフィック (香港) | – | – | 
| アジアパシフィック (ジャカルタ) | – | – | 
| アジアパシフィック (マレーシア) | – | – | 
| アジアパシフィック (メルボルン) | – | – | 
| アジアパシフィック (ムンバイ) | すべてのバージョン | すべてのバージョン | 
| アジアパシフィック (ニュージーランド） | – | – | 
| アジアパシフィック (大阪) | すべてのバージョン | バージョン 2.07.3 以降 | 
| アジアパシフィック (ソウル) | すべてのバージョン | すべてのバージョン | 
| アジアパシフィック (シンガポール) | すべてのバージョン | すべてのバージョン | 
| アジアパシフィック (シドニー) | すべてのバージョン | すべてのバージョン | 
| アジアパシフィック (台北) | – | – | 
| アジアパシフィック (タイ) | – | – | 
| アジアパシフィック (東京) | すべてのバージョン | すべてのバージョン | 
| カナダ (中部) | すべてのバージョン | すべてのバージョン | 
| カナダ西部 (カルガリー) | – | – | 
| 中国 (北京) | – | – | 
| 中国 (寧夏) | – | – | 
| 欧州 (フランクフルト) | すべてのバージョン | すべてのバージョン | 
| 欧州 (アイルランド) | すべてのバージョン | すべてのバージョン | 
| 欧州 (ロンドン) | すべてのバージョン | すべてのバージョン | 
| 欧州 (ミラノ) | – | – | 
| 欧州 (パリ) | すべてのバージョン | すべてのバージョン | 
| 欧州 (スペイン) | – | – | 
| 欧州 (ストックホルム) | – | – | 
| 欧州 (チューリッヒ) | – | – | 
| イスラエル (テルアビブ) | – | – | 
| メキシコ (中部) | – | – | 
| 中東 (バーレーン) | – | – | 
| 中東 (アラブ首長国連邦) | – | – | 
| 南米 (サンパウロ) | – | – | 
| AWS GovCloud (米国東部) | – | – | 
| AWS GovCloud (米国西部) | – | – | 

## バックトラック対応クラスターのアップグレードに関する考慮事項
<a name="AuroraMySQL.Managing.Backtrack.Upgrade"></a>

Aurora MySQL バージョン 3 のすべてのマイナーバージョンがバックトラックについてサポートされているため、バックトラック対応 DB クラスターを Aurora MySQL バージョン 2 からバージョン 3 にアップグレードできます。

# Aurora MySQL DB クラスターのバックトラックの設定
<a name="AuroraMySQL.Managing.Backtrack.Configuring"></a>

バックトラック機能を使用するには、バックトラックを有効にしてターゲットバックトラックウィンドウを指定する必要があります。それ以外の場合、バックトラックは無効です。

ターゲットのバックトラックウィンドウでは、バックトラックを使用してデータベースを巻き戻したい時間の長さを指定します。Aurora は、その時間枠をサポートするのに十分な変更レコードを保持しようと試みます。

## コンソール
<a name="AuroraMySQL.Managing.Backtrack.Configuring.Console"></a>

コンソールを使用して、新しい DB クラスターの作成時にバックトラックを設定できます。DB クラスターを変更して、バックトラック対応クラスターのバックトラックウィンドウを変更することもできます。バックトラックウィンドウを 0 に設定してクラスターのバックトラックを完全に無効にすると、そのクラスターでバックトラックを再度有効にすることはできません。

**Topics**
+ [DB クラスターの作成時にコンソールでバックトラックを設定する](#AuroraMySQL.Managing.Backtrack.Configuring.Console.Creating)
+ [DB クラスターの変更時にコンソールでバックトラックを設定する](#AuroraMySQL.Managing.Backtrack.Configuring.Console.Modifying)

### DB クラスターの作成時にコンソールでバックトラックを設定する
<a name="AuroraMySQL.Managing.Backtrack.Configuring.Console.Creating"></a>

新しい Aurora MySQL DB クラスターの作成時にバックトラックを設定するには、[**Enable Backtrack (バックトラックの有効化)**] を選択し、[**Target Backtrack window (ターゲットバックトラックウィンドウ)**] 値としてゼロより大きい値を [**Backtrack (バックトラック)**] セクションに指定します。

DB クラスターを作成するには、「[Amazon Aurora DB クラスターの作成](Aurora.CreateInstance.md)」の手順に従います。次のイメージは [**Backtrack (バックトラック)**] セクションを示しています。

![\[コンソールで DB クラスターの作成時にバックトラックを有効化する\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/aurora-backtrack-create.png)


新しい DB クラスターを作成した時点では、Aurora には DB クラスターのワークロード用のデータがありません。したがって、新しい DB クラスターのコストを具体的に見積もることはできません。コンソールでは、代わりに一般的なワークロードに基づいて、指定したターゲットバックトラックウィンドウの一般的なユーザーコストを提示します。一般的なコストは、バックトラック機能のコストを見積もるための一般的な参考として提供されます。

**重要**  
実際のコストは、DB クラスターのワークロードに基づくため、一般的なコストとは一致しない場合があります。

### DB クラスターの変更時にコンソールでバックトラックを設定する
<a name="AuroraMySQL.Managing.Backtrack.Configuring.Console.Modifying"></a>

コンソールを使用して DB クラスターのバックトラックを変更できます。

**注記**  
現時点では、バックトラック機能が有効になっている DB クラスターに限り、バックトラックを変更できます。バックトラック機能を無効にして作成した DB クラスターや後でバックトラック機能を無効にした DB クラスターでは、[**バックトラック**] 機能が表示されません。

**コンソールを使用して DB クラスターのバックトラックを変更するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. [**データベース**] をクリックします。

1. 変更するクラスターを選択し、[**変更**] を選択します。

1. [**Target Backtrack window (ターゲットバックトラックウィンドウ)**] で、バックトラックする所望時間を変更します。上限は 72 時間です。  
![\[コンソールでバックトラックを変更する\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/aurora-backtrack-modify.png)

   コンソールは、DB クラスターの過去のワークロードに基づいて、指定した時間のコストを見積もります。
   + DB クラスターでバックトラックが無効になっている場合は、Amazon CloudWatch の DB クラスターの `VolumeWriteIOPS` メトリクスに基づいてコストを見積もります。
   + DB クラスターでバックトラックが以前に有効化されている場合は、Amazon CloudWatch の DB クラスターの `BacktrackChangeRecordsCreationRate` メトリクスに基づいてコストを見積もります。

1. [**Continue**] を選択します。

1. [**Scheduling of Modifications (変更の予定)**] で、以下のいずれかを選択します。
   + **Apply during the next scheduled maintenance window (次回予定のメンテナンスウィンドウで適用する)** - 次回のメンテナンスウィンドウまで待ってから [**Target Backtrack window (ターゲットバックトラックウィンドウ)**] の変更を適用します。
   + **Apply immediately (即時に適用する)** - [**Target Backtrack window (ターゲットバックトラックウィンドウ)**] の変更をできるだけ早急に適用します。

1. [**Modify cluster**] (クラスターの変更) を選択します。

## AWS CLI
<a name="AuroraMySQL.Managing.Backtrack.Configuring.CLI"></a>

AWS CLI の [create-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html) コマンドを使用して新しい Aurora MySQL DB クラスターを作成する場合、バックトラックを設定するには、ゼロより大きい `--backtrack-window` 値を指定します。`--backtrack-window` 値は、ターゲットバックトラックウィンドウを指定します。詳細については、「[Amazon Aurora DB クラスターの作成](Aurora.CreateInstance.md)」を参照してください。

以下の `--backtrack-window` CLI コマンドを使用して AWS 値を指定することもできます。
+  [modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html) 
+  [restore-db-cluster-from-s3](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-from-s3.html) 
+  [restore-db-cluster-from-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-from-snapshot.html) 
+  [restore-db-cluster-to-point-in-time](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-to-point-in-time.html) 

次の手順では、AWS CLI を使用して DB クラスターのターゲットバックトラックウィンドウを変更する方法を示します。

**AWS CLI を使用して DB クラスターのターゲットバックトラックウィンドウを変更するには**
+ AWS CLI の [modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html) コマンドを呼び出して以下の値を指定します。
  + `--db-cluster-identifier` - DB クラスターの名前。
  + `--backtrack-window` - DB クラスターをバックトラックする所望の最大秒数。

  次の例では、`sample-cluster` のターゲットバックトラックウィンドウを 1 日 (86,400 秒) に設定します。

  Linux、macOS、Unix の場合:

  ```
  aws rds modify-db-cluster \
      --db-cluster-identifier sample-cluster \
      --backtrack-window 86400
  ```

  Windows の場合:

  ```
  aws rds modify-db-cluster ^
      --db-cluster-identifier sample-cluster ^
      --backtrack-window 86400
  ```

**注記**  
現在、バックトラックを有効化できるのは、バックトラック機能を有効にして作成した DB クラスターに限ります。

## RDS API
<a name="AuroraMySQL.Managing.Backtrack.Configuring.API"></a>

[CreateDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBCluster.html) Amazon RDS API オペレーションを使用して新しい Aurora MySQL DB クラスターを作成する場合、バックトラックを設定するには、ゼロより大きい `BacktrackWindow` 値を指定します。`BacktrackWindow` 値は、`DBClusterIdentifier` 値で指定した DB クラスターのターゲットバックトラックウィンドウを指定します。詳細については、「[Amazon Aurora DB クラスターの作成](Aurora.CreateInstance.md)」を参照してください。

以下の API オペレーションを使用して `BacktrackWindow` 値を指定することもできます。
+  [ModifyDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBCluster.html) 
+  [RestoreDBClusterFromS3](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBClusterFromS3.html) 
+  [RestoreDBClusterFromSnapshot](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBClusterFromSnapshot.html) 
+  [RestoreDBClusterToPointInTime](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBClusterToPointInTime.html) 

**注記**  
現在、バックトラックを有効化できるのは、バックトラック機能を有効にして作成した DB クラスターに限ります。

# Aurora MySQL DB クラスターのバックトラックの実行
<a name="AuroraMySQL.Managing.Backtrack.Performing0"></a>

DB クラスターは、指定したバックトラックタイムスタンプまでバックトラックできます。バックトラックタイムスタンプが、最も早いバックトラック時間から現時点までの範囲内にあれば、DB クラスターはそのタイムスタンプまでバックトラックされます。

それ以外の場合は、通常、エラーが発生します。また、バイナリログが有効になっている DB クラスターをバックトラックしようとすると、通常、エラーが発生します。ただし、バックトラックの強制実行を選択した場合を除きます。バックトラックの強制実行は、バイナリログを使用する他のオペレーションに干渉する場合があります。

**重要**  
バックトラックでは、それに伴う変更の binlog エントリが生成されません。DB クラスターでバイナリログを有効にしている場合、バックトラックは binlog 実装と互換性がない可能性があります。

**注記**  
データベースのクローンでは、クローンの作成日時より前の時点まで DB クラスターをバックトラックすることはできません。データベースのクローンの詳細については、「[Amazon Aurora DB クラスターのボリュームのクローン作成](Aurora.Managing.Clone.md)」を参照してください。

## コンソール
<a name="AuroraMySQL.Managing.Backtrack.Performing.Console"></a>

次の手順では、コンソールを使用して DB クラスターのバックトラックオペレーションを実行する方法を示します。

**コンソールを使用してバックトラックオペレーションを実行するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**インスタンス**] を選択します。

1. バックトラックする DB クラスターのプライマリインスタンスを選択します。

1. [**アクション**] で、[**DB クラスターのバックトラック**] を選択します。

1. [**DB クラスターのバックトラック**] ページで、DB クラスターのバックトラック先のバックトラックタイムスタンプを入力します。  
![\[DB クラスターのバックトラック\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/aurora-backtrack-db-cluster.png)

1. [**Backtrack DB cluster (DB クラスターのバックトラック)**] を選択します。

## AWS CLI
<a name="AuroraMySQL.Managing.Backtrack.Performing.CLI"></a>

次の手順では、AWS CLI を使用して DB クラスターをバックトラックする方法を示します。

**AWS CLI を使用して DB クラスターをバックトラックするには**
+ AWS CLI の [backtrack-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/backtrack-db-cluster.html) コマンドを呼び出して以下の値を渡します。
  + `--db-cluster-identifier` - DB クラスターの名前。
  + `--backtrack-to` - DB クラスターをバックトラックする先のバックトラックタイムスタンプ (ISO 8601 形式で指定)。

  次の例では、DB クラスター `sample-cluster` を 2018 年 3 月 19 日午前 10 時までバックトラックします。

  Linux、macOS、Unix の場合:

  ```
  aws rds backtrack-db-cluster \
      --db-cluster-identifier sample-cluster \
      --backtrack-to 2018-03-19T10:00:00+00:00
  ```

  Windows の場合:

  ```
  aws rds backtrack-db-cluster ^
      --db-cluster-identifier sample-cluster ^
      --backtrack-to 2018-03-19T10:00:00+00:00
  ```

## RDS API
<a name="AuroraMySQL.Managing.Backtrack.Performing.API"></a>

Amazon RDS API を使用して DB クラスターをバックトラックするには、[BacktrackDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_BacktrackDBCluster.html) オペレーションを使用します。このオペレーションでは、`DBClusterIdentifier` 値で指定した DB クラスターを、指定した時間までバックトラックします。

# Aurora MySQL DB クラスターのバックトラックのモニタリング
<a name="AuroraMySQL.Managing.Backtrack.Monitoring"></a>

DB クラスターのバックトラック情報を表示し、バックトラックのメトリクスをモニタリングできます。

## コンソール
<a name="AuroraMySQL.Managing.Backtrack.Describing.Console"></a>

**コンソールを使用してバックトラック情報を表示し、バックトラックのメトリクスをモニタリングするには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. [**データベース**] をクリックします。

1. 情報を表示する DB クラスターの名前を選択します。

   バックトラック情報は [**Backtrack (バックトラック)**] セクションにあります。  
![\[DB クラスターのバックトラックの詳細\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/aurora-backtrack-details.png)

   バックトラックが有効になっていると、以下の情報が表示されます。
   + **Target window (ターゲットウィンドウ)** - ターゲットバックトラックウィンドウとして現在指定されている時間。十分なストレージがある場合、ターゲットはバックトラックできる最大時間です。
   + **Actual window (実際のウィンドウ)** - 実際にバックトラックできる時間であり、ターゲットバックトラックウィンドウより小さい値になることがあります。実際のバックトラックウィンドウは、ワークロードと、バックトラック変更レコードを保持できるストレージに基づきます。
   + **Earliest backtrack time (最も早いバックトラック時間)** - DB クラスターの最も早い (可能な限り) バックトラック時間。表示された時間より前の時点まで DB クラスターをバックトラックすることはできません。

1. DB クラスターのバックトラックのメトリクスを表示するには、以下の操作を行います。

   1. ナビゲーションペインで、[**インスタンス**] を選択します。

   1. 詳細を表示する DB クラスターのプライマリインスタンス名を選択します。

   1. [**CloudWatch**] セクションで、[**CloudWatch**] ボックスに **Backtrack** と入力し、バックトラックのメトリクスのみを表示します。  
![\[バックトラックのメトリクス\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/aurora-backtrack-metrics.png)

      以下のメトリクスが表示されます。
      + **バックトラック変更レコードの作成率 (カウント)** - このメトリクスは、DB クラスターで 5 分間に作成されたバックトラック変更レコードの数を示します。このメトリクスを使用して、ターゲットバックトラックウィンドウのバックトラックコストを見積もることができます。
      + **[課金済み] 保存されたバックトラック変更レコード数 (カウント)** - このメトリクスは、DB クラスターで実際に使用されたバックトラック変更レコードの数を示します。
      + **実際のバックトラックウィンドウ (分数)** - このメトリクスは、ターゲットバックトラックウィンドウと実際のバックトラックウィンドウの間に差異があるかどうかを示します。例えば、ターゲットバックトラックウィンドウが 2 時間 (120 分) で、このメトリクスで示された実際のバックトラックウィンドウが 100 分の場合、実際のバックトラックウィンドウはターゲットよりも小さくなります。
      + **バックトラックウィンドウのアラート (カウント)** - このメトリクスは、特定の時間内に実際のバックトラックウィンドウがターゲットバックトラックウィンドウより小さくなった回数を示します。
**注記**  
以下のメトリクスは、現在の時刻より遅れる場合があります。  
**バックトラック変更レコードの作成率 (カウント)**
**[課金済み] 保存されたバックトラック変更レコード (カウント)**

## AWS CLI
<a name="AuroraMySQL.Managing.Backtrack.Describing.CLI"></a>

次の手順では、AWS CLI を使用して DB クラスターのバックトラック情報を表示する方法を示します。

**AWS CLI を使用して DB クラスターのバックトラック情報を表示するには**
+ AWS CLI の [describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) コマンドを呼び出して以下の値を渡します。
  + `--db-cluster-identifier` - DB クラスターの名前。

  次の例では、`sample-cluster` のバックトラック情報を一覧表示します。

  Linux、macOS、Unix の場合:

  ```
  aws rds describe-db-clusters \
      --db-cluster-identifier sample-cluster
  ```

  Windows の場合:

  ```
  aws rds describe-db-clusters ^
      --db-cluster-identifier sample-cluster
  ```

## RDS API
<a name="AuroraMySQL.Managing.Backtrack.Describing.API"></a>

Amazon RDS API を使用して DB クラスターのバックトラック情報を表示するには、[DescribeDBClusters](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html) オペレーションを使用します。このオペレーションでは、`DBClusterIdentifier` 値で指定した DB クラスターのバックトラック情報を返します。

## コンソールを使用したバックトラックイベントへのサブスクライブ
<a name="AuroraMySQL.Managing.Backtrack.Event.Console"></a>

次の手順では、コンソールを使用してバックトラックイベントにサブスクライブする方法を示します。実際のバックトラックウィンドウがターゲットバックトラックウィンドウより小さい場合、このイベントから E メール通知またはテキスト通知が送信されます。

**コンソールを使用してバックトラック情報を表示するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. [**イベントサブスクリプション**] をクリックします。

1. [**イベントサブスクリプションを作成**] をクリックします。

1. [**名前** ] ボックスにイベントサブスクリプションの名前を入力し、[**有効**] で [**はい**] を必ず選択します。

1. [**ターゲット**] セクションで、[**新しい E メールトピック**] を選択します。

1. [**トピック名**] にトピックの名前を入力し、[**これらの受取人を含みます**] に通知を受け取る E メールアドレスまたは電話番号を入力します。

1. [**出典**] セクションで、[**出典タイプ**] として [**インスタンス**] を選択します。

1. [**含めるインスタンス**] で、[**特定のインスタンスを選択**] をクリックし、DB インスタンスを選択します。

1. [**含めるイベントカテゴリ**] で、[**特定のイベントカテゴリを選択**] をクリックし、[**バックトラック**] を選択します。

   ページは次のように表示されます。  
![\[バックトラックイベントサブスクリプション\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/aurora-backtrack-event.png)

1. [**作成**] を選択します。

## 既存のバックトラックの取得
<a name="AuroraMySQL.Managing.Backtrack.Retrieving"></a>

DB クラスターの既存のバックトラックに関する情報を取得できます。この情報には、バックトラック固有の識別子、出典から/ターゲットへのバックトラック日時、バックトラックのリクエスト日時、バックトラックの現在のステータスが含まれます。

**注記**  
現時点では、コンソールを使用して既存のバックトラックを取得することはできません。

### AWS CLI
<a name="AuroraMySQL.Managing.Backtrack.Retrieving.CLI"></a>

次の手順では、AWS CLI を使用して DB クラスターの既存のバックトラックを取得する方法を示します。

**AWS CLI を使用して既存のバックトラックを取得するには**
+ AWS CLI の [describe-db-cluster-backtracks](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-cluster-backtracks.html) コマンドを呼び出して以下の値を渡します。
  + `--db-cluster-identifier` - DB クラスターの名前。

  次の例では、`sample-cluster` の既存のバックトラックを取得します。

  Linux、macOS、Unix の場合:

  ```
  aws rds describe-db-cluster-backtracks \
      --db-cluster-identifier sample-cluster
  ```

  Windows の場合:

  ```
  aws rds describe-db-cluster-backtracks ^
      --db-cluster-identifier sample-cluster
  ```

### RDS API
<a name="AuroraMySQL.Managing.Backtrack.Retrieving.API"></a>

Amazon RDS API を使用して DB クラスターのバックトラックに関する情報を取得するには、[DescribeDBClusterBacktracks](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusterBacktracks.html) オペレーションを使用します。このオペレーションでは、`DBClusterIdentifier` 値で指定した DB クラスターのバックトラックに関する情報を返します。

# Aurora MySQL DB クラスターのバックトラックの無効化
<a name="AuroraMySQL.Managing.Backtrack.Disabling"></a>

DB クラスターのバックトラック機能を無効にすることができます。

## コンソール
<a name="AuroraMySQL.Managing.Backtrack.Disabling.Console"></a>

コンソールを使用して DB クラスターのバックトラックを無効にすることができます。クラスターのバックトラックを完全に無効にした後に、そのクラスターに対して再度有効にすることはできません。

**コンソールを使用して DB クラスターのバックトラック機能を無効にするには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. [**データベース**] をクリックします。

1. 変更するクラスターを選択し、[**変更**] をクリックします。

1. [**バックトラック**] セクションで、[**バックトラックを無効にする**] をクリックします。

1. **[Continue]** (続行) をクリックします。

1. [**Scheduling of Modifications (変更の予定)**] で、以下のいずれかを選択します。
   + **次回の定期メンテナンス期間中に適用** - 次回のメンテナンスウィンドウまで待ってから変更を適用します。
   + **すぐに適用** - 変更をできるだけ早急に適用します。

1. [**クラスターの変更**] をクリックします。

## AWS CLI
<a name="AuroraMySQL.Managing.Backtrack.Disabling.CLI"></a>

AWS CLI を使用して DB クラスターのバックトラック機能を無効にするには、ターゲットバックトラックウィンドウを `0` (ゼロ) に設定します。クラスターのバックトラックを完全に無効にした後に、そのクラスターに対して再度有効にすることはできません。

**AWS CLI を使用して DB クラスターのターゲットバックトラックウィンドウを変更するには**
+ AWS CLI の [modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html) コマンドを呼び出して以下の値を指定します。
  + `--db-cluster-identifier` - DB クラスターの名前。
  + `--backtrack-window` - バックトラックをオフにするには、`0` を指定します。

  次の例では、`sample-cluster` のバックトラック機能を無効化するために `--backtrack-window` を `0` に設定します。

  Linux、macOS、Unix の場合:

  ```
  aws rds modify-db-cluster \
      --db-cluster-identifier sample-cluster \
      --backtrack-window 0
  ```

  Windows の場合:

  ```
  aws rds modify-db-cluster ^
      --db-cluster-identifier sample-cluster ^
      --backtrack-window 0
  ```

## RDS API
<a name="AuroraMySQL.Managing.Backtrack.Disabling.API"></a>

Amazon RDS API を使用して DB クラスターのバックトラック機能を無効にするには、[ModifyDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBCluster.html) オペレーションを使用します。`BacktrackWindow` 値を `0` (ゼロ) に設定し、`DBClusterIdentifier` 値に DB クラスターを指定します。クラスターのバックトラックを完全に無効にした後に、そのクラスターに対して再度有効にすることはできません。

# 障害挿入クエリを使用した Amazon Aurora MySQL のテスト
<a name="AuroraMySQL.Managing.FaultInjectionQueries"></a>

障害挿入クエリを使用して、Aurora MySQL DB クラスターの耐障害性をテストできます。フォールト挿入クエリは、SQL コマンドとして Amazon Aurora インスタンスに発行されます。次のいずれかのイベント発生をシミュレートしてスケジュールすることができます。
+ 書き込みまたは読み取り DB インスタンスの障害
+ Aurora レプリカの障害
+ ディスクの障害
+ ディスクの輻輳

障害挿入クエリでクラッシュを指定すると、Aurora MySQL DB インスタンスのクラッシュが強制的に実行されます。その他の障害挿入クエリでは、障害イベントのシミュレーションが実行されますが、そのイベントは発生しません。障害挿入クエリを送信する場合、障害イベントのシミュレーションが発生する時間も指定します。

Aurora レプリカのエンドポイントに接続することによって、Aurora レプリカインスタンスの 1 つに障害挿入クエリを送信できます。詳細については、「[Amazon Aurora エンドポイント接続](Aurora.Overview.Endpoints.md)」を参照してください。

障害挿入クエリの実行には、すべてのマスターユーザー権限が必要です。詳細については、「[マスターユーザーアカウント権限](UsingWithRDS.MasterAccounts.md)」を参照してください。

## インスタンスのクラッシュのテスト
<a name="AuroraMySQL.Managing.FaultInjectionQueries.Crash"></a>

`ALTER SYSTEM CRASH` 障害挿入クエリを使用して、Amazon Aurora インスタンスのクラッシュを強制的に発生させることができます。

この障害挿入クエリでは、フェイルオーバーが発生しません。フェイルオーバーをテストする場合、RDS コンソールで DB クラスターの **[フェイルオーバー]** インスタンスアクションを選択するか、AWS CLI コマンドの [failover-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/failover-db-cluster.html)、または RDS API の [FailoverDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_FailoverDBCluster.html) オペレーションを使用します。

### 構文
<a name="AuroraMySQL.Managing.FaultInjectionQueries.Crash-Syntax"></a>

```
1. ALTER SYSTEM CRASH [ INSTANCE | DISPATCHER | NODE ];
```

### オプション
<a name="AuroraMySQL.Managing.FaultInjectionQueries.Crash-Options"></a>

この障害挿入クエリでは、次のクラッシュタイプのいずれかを指定できます。
+ **`INSTANCE`** — Amazon Aurora インスタンスの MySQL 互換データベースのクラッシュがシミュレートされます。
+ **`DISPATCHER`** — Aurora DB クラスターのライターインスタンスにあるディスパッチャーのクラッシュがシミュレートされます。*ディスパッチャー* は Amazon Aurora DB クラスターのクラスターボリュームに対して更新を書き込みます。
+ **`NODE`** — MySQL 互換データベースと Amazon Aurora インスタンスのディスパッチャーの両方のクラッシュがシミュレートされます。この障害挿入のシミュレーションでは、キャッシュも削除されます。

デフォルトのクラッシュタイプは `INSTANCE` です。

## Aurora レプリカの障害のテスト
<a name="AuroraMySQL.Managing.FaultInjectionQueries.ReplicaFailure"></a>

`ALTER SYSTEM SIMULATE READ REPLICA FAILURE` 障害挿入クエリを使用して、Aurora レプリカの障害をシミュレートできます。

Aurora レプリカの障害は、指定した期間で、ライターインスタンスから Aurora レプリカまたは DB クラスター内のすべての Aurora レプリカに対するすべてのリクエストをブロックします。指定した期間が終了すると、影響を受けた Aurora レプリカは自動的にライターインスタンスと同期されます。

### 構文
<a name="AuroraMySQL.Managing.FaultInjectionQueries.ReplicaFailure-Syntax"></a>

```
1. ALTER SYSTEM SIMULATE percentage_of_failure PERCENT READ REPLICA FAILURE
2.     [ TO ALL | TO "replica name" ]
3.     FOR INTERVAL quantity { YEAR | QUARTER | MONTH | WEEK | DAY | HOUR | MINUTE | SECOND };
```

### オプション
<a name="AuroraMySQL.Managing.FaultInjectionQueries.ReplicaFailure-Options"></a>

この障害挿入クエリでは、以下のパラメータを使用します。
+ **`percentage_of_failure`** — 障害イベントの発生時にブロックするリクエストの割合です。この値は 0～100 の倍精度にすることができます。0 を指定すると、リクエストはブロックされません。100 を指定すると、すべてのリクエストがブロックされます。
+ **障害のタイプ** — シミュレートする障害のタイプ。DB クラスター内のすべての Aurora レプリカの障害をシミュレートするには、`TO ALL` を指定します。1 つの Aurora レプリカの障害をシミュレートするには、`TO` と Aurora レプリカの名前を指定します。デフォルトの障害タイプは `TO ALL` です。
+ **`quantity`** — Aurora レプリカの障害のシミュレートにかかる時間。この値は時間の量の後に時間単位を続けて指定します。シミュレーションは、指定した単位の期間だけ発生します。例えば、`20 MINUTE` と指定すると、シミュレーションは 20 分間実行されます。
**注記**  
Aurora レプリカの障害イベントの時間を指定するときには注意が必要です。指定する時間が長すぎ、障害イベントの発生時にライターインスタンスが大量のデータを書き込んだ場合、Aurora DB クラスターは Aurora レプリカがクラッシュしたものと見なし、レプリカを置き換える可能性があります。

## ディスクの障害のテスト
<a name="AuroraMySQL.Managing.FaultInjectionQueries.DiskFailure"></a>

`ALTER SYSTEM SIMULATE DISK FAILURE` 障害挿入クエリを使用して、Aurora DB クラスターのディスクの障害をシミュレートできます。

ディスク障害のシミュレーションでは、Aurora DB クラスターがランダムにディスクセグメントをエラーとしてマークします。シミュレーションの実行中、これらのセグメントに対するリクエストはブロックされます。

### 構文
<a name="AuroraMySQL.Managing.FaultInjectionQueries.DiskFailure-Syntax"></a>

```
1. ALTER SYSTEM SIMULATE percentage_of_failure PERCENT DISK FAILURE
2.     [ IN DISK index | NODE index ]
3.     FOR INTERVAL quantity { YEAR | QUARTER | MONTH | WEEK | DAY | HOUR | MINUTE | SECOND };
```

### オプション
<a name="AuroraMySQL.Managing.FaultInjectionQueries.DiskFailure-Options"></a>

この障害挿入クエリでは、以下のパラメータを使用します。
+ **`percentage_of_failure`** — 障害イベントの発生時にエラーとしてマークするディスクの割合。この値は 0～100 の倍精度にすることができます。0 を指定すると、ディスクのどの部分もエラーとしてマークされません。100 を指定すると、ディスク全体がエラーとしてマークされます。
+ **`DISK index`** — 障害イベントをシミュレートする特定のデータの論理的なブロック。利用可能な論理的なデータブロックの範囲を超えた場合は、指定できる最大インデックス値を示すエラーが表示されます。詳細については、「[Aurora MySQL DB クラスターのボリュームステータスの表示](AuroraMySQL.Managing.VolumeStatus.md)」を参照してください。
+ **`NODE index`** — 障害イベントをシミュレートする特定のストレージノード。利用可能なストレージノードの範囲を超えた場合は、指定できる最大インデックス値を示すエラーが表示されます。詳細については、「[Aurora MySQL DB クラスターのボリュームステータスの表示](AuroraMySQL.Managing.VolumeStatus.md)」を参照してください。
+ **`quantity`** — ディスクの障害をシミュレートする時間。この値は時間の量の後に時間単位を続けて指定します。シミュレーションは、指定した単位の期間だけ発生します。例えば、`20 MINUTE` と指定すると、シミュレーションは 20 分間実行されます。

## ディスクの輻輳のテスト
<a name="AuroraMySQL.Managing.FaultInjectionQueries.DiskCongestion"></a>

`ALTER SYSTEM SIMULATE DISK CONGESTION` 障害挿入クエリを使用して、Aurora DB クラスターのディスクの障害をシミュレートできます。

ディスク輻輳のシミュレーションでは、Aurora DB クラスターがランダムにディスクセグメントを輻輳としてマークします。これらのセグメントに対するリクエストは、シミュレーションの実行中、指定した最小遅延値と最大遅延値の間で遅延します。

### 構文
<a name="AuroraMySQL.Managing.FaultInjectionQueries.DiskCongestion-Syntax"></a>

```
1. ALTER SYSTEM SIMULATE percentage_of_failure PERCENT DISK CONGESTION
2.     BETWEEN minimum AND maximum MILLISECONDS
3.     [ IN DISK index | NODE index ]
4.     FOR INTERVAL quantity { YEAR | QUARTER | MONTH | WEEK | DAY | HOUR | MINUTE | SECOND };
```

### オプション
<a name="AuroraMySQL.Managing.FaultInjectionQueries.DiskCongestion-Options"></a>

この障害挿入クエリでは、以下のパラメータを使用します。
+ **`percentage_of_failure`** —障害イベントの発生時に輻輳としてマークするディスクの割合です。この値は 0～100 の倍精度にすることができます。0 を指定すると、ディスクのどの部分も輻輳としてマークされません。100 を指定すると、ディスク全体が輻輳としてマークされます。
+ **`DISK index` または `NODE index`** — 障害イベントをシミュレートする特定のディスクまたはノード。ディスクまたはノードのインデックスの範囲を超えた場合は、指定できる最大インデックス値を示すエラーが表示されます。
+ **`minimum` および `maximum`** — 輻輳による遅延の最小値と最大値をミリ秒単位で指定します。シミュレーションの実行中、輻輳としてマークしたディスクセグメントでは、ミリ秒単位の最小値と最大値の間の範囲でランダムな遅延が発生します。
+ **`quantity`** — ディスクの輻輳のシミュレートにかかる時間。この値は時間の量の後に時間単位を続けて指定します。シミュレーションは、指定した時間単位の期間だけ発生します。例えば、`20 MINUTE` と指定すると、シミュレーションは 20 分間実行されます。

# 高速 DDL を使用して Amazon Aurora のテーブルを変更する
<a name="AuroraMySQL.Managing.FastDDL"></a>

Amazon Aurora には、ほぼ瞬時に所定の位置で `ALTER TABLE` オペレーションを実行するための最適化が含まれています。このオペレーションを実行するために、テーブルをコピーする必要はありません。また、他の DML ステートメントに実質的な影響を及ぼすことなく実行できます。このオペレーションは、テーブルのコピーにテンポラリストレージを使用しないため、スモールインスタンスクラスの大きなテーブルに対しても、DDL ステートメントを使用できます。

Aurora MySQL バージョン 3 は、インスタント DDL と呼ばれる MySQL 8.0 の特徴と互換性があります。Aurora MySQL バージョン 2 では、高速 DDL と呼ばれる異なる実装が使用されています。

**Topics**
+ [インスタント DDL (Aurora MySQL バージョン 3)](#AuroraMySQL.mysql80-instant-ddl)
+ [高速 DDL (Aurora MySQL バージョン 2)](#AuroraMySQL.Managing.FastDDL-v2)

## インスタント DDL (Aurora MySQL バージョン 3)
<a name="AuroraMySQL.mysql80-instant-ddl"></a><a name="instant_ddl"></a>

 DDL オペレーションの効率性を向上するため Aurora MySQL バージョン 3 によって実行される最適化を、インスタント DDL と呼びます。

 Aurora MySQL バージョン 3 はコミュニティ MySQL 8.0 のインスタント DDL と互換性があります。インスタント DDL オペレーションを実行するには、`ALTER TABLE` ステートメントで `ALGORITHM=INSTANT` 句を使用します。インスタント DDL の構文と使用方法の詳細については、MySQL ドキュメントの「[ALTER TABLE](https://dev.mysql.com/doc/refman/8.0/en/alter-table.html)」ならびに「[Online DDL Operations](https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html)」(オンライン DDL オペレーション) を参照してください。

 以下の例は、インスタンス DDL の特徴を説明しています。`ALTER TABLE` ステートメントは、列の追加、および列でのデフォルト値の変更を行います。例には、スタンダードカラムと仮想カラムの両方、およびスタンダードテーブルとパーティションテーブルの両方が含まれます。各ステップで、`SHOW CREATE TABLE` と `DESCRIBE` ステートメントを発行すると結果が確認できます。

```
mysql> CREATE TABLE t1 (a INT, b INT, KEY(b)) PARTITION BY KEY(b) PARTITIONS 6;
Query OK, 0 rows affected (0.02 sec)

mysql> ALTER TABLE t1 RENAME TO t2, ALGORITHM = INSTANT;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE t2 ALTER COLUMN b SET DEFAULT 100, ALGORITHM = INSTANT;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t2 ALTER COLUMN b DROP DEFAULT, ALGORITHM = INSTANT;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE t2 ADD COLUMN c ENUM('a', 'b', 'c'), ALGORITHM = INSTANT;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE t2 MODIFY COLUMN c ENUM('a', 'b', 'c', 'd', 'e'), ALGORITHM = INSTANT;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE t2 ADD COLUMN (d INT GENERATED ALWAYS AS (a + 1) VIRTUAL), ALGORITHM = INSTANT;
Query OK, 0 rows affected (0.02 sec)

mysql> ALTER TABLE t2 ALTER COLUMN a SET DEFAULT 20,
    ->   ALTER COLUMN b SET DEFAULT 200, ALGORITHM = INSTANT;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE t3 (a INT, b INT) PARTITION BY LIST(a)(
    ->   PARTITION mypart1 VALUES IN (1,3,5),
    ->   PARTITION MyPart2 VALUES IN (2,4,6)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> ALTER TABLE t3 ALTER COLUMN a SET DEFAULT 20, ALTER COLUMN b SET DEFAULT 200, ALGORITHM = INSTANT;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE t4 (a INT, b INT) PARTITION BY RANGE(a)
    ->   (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(1000),
    ->   PARTITION p2 VALUES LESS THAN MAXVALUE);
Query OK, 0 rows affected (0.05 sec)

mysql> ALTER TABLE t4 ALTER COLUMN a SET DEFAULT 20,
    ->   ALTER COLUMN b SET DEFAULT 200, ALGORITHM = INSTANT;
Query OK, 0 rows affected (0.01 sec)

/* Sub-partitioning example */
mysql> CREATE TABLE ts (id INT, purchased DATE, a INT, b INT)
    ->   PARTITION BY RANGE( YEAR(purchased) )
    ->     SUBPARTITION BY HASH( TO_DAYS(purchased) )
    ->     SUBPARTITIONS 2 (
    ->       PARTITION p0 VALUES LESS THAN (1990),
    ->       PARTITION p1 VALUES LESS THAN (2000),
    ->       PARTITION p2 VALUES LESS THAN MAXVALUE
    ->    );
Query OK, 0 rows affected (0.10 sec)

mysql> ALTER TABLE ts ALTER COLUMN a SET DEFAULT 20,
    ->   ALTER COLUMN b SET DEFAULT 200, ALGORITHM = INSTANT;
Query OK, 0 rows affected (0.01 sec)
```

## 高速 DDL (Aurora MySQL バージョン 2)
<a name="AuroraMySQL.Managing.FastDDL-v2"></a>

 <a name="fast_ddl"></a>

Aurora MySQL の高速 DDL は、ダウンタイムとリソース使用量を削減することで、特定のスキーマ変更 (列の追加や削除など) のパフォーマンスを向上させるように設計された最適化です。これにより、従来の DDL メソッドと比較して、これらのオペレーションをより効率的に完了できます。

**重要**  
現在、高速 DDL を使用するには、Aurora ラボモードを有効にする必要があります。ラボモードを有効にする方法については、「[Amazon Aurora MySQL ラボモード](AuroraMySQL.Updates.LabMode.md)」を参照してください。  
高速 DDL の最適化は、特定の DDL オペレーションの効率を向上させるために、当初 Aurora MySQL バージョン 2 のラボモードで導入されました。Aurora MySQL バージョン 3 では、ラボモードが廃止され、高速 DDL が MySQL 8.0 のインスタント DDL 機能に置き換えられました。

MySQL において、何度もデータ操作言語 (DDL) オペレーションを行うと、パフォーマンスに大きな影響が出ることがあります。

例えば、`ALTER TABLE` オペレーションを使用して列をテーブルに追加するとします。オペレーションに指定するアルゴリズムによっては、このオペレーションに以下の操作が伴う場合があります。
+ テーブル全体のコピーの作成
+ 同時データ操作言語 (DML) オペレーションを処理するためのテンポラリテーブルの作成
+ テーブルのすべてのインデックスの再構築
+ 同時 DML 変更の適用時におけるテーブルロックの適用
+ 同時 DML スループットの低下

このパフォーマンスへの影響は、大きなテーブルやトランザクション量が多い環境では特に問題となる場合があります。高速 DDL は、問題を軽減するために、スキーマの変更を最適化してオペレーションを迅速化し、リソース使用量を減らします。

### 高速 DDL の制限事項
<a name="AuroraMySQL.FastDDL.Limitations"></a>

現在、高速 DDL には以下の制限があります。
+ 高速 DDL は、NULL を許容する列 (デフォルト値を持たない) を、既存テーブルの末尾に追加する場合にのみ使用できます。
+ 高速DDLは、パーティション化されたテーブルでは機能しません。
+ 高速 DDL は、REDUNDANT 行形式を使用する InnoDB テーブルをサポートしていません。
+  Fast DDL は、フルテキスト検索インデックスを持つテーブルでは機能しません。
+ DDL オペレーションの最大可能レコードサイズが大きすぎる場合、高速 DDL は使用されません。ページサイズの半分を超えるレコードサイズは大きすぎます。レコードの最大サイズは、すべての列の最大サイズを追加して計算されます。サイズを変更可能な列の場合は、InnoDB スタンダードに基づき、extern byte は計算に含まれません。

### 高速 DDL の構文
<a name="AuroraMySQL.FastDDL.Syntax"></a>

```
ALTER TABLE tbl_name ADD COLUMN col_name column_definition
```

このステートメントには、以下のオプションがあります。
+ **`tbl_name` — **変更するテーブルの名前。
+ **`col_name` — **追加する列の名前。
+ **`col_definition` — **追加する列の定義。
**注記**  
NULL を許容する列の定義は、デフォルト値を使用せずに指定する必要があります。そうでない場合、高速 DDL は使用されません。

### 高速 DDL の例
<a name="AuroraMySQL.FastDDL.Examples"></a>

 次の例は、高速 DDL オペレーションによる高速化を示しています。最初の SQL の例では、高速 DDL を使用せずに、大きなテーブルに対して `ALTER TABLE` ステートメントを実行しています。この操作にはかなりの時間がかかります。CLI の例は、クラスターで高速 DDL を有効化する方法を示しています。次に、別の SQL の例では、同じテーブルで同じ `ALTER TABLE` ステートメントを実行します。高速 DDL を有効にすると、オペレーションが非常に高速になります。

 この例では、1 億 5000 万行を含む、TPC-H ベンチマークの `ORDERS` テーブルを使用しています。このクラスターでは、比較的小さなインスタンスクラスを意図的に使用して、高速 DDL を使用できない場合の `ALTER TABLE` ステートメントの所要時間を示しています。この例では、同じデータを含む元のテーブルのクローンを作成します。`aurora_lab_mode` 設定を確認すると、ラボモードが有効になっていないため、クラスターで高速 DDL を使用できないことが分かります。その場合、`ALTER TABLE ADD COLUMN` ステートメントでテーブルの最後に新しい列を追加するには、かなりの時間がかかります。

```
mysql> create table orders_regular_ddl like orders;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into orders_regular_ddl select * from orders;
Query OK, 150000000 rows affected (1 hour 1 min 25.46 sec)

mysql> select @@aurora_lab_mode;
+-------------------+
| @@aurora_lab_mode |
+-------------------+
|                 0 |
+-------------------+

mysql> ALTER TABLE orders_regular_ddl ADD COLUMN o_refunded boolean;
Query OK, 0 rows affected (40 min 31.41 sec)

mysql> ALTER TABLE orders_regular_ddl ADD COLUMN o_coverletter varchar(512);
Query OK, 0 rows affected (40 min 44.45 sec)
```

 この例では、前の例と同様に大きなテーブルを準備します。ただし、Interactive SQL セッション内で単にラボモードを有効にすることはできません。この設定は、カスタムパラメータグループで有効にする必要があります。そのためには、`mysql` セッションを終了して AWS CLI コマンドをいくつか実行するか、AWS マネジメントコンソール を使用する必要があります。

```
mysql> create table orders_fast_ddl like orders;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into orders_fast_ddl select * from orders;
Query OK, 150000000 rows affected (58 min 3.25 sec)

mysql> set aurora_lab_mode=1;
ERROR 1238 (HY000): Variable 'aurora_lab_mode' is a read only variable
```

 クラスターのラボモードを有効にするには、パラメータグループをいくつか使用する必要があります。この AWS CLI の例では、クラスターのパラメータグループを使用して、クラスター内のすべての DB インスタンスのラボモード設定で同じ値を使用するようにします。

```
$ aws rds create-db-cluster-parameter-group \
  --db-parameter-group-family aurora5.7 \
    --db-cluster-parameter-group-name lab-mode-enabled-57 --description 'TBD'
$ aws rds describe-db-cluster-parameters \
  --db-cluster-parameter-group-name lab-mode-enabled-57 \
    --query '*[*].[ParameterName,ParameterValue]' \
      --output text | grep aurora_lab_mode
aurora_lab_mode 0
$ aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name lab-mode-enabled-57 \
    --parameters ParameterName=aurora_lab_mode,ParameterValue=1,ApplyMethod=pending-reboot
{
    "DBClusterParameterGroupName": "lab-mode-enabled-57"
}

# Assign the custom parameter group to the cluster that's going to use Fast DDL.
$ aws rds modify-db-cluster --db-cluster-identifier tpch100g \
  --db-cluster-parameter-group-name lab-mode-enabled-57
{
  "DBClusterIdentifier": "tpch100g",
  "DBClusterParameterGroup": "lab-mode-enabled-57",
  "Engine": "aurora-mysql",
  "EngineVersion": "5.7.mysql_aurora.2.10.2",
  "Status": "available"
}

# Reboot the primary instance for the cluster tpch100g:
$ aws rds reboot-db-instance --db-instance-identifier instance-2020-12-22-5208
{
  "DBInstanceIdentifier": "instance-2020-12-22-5208",
  "DBInstanceStatus": "rebooting"
}

$ aws rds describe-db-clusters --db-cluster-identifier tpch100g \
  --query '*[].[DBClusterParameterGroup]' --output text
lab-mode-enabled-57

$ aws rds describe-db-cluster-parameters \
  --db-cluster-parameter-group-name lab-mode-enabled-57 \
    --query '*[*].{ParameterName:ParameterName,ParameterValue:ParameterValue}' \
      --output text | grep aurora_lab_mode
aurora_lab_mode 1
```

 次の例では、パラメータグループの変更が有効になった後のステップを示します。クラスターで高速 DDL を使用できることを確認するため、`aurora_lab_mode` 設定をテストします。次に、`ALTER TABLE` ステートメントを実行して、別の大きなテーブルの末尾に列を追加します。ここでは、ステートメントは非常に高速で終了します。

```
mysql> select @@aurora_lab_mode;
+-------------------+
| @@aurora_lab_mode |
+-------------------+
|                 1 |
+-------------------+

mysql> ALTER TABLE orders_fast_ddl ADD COLUMN o_refunded boolean;
Query OK, 0 rows affected (1.51 sec)

mysql> ALTER TABLE orders_fast_ddl ADD COLUMN o_coverletter varchar(512);
Query OK, 0 rows affected (0.40 sec)
```

# Aurora MySQL DB クラスターのボリュームステータスの表示
<a name="AuroraMySQL.Managing.VolumeStatus"></a>

Amazon Aurora において、DB クラスターボリュームは、論理的なブロックのコレクションで構成されます。各論理的なブロックは、10 ギガバイトの割り当て済みストレージです。これらのブロックは*保護グループ*と呼ばれます。

各保護グループのデータは、6 つの物理ストレージデバイス (*ストレージノード*と呼ばれる) にわたってレプリケートされます。これらのストレージノードは、DB クラスターがある AWS リージョン内の 3 つのアベイラビリティーゾーン (AZ) に割り当てられます。また、各ストレージノードには、DB クラスターボリュームに対する 1 つ以上の論理的なデータブロックが含まれます。保護グループおよびストレージノードの詳細については、AWS データベースブログの「[Aurora ストレージエンジンの概要](https://aws.amazon.com/blogs/database/introducing-the-aurora-storage-engine/)」を参照してください。

ストレージノード全体の障害、またはストレージノード内の単一の論理的なデータブロックの障害をシミュレートできます。シミュレートするには、`ALTER SYSTEM SIMULATE DISK FAILURE` の障害挿入ステートメントを使用します。このステートメントで、特定の論理的なデータブロックまたはストレージノード全体のインデックス値を指定します。ただし、DB クラスターボリュームで使用されている論理的なデータブロックまたはストレージノードの数より大きいインデックス値を指定すると、ステートメントからエラーが返されます。障害挿入クエリの詳細については、「[障害挿入クエリを使用した Amazon Aurora MySQL のテスト](AuroraMySQL.Managing.FaultInjectionQueries.md)」を参照してください。

このエラーは、`SHOW VOLUME STATUS` ステートメントを使用して回避できます。このステートメントからは、2 つのサーバーステータス変数 (`Disks` および `Nodes`) が返されます。これらの変数は、DB クラスターボリュームの論理的なデータブロックとストレージノードの合計数をそれぞれ示します。

## Syntax
<a name="AuroraMySQL.Managing.VolumeStatus.Syntax"></a>

```
SHOW VOLUME STATUS
```

## 例
<a name="AuroraMySQL.Managing.VolumeStatus.Example"></a>

次の例は、SHOW VOLUME STATUS の一般的な結果を示しています。

```
mysql> SHOW VOLUME STATUS;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Disks         | 96    |
| Nodes         | 74    |
+---------------+-------+
```

# Aurora MySQL のチューニング
<a name="AuroraMySQL.Managing.Tuning"></a>

待機イベントとスレッドの状態は、Aurora MySQL の重要なチューニングツールです。セッションがリソースを待っている理由や、何を実行しているのかを知ることができれば、ボトルネックを減少できます。このセクションの情報を使用して、考えられる原因と修正措置を見つけることができます。

Amazon DevOps Guru for RDS は、Aurora MySQL データベースに、後でさらに大きな問題を引き起こす可能性がある問題条件があるかどうかを事前に判断できます。Amazon DevOps Guru for RDS は、是正措置の説明と推奨事項をプロアクティブインサイトで発行します。このセクションには、一般的な問題に関するインサイトが含まれています。

**重要**  
このセクションの待機イベントとスレッドの状態は、Aurora MySQL に固有です。このセクションの情報は Amazon Aurora の調整にのみ使用し、Amazon RDS for MySQL には使用しないでください。  
このセクションの待機イベントの一部は、これらのデータベースエンジンのオープンソースバージョンに対応するものがありません。他の待機イベントの名前は、オープンソースエンジンのイベントと同じですが、動作が異なります。例えば、Amazon Aurora ストレージはオープンソースストレージとは異なる動作をするため、ストレージ関連の待機イベントは異なるリソース条件を示します。

**Topics**
+ [Aurora MySQL チューニングの基本的な概念](AuroraMySQL.Managing.Tuning.concepts.md)
+ [待機イベントを使用した Aurora MySQL のチューニング](AuroraMySQL.Managing.Tuning.wait-events.md)
+ [スレッド状態を使用した Aurora MySQL のチューニング](AuroraMySQL.Managing.Tuning.thread-states.md)
+ [Amazon DevOps Guru のプロアクティブインサイトによる Aurora MySQL のチューニング](MySQL.Tuning.proactive-insights.md)

# Aurora MySQL チューニングの基本的な概念
<a name="AuroraMySQL.Managing.Tuning.concepts"></a>

Aurora MySQL データベースを調整する前に、待機イベントとスレッドの状態はどうなっているか、またその発生理由を確認してください。InnoDB ストレージエンジンを使用するときは、Aurora MySQL の基本的なメモリとディスクアーキテクチャも確認してください。便利なアーキテクチャ図表については、「[MySQL リファレンスマニュアル](https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html)」を参照してください。

**Topics**
+ [Aurora MySQL の待機イベント](#AuroraMySQL.Managing.Tuning.concepts.waits)
+ [Aurora MySQL スレッド状態](#AuroraMySQL.Managing.Tuning.concepts.thread-states)
+ [Aurora MySQL メモリ](#AuroraMySQL.Managing.Tuning.concepts.memory)
+ [Aurora MySQL プロセス](#AuroraMySQL.Managing.Tuning.concepts.processes)

## Aurora MySQL の待機イベント
<a name="AuroraMySQL.Managing.Tuning.concepts.waits"></a>

*待機イベント*はセッションが待っているリソースを示します。例えば、待機イベント `io/socket/sql/client_connection` はスレッドが新しい接続を処理中であることを示します。セッションが待機する一般的なリソースには、次のものがあります。
+ バッファへのシングルスレッドアクセス (例えば、セッションがバッファを変更しようとした場合など)
+ 別のセッションによって現在ロックされている行
+ 読み込まれたデータファイル
+ ログファイルの書き込み

例えば、クエリを満たすために、セッションで完全なテーブルスキャンを実行することがあります。データがまだメモリ上にない場合、セッションはディスク I/O が完了するまで待機します。バッファがメモリに読み込まれるときは、他のセッションが同じバッファにアクセスしているため、セッションは待機しなければならないことがあります。データベースは、事前定義された待機イベントを使用して待機を記録します。これらのイベントはカテゴリに分類されます。

待機イベント自体では、パフォーマンスの問題は表示されません。例えば、要求されたデータがメモリ上にない場合は、ディスクからデータを読み出す必要があります。あるセッションが更新のために行をロックすると、別のセッションはその行を更新できるようにロック解除されるまで待機します。コミットは、ログファイルへの書き込みが完了するまで待機する必要があります。待機は、データベースが正常に機能するために不可欠です。

一般的に、大量の待機イベントはパフォーマンスの問題を示します。そのような場合、待機イベントデータを使用して、セッションが時間を費やしている場所を特定できます。例えば、通常は分単位で実行されるレポートが数時間実行される場合、合計待機時間に最も多く寄与する待機イベントを特定できます。上位の待機イベントの原因を特定できる場合は、パフォーマンス向上のための変更を実行できることがあります。例えば、別のセッションによってロックされている行でセッションが待っている場合、ロックセッションを終了します。

## Aurora MySQL スレッド状態
<a name="AuroraMySQL.Managing.Tuning.concepts.thread-states"></a>

*一般的なスレッド状態*は`State`一般的なクエリ処理に関連付けられている値です。例えばスレッドの状態 `sending data` は、スレッドがクエリの行を読み取り、フィルタリングして正しい結果セットを判断していることを示します。

スレッド状態を使用すると、待機イベントの使用方法と同じような仕様で Aurora MySQL を調整できます。例えば`sending data` の頻繁な発生は通常、クエリがインデックスを使用していないことを示します。スレッド状態の詳細については、*MySQL リファレンスマニュアル*の[一般的なスレッドステート](https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html)を参照してください。

Performance Insights を使用する場合、以下の条件のいずれかに当てはまります。
+ パフォーマンススキーマがオンになっている — Aurora MySQL はスレッド状態ではなく待機イベントを表示します。
+ パフォーマンススキーマがオンになっていない — Aurora MySQL はスレッド状態を表示します。

パフォーマンススキーマは、自動管理に設定することをお勧めします。パフォーマンススキーマは、潜在的なパフォーマンスの問題を調査するための追加のインサイトと優れたツールを提供します。詳細については、[Aurora MySQL における Performance Insights のPerformance Schema の概要](USER_PerfInsights.EnableMySQL.md) を参照してください。

## Aurora MySQL メモリ
<a name="AuroraMySQL.Managing.Tuning.concepts.memory"></a>

Aurora MySQL では、最も重要なメモリ領域はバッファプールとログバッファです。

**Topics**
+ [バッファプール](#AuroraMySQL.Managing.Tuning.concepts.memory.buffer-pool)

### バッファプール
<a name="AuroraMySQL.Managing.Tuning.concepts.memory.buffer-pool"></a>

*バッファプール*は Aurora MySQL がテーブルとインデックスデータをキャッシュする共有メモリ領域です。クエリはディスクから読み取ることなく、頻繁に使用されるデータにメモリから直接アクセスできます。

バッファプールは、ページのリンクリストとして構成されています。*ページ*は複数の行を保持できます。Aurora MySQL は、プールからページをエージングアウトするために、最近最も使用されていない (LRU) アルゴリズムを使用します。

詳細については、*MySQL リファレンスマニュアル*の「[Buffer Pool](https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool.html)」(バッファプール) を参照してください。

## Aurora MySQL プロセス
<a name="AuroraMySQL.Managing.Tuning.concepts.processes"></a>

Aurora MySQL は Aurora PostgreSQL とは大きく異なるプロセスモデルを使用しています。

**Topics**
+ [MySQLサーバー (mysqld)](#AuroraMySQL.Managing.Tuning.concepts.processes.mysqld)
+ [スレッド](#AuroraMySQL.Managing.Tuning.concepts.processes.threads)
+ [スレッドプール](#AuroraMySQL.Managing.Tuning.concepts.processes.pool)

### MySQLサーバー (mysqld)
<a name="AuroraMySQL.Managing.Tuning.concepts.processes.mysqld"></a>

MySQL サーバーは mysqld という名前の単一のオペレーティングシステムプロセスです。MySQL サーバーは追加のプロセスを生成しません。したがって Aurora MySQL データベースは、 mysqld を使用してほとんどの作業を実行します。

MySQL サーバーが起動すると、MySQL クライアントからのネットワーク接続をリッスンします。クライアントがデータベースに接続すると、mysqld はスレッドを開きます。

### スレッド
<a name="AuroraMySQL.Managing.Tuning.concepts.processes.threads"></a>

接続マネージャースレッドは、各クライアント接続を専用スレッドに関連付けます。このスレッドは、認証を管理し、ステートメントを実行し、結果をクライアントに返します。接続マネージャは、必要に応じて新しいスレッドを作成します。

*スレッドキャッシュ*は使用可能なスレッドのセットです。接続が終了すると、キャッシュがいっぱいでない場合、MySQL はスレッドをスレッドキャッシュに返します。`thread_cache_size` システム可変は、スレッドキャッシュのサイズを決定します。

### スレッドプール
<a name="AuroraMySQL.Managing.Tuning.concepts.processes.pool"></a>

*スレッドプール*は複数のスレッドグループで構成されています。各グループは一連のクライアント接続を管理します。クライアントがデータベースに接続すると、スレッドプールはラウンドロビン方式でスレッドグループに接続を割り当てます。スレッドプールは接続とスレッドを分離します。接続と、それらの接続から受信した文を実行するスレッドの間には、固定された関係はありません。

# 待機イベントを使用した Aurora MySQL のチューニング
<a name="AuroraMySQL.Managing.Tuning.wait-events"></a>

次の表は、パフォーマンス問題を最もよく示す Aurora MySQL の待機イベントをまとめたものです。以下の待機イベントは、[Aurora MySQL の待機イベント](AuroraMySQL.Reference.Waitevents.md) のリストのサブセットです。


| 待機イベント | 説明 | 
| --- | --- | 
|  [cpu](ams-waits.cpu.md)  |  このイベントは、スレッドが CPU でアクティブであるか、CPU を待っているときに発生します。  | 
|  [io/aurora\$1redo\$1log\$1flush](ams-waits.io-auredologflush.md)  |  このイベントは、セッションが永続データを Aurora ストレージに書き込むときに発生します。  | 
|  [io/aurora\$1respond\$1to\$1client](ams-waits.respond-to-client.md)  |   イベントは、スレッドが結果セットをクライアントに返すのを待っているときに発生します。  | 
|  [io/redo\$1log\$1flush](ams-waits.io-redologflush.md)  |  このイベントは、セッションが永続データを Aurora ストレージに書き込むときに発生します。  | 
|  [io/socket/sql/client\$1connection](ams-waits.client-connection.md)  |  このイベントは、スレッドが新しい接続を処理している最中のときに発生します。  | 
|  [io/table/sql/handler](ams-waits.waitio.md)  |  このイベントは、作業がストレージエンジンに委任されたときに発生します。  | 
|  [synch/cond/innodb/row\$1lock\$1wait](ams-waits.row-lock-wait.md)  |  このイベントは、あるセッションが更新のために行をロックし、別のセッションが同じ行を更新しようとしたときに発生します。  | 
|  [synch/cond/innodb/row\$1lock\$1wait\$1cond](ams-waits.row-lock-wait-cond.md)  |  このイベントは、あるセッションが更新のために行をロックし、別のセッションが同じ行を更新しようとしたときに発生します。  | 
|  [synch/cond/sql/MDL\$1context::COND\$1wait\$1status](ams-waits.cond-wait-status.md)  |  このイベントは、テーブルメタデータロックに待機中のスレッドがあるときに発生します。  | 
|  [synch/mutex/innodb/aurora\$1lock\$1thread\$1slot\$1futex](ams-waits.waitsynch.md)  |  このイベントは、あるセッションが更新のために行をロックし、別のセッションが同じ行を更新しようとしたときに発生します。  | 
|  [synch/mutex/innodb/buf\$1pool\$1mutex](ams-waits.bufpoolmutex.md)  |  このイベントは、スレッドがメモリ内のページにアクセスするために InnoDB バッファプールのロックを取得したときに発生します。  | 
|  [synch/mutex/innodb/fil\$1system\$1mutex](ams-waits.innodb-fil-system-mutex.md)  |  このイベントは、セッションがテーブルスペースのメモリキャッシュへのアクセスを待っているときに発生します。  | 
|  [synch/mutex/innodb/trx\$1sys\$1mutex](ams-waits.trxsysmutex.md)  |  このイベントは、大量のトランザクションで高いデータベースアクティビティがある場合に発生します。  | 
|  [synch/sxlock/innodb/hash\$1table\$1locks](ams-waits.sx-lock-hash-table-locks.md)  |  このイベントは、バッファプール内には見つからないページをファイルから読み込む必要がある場合に発生します。  | 
|  [synch/mutex/innodb/temp\$1pool\$1manager\$1mutex](ams-waits.io-temppoolmanager.md)  |  このイベントは、セッションがセッション一時テーブルスペースのプールを管理するためのミューテックスの取得を待機しているときに発生します。  | 

# cpu
<a name="ams-waits.cpu"></a>

`cpu` 待機イベントは、スレッドが CPU でアクティブな場合、または CPU を待っている際に発生します。

**Topics**
+ [サポート対象エンジンバージョン](#ams-waits.cpu.context.supported)
+ [Context](#ams-waits.cpu.context)
+ [待ち時間増加の考えられる原因](#ams-waits.cpu.causes)
+ [アクション](#ams-waits.cpu.actions)

## サポート対象エンジンバージョン
<a name="ams-waits.cpu.context.supported"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 2 および 3

## Context
<a name="ams-waits.cpu.context"></a>

すべての vCPU に対して、接続はこの CPU 上で動作を実行できます。状況によっては、実行可能なアクティブな接続の数が vCPUs の数よりも多くなります。この不均衡により、接続が CPU リソースを待機することになります。アクティブな接続の数が vCPUs の数よりも常に多い場合、インスタンスに CPU 競合が発生します。この競合により、`cpu` 待機イベントが発生します。

**注記**  
CPU の Performance Insights メトリクスは `DBLoadCPU` です。`DBLoadCPU` の値は CloudWatch メトリクス `CPUUtilization` の値とは異なる場合があります。後者のメトリクスは、データベースインスタンスのハイパーバイザーから収集されます。

Performance Insights OS メトリクスは、CPU 使用率に関する詳細情報を提供します。例えば、以下のメトリクスを表示できます。
+ `os.cpuUtilization.nice.avg`
+ `os.cpuUtilization.total.avg`
+ `os.cpuUtilization.wait.avg`
+ `os.cpuUtilization.idle.avg`

Performance Insights は、データベースエンジンによる CPU 使用率を `os.cpuUtilization.nice.avg` として報告します。

## 待ち時間増加の考えられる原因
<a name="ams-waits.cpu.causes"></a>

このイベントが通常よりも多く発生し、パフォーマンス問題を示している可能性がある場合、典型的な原因は次のとおりです。
+ 分析クエリ
+ 高パラレルトランザクション
+ 実行時間が長いトランザクション
+ *ログインストーム*として知られる、接続数の急激な増加。
+ コンテキスト切り替えの増加

## アクション
<a name="ams-waits.cpu.actions"></a>

`cpu` 待機イベントがデータベースアクティビティを占領している場合でも、必ずしもパフォーマンスの問題を示すわけではありません。パフォーマンスが低下した場合にのみ、このイベントに応答します。

CPU 使用率の増加の原因に応じて、次の戦略を検討してください。
+ ホストの CPU 容量を増やします。このアプローチは通常、テンポラリ救済しか与えません。
+ 潜在的な最適化のためのトップクエリを特定します。
+ 読み取り専用ワークロードをリーダーノードにリダイレクトします (該当する場合)。

**Topics**
+ [問題の原因となっているセッションまたはクエリを特定します。](#ams-waits.cpu.actions.az-vpc-subnet)
+ [高い CPU ワークロードを分析して最適化する](#ams-waits.cpu.actions.db-instance-class)

### 問題の原因となっているセッションまたはクエリを特定します。
<a name="ams-waits.cpu.actions.az-vpc-subnet"></a>

セッションとクエリを見つけるには、Performance Insights の**トップ SQL** の表で、CPU ロードが最も高い SQL ステートメントを探します。詳細については、「[Performance Insights ダッシュボードを使用してメトリクスを分析する](USER_PerfInsights.UsingDashboard.md)」を参照してください。

通常、1 つまたは 2 つの SQL ステートメントは CPU サイクルの大半を消費します。これらのステートメントを中心に確認してください。DB インスタンスに 2 つの vCPUs があり、DB ロードが平均 3.1 のアクティブセッション (AAS) がすべて CPU 状態にあるとします。この場合、インスタンスは CPU バインドされています。以下の戦略を検討して下さい。
+ より多くの vCPUs を持つより大きなインスタンスクラスにアップグレードします。
+ クエリを調整して CPU ロードを下げます。

この例では、上位 SQL クエリの DB ロードが 1.5 AAS で、すべて CPU 状態です。別の SQL ステートメントの CPU 状態では 0.1 のロードがあります。この例では、lowest-load SQL 文を停止しても、データベースのロードは大幅に軽減されません。ただし、2 つの高ロードクエリを最適化して 2 倍の効率が得られると、CPU のボトルネックがなくなります。1.5 AAS の CPU ロードを 50% 減らすと、各ステートメントの AAS は 0.75 に減少します。CPU に費やされた DB ロードの合計は 1.6 AAS になりました。この値は、vCPU の最大ラインの 2.0 を下回っています。

Performance Insights を使用したトラブルシューティングの便利な概要については、ブログ記事 [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/) を参照してください。また AWS Support 記事 [Amazon RDS for MySQL インスタンスで CPU 使用率が高い CPU 使用率のトラブルシューティングと解決方法を教えてください。](https://aws.amazon.com/premiumsupport/knowledge-center/rds-instance-high-cpu/)も参照してください。

### 高い CPU ワークロードを分析して最適化する
<a name="ams-waits.cpu.actions.db-instance-class"></a>

CPU 使用率を増加させているクエリを特定したら、それらを最適化するか、接続を終了します。次の例は、接続の終了方法を解説しています。

```
CALL mysql.rds_kill(processID);
```

詳細については、「[mysql.rds\$1kill](mysql-stored-proc-ending.md#mysql_rds_kill)」を参照してください。

セッションを終了すると、アクションによって長いロールバックがトリガーされることがあります。

#### クエリを最適化するためのガイドラインに従う
<a name="ams-waits.cpu.actions.db-instance-class.optimizing"></a>

クエリを最適化するには、次のガイドラインを考慮してください。
+ `EXPLAIN` ステートメントを実行します。

  このコマンドは、クエリの実行に関連する個々のステップを示しています。詳細については、MySQL ドキュメントの[「EXPLAIN を使用したクエリの最適化」](https://dev.mysql.com/doc/refman/5.7/en/using-explain.html)を参照してください。
+ `SHOW PROFILE` ステートメントを実行します。

  このステートメントを使用して、現在のセッション中に実行されるステートメントのリソース使用状況を示すプロファイル詳細を確認します。詳細については、MySQL ドキュメントの [SHOW PROFILE ステートメント](https://dev.mysql.com/doc/refman/5.7/en/show-profile.html)を参照してください。
+ `ANALYZE TABLE` ステートメントを実行します。

  このステートメントを使用して、CPU を大量に消費するクエリによってアクセスされるテーブルのインデックス統計を更新します。ステートメントを分析することで、オプティマイザが適切な実行プランを選択するのに役立ちます。詳細については、MySQL ドキュメントの [ANALYZE TABLE ステートメント](https://dev.mysql.com/doc/refman/5.7/en/analyze-table.html)を参照してください。

#### CPU 使用率を改善するためのガイドラインに従ってください
<a name="ams-waits.cpu.actions.db-instance-class.considerations"></a>

データベースインスタンスの CPU 使用率を向上させるには、次のガイドラインに従ってください。
+ すべてのクエリが適切なインデックスを使用していることを確認します。
+ Aurora パラレルクエリを使用できるかどうかを調べます。このテクニックを使うと、関数処理、行のフィルタリング、および `WHERE` 句のプロジェクションをプッシュダウンすることにより、ヘッドノードの CPU 使用率を削減することができます。
+ 1 秒あたりの SQL 実行数が予想されるしきい値と合っているかを調べます。
+ インデックスのメンテナンスまたは新規インデックスの作成が、本番ワークロードで必要な CPU サイクルにかかるかどうかを調べます。ピークアクティビティ時間外のメンテナンスアクティビティをスケジュールします。
+ パーティショニングを使用してクエリデータセットを削減できるかどうかを調べます。詳細については、ブログの投稿記事 [統合ワークロードに向けて Amazon Aurora with MySQL の互換性を計画、最適化する方法](https://aws.amazon.com/blogs/database/planning-and-optimizing-amazon-aurora-with-mysql-compatibility-for-consolidated-workloads/)を参照してください。

#### 接続ストームをチェックする
<a name="ams-waits.cpu.actions.db-instance-class.cpu-util"></a>

 `DBLoadCPU` メトリクスはそれほど高くはないが `CPUUtilization` メトリクスが高い場合、CPU 使用率が高い原因はデータベースエンジンの外部にあります。典型的な例はコネクションストームです。

以下の条件に該当するかどうかを確認してください。
+ Performance Insights `CPUUtilization` メトリックスと Amazon CloudWatch `DatabaseConnections` メトリクスの両方で増加が見られる。
+ CPU 内のスレッド数が vCPUs 数を超えいる。

上記の条件に当てはまる場合は、データベース接続数を減らすことを検討してください。例えば、RDS プロキシなどの接続プールを使用できます。効果的な接続管理とスケーリングのベストプラクティスを学ぶには、ホワイトペーパー[接続管理のための Amazon Aurora MySQL DBA ハンドブック](https://d1.awsstatic.com/whitepapers/RDS/amazon-aurora-mysql-database-administrator-handbook.pdf)を参照してください。

# io/aurora\$1redo\$1log\$1flush
<a name="ams-waits.io-auredologflush"></a>

`io/aurora_redo_log_flush` イベントは、セッションが永続データを Amazon Aurora ストレージに書き込むときに発生します。

**Topics**
+ [サポート対象エンジンバージョン](#ams-waits.io-auredologflush.context.supported)
+ [Context](#ams-waits.io-auredologflush.context)
+ [待機時間が増加する原因の可能性](#ams-waits.io-auredologflush.causes)
+ [アクション](#ams-waits.io-auredologflush.actions)

## サポート対象エンジンバージョン
<a name="ams-waits.io-auredologflush.context.supported"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 2

## Context
<a name="ams-waits.io-auredologflush.context"></a>

`io/aurora_redo_log_flush` イベントは Aurora MySQL の書き込み入力/出力 (I/O) オペレーション用です。

**注記**  
Aurora MySQL バージョン 3 では、この待機イベントの名前は [io/redo\$1log\$1flush](ams-waits.io-redologflush.md) です。

## 待機時間が増加する原因の可能性
<a name="ams-waits.io-auredologflush.causes"></a>

データの永続化のために、コミットはストレージが安定するよう耐久性の高い書き込みを要求とします。データベースがコミットを多くし過ぎると、書き込み I/O オペレーションで待機イベントが発生します、`io/aurora_redo_log_flush` 待機イベント。

次の例では、db.r5.xlarge DB インスタンスクラスを使用して、50,000 レコードが Aurora MySQL DB クラスターに挿入されています。
+ 初期の例では、各セッションは行ごとに 10,000 レコードを挿入しています。デフォルトで、データ操作言語 (DML) コマンドがトランザクション内にない場合、Aurora MySQL は暗黙的なコミットを使用します。オートコミットがオンになっています。これは、各行の挿入に対してコミットがあることを意味します。Performance Insights は、コネクションがほとんどの時間`io/aurora_redo_log_flush` 待機イベントで待っていることを示しています。  
![\[Performance Insights 待機イベントの例\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/auredologflush_PI_example1.png)

  これは、使用される単純な挿入ステートメントが原因です。  
![\[トップ SQL にステートメントを挿入します\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/auredologflush_top_SQL1.png)

  50,000 レコードは挿入されるまで 3.5 分 かかります。
+ 2 番目の例では、挿入は 1,000 バッチで作成されます。つまり、各接続は 10,000 ではなく 10 のコミットを実行します。Performance Insights は、コネクションがほとんどの時間 `io/aurora_redo_log_flush` 待機イベントで待っていないことを示しています。  
![\[影響の少ない Performance Insights 待機イベントの例\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/auredologflush_PI_example2.png)

  50,000 レコードが挿入されるまでに 4 秒かかります。

## アクション
<a name="ams-waits.io-auredologflush.actions"></a>

待機イベントの原因に応じて、異なるアクションをお勧めします。

**Topics**
+ [問題のあるセッションとクエリを特定する](#ams-waits.io-auredologflush.actions.identify-queries)
+ [書き込みオペレーションをグループ化する](#ams-waits.io-auredologflush.actions.action0)
+ [オートコミットをオフにする](#ams-waits.io-auredologflush.actions.action1)
+ [トランザクションの使用](#ams-waits.io-auredologflush.action2)
+ [バッチを使用する](#ams-waits.io-auredologflush.action3)

### 問題のあるセッションとクエリを特定する
<a name="ams-waits.io-auredologflush.actions.identify-queries"></a>

DB インスタンスにボトルネックが発生している場合、ユーザーの初期のタスクは、その原因となるセッションとクエリを見つけることになります。便利な AWS データベースブログ記事は [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/) を参照してください。

**ボトルネックの原因となっているセッションとクエリを特定するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**Performance Insights**] を選択します。

1. DB インスタンスを選択します。

1. **データベース負荷**で、**待機でスライス**を選択します。

1. ページの下部で **トップ SQL** を選択します。

   リストの上部にあるクエリは、データベースで最大の負荷を引き起こしています。

### 書き込みオペレーションをグループ化する
<a name="ams-waits.io-auredologflush.actions.action0"></a>

次の例は `io/aurora_redo_log_flush` 待機イベントをトリガーしています。(オートコミットがオンになっています。)

```
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
....
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');

UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx;
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx;
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx;
....
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx;

DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
....
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
```

`io/aurora_redo_log_flush` 待機イベントで待機する時間を減らすため、書き込み操作を論理的に 1 つのコミットにグループ化し、ストレージへの永続的な呼び出しを減らします。

### オートコミットをオフにする
<a name="ams-waits.io-auredologflush.actions.action1"></a>

次の例に示すように、トランザクション内に存在しない大きな変更を加える前に、オートコミットをオフにします。

```
SET SESSION AUTOCOMMIT=OFF;
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx;
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx;
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx;
....
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx;
-- Other DML statements here
COMMIT;

SET SESSION AUTOCOMMIT=ON;
```

### トランザクションの使用
<a name="ams-waits.io-auredologflush.action2"></a>

次の例が示すように、トランサクションを使用することができます。

```
BEGIN
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
....
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');

DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
....
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;

-- Other DML statements here
END
```

### バッチを使用する
<a name="ams-waits.io-auredologflush.action3"></a>

次の例が示すように、バッチで変更することもできます。ただし、大きすぎるバッチを使用すると、特にリードレプリカやポイントインタイムリカバリ (PITR) の実行時にパフォーマンスの問題が発生する可能性があります。

```
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES
('xxxx','xxxxx'),('xxxx','xxxxx'),...,('xxxx','xxxxx'),('xxxx','xxxxx');

UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1 BETWEEN xx AND xxx;

DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1<xx;
```

# io/aurora\$1respond\$1to\$1client
<a name="ams-waits.respond-to-client"></a>

`io/aurora_respond_to_client` イベントは、スレッドが結果セットをクライアントに返すのを待っているときに発生します。

**Topics**
+ [サポート対象エンジンバージョン](#ams-waits.respond-to-client.context.supported)
+ [Context](#ams-waits.respond-to-client.context)
+ [待ち時間増加の考えられる原因](#ams-waits.respond-to-client.causes)
+ [アクション](#ams-waits.respond-to-client.actions)

## サポート対象エンジンバージョン
<a name="ams-waits.respond-to-client.context.supported"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 2

## Context
<a name="ams-waits.respond-to-client.context"></a>

`io/aurora_respond_to_client` イベントは、スレッドが結果セットをクライアントに返すのを待っているときに発生します。

クエリの処理が完了し、結果はアプリケーションクライアントに返されます。ただし、DB クラスターには十分なネットワーク帯域幅がないため、スレッドは結果セットを返すのを待っています。

## 待ち時間増加の考えられる原因
<a name="ams-waits.respond-to-client.causes"></a>

`io/aurora_respond_to_client` イベントが通常よりも多く表示され、パフォーマンスの問題を示している可能性がある場合、典型的な原因は次のとおりです。

**DB インスタンスクラスがワークロードに対して不十分**  
DB クラスターで使用される DB インスタンスクラスには、ワークロードを効率的に処理するために必要なネットワーク帯域幅がありません。

**大きな結果セット**  
クエリがより多くの行数を返すため、返される結果セットのサイズが増加しました。結果セットが大きいほど、より多くのネットワーク帯域幅を消費します。

**クライアントへの負荷の増加**  
クライアントに CPU プレッシャー、メモリプレッシャー、またはネットワークの飽和が発生する可能性があります。クライアントの負荷が増加すると、Aurora MySQL DB クラスターからのデータの受信が遅れます。

**ネットワークレイテンシーの増加**  
Aurora MySQL DB クラスターとクライアント間のネットワークレイテンシーが増加することがあります。ネットワークレイテンシーが大きいほど、クライアントがデータを受信するのに必要な時間が長くなります。

## アクション
<a name="ams-waits.respond-to-client.actions"></a>

待機イベントの原因に応じたさまざまなアクションをお勧めします。

**Topics**
+ [イベントの原因となるセッションとクエリを特定する](#ams-waits.respond-to-client.actions.identify)
+ [DB インスタンスクラスのスケール](#ams-waits.respond-to-client.actions.scale-db-instance-class)
+ [予期しない結果のワークロードをチェックする](#ams-waits.respond-to-client.actions.workload)
+ [リーダーインスタンスでワークロードを分散する](#ams-waits.respond-to-client.actions.balance)
+ [SQL\$1BUFFER\$1RESULT 修飾子を使用する](#ams-waits.respond-to-client.actions.sql-buffer-result)

### イベントの原因となるセッションとクエリを特定する
<a name="ams-waits.respond-to-client.actions.identify"></a>

Performance Insights を使用して、`io/aurora_respond_to_client` 待機イベントによってブロックされたクエリを表示できます。通常、ロードが中程度から重大なデータベースには、待機イベントがあります。パフォーマンスが最適であれば、待機イベントは受け入れられる可能性があります。パフォーマンスが最適でない場合は、データベースが最も長い時間を費やしている場所を調べます。最も高いロードに寄与する待機イベントを調べて、データベースとアプリケーションを最適化してこれらのイベントを削減できるかどうかを調べます。

**高ロードの原因となる SQL クエリを検索するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**Performance Insights**] を選択します。

1. DB インスタンスを選択します。その DB インスタンスの Performance Insights ダッシュボードが表示されます。

1. **データベースロード**で、**待機でスライス**を選択します。

1. ページの下部で **トップ SQL** を選択します。

   グラフには、ロードの原因となる SQL クエリがリストされます。リスト上部にあるクエリに、最も責任があります。ボトルネックを解決するには、これらのステートメントに注目してください。

Performance Insights を使用したトラブルシューティングの便利な概要については、AWS　データベースブログ記事の [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/)を参照してください。

### DB インスタンスクラスのスケール
<a name="ams-waits.respond-to-client.actions.scale-db-instance-class"></a>

`NetworkReceiveThroughput` や `NetworkTransmitThroughput` などのネットワークスループットに関連する Amazon CloudWatch メトリクスの値の増加を確認します。DB インスタンスクラスのネットワーク帯域幅に達している場合は、DB クラスターを変更することで、DB クラスターで使用される DB インスタンスクラスをスケールできます。より大きなネットワーク帯域幅を持つ DB インスタンスクラスは、データをより効率的にクライアントに返します。

Amazon CloudWatch メトリクスのモニタリングについては、[Amazon RDS コンソールでのメトリクスの表示](USER_Monitoring.md) を参照してください。DB インスタンスクラスの詳細については、「[Amazon Aurora DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。DB クラスターの変更の詳細については、「[Amazon Aurora DB クラスターの変更](Aurora.Modifying.md)」を参照してください。

### 予期しない結果のワークロードをチェックする
<a name="ams-waits.respond-to-client.actions.workload"></a>

DB クラスターのワークロードをチェックし、予期しない結果が発生していないことを確認します。例えば、予想よりも多くの行を返すクエリがある可能性があります。この場合、`Innodb_rows_read` などの Performance Insights カウンターメトリクスを使用できます。詳細については、「[Performance Insights カウンターメトリクス](USER_PerfInsights_Counters.md)」を参照してください。

### リーダーインスタンスでワークロードを分散する
<a name="ams-waits.respond-to-client.actions.balance"></a>

Aurora レプリカを使用して、読み取り専用ワークロードを配布できます。Aurora レプリカを追加することで、水平方向にスケールできます。そうすると、ネットワーク帯域幅のスロットリング制限が増加する可能性があります。詳細については、「[Amazon Aurora DB クラスター](Aurora.Overview.md)」を参照してください。

### SQL\$1BUFFER\$1RESULT 修飾子を使用する
<a name="ams-waits.respond-to-client.actions.sql-buffer-result"></a>

`SQL_BUFFER_RESULT` 修飾子 を `SELECT` ステートメントに追加すると、結果がクライアントに返される前にテンポラリテーブルに強制できます。クエリは `io/aurora_respond_to_client` 待機状態になっているため、InnoDB ロックが解放されていない時この修飾子はパフォーマンスの問題に役立ちます。詳細については、MySQL ドキュメントの [SELECT ステートメント](https://dev.mysql.com/doc/refman/5.7/en/select.html)を参照してください。

# io/redo\$1log\$1flush
<a name="ams-waits.io-redologflush"></a>

`io/redo_log_flush` イベントは、セッションが永続データを Amazon Aurora ストレージに書き込むときに発生します。

**Topics**
+ [サポート対象エンジンバージョン](#ams-waits.io-redologflush.context.supported)
+ [Context](#ams-waits.io-redologflush.context)
+ [待機時間が増加する原因の可能性](#ams-waits.io-redologflush.causes)
+ [アクション](#ams-waits.io-redologflush.actions)

## サポート対象エンジンバージョン
<a name="ams-waits.io-redologflush.context.supported"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 3

## Context
<a name="ams-waits.io-redologflush.context"></a>

`io/redo_log_flush` イベントは Aurora MySQL の書き込み入力/出力 (I/O) オペレーション用です。

**注記**  
Aurora MySQL バージョン 2 では、この待機イベントの名前は [io/aurora\$1redo\$1log\$1flush](ams-waits.io-auredologflush.md) です。

## 待機時間が増加する原因の可能性
<a name="ams-waits.io-redologflush.causes"></a>

データの永続化のために、コミットはストレージが安定するよう耐久性の高い書き込みを要求とします。データベースがコミットを多くし過ぎると、書き込み I/O オペレーションで待機イベントが発生します、`io/redo_log_flush` 待機イベント。

この待機イベントの動作の例については、「[io/aurora\$1redo\$1log\$1flush](ams-waits.io-auredologflush.md)」を参照してください。

## アクション
<a name="ams-waits.io-redologflush.actions"></a>

待機イベントの原因に応じて、異なるアクションをお勧めします。

**Topics**
+ [問題のあるセッションとクエリを特定する](#ams-waits.io-redologflush.actions.identify-queries)
+ [書き込みオペレーションをグループ化する](#ams-waits.io-redologflush.actions.action0)
+ [オートコミットをオフにする](#ams-waits.io-redologflush.actions.action1)
+ [トランザクションの使用](#ams-waits.io-redologflush.action2)
+ [バッチを使用する](#ams-waits.io-redologflush.action3)

### 問題のあるセッションとクエリを特定する
<a name="ams-waits.io-redologflush.actions.identify-queries"></a>

DB インスタンスにボトルネックが発生している場合、ユーザーの初期のタスクは、その原因となるセッションとクエリを見つけることになります。便利な AWS データベースブログ記事は [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/) を参照してください。

**ボトルネックの原因となっているセッションとクエリを特定するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**Performance Insights**] を選択します。

1. DB インスタンスを選択します。

1. **データベース負荷**で、**待機でスライス**を選択します。

1. ページの下部で **トップ SQL** を選択します。

   リストの上部にあるクエリは、データベースで最大の負荷を引き起こしています。

### 書き込みオペレーションをグループ化する
<a name="ams-waits.io-redologflush.actions.action0"></a>

次の例は `io/redo_log_flush` 待機イベントをトリガーしています。(オートコミットがオンになっています。)

```
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
....
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');

UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx;
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx;
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx;
....
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE id=xx;

DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
....
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
```

`io/redo_log_flush` 待機イベントで待機する時間を減らすため、書き込み操作を論理的に 1 つのコミットにグループ化し、ストレージへの永続的な呼び出しを減らします。

### オートコミットをオフにする
<a name="ams-waits.io-redologflush.actions.action1"></a>

次の例に示すように、トランザクション内に存在しない大きな変更を加える前に、オートコミットをオフにします。

```
SET SESSION AUTOCOMMIT=OFF;
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx;
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx;
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx;
....
UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1=xx;
-- Other DML statements here
COMMIT;

SET SESSION AUTOCOMMIT=ON;
```

### トランザクションの使用
<a name="ams-waits.io-redologflush.action2"></a>

次の例が示すように、トランサクションを使用することができます。

```
BEGIN
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');
....
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES ('xxxx','xxxxx');

DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;
....
DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1=xx;

-- Other DML statements here
END
```

### バッチを使用する
<a name="ams-waits.io-redologflush.action3"></a>

次の例が示すように、バッチで変更することもできます。ただし、大きすぎるバッチを使用すると、特にリードレプリカやポイントインタイムリカバリ (PITR) の実行時にパフォーマンスの問題が発生する可能性があります。

```
INSERT INTO `sampleDB`.`sampleTable` (sampleCol2, sampleCol3) VALUES
('xxxx','xxxxx'),('xxxx','xxxxx'),...,('xxxx','xxxxx'),('xxxx','xxxxx');

UPDATE `sampleDB`.`sampleTable` SET sampleCol3='xxxxx' WHERE sampleCol1 BETWEEN xx AND xxx;

DELETE FROM `sampleDB`.`sampleTable` WHERE sampleCol1<xx;
```

# io/socket/sql/client\$1connection
<a name="ams-waits.client-connection"></a>

`io/socket/sql/client_connection` イベントは、スレッドが新しい接続を処理している最中に発生します。

**Topics**
+ [サポート対象エンジンバージョン](#ams-waits.client-connection.context.supported)
+ [Context](#ams-waits.client-connection.context)
+ [待ち時間増加の考えられる原因](#ams-waits.client-connection.causes)
+ [アクション](#ams-waits.client-connection.actions)

## サポート対象エンジンバージョン
<a name="ams-waits.client-connection.context.supported"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 2 および 3

## Context
<a name="ams-waits.client-connection.context"></a>

イベント`io/socket/sql/client_connection` は、受信する新規クライアント接続を処理するためのスレッド作成で mysqld がビジー状態であることを示します。このシナリオでは、スレッドが割り当てられるのを接続が待っている間、新しいクライアント接続リクエストの対応処理が遅くなります。詳細については、「[MySQLサーバー (mysqld)](AuroraMySQL.Managing.Tuning.concepts.md#AuroraMySQL.Managing.Tuning.concepts.processes.mysqld)」を参照してください。

## 待ち時間増加の考えられる原因
<a name="ams-waits.client-connection.causes"></a>

この イベントが通常よりも多く表示され、パフォーマンスの問題を示している可能性がある場合、典型的な原因は次のとおりです。
+ アプリケーションから Amazon RDS インスタンスへの新しいユーザー接続が突然増加しています。
+ ネットワーク、CPU、またはメモリがスロットリングされているため、DB インスタンスは新しい接続を処理できません。

## アクション
<a name="ams-waits.client-connection.actions"></a>

`io/socket/sql/client_connection` がデータベースアクティビティを占領している場合でも、必ずしもパフォーマンスの問題を示すわけではありません。アイドル状態でないデータベースでは、待機イベントは常に最上位にあります。パフォーマンスが低下したときにのみ動作してください。待機イベントの原因に応じて、異なるアクションをお勧めします。

**Topics**
+ [問題のあるセッションとクエリを特定する](#ams-waits.client-connection.actions.identify-queries)
+ [接続管理のベストプラクティス](#ams-waits.client-connection.actions.manage-connections)
+ [リソースがスロットリングされている場合にインスタンスをスケールアップする](#ams-waits.client-connection.upgrade)
+ [上位ホストと上位ユーザーを確認する](#ams-waits.client-connection.top-hosts)
+ [performance\$1schema テーブルのクエリを実行する](#ams-waits.client-connection.perf-schema)
+ [クエリのスレッド状態を確認する](#ams-waits.client-connection.thread-states)
+ [リクエストとクエリを監査する](#ams-waits.client-connection.auditing)
+ [データベース接続をプールする](#ams-waits.client-connection.pooling)

### 問題のあるセッションとクエリを特定する
<a name="ams-waits.client-connection.actions.identify-queries"></a>

DB インスタンスにボトルネックが発生している場合、ユーザーの初期のタスクは、その原因となるセッションとクエリを見つけることになります。便利なデータベースブログ記事は、[Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/)を参照してください。

**ボトルネックの原因となっているセッションとクエリを特定するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**Performance Insights**] を選択します。

1. DB インスタンスを選択します。

1. **データベース負荷**で、**待機でスライス**を選択します。

1. ページの下部で **トップ SQL** を選択します。

   リストの上部にあるクエリは、データベースで最大のロードを引き起こしています。

### 接続管理のベストプラクティス
<a name="ams-waits.client-connection.actions.manage-connections"></a>

接続を管理するには、次の戦略を検討してください。
+ 接続プーリングの使用

  必要に応じて、接続数を徐々に増やすことができます。詳細については、ホワイトペーパーの [Amazon Aurora MySQL データベース管理者ハンドブック](https://d1.awsstatic.com/whitepapers/RDS/amazon-aurora-mysql-database-administrator-handbook.pdf)を参照してください。
+ リーダーノードを使用して、読み取り専用トラフィックを再配布します。

  詳細については、「[Aurora レプリカ](Aurora.Replication.md#Aurora.Replication.Replicas)」および「[Amazon Aurora エンドポイント接続](Aurora.Overview.Endpoints.md)」を参照してください。

### リソースがスロットリングされている場合にインスタンスをスケールアップする
<a name="ams-waits.client-connection.upgrade"></a>

次のリソースでスロットリングの例を探してください。
+ CPU

  Amazon CloudWatch メトリクスで CPU 使用率が高くなるかどうかを確認してください。
+ Network

  CloudWatch メトリクス `network receive throughput` および `network transmit throughput` の値の増加を確認します。インスタンスがインスタンスクラスのネットワーク帯域幅制限に達した場合は、RDS インスタンスをより高いインスタンスクラスタイプにスケールアップすることを検討してください。詳細については、「[Amazon Aurora DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。
+ 解放可能なメモリ 

  CloudWatch メトリクス `FreeableMemory` のドロップをチェックします。また、拡張モニタリングをオンにすることを検討してください。詳細については、「[拡張モニタリングを使用した OS メトリクスのモニタリング](USER_Monitoring.OS.md)」を参照してください。

### 上位ホストと上位ユーザーを確認する
<a name="ams-waits.client-connection.top-hosts"></a>

Performance Insights を使用して、上位ホストと上位ユーザーを確認します。詳細については、「[Performance Insights ダッシュボードを使用してメトリクスを分析する](USER_PerfInsights.UsingDashboard.md)」を参照してください。

### performance\$1schema テーブルのクエリを実行する
<a name="ams-waits.client-connection.perf-schema"></a>

現在の接続数と合計接続数の正確な数を取得するには、`performance_schema` テーブルをクエリします。この手法では、多数の接続の作成を担当する出典ユーザーまたはホストを特定します。例えば、次の通り `performance_schema` テーブルをクエリします。

```
SELECT * FROM performance_schema.accounts;
SELECT * FROM performance_schema.users;
SELECT * FROM performance_schema.hosts;
```

### クエリのスレッド状態を確認する
<a name="ams-waits.client-connection.thread-states"></a>

パフォーマンスの問題が継続する場合は、クエリのスレッド状態を確認してください。`mysql` クライアントで、次のコマンドを実行します。

```
show processlist;
```

### リクエストとクエリを監査する
<a name="ams-waits.client-connection.auditing"></a>

ユーザーアカウントからのリクエストとクエリの性質を確認するには、AuroraAurora MySQL アドバンスト監査を使用します。監査を有効にする方法については、[Amazon Aurora MySQL DB クラスターでのアドバンストな監査の使用](AuroraMySQL.Auditing.md) を参照してください。

### データベース接続をプールする
<a name="ams-waits.client-connection.pooling"></a>

接続管理に Amazon RDS プロキシを使用することを検討してください。RDS プロキシーを使用すると、アプリケーションでデータベース接続をプールおよび共有して、アプリケーションのスケール能力を向上させることができます。RDS Proxy は、アプリケーション接続を維持しながらスタンバイ DB インスタンスに自動的に接続することで、データベースの障害に対するアプリケーションの耐障害性を高めます。詳細については、「[Amazon RDS Proxy for Aurora](rds-proxy.md)」を参照してください。

# io/table/sql/handler
<a name="ams-waits.waitio"></a>

`io/table/sql/handler` イベントは、作業がストレージエンジンに委任されたときに発生します。

**Topics**
+ [サポート対象エンジンバージョン](#ams-waits.waitio.context.supported)
+ [Context](#ams-waits.waitio.context)
+ [待機時間が増加する原因の可能性](#ams-waits.waitio.causes)
+ [アクション](#ams-waits.waitio.actions)

## サポート対象エンジンバージョン
<a name="ams-waits.waitio.context.supported"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 2 および 3

## Context
<a name="ams-waits.waitio.context"></a>

イベント `io/table` は、テーブルへのアクセスを待っていることを示します。このイベントは、データがバッファプールにキャッシュされているか、ディスク上でアクセスされているかにかかわらず、発生します。`io/table/sql/handler` イベントは、ワークロードアクティビティの増加を示します。

*ハンドラー*は、特定の種類のデータに特化したルーチンか、特定の特別なタスクに焦点を当てたルーチンです。例えば、イベントハンドラーは、オペレーティングシステムまたはユーザーインターフェイスからイベントとシグナルを受信してダイジェストします。メモリハンドラーは、メモリに関連するタスクを実行します。ファイル入力ハンドラは、ファイル入力を受け取り、コンテキストに応じてデータに対して特別なタスクを実行する関数です。

`performance_schema.events_waits_current` などの ビューは、実際の待機がロックなどのネストされた待機イベントである場合に `io/table/sql/handler` をよく表示します。実際の待機が `io/table/sql/handler` ではない場合、Performance Insights はネストされた待機イベントをレポートします。Performance Insights が `io/table/sql/handler` をレポートする場合、非表示のネストされた待機イベントではなく I/O リクエストの InnoDB 処理を表します。詳細については、*MySQL リファレンスマニュアル*の[「パフォーマンススキーマの原子および分子イベント」](https://dev.mysql.com/doc/refman/5.7/en/performance-schema-atom-molecule-events.html)を参照してください。

`io/table/sql/handler` イベントは多くの場合、`io/aurora_redo_log_flush` のような I/O 待機を伴う上位の待機イベントに表示されます。

## 待機時間が増加する原因の可能性
<a name="ams-waits.waitio.causes"></a>

Performance Insights で、`io/table/sql/handler` イベントの急増はワークロードアクティビティの増加を示します。アクティビティの増加は、I/O が増加することを意味します。

Performance Insights はネストイベント ID をフィルタリングし、基盤となるネストされたイベントがロック待機である場合、`io/table/sql/handler` 待機をレポートします。例えば、根本原因イベントが [synch/mutex/innodb/aurora\$1lock\$1thread\$1slot\$1futex](ams-waits.waitsynch.md) である場合、Performance Insights は `io/table/sql/handler` ではなく 上位待機イベントにこの待機を表示します。

`performance_schema.events_waits_current` などのビューは、実際の待機がロックなどのネストされた待機イベントである場合によく`io/table/sql/handler` の待機を表示します。実際の待ち時間が `io/table/sql/handler` と異なる場合、Performance Insights はネストされた待機を検索し、`io/table/sql/handler` の代わりに実際の待機を報告します。Performance Insights が `io/table/sql/handler` をレポートする場合、実際の待機は非表示のネストされた待機イベントではなく、`io/table/sql/handler` になります。詳細については、[「MySQL 5.7 リファレンスマニュアル」](https://dev.mysql.com/doc/refman/5.7/en/performance-schema-atom-molecule-events.html)の*「パフォーマンススキーマのアトムおよび分子イベント」*を参照してください。

## アクション
<a name="ams-waits.waitio.actions"></a>

待機イベントがデータベースアクティビティを占領している場合でも、必ずしもパフォーマンスの問題を示すわけではありません。データベースがアクティブな場合、待機イベントは常に最上位になります。パフォーマンスが低下したときにのみ動作してください。

確認できる他の待機イベントに応じて、異なるアクションをお勧めします。

**Topics**
+ [イベントの原因となるセッションとクエリを特定する](#ams-waits.waitio.actions.identify)
+ [Performance Insights カウンター指標との相関関係をチェックする](#ams-waits.waitio.actions.filters)
+ [他の相関待ちイベントがないかチェックする](#ams-waits.waitio.actions.maintenance)

### イベントの原因となるセッションとクエリを特定する
<a name="ams-waits.waitio.actions.identify"></a>

通常、ロードが中程度から重大なデータベースには、待機イベントがあります。パフォーマンスが最適であれば、待機イベントは受け入れられる可能性があります。パフォーマンスが最適でない場合は、データベースが最も長い時間を費やしている場所を調べます。最も高いロードに寄与する待機イベントを調べて、データベースとアプリケーションを最適化してこれらのイベントを削減できるかどうかを調べます。

**高ロードの原因となる SQL クエリを検索するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**Performance Insights**] を選択します。

1. DB インスタンスを選択します。その DB インスタンスの Performance Insights ダッシュボードが表示されます。

1. **データベースロード**で、**待機でスライス**を選択します。

1. ページの下部で **トップ SQL** を選択します。

   グラフには、ロードの原因となる SQL クエリがリストされます。リスト上部にあるクエリに、最も責任があります。ボトルネックを解決するには、これらのステートメントに注目してください。

Performance Insights を使用したトラブルシューティングの便利な概要については、ブログ記事 [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/) を参照してください。

### Performance Insights カウンター指標との相関関係をチェックする
<a name="ams-waits.waitio.actions.filters"></a>

`Innodb_rows_changed` などの Performance Insights カウンターメトリクスをチェックします。カウンタメトリックが `io/table/sql/handler` と相関している場合、以下のステップを実行します。

1. Performance Insights で、`io/table/sql/handler` トップ待機イベントの原因になっている SQL ステートメントを探します。可能であれば、このステートメントを最適化して、返される行数を減らします。

1. `schema_table_statistics` と `x$schema_table_statistics` ビューからトップテーブルを取得します。これらのビューには、テーブルごとに費やされた時間が表示されます。詳細については、*MySQL リファレンスマニュアル*の [schema\$1table\$1statistics と x\$1schema\$1table\$1statistics ビュー](https://dev.mysql.com/doc/refman/5.7/en/sys-schema-table-statistics.html) を参照してください。

   デフォルトでは、行は合計待機時間の降順でソートされます。競合が最も多いテーブルが初期に表示されます。出力は、読み取り、書き込み、フェッチ、挿入、更新、または削除に時間を費やしているかどうかを示します。

   ```
   mysql> select * from sys.schema_table_statistics limit 1\G
   
   *************************** 1. row ***************************
        table_schema: read_only_db
          table_name: sbtest41
       total_latency: 54.11 m
        rows_fetched: 6001557
       fetch_latency: 39.14 m
       rows_inserted: 14833
      insert_latency: 5.78 m
        rows_updated: 30470
      update_latency: 5.39 m
        rows_deleted: 14833
      delete_latency: 3.81 m
    io_read_requests: NULL
             io_read: NULL
     io_read_latency: NULL
   io_write_requests: NULL
            io_write: NULL
    io_write_latency: NULL
    io_misc_requests: NULL
     io_misc_latency: NULL
   1 row in set (0.11 sec)
   ```

### 他の相関待ちイベントがないかチェックする
<a name="ams-waits.waitio.actions.maintenance"></a>

`synch/sxlock/innodb/btr_search_latch` と `io/table/sql/handler` が共に DB ロードの異常に最も貢献している場合、`innodb_adaptive_hash_index` 可変がオンになっているかチェックします。もしそうであれば、`innodb_adaptive_hash_index_parts` パラメータ値を増やすことを検討します。

Adaptive Hash インデックスがオフになっている場合、オンにすることを検討します。MySQL adaptive Hash インデックスの詳細については、以下のリソースを参照してください。
+ Percona Web サイトの記事「[InnoDB の Adaptive Hash Index は私のワークロードに適していますか？](https://www.percona.com/blog/2016/04/12/is-adaptive-hash-index-in-innodb-right-for-my-workload)」
+ *MySQL リファレンスマニュアル*の[アダプティブハッシュインデックス](https://dev.mysql.com/doc/refman/5.7/en/innodb-adaptive-hash.html)
+ Percona ウェブサイトの [MySQL InnoDB での競合: セマフォセクションからの有用な情報](https://www.percona.com/blog/2019/12/20/contention-in-mysql-innodb-useful-info-from-the-semaphores-section/)の記事

**注記**  
Adaptive Hash インデックスは Aurora Reader DB インスタンスではサポートされていません。  
`synch/sxlock/innodb/btr_search_latch` と `io/table/sql/handler` が支配的な場合、リーダーインスタンスのパフォーマンスが低下することがあります。その場合は、ワークロードをライター DB インスタンスに一時的にリダイレクトし、Adaptive Hash インデックスをオンにすることを検討してください。

# synch/cond/innodb/row\$1lock\$1wait
<a name="ams-waits.row-lock-wait"></a>

`synch/cond/innodb/row_lock_wait` イベントは、あるセッションが更新のために行をロックし、別のセッションが同じ行を更新しようとしたときに発生します。詳細については、MySQL ドキュメントの「[InnoDB Locking](https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html)」を参照してください。



## サポート対象エンジンバージョン
<a name="ams-waits.row-lock-wait.versions"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 3

## 待機時間が増加する原因の可能性
<a name="ams-waits.row-lock-wait.causes"></a>

複数のデータ操作言語 (DML) ステートメントが同じ行に同時にアクセスしようとしています。

## アクション
<a name="ams-waits.row-lock-wait.actions"></a>

確認できる他の待機イベントに応じて、異なるアクションをお勧めします。

**Topics**
+ [この待機イベントを担当する SQL 文を見つけて応答します。](#ams-waits.row-lock-wait.actions.id)
+ [ブロッキングセッションを見つけて対応する](#ams-waits.row-lock-wait.actions.blocker)

### この待機イベントを担当する SQL 文を見つけて応答します。
<a name="ams-waits.row-lock-wait.actions.id"></a>

Performance Insights を使用して、この待機イベントの原因になっている SQL ステートメントを特定します。以下の戦略を検討して下さい。
+ 行のロックが永続的な問題である場合は、オプティミスティックロックを使用するようにアプリケーションを書き直すことを検討してください。
+ 複数行のステートメントの使用。
+ ワークロードを異なるデータベースオブジェクトに分散します。パーティショニングによって、これを行うことができます。
+ `innodb_lock_wait_timeout` パラメータの値をチェックしてください。これは、タイムアウトエラーを生成する前にトランザクションが待機する時間を制御します。

Performance Insights を使用したトラブルシューティングの便利な概要については、ブログ記事 [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/) を参照してください。

### ブロッキングセッションを見つけて対応する
<a name="ams-waits.row-lock-wait.actions.blocker"></a>

ブロッキングセッションがアイドルかアクティブかを確認します。また、セッションがアプリケーションからかのものか、またはアクティブユーザーからのものであるかを調べます。

ロックを保持しているセッションを識別するには、`SHOW ENGINE INNODB STATUS` を実行します。次の例は サンプル出力を示しています。

```
mysql> SHOW ENGINE INNODB STATUS;

---TRANSACTION 1688153, ACTIVE 82 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 2 row lock(s)
MySQL thread id 4244, OS thread handle 70369524330224, query id 4020834 172.31.14.179 reinvent executing
select id1 from test.t1 where id1=1 for update
------- TRX HAS BEEN WAITING 24 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 11 page no 4 n bits 72 index GEN_CLUST_INDEX of table test.t1 trx id 1688153 lock_mode X waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
```

または、次のクエリを使用して、現在のロックの詳細を抽出することもできます。

```
mysql> SELECT p1.id waiting_thread,
    p1.user waiting_user,
    p1.host waiting_host,
    it1.trx_query waiting_query,
    ilw.requesting_engine_transaction_id waiting_transaction,
    ilw.blocking_engine_lock_id blocking_lock,
    il.lock_mode blocking_mode,
    il.lock_type blocking_type,
    ilw.blocking_engine_transaction_id blocking_transaction,
    CASE it.trx_state
        WHEN 'LOCK WAIT'
        THEN it.trx_state
        ELSE p.state end blocker_state,
    concat(il.object_schema,'.', il.object_name) as locked_table,
    it.trx_mysql_thread_id blocker_thread,
    p.user blocker_user,
    p.host blocker_host
FROM performance_schema.data_lock_waits ilw
JOIN performance_schema.data_locks il
ON ilw.blocking_engine_lock_id = il.engine_lock_id
AND ilw.blocking_engine_transaction_id = il.engine_transaction_id
JOIN information_schema.innodb_trx it
ON ilw.blocking_engine_transaction_id = it.trx_id join information_schema.processlist p
ON it.trx_mysql_thread_id = p.id join information_schema.innodb_trx it1
ON ilw.requesting_engine_transaction_id = it1.trx_id join information_schema.processlist p1
ON it1.trx_mysql_thread_id = p1.id\G

*************************** 1. row ***************************
waiting_thread: 4244
waiting_user: reinvent
waiting_host: 123.456.789.012:18158
waiting_query: select id1 from test.t1 where id1=1 for update
waiting_transaction: 1688153
blocking_lock: 70369562074216:11:4:2:70369549808672
blocking_mode: X
blocking_type: RECORD
blocking_transaction: 1688142
blocker_state: User sleep
locked_table: test.t1
blocker_thread: 4243
blocker_user: reinvent
blocker_host: 123.456.789.012:18156
1 row in set (0.00 sec)
```

セッションを特定する際、次のようなオプションが含まれます。
+ アプリケーションの所有者またはユーザーにお問い合わせください。
+ ブロッキングセッションがアイドル状態の場合は、ブロッキングセッションを終了することを検討してください。このアクションは、長いロールバックをトリガーする可能性があります。セッションの終了方法については、「[セッションやクエリの終了](mysql-stored-proc-ending.md)」を参照してください。

ブロックトランザクションの識別の詳細については、MySQL ドキュメントの「[Using InnoDB transaction and locking information](https://dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-examples.html)」を参照してください。

# synch/cond/innodb/row\$1lock\$1wait\$1cond
<a name="ams-waits.row-lock-wait-cond"></a>

`synch/cond/innodb/row_lock_wait_cond` イベントは、あるセッションが更新のために行をロックし、別のセッションが同じ行を更新しようとしたときに発生します。詳細については、MySQL ドキュメントの「[InnoDB Locking](https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html)」を参照してください。



## サポート対象エンジンバージョン
<a name="ams-waits.row-lock-wait-cond.versions"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 2

## 待機時間が増加する原因の可能性
<a name="ams-waits.row-lock-wait-cond.causes"></a>

複数のデータ操作言語 (DML) ステートメントが同じ行に同時にアクセスしようとしています。

## アクション
<a name="ams-waits.row-lock-wait-cond.actions"></a>

確認できる他の待機イベントに応じて、異なるアクションをお勧めします。

**Topics**
+ [この待機イベントを担当する SQL 文を見つけて応答します。](#ams-waits.row-lock-wait-cond.actions.id)
+ [ブロッキングセッションを見つけて対応する](#ams-waits.row-lock-wait-cond.actions.blocker)

### この待機イベントを担当する SQL 文を見つけて応答します。
<a name="ams-waits.row-lock-wait-cond.actions.id"></a>

Performance Insights を使用して、この待機イベントの原因になっている SQL ステートメントを特定します。以下の戦略を検討して下さい。
+ 行のロックが永続的な問題である場合は、オプティミスティックロックを使用するようにアプリケーションを書き直すことを検討してください。
+ 複数行のステートメントの使用。
+ ワークロードを異なるデータベースオブジェクトに分散します。パーティショニングによって、これを行うことができます。
+ `innodb_lock_wait_timeout` パラメータの値をチェックしてください。これは、タイムアウトエラーを生成する前にトランザクションが待機する時間を制御します。

Performance Insights を使用したトラブルシューティングの便利な概要については、ブログ記事 [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/) を参照してください。

### ブロッキングセッションを見つけて対応する
<a name="ams-waits.row-lock-wait-cond.actions.blocker"></a>

ブロッキングセッションがアイドルかアクティブかを確認します。また、セッションがアプリケーションからかのものか、またはアクティブユーザーからのものであるかを調べます。

ロックを保持しているセッションを識別するには、`SHOW ENGINE INNODB STATUS` を実行します。次の例は サンプル出力を示しています。

```
mysql> SHOW ENGINE INNODB STATUS;

---TRANSACTION 2771110, ACTIVE 112 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 24, OS thread handle 70369573642160, query id 13271336 172.31.14.179 reinvent Sending data
select id1 from test.t1 where id1=1 for update
------- TRX HAS BEEN WAITING 43 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 11 page no 3 n bits 0 index GEN_CLUST_INDEX of table test.t1 trx id 2771110 lock_mode X waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
```

または、次のクエリを使用して、現在のロックの詳細を抽出することもできます。

```
mysql> SELECT p1.id waiting_thread,
              p1.user waiting_user,
              p1.host waiting_host,
              it1.trx_query waiting_query,        
              ilw.requesting_trx_id waiting_transaction, 
              ilw.blocking_lock_id blocking_lock, 
              il.lock_mode blocking_mode,
              il.lock_type blocking_type,
              ilw.blocking_trx_id blocking_transaction,
              CASE it.trx_state 
                WHEN 'LOCK WAIT' 
                THEN it.trx_state 
                ELSE p.state 
              END blocker_state, 
              il.lock_table locked_table,        
              it.trx_mysql_thread_id blocker_thread, 
              p.user blocker_user, 
              p.host blocker_host 
       FROM information_schema.innodb_lock_waits ilw 
       JOIN information_schema.innodb_locks il 
         ON ilw.blocking_lock_id = il.lock_id 
        AND ilw.blocking_trx_id = il.lock_trx_id
       JOIN information_schema.innodb_trx it 
         ON ilw.blocking_trx_id = it.trx_id
       JOIN information_schema.processlist p 
         ON it.trx_mysql_thread_id = p.id 
       JOIN information_schema.innodb_trx it1 
         ON ilw.requesting_trx_id = it1.trx_id 
       JOIN information_schema.processlist p1 
         ON it1.trx_mysql_thread_id = p1.id\G

*************************** 1. row ***************************
      waiting_thread: 3561959471
        waiting_user: reinvent
        waiting_host: 123.456.789.012:20485
       waiting_query: select id1 from test.t1 where id1=1 for update
 waiting_transaction: 312337314
       blocking_lock: 312337287:261:3:2
       blocking_mode: X
       blocking_type: RECORD
blocking_transaction: 312337287
       blocker_state: User sleep
        locked_table: `test`.`t1`
      blocker_thread: 3561223876
        blocker_user: reinvent
        blocker_host: 123.456.789.012:17746
1 row in set (0.04 sec)
```

セッションを特定する際、次のようなオプションが含まれます。
+ アプリケーションの所有者またはユーザーにお問い合わせください。
+ ブロッキングセッションがアイドル状態の場合は、ブロッキングセッションを終了することを検討してください。このアクションは、長いロールバックをトリガーする可能性があります。セッションの終了方法については、「[セッションやクエリの終了](mysql-stored-proc-ending.md)」を参照してください。

ブロックトランザクションの識別の詳細については、MySQL ドキュメントの「[Using InnoDB transaction and locking information](https://dev.mysql.com/doc/refman/5.7/en/innodb-information-schema-examples.html)」を参照してください。

# synch/cond/sql/MDL\$1context::COND\$1wait\$1status
<a name="ams-waits.cond-wait-status"></a>

`synch/cond/sql/MDL_context::COND_wait_status` イベントは、テーブルメタデータロックに待機中のスレッドがあるときに発生します。

**Topics**
+ [サポート対象エンジンバージョン](#ams-waits.cond-wait-status.context.supported)
+ [Context](#ams-waits.cond-wait-status.context)
+ [待ち時間増加の考えられる原因](#ams-waits.cond-wait-status.causes)
+ [アクション](#ams-waits.cond-wait-status.actions)

## サポート対象エンジンバージョン
<a name="ams-waits.cond-wait-status.context.supported"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 2 および 3

## Context
<a name="ams-waits.cond-wait-status.context"></a>

イベント `synch/cond/sql/MDL_context::COND_wait_status` は、テーブルメタデータロックを待機中のスレッドがあることを示します。場合によっては、あるセッションがテーブルのメタデータロックを保持し、別のセッションが同じテーブルで同じロックを取得しようとする場合があります。このような場合、2 番目のセッションは `synch/cond/sql/MDL_context::COND_wait_status` 待機イベントで待機します。

MySQL は、メタデータロックを使用して、データベースオブジェクトへの同時アクセスを管理し、データの整合性を確保します。メタデータのロックは、`get_lock` 関数で取得したスケジュールされたイベント、テーブルスペース、ユーザーロックテーブル、および ストアドプログラムに適用されます。ストアドプログラムには、プロシージャ、関数、トリガーが含まれます。詳細については、MySQL ドキュメントの[メタデータロック](https://dev.mysql.com/doc/refman/5.7/en/metadata-locking.html)を参照してください。

MySQL プロセスリストは、このセッションを状態 `waiting for metadata lock` で表示されます。Performance Insights では、`Performance_schema` がオンになっている場合、イベント `synch/cond/sql/MDL_context::COND_wait_status` が表示されます。

メタデータロックで待っているクエリのデフォルトタイムアウトは `lock_wait_timeout` パラメータ値に基づきます。デフォルトは 31,536,000 秒 (365 日) です。

さまざまな InnoDB ロックと競合を引き起こす可能性のあるロックの種類の詳細については、MySQL ドキュメントの [InnoDB ロック](https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html)を参照してください。

## 待ち時間増加の考えられる原因
<a name="ams-waits.cond-wait-status.causes"></a>

`synch/cond/sql/MDL_context::COND_wait_status` イベントが通常よりも多く表示され、パフォーマンスの問題を示している可能性がある場合、典型的な原因は次のとおりです。

**実行時間が長いトランザクション**  
1 つ以上のトランザクションが大量のデータを変更し、非常に長い間テーブルのロックを保持しています。

**Idle トランザクション**  
1 つ以上のトランザクションは、コミットまたはロールバックされることなく、長い間開いたままです。

**大きなテーブルの DDL ステートメント**  
1 つ以上のデータ定義ステートメント (DDL) ステートメント。`ALTER TABLE`コマンドは、非常に大きなテーブルで実行されました。

**明示的なテーブルロック**  
テーブルには、タイムリーに解放されない明示的なロックがあります。例えば、アプリケーションが実行されているとします。`LOCK TABLE`不適切にステートメント。

## アクション
<a name="ams-waits.cond-wait-status.actions"></a>

待機イベントの原因と Aurora MySQL DB クラスターのバージョンに応じて、さまざまなアクションをお勧めします。

**Topics**
+ [イベントの原因となるセッションとクエリを特定する](#ams-waits.cond-wait-status.actions.identify)
+ [過去のイベントをチェックする](#ams-waits.cond-wait-status.actions.past-events)
+ [Aurora MySQL バージョン 2 でクエリを実行する](#ams-waits.cond-wait-status.actions.run-queries-aurora-mysql-57)
+ [ブロッキングセッションに応答する](#ams-waits.cond-wait-status.actions.blocker)

### イベントの原因となるセッションとクエリを特定する
<a name="ams-waits.cond-wait-status.actions.identify"></a>

Performance Insights を使用して、`synch/cond/sql/MDL_context::COND_wait_status` 待機イベントによってブロックされたクエリを表示できます。ただし、ブロッキングセッションを特定するには、からメタデータテーブルをクエリします。`performance_schema`そして`information_schema`DB クラスター上にあります。

通常、ロードが中程度から重大なデータベースには、待機イベントがあります。パフォーマンスが最適であれば、待機イベントは受け入れられる可能性があります。パフォーマンスが最適でない場合は、データベースが最も長い時間を費やしている場所を調べます。最も高いロードに寄与する待機イベントを調べて、データベースとアプリケーションを最適化してこれらのイベントを削減できるかどうかを調べます。

**高ロードの原因となる SQL クエリを検索するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**Performance Insights**] を選択します。

1. DB インスタンスを選択します。この DB インスタンスに Performance Insights ダッシュボードが表示されます。

1. **データベースロード**で、**待機でスライス**を選択します。

1. ページの下部で **トップ SQL** を選択します。

   グラフには、ロードの原因となる SQL クエリがリストされます。リスト上部にあるクエリに、最も責任があります。ボトルネックを解決するには、これらのステートメントに注目してください。

Performance Insights を使用したトラブルシューティングの便利な概要については、AWS　データベースブログ記事の [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/)を参照してください。

### 過去のイベントをチェックする
<a name="ams-waits.cond-wait-status.actions.past-events"></a>

この待機イベントについてのインサイトを取得して、過去のイベントが発生していないかどうかをチェックできます。そのためには、以下のアクションを実行します。
+ データ操作言語 (DML) と DDL のスループットとレイテンシーを調べて、ワークロードに変更があったかどうかをチェックします。

  Performance Insights を使用して、問題発生時にこのイベントで待っているクエリを検索できます。また、発行時に実行されたクエリのダイジェストを表示することもできます。
+ DB クラスターの監査ログまたは一般ログがオンになっている場合、待機中のトランザクションに含まれるオブジェクト (schema.table) で実行されるすべてのクエリをチェックできます。また、トランザクションの前に実行が完了したクエリをチェックすることもできます。

過去のイベントのトラブルシューティングに使用できる情報は限られています。これらのチェックを実行しても、どのオブジェクトが情報を待っているのかは示されません。ただし、イベント時にロードが大きいテーブルや、発行時に競合の原因となる頻繁に操作される一連の行を特定できます。この情報を使用して、テスト環境で問題を再現し、その原因に関するインサイトを使用できます。

### Aurora MySQL バージョン 2 でクエリを実行する
<a name="ams-waits.cond-wait-status.actions.run-queries-aurora-mysql-57"></a>

Aurora MySQL バージョン 2 の場合、`performance_schema` テーブルないし `sys` ビューに対してクエリを実行して、ブロックされたセッションを直接識別できます。。例は、ブロックしているクエリとセッションを識別するため、テーブルにクエリを実行する方法を示しています。

次のプロセスリストの出力では、接続 ID `89` がメタデータロックを待っていて、`TRUNCATE TABLE` コマンドを実行しています。`performance_schema` テーブルないし `sys` スキーマビューのクエリの場合、出力が表示するブロッキングセッションは `76` です。

```
MySQL [(none)]> select @@version, @@aurora_version;
+-----------+------------------+
| @@version | @@aurora_version |
+-----------+------------------+
| 5.7.12    | 2.11.5           |
+-----------+------------------+
1 row in set (0.01 sec)

MySQL [(none)]> show processlist;
+----+-----------------+--------------------+-----------+---------+------+---------------------------------+-------------------------------+
| Id | User            | Host               | db        | Command | Time | State                           | Info                          |
+----+-----------------+--------------------+-----------+---------+------+---------------------------------+-------------------------------+
|  2 | rdsadmin        | localhost          | NULL      | Sleep   |    0 | NULL                            | NULL                          |
|  4 | rdsadmin        | localhost          | NULL      | Sleep   |    2 | NULL                            | NULL                          |
|  5 | rdsadmin        | localhost          | NULL      | Sleep   |    1 | NULL                            | NULL                          |
| 20 | rdsadmin        | localhost          | NULL      | Sleep   |    0 | NULL                            | NULL                          |
| 21 | rdsadmin        | localhost          | NULL      | Sleep   |  261 | NULL                            | NULL                          |
| 66 | auroramysql5712 | 172.31.21.51:52154 | sbtest123 | Sleep   |    0 | NULL                            | NULL                          |
| 67 | auroramysql5712 | 172.31.21.51:52158 | sbtest123 | Sleep   |    0 | NULL                            | NULL                          |
| 68 | auroramysql5712 | 172.31.21.51:52150 | sbtest123 | Sleep   |    0 | NULL                            | NULL                          |
| 69 | auroramysql5712 | 172.31.21.51:52162 | sbtest123 | Sleep   |    0 | NULL                            | NULL                          |
| 70 | auroramysql5712 | 172.31.21.51:52160 | sbtest123 | Sleep   |    0 | NULL                            | NULL                          |
| 71 | auroramysql5712 | 172.31.21.51:52152 | sbtest123 | Sleep   |    0 | NULL                            | NULL                          |
| 72 | auroramysql5712 | 172.31.21.51:52156 | sbtest123 | Sleep   |    0 | NULL                            | NULL                          |
| 73 | auroramysql5712 | 172.31.21.51:52164 | sbtest123 | Sleep   |    0 | NULL                            | NULL                          |
| 74 | auroramysql5712 | 172.31.21.51:52166 | sbtest123 | Sleep   |    0 | NULL                            | NULL                          |
| 75 | auroramysql5712 | 172.31.21.51:52168 | sbtest123 | Sleep   |    0 | NULL                            | NULL                          |
| 76 | auroramysql5712 | 172.31.21.51:52170 | NULL      | Query   |    0 | starting                        | show processlist              |
| 88 | auroramysql5712 | 172.31.21.51:52194 | NULL      | Query   |   22 | User sleep                      | select sleep(10000)           |
| 89 | auroramysql5712 | 172.31.21.51:52196 | NULL      | Query   |    5 | Waiting for table metadata lock | truncate table sbtest.sbtest1 |
+----+-----------------+--------------------+-----------+---------+------+---------------------------------+-------------------------------+
18 rows in set (0.00 sec)
```

次に、`performance_schema` テーブルないし `sys` スキーマビューのクエリはブロッキングセッションが `76` であることを示します。

```
MySQL [(none)]> select * from sys.schema_table_lock_waits;                                                                
+---------------+-------------+-------------------+-------------+------------------------------+-------------------+-----------------------+-------------------------------+--------------------+-----------------------------+-----------------------------+--------------------+--------------+------------------------------+--------------------+------------------------+-------------------------+------------------------------+
| object_schema | object_name | waiting_thread_id | waiting_pid | waiting_account              | waiting_lock_type | waiting_lock_duration | waiting_query                 | waiting_query_secs | waiting_query_rows_affected | waiting_query_rows_examined | blocking_thread_id | blocking_pid | blocking_account             | blocking_lock_type | blocking_lock_duration | sql_kill_blocking_query | sql_kill_blocking_connection |
+---------------+-------------+-------------------+-------------+------------------------------+-------------------+-----------------------+-------------------------------+--------------------+-----------------------------+-----------------------------+--------------------+--------------+------------------------------+--------------------+------------------------+-------------------------+------------------------------+
| sbtest        | sbtest1     |               121 |          89 | auroramysql5712@192.0.2.0    | EXCLUSIVE         | TRANSACTION           | truncate table sbtest.sbtest1 |                 10 |                           0 |                           0 |                108 |           76 | auroramysql5712@192.0.2.0    | SHARED_READ        | TRANSACTION            | KILL QUERY 76           | KILL 76                      |
+---------------+-------------+-------------------+-------------+------------------------------+-------------------+-----------------------+-------------------------------+--------------------+-----------------------------+-----------------------------+--------------------+--------------+------------------------------+--------------------+------------------------+-------------------------+------------------------------+
1 row in set (0.00 sec)
```

### ブロッキングセッションに応答する
<a name="ams-waits.cond-wait-status.actions.blocker"></a>

セッションを特定する際、次のようなオプションが含まれます。
+ アプリケーションの所有者またはユーザーにお問い合わせください。
+ ブロッキングセッションがアイドル状態の場合は、ブロッキングセッションを終了することを検討してください。このアクションは、長いロールバックをトリガーする可能性があります。セッションの終了方法については、「[セッションやクエリの終了](mysql-stored-proc-ending.md)」を参照してください。

ブロックトランザクションの識別の詳細については、MySQL ドキュメントの[InnoDB トランザクションの使用と情報のロック](https://dev.mysql.com/doc/refman/5.7/en/innodb-information-schema-examples.html)を参照してください。

# synch/mutex/innodb/aurora\$1lock\$1thread\$1slot\$1futex
<a name="ams-waits.waitsynch"></a>

`synch/mutex/innodb/aurora_lock_thread_slot_futex` イベントは、あるセッションが更新のために行をロックし、別のセッションが同じ行を更新しようとしたときに発生します。詳細については、[MySQL リファレンス](https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html)の *InnoDB ロック*を参照してください。



## サポート対象エンジンバージョン
<a name="ams-waits.waitsynch.versions"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 2

## 待機時間が増加する原因の可能性
<a name="ams-waits.waitsynch.causes"></a>

複数のデータ操作言語 (DML) ステートメントが同じ行に同時にアクセスしようとしています。

## アクション
<a name="ams-waits.waitsynch.actions"></a>

確認できる他の待機イベントに応じて、異なるアクションをお勧めします。

**Topics**
+ [この待機イベントを担当する SQL 文を見つけて応答します。](#ams-waits.waitsynch.actions.id)
+ [ブロッキングセッションを見つけて対応する](#ams-waits.waitsynch.actions.blocker)

### この待機イベントを担当する SQL 文を見つけて応答します。
<a name="ams-waits.waitsynch.actions.id"></a>

Performance Insights を使用して、この待機イベントの原因になっている SQL ステートメントを特定します。以下の戦略を検討して下さい。
+ 行のロックが永続的な問題である場合は、オプティミスティックロックを使用するようにアプリケーションを書き直すことを検討してください。
+ 複数行のステートメントの使用。
+ ワークロードを異なるデータベースオブジェクトに分散します。パーティショニングによって、これを行うことができます。
+ `innodb_lock_wait_timeout` パラメータの値をチェックしてください。これは、タイムアウトエラーを生成する前にトランザクションが待機する時間を制御します。

Performance Insights を使用したトラブルシューティングの便利な概要については、ブログ記事 [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/) を参照してください。

### ブロッキングセッションを見つけて対応する
<a name="ams-waits.waitsynch.actions.blocker"></a>

ブロッキングセッションがアイドルかアクティブかを確認します。また、セッションがアプリケーションからかのものか、またはアクティブユーザーからのものであるかを調べます。

ロックを保持しているセッションを識別するには、`SHOW ENGINE INNODB STATUS` を実行します。次の例は サンプル出力を示しています。

```
mysql> SHOW ENGINE INNODB STATUS;

---------------------TRANSACTION 302631452, ACTIVE 2 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)
MySQL thread id 80109, OS thread handle 0x2ae915060700, query id 938819 10.0.4.12 reinvent updating
UPDATE sbtest1 SET k=k+1 WHERE id=503
------- TRX HAS BEEN WAITING 2 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 148 page no 11 n bits 30 index `PRIMARY` of table `sysbench2`.`sbtest1` trx id 302631452 lock_mode X locks rec but not gap waiting
Record lock, heap no 30 PHYSICAL RECORD: n_fields 6; compact format; info bits 0
```

または、次のクエリを使用して、現在のロックの詳細を抽出することもできます。

```
mysql> SELECT p1.id waiting_thread,
              p1.user waiting_user,
              p1.host waiting_host,
              it1.trx_query waiting_query,        
              ilw.requesting_trx_id waiting_transaction, 
              ilw.blocking_lock_id blocking_lock, 
              il.lock_mode blocking_mode,
              il.lock_type blocking_type,
              ilw.blocking_trx_id blocking_transaction,
              CASE it.trx_state 
                WHEN 'LOCK WAIT' 
                THEN it.trx_state 
                ELSE p.state 
              END blocker_state, 
              il.lock_table locked_table,        
              it.trx_mysql_thread_id blocker_thread, 
              p.user blocker_user, 
              p.host blocker_host 
       FROM information_schema.innodb_lock_waits ilw 
       JOIN information_schema.innodb_locks il 
         ON ilw.blocking_lock_id = il.lock_id 
        AND ilw.blocking_trx_id = il.lock_trx_id
       JOIN information_schema.innodb_trx it 
         ON ilw.blocking_trx_id = it.trx_id
       JOIN information_schema.processlist p 
         ON it.trx_mysql_thread_id = p.id 
       JOIN information_schema.innodb_trx it1 
         ON ilw.requesting_trx_id = it1.trx_id 
       JOIN information_schema.processlist p1 
         ON it1.trx_mysql_thread_id = p1.id\G

*************************** 1. row ***************************
      waiting_thread: 3561959471
        waiting_user: reinvent
        waiting_host: 123.456.789.012:20485
       waiting_query: select id1 from test.t1 where id1=1 for update
 waiting_transaction: 312337314
       blocking_lock: 312337287:261:3:2
       blocking_mode: X
       blocking_type: RECORD
blocking_transaction: 312337287
       blocker_state: User sleep
        locked_table: `test`.`t1`
      blocker_thread: 3561223876
        blocker_user: reinvent
        blocker_host: 123.456.789.012:17746
1 row in set (0.04 sec)
```

セッションを特定する際、次のようなオプションが含まれます。
+ アプリケーションの所有者またはユーザーにお問い合わせください。
+ ブロッキングセッションがアイドル状態の場合は、ブロッキングセッションを終了することを検討してください。このアクションは、長いロールバックをトリガーする可能性があります。セッションの終了方法については、「[セッションやクエリの終了](mysql-stored-proc-ending.md)」を参照してください。

ブロックトランザクションの識別の詳細については、*MySQL リファレンスマニュアル*の [InnoDB トランザクションの使用とロック情報](https://dev.mysql.com/doc/refman/5.7/en/innodb-information-schema-examples.html)を参照してください。

# synch/mutex/innodb/buf\$1pool\$1mutex
<a name="ams-waits.bufpoolmutex"></a>

`synch/mutex/innodb/buf_pool_mutex` イベントは、スレッドがメモリ内のページにアクセスするために InnoDB バッファプールのロックを取得したときに発生します。

**Topics**
+ [関連するエンジンバージョン](#ams-waits.bufpoolmutex.context.supported)
+ [Context](#ams-waits.bufpoolmutex.context)
+ [待ち時間増加の考えられる原因](#ams-waits.bufpoolmutex.causes)
+ [アクション](#ams-waits.bufpoolmutex.actions)

## 関連するエンジンバージョン
<a name="ams-waits.bufpoolmutex.context.supported"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 2

## Context
<a name="ams-waits.bufpoolmutex.context"></a>

`buf_pool` ミューテックスは、バッファプールの制御データ構造を保護する単一のミューテックスです。

詳細については、MySQL ドキュメントの[パフォーマンススキーマを使用した InnoDB Mutex 待機をモニタリングする](https://dev.mysql.com/doc/refman/5.7/en/monitor-innodb-mutex-waits-performance-schema.html)を参照してください。

## 待ち時間増加の考えられる原因
<a name="ams-waits.bufpoolmutex.causes"></a>

これは、ワークロード固有の待機イベントです。`synch/mutex/innodb/buf_pool_mutex` がトップ待機イベント内に出現する一般的な原因は、次のような場合が含まれます。
+ バッファープールのサイズが、ワーキングデータセットを保持するのに十分な大きさではない。
+ ワークロードが、データベース内の特定のテーブルの特定のページに固有であり、バッファプール内に競合が発生ている。

## アクション
<a name="ams-waits.bufpoolmutex.actions"></a>

待機イベントの原因に応じたさまざまなアクションをお勧めします。

**Topics**
+ [イベントの原因となるセッションとクエリを特定する](#ams-waits.bufpoolmutex.actions.identify)
+ [Performance Insights の使用](#ams-waits.bufpoolmutex.actions.action1)
+ [Aurora レプリカの作成](#ams-waits.bufpoolmutex.actions.action2)
+ [バッファープールサイズの検査](#ams-waits.bufpoolmutex.actions.action3)
+ [グローバルステータス履歴をモニタリングする](#ams-waits.bufpoolmutex.actions.action4)

### イベントの原因となるセッションとクエリを特定する
<a name="ams-waits.bufpoolmutex.actions.identify"></a>

通常、ロードが中程度から重大なデータベースには、待機イベントがあります。パフォーマンスが最適であれば、待機イベントは受け入れられる可能性があります。パフォーマンスが最適でない場合は、データベースが最も長い時間を費やしている場所を調べます。最も高いロードに寄与する待機イベントを調べて、データベースとアプリケーションを最適化してこれらのイベントを削減できるかどうかを調べます。

**AWSマネジメントコンソールの トップ SQL チャートを表示するには**

1. Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**Performance Insights**] を選択します。

1. DB インスタンスを選択します。その DB インスタンスの Performance Insights ダッシュボードが表示されます。

1. **データベースロード**で、**待機でスライス**を選択します。

1. **データベースロード**グラフの下で、**トップ SQL** を選択します。

   グラフには、ロードの原因となる SQL クエリがリストされます。リスト上部にあるクエリに、最も責任があります。ボトルネックを解決するには、これらのステートメントに注目してください。

Performance Insights を使用したトラブルシューティングの便利な概要については、ブログ記事 [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/) を参照してください。

### Performance Insights の使用
<a name="ams-waits.bufpoolmutex.actions.action1"></a>

このイベントはワークロードに関連しています。Performance Insights を使用して、以下を実行できます。
+ 待機イベントがスタートされたタイミングと、その時点でアプリケーションログまたは関連出典からのワークロードに変化があったかどうかを特定します。
+ この待機イベントの原因になっている SQL ステートメントを特定します。クエリの実行プランを調べて、これらのクエリが最適化され、適切なインデックスが使用されていることを確認します。

  待機イベントの原因となる上位クエリが同じデータベースオブジェクトまたはテーブルに関連付けられている場合は、そのオブジェクトまたはテーブルをパーティション化することを検討してください。

### Aurora レプリカの作成
<a name="ams-waits.bufpoolmutex.actions.action2"></a>

Aurora レプリカを作成して、読み取り専用トラフィックを処理できます。Aurora オートスケーリングを使用して、読み取りトラフィックのサージを処理することもできます。Aurora レプリカでスケジュールされた読み取り専用タスクと論理的なバックアップを実行してください。

詳細については、「[Aurora レプリカでの Amazon Aurora Auto Scaling](Aurora.Integrating.AutoScaling.md)」を参照してください。

### バッファープールサイズの検査
<a name="ams-waits.bufpoolmutex.actions.action3"></a>

メトリクス `innodb_buffer_pool_wait_free` を確認して、バッファ・プール・サイズがワークロードに十分かどうかをチェックします。このメトリクスの値が高く継続的に増加している場合は、バッファ・プールのサイズがワークロードを処理するのに十分でないことを示します。`innodb_buffer_pool_size` が適切に設定されている場合、`innodb_buffer_pool_wait_free` の値は小さくなります。詳細については、MySQL ドキュメントの[Innodb\$1buffer\$1pool\$1wait\$1free](https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html#statvar_Innodb_buffer_pool_wait_free)を参照してください。

DB インスタンス上に、セッションバッファとオペレーティングシステムのタスクに十分なメモリがある場合は、バッファプールサイズを増やします。そうでない場合は、DB インスタンスを大きな DB インスタンスクラスに変更して、バッファプールに割り当てられる追加のメモリを取得します。

**注記**  
Aurora MySQL は、構成された `innodb_buffer_pool_size` に基づいて`innodb_buffer_pool_instances` の値を自動的に調整します

### グローバルステータス履歴をモニタリングする
<a name="ams-waits.bufpoolmutex.actions.action4"></a>

ステータス可変の変更率をモニタリングすることで、DB インスタンスのロックまたはメモリの問題を検出できます。グローバルステータス履歴 (GoSH) がまだオンになっていない場合は、オンにします。GoSH の詳細については、[グローバルステータス履歴の管理](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.MySQL.CommonDBATasks.html#Appendix.MySQL.CommonDBATasks.GoSH)を参照してください。

カスタムの Amazon CloudWatch メトリクスを作成して、ステータス可変をモニタリングすることもできます。詳細については、[カスタムメトリクスの発行](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html)を参照してください。

# synch/mutex/innodb/fil\$1system\$1mutex
<a name="ams-waits.innodb-fil-system-mutex"></a>

`synch/mutex/innodb/fil_system_mutex` イベントは、セッションがテーブルスペースのメモリキャッシュへのアクセスを待っているときに発生します。

**Topics**
+ [サポート対象エンジンバージョン](#ams-waits.innodb-fil-system-mutex.context.supported)
+ [Context](#ams-waits.innodb-fil-system-mutex.context)
+ [待ち時間増加の考えられる原因](#ams-waits.innodb-fil-system-mutex.causes)
+ [アクション](#ams-waits.innodb-fil-system-mutex.actions)

## サポート対象エンジンバージョン
<a name="ams-waits.innodb-fil-system-mutex.context.supported"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 2 および 3

## Context
<a name="ams-waits.innodb-fil-system-mutex.context"></a>

InnoDB はテーブルスペースを使用して、テーブルとログファイルのストレージ領域を管理します。*テーブルスペースのメモリキャッシュ*は、テーブルスペースに関する情報を保持するグローバル・メモリ構造です。MySQL は `synch/mutex/innodb/fil_system_mutex` 待機を使用して、テーブルスペースのメモリー・キャッシュへの同時アクセスを制御します。

イベント `synch/mutex/innodb/fil_system_mutex` は、テーブルスペースメモリーキャッシュにある情報を、同じテーブルスペースに対して取得または操作しないといけないオペレーションが現在複数存在することを示します。

## 待ち時間増加の考えられる原因
<a name="ams-waits.innodb-fil-system-mutex.causes"></a>

`synch/mutex/innodb/fil_system_mutex` イベントが通常よりも多く表示され、パフォーマンスの問題を示している可能性がある場合、典型的な原因は次のとおりです。
+ 同じテーブル内のデータを更新または削除する、同時データ操作言語 (DML) オペレーションの増加。
+ このテーブルのテーブルスペースは非常に大きく、多くのデータページがあります。
+ これらのデータページの塗りつぶし係数は低いです。

## アクション
<a name="ams-waits.innodb-fil-system-mutex.actions"></a>

待機イベントの原因に応じたさまざまなアクションをお勧めします。

**Topics**
+ [イベントの原因となるセッションとクエリを特定する](#ams-waits.innodb-fil-system-mutex.actions.identify)
+ [オフピーク時に大きなテーブルを再編成する](#ams-waits.innodb-fil-system-mutex.actions.reorganize)

### イベントの原因となるセッションとクエリを特定する
<a name="ams-waits.innodb-fil-system-mutex.actions.identify"></a>

通常、ロードが中程度から重大なデータベースには、待機イベントがあります。パフォーマンスが最適であれば、待機イベントは受け入れられる可能性があります。パフォーマンスが最適でない場合は、データベースが最も長い時間を費やしている場所を調べます。最も高いロードに寄与する待機イベントを調べて、データベースとアプリケーションを最適化してこれらのイベントを削減できるかどうかを調べます。

**高ロードの原因となる SQL クエリを検索するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**Performance Insights**] を選択します。

1. DB インスタンスを選択します。この DB インスタンスに Performance Insights ダッシュボードが表示されます。

1. **データベースロード**で、**待機でスライス**を選択します。

1. ページの下部で **トップ SQL** を選択します。

   グラフには、ロードの原因となる SQL クエリがリストされます。リスト上部にあるクエリに、最も責任があります。ボトルネックを解決するには、これらのステートメントに注目してください。

Performance Insights を使用したトラブルシューティングの便利な概要については、ブログ記事 [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/) を参照してください。

どのクエリが多数の`synch/mutex/innodb/fil_system_mutex` 待機原因になっているかを調べる別の方法は、、以下の例のように `performance_schema` をチェックする方法です。

```
mysql> select * from performance_schema.events_waits_current where EVENT_NAME='wait/synch/mutex/innodb/fil_system_mutex'\G
*************************** 1. row ***************************
            THREAD_ID: 19
             EVENT_ID: 195057
         END_EVENT_ID: 195057
           EVENT_NAME: wait/synch/mutex/innodb/fil_system_mutex
               SOURCE: fil0fil.cc:6700
          TIMER_START: 1010146190118400
            TIMER_END: 1010146196524000
           TIMER_WAIT: 6405600
                SPINS: NULL
        OBJECT_SCHEMA: NULL
          OBJECT_NAME: NULL
           INDEX_NAME: NULL
          OBJECT_TYPE: NULL
OBJECT_INSTANCE_BEGIN: 47285552262176
     NESTING_EVENT_ID: NULL
   NESTING_EVENT_TYPE: NULL
            OPERATION: lock
      NUMBER_OF_BYTES: NULL
                FLAGS: NULL
*************************** 2. row ***************************
            THREAD_ID: 23
             EVENT_ID: 5480
         END_EVENT_ID: 5480
           EVENT_NAME: wait/synch/mutex/innodb/fil_system_mutex
               SOURCE: fil0fil.cc:5906
          TIMER_START: 995269979908800
            TIMER_END: 995269980159200
           TIMER_WAIT: 250400
                SPINS: NULL
        OBJECT_SCHEMA: NULL
          OBJECT_NAME: NULL
           INDEX_NAME: NULL
          OBJECT_TYPE: NULL
OBJECT_INSTANCE_BEGIN: 47285552262176
     NESTING_EVENT_ID: NULL
   NESTING_EVENT_TYPE: NULL
            OPERATION: lock
      NUMBER_OF_BYTES: NULL
                FLAGS: NULL
*************************** 3. row ***************************
            THREAD_ID: 55
             EVENT_ID: 23233794
         END_EVENT_ID: NULL
           EVENT_NAME: wait/synch/mutex/innodb/fil_system_mutex
               SOURCE: fil0fil.cc:449
          TIMER_START: 1010492125341600
            TIMER_END: 1010494304900000
           TIMER_WAIT: 2179558400
                SPINS: NULL
        OBJECT_SCHEMA: NULL
          OBJECT_NAME: NULL
           INDEX_NAME: NULL
          OBJECT_TYPE: NULL
OBJECT_INSTANCE_BEGIN: 47285552262176
     NESTING_EVENT_ID: 23233786
   NESTING_EVENT_TYPE: WAIT
            OPERATION: lock
      NUMBER_OF_BYTES: NULL
                FLAGS: NULL
```

### オフピーク時に大きなテーブルを再編成する
<a name="ams-waits.innodb-fil-system-mutex.actions.reorganize"></a>

本番時間外のメンテナンスウィンドウで、多数の `synch/mutex/innodb/fil_system_mutex` 待機イベントの出典として識別するラージテーブルを再編成する。これにより、テーブルへのクイックアクセスが必修な際に、内部テーブルスペースマップのクリーンアップが行われないようにします。テーブルの再編成については、*MySQL リファレンス*の [TABLE ステートメントの最適化](https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html)を参照してください。

# synch/mutex/innodb/trx\$1sys\$1mutex
<a name="ams-waits.trxsysmutex"></a>

`synch/mutex/innodb/trx_sys_mutex` イベントは、大量のトランザクションで高いデータベースアクティビティがある場合に発生します。

**Topics**
+ [関連するエンジンバージョン](#ams-waits.trxsysmutex.context.supported)
+ [Context](#ams-waits.trxsysmutex.context)
+ [待ち時間増加の考えられる原因](#ams-waits.trxsysmutex.causes)
+ [アクション](#ams-waits.trxsysmutex.actions)

## 関連するエンジンバージョン
<a name="ams-waits.trxsysmutex.context.supported"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 2 および 3

## Context
<a name="ams-waits.trxsysmutex.context"></a>

内部的には、InnoDB データベースエンジンは、繰り返し可能な読み取り分離レベルとスナップショットを使用して、読み取りの整合性を提供します。これにより、スナップショットが作成された時点でのデータベースのポイントインタイムビューが表示されます。

InnoDB では、コミットされているかどうかにかかわらず、すべての変更が到着するとすぐにデータベースに適用されます。このアプローチは、マルチバージョン同時実行制御 (MVCC) を使用しないと、データベースに接続されているすべてのユーザーに、すべての変更と最新の行が表示されることを意味します。したがって、InnoDB ではロールバックする内容を理解するために、変更を追跡する方法が必要に応じて必要です。

これを行うために、InnoDB はトランザクションシステム (`trx_sys`) を使用してスナップショットを追跡します。トランザクションシステムは、以下を実行します。
+ 元に戻すログの各行に対するトランザクション ID を追跡します。
+ `ReadView` 呼ばれる内部 InnoDB 構造体を使用すると、スナップショットで表示されるトランザクション ID の特定を容易に行えます。

## 待ち時間増加の考えられる原因
<a name="ams-waits.trxsysmutex.causes"></a>

一貫性のある制御されたトランザクション ID 処理 (作成、読み取り、更新、および削除) を必要とする全てのデータベースオペレーションは、`trx_sys` からミューテックスに呼び出しを行います。

これらの呼び出しは、次の 3 つの関数内で発生します。
+ `trx_sys_mutex_enter` － ミューテックスを作成する。
+ `trx_sys_mutex_exit` － ミューテックスを解放する。
+ `trx_sys_mutex_own` － ミューテックスが所有されているかどうかをテストする。

InnoDB パフォーマンススキーマインストルメンテーションは、すべての `trx_sys` ミューテックスの呼び出しを追跡します。追跡には管理が含まれますが、これらに限定されません。`trx_sys`データベースの起動時またはシャットダウン、ロールバック操作、クリーンアップの取り消し、行の読み取りアクセス、およびバッファプールのロード。トランザクション数が多く、データベースアクティビティが高い場合、`synch/mutex/innodb/trx_sys_mutex` は上位の待機イベント中に現れます。

詳細については、MySQL ドキュメントの[パフォーマンススキーマを使用した InnoDB Mutex 待機をモニタリングする](https://dev.mysql.com/doc/refman/5.7/en/monitor-innodb-mutex-waits-performance-schema.html)を参照してください。

## アクション
<a name="ams-waits.trxsysmutex.actions"></a>

待機イベントの原因に応じたさまざまなアクションをお勧めします。

**Topics**
+ [イベントの原因となるセッションとクエリを特定する](#ams-waits.trxsysmutex.actions.identify)
+ [他の待機イベントを検査する](#ams-waits.trxsysmutex.actions.action1)

### イベントの原因となるセッションとクエリを特定する
<a name="ams-waits.trxsysmutex.actions.identify"></a>

通常、ロードが中程度から重大なデータベースには、待機イベントがあります。パフォーマンスが最適であれば、待機イベントは受け入れられる可能性があります。パフォーマンスが最適でない場合は、データベースが最も長い時間を費やしている場所を調べます。最も高いロードに寄与する待機イベントを見てください。これらのイベントを減らすためにデータベースとアプリケーションを最適化できるかどうかを調べます。

**AWS マネジメントコンソール で上位 SQL チャートを表示するには**

1. Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**Performance Insights**] を選択します。

1. DB インスタンスを選択します。その DB インスタンスの Performance Insights ダッシュボードが表示されます。

1. **データベースロード**で、**待機でスライス**を選択します。

1. **データベースロード**グラフで、**上位の SQL**を選択します。

   グラフには、ロードの原因となる SQL クエリがリストされます。リスト上部にあるクエリに、最も責任があります。ボトルネックを解決するには、これらのステートメントに注目してください。

Performance Insights を使用したトラブルシューティングの便利な概要については、ブログ記事 [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/) を参照してください。

### 他の待機イベントを検査する
<a name="ams-waits.trxsysmutex.actions.action1"></a>

`synch/mutex/innodb/trx_sys_mutex` 待機イベントに関連する他の待機イベントを調べます。これにより、ワークロードの性質に関する詳細情報が提供されます。トランザクションの数が多いとスループットが低下する可能性がありますが、ワークロードによってはこれが必要な場合もあります。

トランザクションを最適化する方法の詳細については、MySQL ドキュメントの [InnoDB トランザクション管理の最適化](https://dev.mysql.com/doc/refman/5.7/en/optimizing-innodb-transaction-management.html)を参照してください。

# synch/sxlock/innodb/hash\$1table\$1locks
<a name="ams-waits.sx-lock-hash-table-locks"></a>

`synch/sxlock/innodb/hash_table_locks` イベントは、バッファプール内に見つからないページをストレージから読み込む必要があるときに発生します。

**Topics**
+ [サポート対象エンジンバージョン](#ams-waits.sx-lock-hash-table-locks.context.supported)
+ [Context](#ams-waits.sx-lock-hash-table-locks.context)
+ [待ち時間増加の考えられる原因](#ams-waits.sx-lock-hash-table-locks.causes)
+ [アクション](#ams-waits.sx-lock-hash-table-locks.actions)

## サポート対象エンジンバージョン
<a name="ams-waits.sx-lock-hash-table-locks.context.supported"></a>

この待機イベント情報は、以下のバージョンでサポートされています:
+ Aurora MySQL バージョン 2 および 3

## Context
<a name="ams-waits.sx-lock-hash-table-locks.context"></a>

イベント `synch/sxlock/innodb/hash_table_locks` は、ワークロードがバッファプールに保存されていないデータに頻繁にアクセスしていることを示します。この待機イベントは、バッファプールからの新しいページの追加と古いデータの削除に関連付けられます。バッファプールに格納されたデータは、古いデータおよび新しいデータをキャッシュする必要があります。そのため、古いページは削除され、新しいページのキャッシュが可能になります。MySQL は、バッファプールからページを削除するために、最近一番使用されていない (LRU) アルゴリズムを使用します。ワークロードは、バッファプールにロードされていないデータ、またはバッファプールから削除されたデータにアクセスしようとしています。

この待機イベントは、ワークロードがディスク上のファイル内のデータにアクセスする必要がある場合、またはブロックがバッファプールの LRU リストから解放または追加されたときに発生します。これらのオペレーションは、共有除外ロック (SX-Lock) の取得を待ちます。この SX-Lock は、*ハッシュテーブル*上での同期化に使われます。これは、バッファプールのアクセスパフォーマンスを向上させるために設計されたメモリ内のテーブルです。

詳細については、MySQL ドキュメントの[バッファプール](https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool.html)を参照してください。

## 待ち時間増加の考えられる原因
<a name="ams-waits.sx-lock-hash-table-locks.causes"></a>

`synch/sxlock/innodb/hash_table_locks` 待機イベントが通常よりも多く表示され、パフォーマンスの問題を示している可能性がある場合、典型的な原因は次のとおりです。

**サイズの小さいバッファープール**  
バッファプールのサイズが小さすぎて、頻繁にアクセスされるすべてのページをメモリ内に保持できません。

**ヘビーワークロード**  
ワークロードによって、バッファキャッシュで頻繁にエビクションとデータページがリロードされます。

**ページの読み取り中にエラーが発生しました**  
バッファープール内のページの読み取り中にエラーが発生しました。これは、データの破損を示している可能性があります。

## アクション
<a name="ams-waits.sx-lock-hash-table-locks.actions"></a>

待機イベントの原因に応じたさまざまなアクションをお勧めします。

**Topics**
+ [バッファプールのサイズを増やす](#ams-waits.sx-lock-hash-table-locks.actions.increase-buffer-pool-size)
+ [データアクセスパターンの改善](#ams-waits.sx-lock-hash-table-locks.actions.improve-data-access-patterns)
+ [フルテーブルスキャンの削減または回避](#ams-waits.sx-lock-hash-table-locks.actions.reduce-full-table-scans)
+ [エラーログでページの破損を確認します。](#ams-waits.sx-lock-hash-table-locks.actions.check-error-logs)

### バッファプールのサイズを増やす
<a name="ams-waits.sx-lock-hash-table-locks.actions.increase-buffer-pool-size"></a>

バッファプールがワークロードに合わせて適切なサイズになっていることを確認します。そのためには、バッファプールのキャッシュヒット率を確認できます。通常、値が 95% を下回った場合は、バッファプールのサイズを大きくすることを検討してください。バッファプールが大きいほど、頻繁にアクセスされるページをメモリ内に長く保持できます。バッファプールのサイズを増やすには、`innodb_buffer_pool_size` パラメータの値を変更します。このパラメータのデフォルト値は、DB インスタンスクラスのサイズに基づいています。詳細については、[Amazon Aurora MySQL データベース設定のベストプラクティス](https://aws.amazon.com/blogs/database/best-practices-for-amazon-aurora-mysql-database-configuration/)を参照してください。

### データアクセスパターンの改善
<a name="ams-waits.sx-lock-hash-table-locks.actions.improve-data-access-patterns"></a>

この待機の影響を受けるクエリとその実行プランを確認します。データアクセスパターンの改善を検討してください。例えば[mysqli\$1result:: fetch\$1array](https://www.php.net/manual/en/mysqli-result.fetch-array.php) を使用している場合には、配列のフェッチサイズを大きくしてみるなどが可能です。

Performance Insights を使用して、`synch/sxlock/innodb/hash_table_locks` 待機イベントの原因となっている可能性のあるクエリとセッションを表示できます。

**高ロードの原因となる SQL クエリを検索するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/) を開きます。

1. ナビゲーションペインで、[**Performance Insights**] を選択します。

1. DB インスタンスを選択します。その DB インスタンスの Performance Insights ダッシュボードが表示されます。

1. **データベースロード**で、**待機でスライス**を選択します。

1. ページの下部で **トップ SQL** を選択します。

   グラフには、ロードの原因となる SQL クエリがリストされます。リスト上部にあるクエリに、最も責任があります。ボトルネックを解決するには、これらのステートメントに注目してください。

Performance Insights を使用したトラブルシューティングの便利な概要については、AWS　データベースブログ記事の [Performance Insights を使用した Amazon Aurora MySQL ワークロードの分析](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/)を参照してください。

### フルテーブルスキャンの削減または回避
<a name="ams-waits.sx-lock-hash-table-locks.actions.reduce-full-table-scans"></a>

ワークロードをモニタリングして、フルテーブルスキャンが実行されているかどうかを確認し、実行している場合はそれを減らすか回避します。例えば、`Handler_read_rnd_next` のようなステータス可変をモニタリングできます。詳細については、MySQL ドキュメントの[サーバーステータス可変](https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html#statvar_Handler_read_rnd_next)を参照してください。

### エラーログでページの破損を確認します。
<a name="ams-waits.sx-lock-hash-table-locks.actions.check-error-logs"></a>

mysql-error.log をチェックして、問題の発生時に検出された破損関連のメッセージを確認できます。問題を解決するために作業できるメッセージは、エラーログに記録されます。破損として報告されたオブジェクトを再作成する必要がある場合があります。

# synch/mutex/innodb/temp\$1pool\$1manager\$1mutex
<a name="ams-waits.io-temppoolmanager"></a>

`synch/mutex/innodb/temp_pool_manager_mutex` 待機イベントは、セッションがセッション一時テーブルスペースのプールを管理するためのミューテックスの取得を待機しているときに発生します。

**Topics**
+ [サポート対象エンジンバージョン](#ams-waits.io-temppoolmanager.context.supported)
+ [Context](#ams-waits.io-temppoolmanager.context)
+ [待機時間が増加する原因の可能性](#ams-waits.io-temppoolmanager.causes)
+ [アクション](#ams-waits.io-temppoolmanager.actions)

## サポート対象エンジンバージョン
<a name="ams-waits.io-temppoolmanager.context.supported"></a>

この待機イベント情報は、以下のエンジンバージョンでサポートされています。
+ Aurora MySQL バージョン 3

## Context
<a name="ams-waits.io-temppoolmanager.context"></a>

Aurora MySQL バージョン 3.x 以降では、`temp_pool_manager_mutex` を使用して、一時テーブルスペースプールに同時にアクセスする複数のセッションを制御します。Aurora MySQL は、永続データ用に Aurora クラスターボリュームを介してストレージを管理し、一時ファイル用にローカルストレージを管理します。セッションが Aurora クラスターボリュームに一時テーブルを作成する場合、一時テーブルスペースが必要です。

セッションが初めて一時テーブルスペースをリクエストすると、MySQL は共有プールからセッション一時テーブルスペースを割り当てます。セッションには、次のテーブルタイプで一度に最大 2 つの一時テーブルスペースを保持できます。
+ ユーザーが作成した一時テーブル
+ オプティマイザが生成した内部一時テーブル

デフォルトの `TempTable` エンジンは、次のオーバーフローメカニズムを使用して一時テーブルを処理します。
+ [https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram) 制限までテーブルを RAM に保存します。
+ RAM がいっぱいになると、ローカルストレージのメモリマップファイルに移動します。
+ メモリマップされたファイルが [https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap) 制限に達すると、共有クラスターボリュームを使用します。

一時テーブルが RAM とローカルストレージの両方の制限を超えると、MySQL はディスク上のテーブルスペースを使用して一時テーブルを管理します。

セッションでディスク上の一時テーブルが必要な場合、MySQL は次のようになります。
+ プールで使用可能な `INACTIVE` テーブルスペースを探して再利用します。
+ `INACTIVE` スペースが存在しない場合は、10 個の新しいテーブルスペースを作成します。

セッションが切断されると、MySQL は次の操作を行います。
+ セッションの一時テーブルスペースを切り捨てます。
+ 再利用するためにプールでそれらを INACTIVE としてマークします。
+ サーバーの再起動まで現在のプールサイズを維持します。
+ 再起動後、デフォルトのプールサイズ (10 テーブルスペース) に戻ります。

## 待機時間が増加する原因の可能性
<a name="ams-waits.io-temppoolmanager.causes"></a>

この待機イベントの原因となる一般的な状況。
+ クラスターボリュームに内部一時テーブルを作成する同時セッション。
+ クラスターボリュームにユーザー一時テーブルを作成する同時セッション。
+ アクティブなテーブルスペースを使用したセッションの突然の終了。
+ 書き込み負荷の高いワークロード中のテーブルスペースプールの拡張。
+ アクセスする同時クエリ `INFORMATION_SCHEMA.`

## アクション
<a name="ams-waits.io-temppoolmanager.actions"></a>

待機イベントの原因に応じたさまざまなアクションをお勧めします。

**Topics**
+ [一時テーブルの使用状況のモニタリングと最適化](#ams-waits.io-temppoolmanager.actions.monitor)
+ [INFORMATION\$1SCHEMA を使用してクエリを確認する](#ams-waits.io-temppoolmanager.actions.schema-queries)
+ [innodb\$1sync\$1array\$1size パラメータを増やす](#ams-waits.io-temppoolmanager.actions.sync_array)
+ [接続プールを実装する](#ams-waits.io-temppoolmanager.actions.connection_pooling)

### 一時テーブルの使用状況のモニタリングと最適化
<a name="ams-waits.io-temppoolmanager.actions.monitor"></a>

一時テーブルの使用状況をモニタリングして最適化するには、次のいずれかの方法を使用します。
+ Performance Insights の `Created_tmp_disk_tables` カウンターをチェックして、Aurora クラスター全体でディスク上の一時テーブルの作成を追跡します。
+ データベースでこのコマンドを実行して、一時テーブルの作成を直接モニタリングします。`mysql> show status like '%created_tmp_disk%'`。

**注記**  
一時テーブルの動作は、Aurora MySQL リーダーノードとライターノードで異なります。詳細については、「[Aurora MySQL バージョン 3 での新しい一時テーブルの動作](ams3-temptable-behavior.md)」を参照してください。

一時テーブルを作成するクエリを特定したら、以下の最適化ステップを実行します。
+ `EXPLAIN` を使用してクエリ実行プランを調べ、一時テーブルが作成される場所と理由を特定します。
+ クエリを変更して、可能な場合は一時テーブルの使用量を減らします。

クエリの最適化だけではパフォーマンスの問題を解決できない場合は、以下の設定パラメータの調整を検討してください。
+  [https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram) – 一時テーブルの最大 RAM 使用量を制御します。
+  [https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap) – メモリマップされたファイルストレージの制限を設定します。
+ [https://dev.mysql.com/doc/refman/8.4/en/server-system-variables.html#sysvar_tmp_table_size](https://dev.mysql.com/doc/refman/8.4/en/server-system-variables.html#sysvar_tmp_table_size) – `aurora_tmptable_enable_per_table_limit` が有効になっている場合に適用されます (デフォルトでは無効)。

**重要**  
特定のクエリ条件では、設定に関係なく、常にディスク上の一時テーブルが必要になることに注意してください。`TempTable` ストレージエンジンの詳細については、「[Use the TempTable storage engine on Amazon RDS for MySQL and Amazon Aurora MySQL](https://aws.amazon.com/blogs/database/use-the-temptable-storage-engine-on-amazon-rds-for-mysql-and-amazon-aurora-mysql/)」を参照してください。

### INFORMATION\$1SCHEMA を使用してクエリを確認する
<a name="ams-waits.io-temppoolmanager.actions.schema-queries"></a>

`INFORMATION_SCHEMA` テーブルをクエリすると、MySQL はクラスターボリュームに InnoDB 一時テーブルを作成します。各セッションには、これらのテーブルの一時テーブルスペースが必要です。これにより、同時アクセスが多い場合にパフォーマンスの問題が発生する可能性があります。

パフォーマンスを向上させるには。
+ 可能な限り `INFORMATION_SCHEMA` の代わりに `PERFORMANCE_SCHEMA` を使用します。
+ `INFORMATION_SCHEMA` を使用する必要がある場合は、これらのクエリを実行する頻度を減らします。

### innodb\$1sync\$1array\$1size パラメータを増やす
<a name="ams-waits.io-temppoolmanager.actions.sync_array"></a>

`innodb_sync_array_size` パラメータは、MySQL のミューテックス/ロック待機配列のサイズを制御します。`1` のデフォルト値は一般的なワークロードで機能しますが、これを増やすと、同時実行数が多いときにスレッドの競合を減らすことができます。

ワークロードで待機スレッドの数が増えると表示される場合。
+ ワークロード内の待機中のスレッドの数をモニタリングします。
+ スレッド調整構造を分割し、競合を減らすには、`innodb_sync_array_size` をインスタンスの vCPU 数以上に設定します。

**注記**  
RDS インスタンスで使用可能な vCPU の数を確認するには、[Amazon RDS インスタンスタイプ](https://aws.amazon.com/rds/instance-types/)の vCPU 仕様を参照してください。

### 接続プールを実装する
<a name="ams-waits.io-temppoolmanager.actions.connection_pooling"></a>

MySQL は、一時テーブルを作成する各セッションに専用のテーブルスペースを割り当てます。このテーブルスペースは、データベース接続が終了するまでアクティブのままです。リソースをより効率的に管理するには。
+ 接続プーリングを実装して、アクティブな一時テーブルスペースの数を制限します。
+ オペレーションごとに新しい接続を作成する代わりに、既存の接続を再利用します。

# スレッド状態を使用した Aurora MySQL のチューニング
<a name="AuroraMySQL.Managing.Tuning.thread-states"></a>

次の表は Aurora MySQL の最も一般的なスレッド状態をまとめたものです。


| 一般的なスレッド状態 | 説明 | 
| --- | --- | 
|  [ソートインデックスの作成](ams-states.sort-index.md)  |  このスレッド状態は、データをソートするために内部テンポラリテーブルを使用する必要がある `SELECT` ステートメントを、スレッドが処理中であることを示します。  | 
|  [データの送信](ams-states.sending-data.md)  |  このスレッド状態は、スレッドがクエリの行を読み取り、フィルタリングして、正しい結果セットを判断していることを示します。  | 

# ソートインデックスの作成
<a name="ams-states.sort-index"></a>

`creating sort index` スレッド状態は、データをソートするために内部テンポラリテーブルを使用する必要がある `SELECT` ステートメントを、スレッドが処理中であることを示します。

**Topics**
+ [サポート対象エンジンバージョン](#ams-states.sort-index.context.supported)
+ [Context](#ams-states.sort-index.context)
+ [待ち時間増加の考えられる原因](#ams-states.sort-index.causes)
+ [アクション](#ams-states.sort-index.actions)

## サポート対象エンジンバージョン
<a name="ams-states.sort-index.context.supported"></a>

このスレッド状態情報は、以下のバージョンでサポートされています。
+ Aurora MySQL バージョン 2 から 2.09.2 まで

## Context
<a name="ams-states.sort-index.context"></a>

`creating sort index` 状態は、`ORDER BY` および `GROUP BY` 句を持つクエリが既存のインデックスを使用して操作を実行できない場合に表示されます。この場合、MySQL はより高価な `filesort` オペレーションを実行する必要があります。通常、この操作は結果セットが大きすぎない場合にメモリ内で実行されます。それ以外の場合は、ディスク上にファイルを作成する必要があります。

## 待ち時間増加の考えられる原因
<a name="ams-states.sort-index.causes"></a>

`creating sort index` の表示は、それ自体が問題を示しているわけではありません。パフォーマンスが低下し、頻繁に `creating sort index` の症例が表示される場合、最も可能性の高い原因は `ORDER BY` または `GROUP BY` 演算子を使った遅いクエリです。

## アクション
<a name="ams-states.sort-index.actions"></a>

一般的なガイドラインは、`creating sort index` 状態の増加と関連付けられる `ORDER BY` と `GROUP BY` 句を持つクエリを見つけることです。次に、インデックスを追加するか、ソートバッファサイズを大きくしても問題が解決するかどうかを確認します。

**Topics**
+ [パフォーマンススキーマ がオンになっていない場合は、オンにします。](#ams-states.sort-index.actions.enable-pfs)
+ [問題のあるクエリを特定する](#ams-states.sort-index.actions.identify)
+ [ファイルソートの使用に関する説明プランを調べる](#ams-states.sort-index.actions.plan)
+ [ソートバッファサイズを増やす](#ams-states.sort-index.actions.increasebuffersize)

### パフォーマンススキーマ がオンになっていない場合は、オンにします。
<a name="ams-states.sort-index.actions.enable-pfs"></a>

Performance Insights は、パフォーマンススキーマインストゥルメントがオンになっていない場合にのみ、スレッドの状態を報告します。パフォーマンススキーマインストゥルメントがオンの場合、Performance Insights は代わりに待機イベントをレポートします。パフォーマンススキーマインストゥルメントは、潜在的なパフォーマンスの問題を調査するための、追加のインサイトと優れたツールを提供します。したがって、パフォーマンススキーマをオンにすることをお勧めします。詳細については、「[Aurora MySQL における Performance Insights のPerformance Schema の概要](USER_PerfInsights.EnableMySQL.md)」を参照してください。

### 問題のあるクエリを特定する
<a name="ams-states.sort-index.actions.identify"></a>

`creating sort index` 状態の増加の原因となっている現在のクエリを特定するには、`show processlist` を実行して `ORDER BY` または `GROUP BY` を持つクエリがないか確認します。任意で、`filesort` を持つクエリのプロセスリスト ID に `N` がなっている場所で、`explain for connection N` を実行します。

これらの増加の原因となっている過去のクエリを特定するには、スロークエリログをオンにして、`ORDER BY` のクエリを検索します。遅いクエリで`EXPLAIN`を実行し、「filesort を使用しています。」を探します。詳細については、「[ファイルソートの使用に関する説明プランを調べる](#ams-states.sort-index.actions.plan)」を参照してください。

### ファイルソートの使用に関する説明プランを調べる
<a name="ams-states.sort-index.actions.plan"></a>

`creating sort index`状態を引き起こす`ORDER BY` と `GROUP BY` 句を持つステートメントを特定する。

次の例は、クエリで `explain` を実行する方法を解説しています。`Extra` 列は、このクエリが `filesort` を使用していることを示しています。

```
mysql> explain select * from mytable order by c1 limit 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: mytable
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 2064548
     filtered: 100.00
        Extra: Using filesort
1 row in set, 1 warning (0.01 sec)
```

次の例は、`c1` カラムにインデックスが作成された後、同じクエリで `EXPLAIN` を実行した結果を示しています。

```
mysql> alter table mytable add index (c1);
```

```
mysql> explain select * from mytable order by c1 limit 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: mytable
   partitions: NULL
         type: index
possible_keys: NULL
          key: c1
      key_len: 1023
          ref: NULL
         rows: 10
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.01 sec)
```

ソート順の最適化にインデックスを使用する方法については、MySQL ドキュメントの[最適化による注文](https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html)を参照してください。

### ソートバッファサイズを増やす
<a name="ams-states.sort-index.actions.increasebuffersize"></a>

特定のクエリで、ディスク上にファイルを作成した `filesort` プロセスが必要かどうかを確認するには、クエリの実行後、`sort_merge_passes` 可変値をチェックします。例を以下に示します。

```
mysql> show session status like 'sort_merge_passes';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
+-------------------+-------+
1 row in set (0.01 sec)

--- run query
mysql> select * from mytable order by u limit 10; 
--- run status again:

mysql> show session status like 'sort_merge_passes';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
+-------------------+-------+
1 row in set (0.01 sec)
```

`sort_merge_passes` の値が高い場合は、ソートバッファサイズを大きくすることを検討してください。この増加をセッションレベルで適用します。グローバルに増やすと、RAM MySQL の使用量が大幅に増加する可能性があるためです。次の例は、クエリを実行する前にソートバッファサイズを変更する方法を示しています。

```
mysql> set session sort_buffer_size=10*1024*1024;
Query OK, 0 rows affected (0.00 sec)
-- run query
```

# データの送信
<a name="ams-states.sending-data"></a>

`sending data` スレッド状態は、スレッドがクエリの行を読み取り、フィルタリングして、正しい結果セットを決定していることを示します。名前が誤解を招くのは、状態がデータを転送しており、後で送信するデータを収集して準備していないことを意味するためです。

**Topics**
+ [サポート対象エンジンバージョン](#ams-states.sending-data.context.supported)
+ [Context](#ams-states.sending-data.context)
+ [待ち時間増加の考えられる原因](#ams-states.sending-data.causes)
+ [アクション](#ams-states.sending-data.actions)

## サポート対象エンジンバージョン
<a name="ams-states.sending-data.context.supported"></a>

このスレッド状態情報は、以下のバージョンでサポートされています。
+ Aurora MySQL バージョン 2 から 2.09.2 まで

## Context
<a name="ams-states.sending-data.context"></a>

多くのスレッド状態は短続きします。中に発生するオペレーション`sending data`大量のディスクまたはキャッシュ読み取りを実行する傾向があります。したがって、`sending data`多くの場合、特定のクエリの存続期間中で最も長い実行状態です。この状態は、Aurora MySQL が次のことをしているときに表示されます。
+ のローの読み取りと処理`SELECT`ステートメント
+ ディスクまたはメモリから大量の読み取りを実行する
+ 特定のクエリからのすべてのデータの完全な読み取りを完了する
+ テーブル、インデックス、またはストアドプロシージャの作業からデータを読み込む
+ データのソート、グループ化、または順序付け

After`sending data`state はデータの準備を終了し、スレッドの状態`writing to net`は、クライアントにデータを返すことを示します。通常、`writing to net`は、結果セットが非常に大きいか、または深刻なネットワークレイテンシーによって転送が遅くなる場合にのみキャプチャされます。

## 待ち時間増加の考えられる原因
<a name="ams-states.sending-data.causes"></a>

`sending data` の表示は、それ自体が問題を示しているわけではありません。パフォーマンスが低下し、頻繁に次のインスタンスが表示される場合`sending data`の場合、最も可能性の高い原因は以下のとおりです。

**Topics**
+ [非効率なクエリ](#ams-states.sending-data.causes.structure)
+ [最適でないサーバー設定](#ams-states.sending-data.causes.server)

### 非効率なクエリ
<a name="ams-states.sending-data.causes.structure"></a>

ほとんどの場合、この状態の原因となるのは、特定のクエリの結果セットを見つけるために適切なインデックスを使用していないクエリです。例えば、カリフォルニアで行われたすべての注文について 1,000 万件のレコードテーブルを読み取るクエリについて考えてみます。ここでは、州の列にインデックスが付けられていないか、インデックスが不十分です。後者の場合、インデックスは存在する可能性がありますが、カーディナリティが低いためオプティマイザはそれを無視します。

### 最適でないサーバー設定
<a name="ams-states.sending-data.causes.server"></a>

複数のクエリが`sending data`状態の場合、データベースサーバーの設定が不十分である可能性があります。具体的には、サーバーには次の問題が発生する可能性があります。
+ データベースサーバーには、ディスク I/O、ディスクタイプと速度、CPU、または CPU の数など、十分なコンピューティング性能がありません。
+ InnoDB テーブルの InnoDB バッファプールや MyISAM テーブルのキーバッファなど、割り当てられたリソースでサーバーが不足しています。
+ スレッドごとのメモリ設定 (など)`sort_buffer`、`read_buffer`、 および`join_buffer`必要以上に多くの RAM を消費し、物理サーバのメモリリソースが不足しています。

## アクション
<a name="ams-states.sending-data.actions"></a>

一般的なガイドラインは、パフォーマンススキーマをチェックして、多数の行を返すクエリを検索することです。インデックスを使用しないクエリのログがオンの場合、スローログの結果を調べることもできます。

**Topics**
+ [パフォーマンススキーマ がオンになっていない場合は、オンにします。](#ams-states.sending-data.actions.enable-pfs)
+ [メモリ設定の確認](#ams-states.sending-data.actions.memory)
+ [インデックスの使用状況に関する説明プランを調べる](#ams-states.sending-data.actions.plans)
+ [返されたデータの量をチェックする](#ams-states.sending-data.actions.maintenance)
+ [並行性の問題をチェックする](#ams-states.sending-data.actions.concurrent-queries)
+ [クエリの構文を確認します。](#ams-states.sending-data.actions.subqueries)

### パフォーマンススキーマ がオンになっていない場合は、オンにします。
<a name="ams-states.sending-data.actions.enable-pfs"></a>

Performance Insights は、パフォーマンススキーマインストゥルメントがオンになっていない場合にのみ、スレッドの状態を報告します。パフォーマンススキーマインストゥルメントがオンの場合、Performance Insights は代わりに待機イベントをレポートします。パフォーマンススキーマインストゥルメントは、潜在的なパフォーマンスの問題を調査するための、追加のインサイトと優れたツールを提供します。したがって、パフォーマンススキーマをオンにすることをお勧めします。詳細については、「[Aurora MySQL における Performance Insights のPerformance Schema の概要](USER_PerfInsights.EnableMySQL.md)」を参照してください。

### メモリ設定の確認
<a name="ams-states.sending-data.actions.memory"></a>

プライマリバッファプールのメモリ設定を確認します。これらのプールがワークロードに合わせて適切なサイズになっていることを確認します。データベースで複数のバッファプールインスタンスを使用している場合は、それらが多数の小さなバッファプールに分割されていないことを確認してください。スレッドが一度に使用できるバッファプールは 1 つだけです。

各スレッドで使用される次のメモリ設定が、適切なサイズであることを確認します。
+ read\$1buffer
+ read\$1rnd\$1buffer
+ sort\$1buffer
+ join\$1buffer
+ binlog\$1cache

設定を変更する特定の理由がない限り、デフォルト値を使用します。

### インデックスの使用状況に関する説明プランを調べる
<a name="ams-states.sending-data.actions.plans"></a>

`sending data` スレッド状態のクエリの場合、プランを調べて、適切なインデックスが使用されているかどうかを判断します。クエリが有用なインデックスを使用していない場合は、`USE INDEX` や `FORCE INDEX` のようなヒントを追加することを検討してください。ヒントは、クエリの実行にかかる時間を大幅に増減できるので、追加する前に注意してください。

### 返されたデータの量をチェックする
<a name="ams-states.sending-data.actions.maintenance"></a>

クエリ対象のテーブルと、そのテーブルに含まれるデータの量をチェックします。このデータのいずれかをアーカイブできますか? 多くの場合、クエリの実行時間が短くなる原因は、クエリプランの結果ではなく、処理されるデータの量です。多くのデベロッパーはデータベースにデータを追加するのに非常に効率的ですが、設計および開発段階でデータセットのライフサイクルを考慮することはほとんどありません。

低ボリュームデータベースではうまく機能するが、現在のシステムではパフォーマンスが低下するクエリを探します。特定のクエリを設計するデベロッパーは、これらのクエリが 350,000 行を返していることに気付かないことがあります。デベロッパーは、実稼働環境よりも小さいデータセットを持つ低ボリュームの環境でクエリを開発した可能性があります。

### 並行性の問題をチェックする
<a name="ams-states.sending-data.actions.concurrent-queries"></a>

同じタイプの複数のクエリが同時に実行されているかどうかを確認します。一部の形式のクエリは、単独で実行すると効率的に実行されます。ただし、同様の形式のクエリを一緒に、または大量に実行すると、同時実行の問題が発生する可能性があります。多くの場合、これらの問題はデータベースがテンポラリテーブルを使用して結果をレンダリングするときに発生します。制限的なトランザクション分離レベルは、同時実行性の問題を引き起こすこともあります。

テーブルが同時に読み書きされる場合、データベースがロックを使用している可能性があります。低いパフォーマンス期間を特定するには、大規模なバッチプロセスでデータベースの使用状況を調べます。最近のロックとロールバックを確認するには、`SHOW ENGINE INNODB STATUS` コマンドの出力を確認します。

### クエリの構文を確認します。
<a name="ams-states.sending-data.actions.subqueries"></a>

これらの状態からキャプチャされたクエリがサブクエリを使用しているかどうかを確認します。このタイプのクエリは、データベースが内部的に結果をコンパイルし、それらを再びクエリに戻してデータレンダリングするため、パフォーマンスが低下することがあります。このプロセスは、データベースの追加ステップです。多くの場合このステップは、高い同時ロード条件下でパフォーマンスが低下する可能性があります。

また大量の `ORDER BY` および `GROUP BY`句 をクエリが使用していないかも、確認してください。このような操作では、多くの場合、データベースはまずデータセット全体をメモリ内に形成する必要があります。その後、クライアントに戻す前に、特定の方法で注文またはグループ化する必要があります。

# Amazon DevOps Guru のプロアクティブインサイトによる Aurora MySQL のチューニング
<a name="MySQL.Tuning.proactive-insights"></a>

DevOps Guru のプロアクティブインサイトは、Aurora MySQL DB クラスターで既知の問題が発生する前に検出します。DevOps Guru では、次のことができます。
+ データベース構成を一般的な推奨設定と照合することで、データベースに関する多くの一般的な問題を防ぎます。
+ 未チェックのままにしておくと、後で大きな問題につながる可能性があるフリート内の重大な問題について警告します。
+ 新しく発見された問題について警告します。

すべてのプロアクティブインサイトには、問題の原因の分析と是正措置の推奨事項が含まれています。

**Topics**
+ [InnoDB 履歴リストの長さが大幅に増加しました](proactive-insights.history-list.md)
+ [データベースはディスク上にテンポラリテーブルを作成している](proactive-insights.temp-tables.md)

# InnoDB 履歴リストの長さが大幅に増加しました
<a name="proactive-insights.history-list"></a>

*date* を過ぎると、行変更の履歴リストが大幅に増加し、*db-instance* では最大 *length* になりました。この増加は、クエリとデータベースのシャットダウンパフォーマンスに影響します。

**Topics**
+ [サポート対象エンジンバージョン](#proactive-insights.history-list.context.supported)
+ [Context](#proactive-insights.history-list.context)
+ [この問題の考えられる原因](#proactive-insights.history-list.causes)
+ [アクション](#proactive-insights.history-list.actions)
+ [関連するメトリクス](#proactive-insights.history-list.metrics)

## サポート対象エンジンバージョン
<a name="proactive-insights.history-list.context.supported"></a>

このインサイト情報は、Aurora MySQL のすべてのバージョンでサポートされています。

## Context
<a name="proactive-insights.history-list.context"></a>

InnoDB トランザクションシステムは、マルチバージョン同時実行制御 (MVCC) を維持します。行が変更されると、変更中のデータの修正前のバージョンが、undo レコードとして undo ログに保存されます。すべての undo レコードには、以前の redo レコードへの参照があり、リンクリストを形成します。

InnoDB 履歴リストは、コミットされたトランザクションの undo ログのグローバルリストです。MySQL は、トランザクションで履歴が不要になったときに、履歴リストを使用してレコードとログページを削除します。履歴リストの長さは、履歴リスト内の変更を含む undo ログの総数です。各ログには、1 つ以上の変更が含まれます。InnoDB 履歴リストの長さが大きくなりすぎると、古い行バージョンが多数存在することになり、クエリやデータベースのシャットダウンが遅くなります。

## この問題の考えられる原因
<a name="proactive-insights.history-list.causes"></a>

履歴リストが長くなる一般的な原因には次のものがあります。
+ 実行時間の長いトランザクション (読み取りまたは書き込み)
+ 書き込み負荷が高い

## アクション
<a name="proactive-insights.history-list.actions"></a>

インサイトの原因に応じて、異なるアクションをお勧めします。

**Topics**
+ [InnoDB 履歴リストが減るまで、データベースのシャットダウンを伴う操作を開始しない](#proactive-insights.history-list.actions.no-shutdown)
+ [長時間実行されるトランザクションを特定して終了する](#proactive-insights.history-list.actions.long-txn)
+ [Performance Insights を使用して、上位ホストと上位ユーザーを特定します。](#proactive-insights.history-list.actions.top-PI)

### InnoDB 履歴リストが減るまで、データベースのシャットダウンを伴う操作を開始しない
<a name="proactive-insights.history-list.actions.no-shutdown"></a>

InnoDB 履歴リストが長くなるとデータベースのシャットダウンが遅くなるため、データベースシャットダウンを伴う操作を開始する前にリストサイズを小さくしてください。これらの操作には、データベースのメジャーバージョンのアップグレードが含まれます。

### 長時間実行されるトランザクションを特定して終了する
<a name="proactive-insights.history-list.actions.long-txn"></a>

`information_schema.innodb_trx` クエリを実行すると、実行時間の長いトランザクションを見つけることができます。

**注記**  
リードレプリカで長時間実行されるトランザクションも必ず探してください。

**長時間実行されるトランザクションを特定して終了するには**

1. 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
   ```

1. ストアドプロシージャ [mysql.rds\$1kill](mysql-stored-proc-ending.md#mysql_rds_kill) を使用して、長時間実行している各トランザクションを終了します。

### Performance Insights を使用して、上位ホストと上位ユーザーを特定します。
<a name="proactive-insights.history-list.actions.top-PI"></a>

トランザクションを最適化して、変更された多数の行がすぐにコミットされるようにします。

## 関連するメトリクス
<a name="proactive-insights.history-list.metrics"></a>

このインサイトに関連するメトリクスは次のとおりです。
+ `trx_rseg_history_len` – このカウンターメトリクスは、Performance Insights および `INFORMATION_SCHEMA.INNODB_METRICS` テーブルで表示できます。詳細については、MySQL ドキュメントの「[InnoDB INFORMATION\$1SCHEMA metrics table](https://dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-metrics-table.html)」を参照してください。
+ `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 のインスタンスレベルのメトリクス](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances)」を参照してください。

# データベースはディスク上にテンポラリテーブルを作成している
<a name="proactive-insights.temp-tables"></a>

最近のディスク上のテンポラリテーブルの使用率が大幅に増加し、最大 *percentage* に達しています。データベースは、1 秒あたり約 *number* 個のテンポラリテーブルを作成しています。これにより、パフォーマンスに影響が及び、*db-instance* に対するディスク操作が増える可能性があります。

**Topics**
+ [サポート対象エンジンバージョン](#proactive-insights.temp-tables.context.supported)
+ [Context](#proactive-insights.temp-tables.context)
+ [この問題の考えられる原因](#proactive-insights.temp-tables.causes)
+ [アクション](#proactive-insights.temp-tables.actions)
+ [関連するメトリクス](#proactive-insights.temp-tables.metrics)

## サポート対象エンジンバージョン
<a name="proactive-insights.temp-tables.context.supported"></a>

このインサイト情報は、Aurora MySQL のすべてのバージョンでサポートされています。

## Context
<a name="proactive-insights.temp-tables.context"></a>

MySQL サーバーがクエリの処理中に内部一時テーブルを作成する必要がある場合があります。Aurora MySQL は、内部一時テーブルをメモリに保持できます。このテーブルは、TempTable または MEMORY ストレージエンジンで処理するか、InnoDB によってディスクに保存したりできます。詳細については、*MySQL リファレンスマニュアル*の「[Internal Temporary Table Use in MySQL](https://dev.mysql.com/doc/refman/5.6/en/internal-temporary-tables.html)」(MySQL での内部一時テーブルの使用) を参照してください。

## この問題の考えられる原因
<a name="proactive-insights.temp-tables.causes"></a>

ディスク上の一時テーブルの増加は、複雑なクエリの使用を示しています。設定されたメモリが一時テーブルをメモリに格納するには不十分な場合、Aurora MySQL はテーブルをディスク上に作成します。これにより、パフォーマンスに影響が及び、ディスク操作が増える可能性があります。

## アクション
<a name="proactive-insights.temp-tables.actions"></a>

インサイトの原因に応じて、異なるアクションをお勧めします。
+ Aurora MySQL バージョン 3 の場合、TempTable ストレージエンジンを使用することをお勧めします。
+ 必要な列のみを選択して、クエリを最適化して、返されるデータを減らします。

  すべての `statement` 計測が有効で時間制限のある状態でパフォーマンススキーマを有効にすると、`SYS.statements_with_temp_tables` クエリを実行して、一時テーブルを使用するクエリのリストを取得できます。詳細については、MySQL ドキュメントの「[Prerequisites for Using the sys Schema](https://dev.mysql.com/doc/refman/8.0/en/sys-schema-prerequisites.html)」(sys スキーマを使用するための前提条件) を参照してください。
+ ソートやグループ化の操作に関係する列にインデックスを付けることを検討してください。
+ `BLOB` および `TEXT` 列を避けるように、クエリを書き直します。これらの列は常にディスクを使用します。
+ `tmp_table_size` および `max_heap_table_size` データベースパラメータをチューニングします。

  これらのパラメータのデフォルト値は 16 MiB です。メモリ内一時テーブルに MEMORY ストレージエンジンを使用する場合、最大サイズは、`tmp_table_size` または `max_heap_table_size` 値のいずれか小さい方によって定義されます。この最大サイズに達すると、MySQL はインメモリ内部一時テーブルを InnoDB オンディスク内部一時テーブルに自動的に変換します。詳細については、「[Use the TempTable storage engine on Amazon RDS for MySQL and Amazon Aurora MySQL](https://aws.amazon.com/blogs/database/use-the-temptable-storage-engine-on-amazon-rds-for-mysql-and-amazon-aurora-mysql/)」(Amazon RDS for MySQL および Amazon Aurora MySQL で TempTable ストレージ エンジンを使用する) を参照してください。
**注記**  
CREATE TABLE を使用して MEMORY テーブルを明示的に作成する場合、テーブルをどれだけ大きくできるかを決めるのは `max_heap_table_size` 変数だけです。また、オンディスク形式への変換もありません。

## 関連するメトリクス
<a name="proactive-insights.temp-tables.metrics"></a>

以下の Performance Insights メトリクスがこのインサイトに関連しています。
+ Created\$1tmp\$1disk\$1tables
+ Created\$1tmp\$1tables

詳細については、MySQL ドキュメントの「[Created\$1tmp\$1disk\$1tables](https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html#statvar_Created_tmp_disk_tables)」を参照してください。

# Amazon Aurora MySQL の並列クエリ
<a name="aurora-mysql-parallel-query"></a><a name="parallel_query"></a><a name="pq"></a>

このトピックでは、Amazon Aurora MySQL 互換エディションのパラレルクエリの最適化機能について説明しています。この機能は、特定のデータ集約型クエリに対して特別な処理パスを使用し、Aurora 共有ストレージアーキテクチャを利用します。パラレルクエリは、数百万行のテーブルと完了までに数分または数時間かかる分析クエリを持つテーブルを持つ Aurora MySQL DB クラスターで最も効果的です。

**Topics**
+ [Aurora MySQL の並列クエリの概要](#aurora-mysql-parallel-query-overview)
+ [Aurora MySQL での並列クエリ DB クラスターの作成](aurora-mysql-parallel-query-creating-cluster.md)
+ [Aurora MySQL での並列クエリのオン/オフの切り替え](aurora-mysql-parallel-query-enabling.md)
+ [Aurora MySQL での並列クエリの最適化](aurora-mysql-parallel-query-optimizing.md)
+ [Aurora MySQL の並列クエリを使用しているステートメントの確認](aurora-mysql-parallel-query-verifying.md)
+ [Aurora MySQL の並列クエリのモニタリング](aurora-mysql-parallel-query-monitoring.md)
+ [Aurora MySQL の並列クエリ用の SQL コンストラクト](aurora-mysql-parallel-query-sql.md)

## Aurora MySQL の並列クエリの概要
<a name="aurora-mysql-parallel-query-overview"></a>

 Aurora MySQL パラレルクエリは、データ集約的なクエリの処理に関連する I/O と計算の一部をパラレル処理する最適化です。パラレル処理される作業には、ストレージから行を取得し、列の値を抽出して、`WHERE` 句と結合句の条件に一致する行を判別することが含まれます。このデータ集約型の作業は、Aurora 分散ストレージレイヤー内の複数のノードに委譲されます (データベース最適化の用語では、*プッシュダウン*されます)。並行クエリがないと、各クエリはすべてのスキャンされたデータを Aurora MySQL クラスター (ヘッドノード) 内の単一のノードに持ち込み、そこですべてのクエリ処理を実行します。

**ヒント**  
PostgreSQL データベースエンジンにも「パラレルクエリ」と呼ばれる機能があります。この機能は、Aurora のパラレルクエリとは異なります。

 パラレルクエリ特徴を有効にすると、ヒントやテーブル属性などの SQL の変更を必要とせずに、Aurora MySQL エンジンはクエリがいつ利点を得られるかを自動的に判断します。以降のセクションで、パラレルクエリがいつクエリに適用されるかについて説明します。パラレルクエリが最も効果的な場所に適用されていることを確認する方法についても説明します。

**注記**  
 パラレルクエリの最適化は、完了までに数分や数時間といった長い時間がかかるクエリの場合に最もメリットがあります。Aurora MySQL は、一般的に安価なクエリのためにはパラレルクエリの最適化を実行しません。また、クエリのキャッシュ、バッファプールのキャッシュ、インデックスの検索などの別の最適化手法を使用したほうが効果的な場合も、通常はパラレルクエリの最適化を行いません。パラレルクエリが適切に使用されていない場合は、「[Aurora MySQL の並列クエリを使用しているステートメントの確認](aurora-mysql-parallel-query-verifying.md)」を参照してください。

**Topics**
+ [利点](#aurora-mysql-parallel-query-benefits)
+ [アーキテクチャ](#aurora-mysql-parallel-query-architecture)
+ [前提条件](#aurora-mysql-parallel-query-prereqs)
+ [制限](#aurora-mysql-parallel-query-limitations)
+ [並列クエリの I/O コスト](#aurora-mysql-parallel-query-cost)

### 利点
<a name="aurora-mysql-parallel-query-benefits"></a>

 パラレルクエリを使用すると、Aurora MySQL のテーブルに対してデータ集約型の分析クエリを実行できます。多くの場合、従来のようにクエリの処理を分ける場合よりもパフォーマンスが大幅に向上します。

 パラレルクエリを使用すると、次のような利点があります。
+  複数のストレージノード間で物理的な読み取りリクエストをパラレル処理するため、I/O パフォーマンスが向上しました。
+  ネットワークトラフィックの削減。Aurora は、ストレージノードからヘッドノードへデータページ全体を送信せず、その後不要な行および列をフィルタリングで除去します。代わりに、Aurora は、結果セットに必要な列値のみを含むコンパクトなタプルを送信します。
+  関数の処理、行のフィルタリング、および `WHERE` 句の列射影をプッシュダウンすることにより、ヘッドノードの CPU 使用率を削減しました。
+  バッファプールのメモリ負荷が低減されました。パラレルクエリによって処理されたページは、バッファプールに追加されません。これにより、データ集約型のスキャンで、頻繁に使用されるデータがバッファプールから削除されることが少なくなります。
+  既存のデータに対して長時間実行される分析クエリを実用的に実行することで、抽出、変換、ロード (ETL) パイプラインでのデータ重複を潜在的に削減します。

### アーキテクチャ
<a name="aurora-mysql-parallel-query-architecture"></a>

 パラレルクエリ機能は、Aurora MySQL の主なアーキテクチャ原則を使用して、ストレージサブシステムからデータベースエンジンをデカップリング、通信プロトコルを効率化してネットワークトラフィックを削減します。Aurora MySQL は、これらの技術を使用して、REDO ログ処理などの書き込み負荷の高いオペレーションを高速化します。パラレルクエリは、同じ原則を読み取り操作に適用します。

**注記**  
 Aurora MySQL パラレルクエリのアーキテクチャは、他のデータベースシステムで同様の名前を持つ機能のアーキテクチャとは異なります。Aurora MySQL のパラレルクエリは、対称型マルチプロセッシング (SMP) を利用しないため、データベースサーバーの CPU 容量に依存しません。パラレル処理は、クエリコーディネーターとして機能する Aurora MySQL サーバーとは独立して、ストレージレイヤーで行われます。

 デフォルトでは、パラレルクエリを使用しない場合の Aurora のクエリ処理では、Aurora クラスター内の単一のノード (*ヘッドノード*) に raw データが送られます。Aurora は、その単一ノード上の単一のスレッドで、その後のクエリの処理をすべて実行します。パラレルクエリでは、この I/O 集約型および CPU 集約型の作業の多くは、ストレージレイヤー内のノードに委譲されます。結果セットのコンパクトな行のみがヘッドノードに戻されます (行は既にフィルタリングされ、列の値は既に抽出され、変換されています)。パフォーマンスの利点は、ネットワークトラフィックの削減、ヘッドノードでの CPU 使用率の削減、ストレージノード間の I/O のパラレル化から得られます。パラレル I/O、フィルタリング、および射影の量は、クエリを実行する Aurora クラスター内の DB インスタンスの数に依存しません。

### 前提条件
<a name="aurora-mysql-parallel-query-prereqs"></a>

パラレルクエリのすべての機能を使用するには、バージョン 2.09 以上を実行している Aurora MySQL DB クラスターが必要です。パラレルクエリを使用したいクラスターが既にある場合は、互換性のあるバージョンにアップグレードしてからパラレルクエリを有効にすることができます。その場合、これらの新しいバージョンでは設定名とデフォルト値が異なるため、「[パラレルクエリのアップグレードに関する考慮事項](aurora-mysql-parallel-query-optimizing.md#aurora-mysql-parallel-query-upgrade)」のアップグレード手順に従ってください。

クラスターの DB インスタンスでは、`db.r*` インスタンスクラスを使用する必要があります。

クラスターでは、ハッシュ結合の最適化を必ず有効にしてください。この方法については、「[パラレルクエリクラスターのハッシュ結合の有効化](aurora-mysql-parallel-query-enabling.md#aurora-mysql-parallel-query-enabling-hash-join)」を参照してください。

 `aurora_parallel_query` や `aurora_disable_hash_join` などのパラメータをカスタマイズするには、クラスターで使用するカスタムパラメータグループが必要です。これらのパラメータは、DB パラメータグループを使用して DB インスタンスごとに個別に指定することもできます。ただし、DB クラスターパラメータグループで指定することをお勧めします。これにより、クラスターのすべての DB インスタンスでこれらのパラメータの同じ設定が継承されます。

### 制限
<a name="aurora-mysql-parallel-query-limitations"></a>

パラレルクエリ機能には、次の制限が適用されます。
+ 並列クエリは Aurora I/O-Optimized DB クラスターのストレージ設定ではサポートされていません。
+ db.t2 または db.t3 インスタンスクラスでは、パラレルクエリは使用できません。この制限は、`aurora_pq_force` セッション変数を使用してパラレルクエリを行う場合にも適用されます。
+ パラレルクエリは、`COMPRESSED` または `REDUNDANT` の行形式を使用するテーブルには適用されません。パラレルクエリを使用するテーブルには、`COMPACT` または `DYNAMIC` の行形式を使用してください。
+ Aurora では、コストに基づくアルゴリズムを使用して、それぞれの SQL ステートメントにパラレルクエリを使用するかどうかを判断します。ステートメントで特定の SQL コンストラクトを使用すると、パラレルクエリを防止したり、そのステートメントでパラレルクエリが行われる可能性を低くしたりすることができます。SQL コンストラクトとパラレルクエリの互換性については、「[Aurora MySQL の並列クエリ用の SQL コンストラクト](aurora-mysql-parallel-query-sql.md)」を参照してください。
+ 各 Aurora DB インスタンスは、一度に特定の数のパラレルクエリセッションのみを実行できます。クエリにサブクエリ、結合、または `UNION` 演算子などのパラレルクエリを使用する複数の部分がある場合、それらのフェーズは順番に実行されます。このステートメントは、一度に 1 つのパラレルクエリセッションとしてカウントされます。[パラレルクエリステータス可変](aurora-mysql-parallel-query-monitoring.md)を使用して、アクティブなセッションの数をモニタリングできます。ステータス可変 `Aurora_pq_max_concurrent_requests` を照会することで、特定の DB インスタンスの同時セッションの制限を確認できます。
+ パラレルクエリは、Aurora がサポートしているすべての AWS リージョンで利用できます。ほとんどの AWS リージョンの場合、パラレルクエリを使用するために必要な Aurora MySQL の最小バージョンは 2.09 です。
+ パラレルクエリは、データ集約型クエリのパフォーマンスを向上させるように設計されています。軽量のクエリ用向けには設計されていません。
+ SELECT ステートメント、特にデータ量の多いステートメントにはリーダーノードを使用することをお勧めします。

### 並列クエリの I/O コスト
<a name="aurora-mysql-parallel-query-cost"></a>

Aurora MySQL クラスターがパラレルクエリを使用している場合、`VolumeReadIOPS` 値が増加することがあります。パラレルクエリでは、バッファプールは使用されません。したがって、クエリは高速ですが、この最適化された処理により、読み取り操作とそれに関連する料金が増加する可能性があります。

クエリのパラレルクエリ I/O コストは、ストレージレイヤーで計測され、パラレルクエリがオンになっている場合と同じかそれ以上になります。利点は、クエリのパフォーマンスが向上することです。パラレルクエリで I/O コストが高くなる可能性がある理由は 2 つあります。
+ テーブル内のデータの一部がバッファプールにある場合でも、パラレルクエリでは、すべてのデータをストレージレイヤーでスキャンする必要があり、I/O コストが発生します。
+ パラレルクエリを実行しても、バッファプールはウォームアップされません。その結果、同じパラレルクエリを連続して実行すると、完全な I/O コストが発生します。

# Aurora MySQL での並列クエリ DB クラスターの作成
<a name="aurora-mysql-parallel-query-creating-cluster"></a>

 パラレルクエリを使用した Aurora MySQL クラスターの作成や、そのクラスターへの新しいインスタンスの追加、あるいは他の管理操作の実行には、他の Aurora MySQL クラスターと同様な、AWS マネジメントコンソール や AWS CLI のテクニックを使用します。パラレルクエリを処理するための新しいクラスターを作成できます。また、パラレルクエリを使用する DB クラスターは、MySQL と互換性がある Aurora DB クラスターのスナップショットから復元することによって作成することもできます。新しい Aurora MySQL クラスターを作成するプロセスに詳しくない場合は、「[Amazon Aurora DB クラスターの作成](Aurora.CreateInstance.md)」の背景情報と前提条件を参照してください。

Aurora MySQL のエンジンのバージョンを選択する場合は、利用可能な最新のバージョンを選択することをお勧めします。現在、すべての利用可能なバージョンの Aurora MySQL はパラレルクエリをサポートしています。最新のバージョンを使用している場合は、パラレルクエリのオン/オフを切り替えたり、既存のクラスターでパラレルクエリを使用したりする際の柔軟性が増します。

 新しいクラスターを作成する場合でも、スナップショットから復元する場合でも、同じテクニックを使用して、他の Aurora MySQL クラスターで行う新しい DB インスタンスを追加できます。

Amazon RDS コンソールまたは AWS CLI を使用して、並列クエリクラスターを作成できます。

**Contents**
+ [コンソールを使用したパラレルクエリクラスターの作成](#aurora-mysql-parallel-query-creating-cluster-console)
+ [CLI を使用したパラレルクエリクラスターの作成](#aurora-mysql-parallel-query-creating-cluster-cli)

## コンソールを使用したパラレルクエリクラスターの作成
<a name="aurora-mysql-parallel-query-creating-cluster-console"></a>

 次のように、コンソールで新しいパラレルクエリクラスターを作成できます。

**AWS マネジメントコンソール コンソールでパラレルクエリクラスターを作成するには**

1.  「AWS マネジメントコンソール」一般的な [Amazon Aurora DB クラスターの作成](Aurora.CreateInstance.md) の手順に従います。

1. **[エンジンのタイプ]** で、[Aurora MySQL] を選択します。

1. **[追加設定]** で、**[DB クラスターパラメータグループ]** のために作成したパラメータグループを選択します。Aurora MySQL 2.09 以上では、このようなカスタムパラメータグループを使用する必要があります。DB クラスターパラメータグループで、パラメータ設定の `aurora_parallel_query=ON` と `aurora_disable_hash_join=OFF` を指定します。これにより、クラスターでパラレルクエリが有効になり、パラレルクエリと組み合わせて使用するハッシュ結合の最適化が有効になります。

**新しいクラスターがパラレルクエリを使用できることを確認するには**

1. 上記の方法を使用してクラスターを作成します。

1. (Aurora MySQL バージョン 2 または 3 の場合) `aurora_parallel_query` の設定が true であることを確認します。

   ```
   mysql> select @@aurora_parallel_query;
   +-------------------------+
   | @@aurora_parallel_query |
   +-------------------------+
   |                       1 |
   +-------------------------+
   ```

1. (Aurora MySQL バージョン 2 の場合) `aurora_disable_hash_join` 設定が false になっていることを確認します。

   ```
   mysql> select @@aurora_disable_hash_join;
   +----------------------------+
   | @@aurora_disable_hash_join |
   +----------------------------+
   |                          0 |
   +----------------------------+
   ```

1.  いくつかの大きなテーブルとデータ集約型のクエリについて、クエリの計画を確認して、一部のクエリでパラレルクエリの最適化を使用していることを確認します。これを行うには、「[Aurora MySQL の並列クエリを使用しているステートメントの確認](aurora-mysql-parallel-query-verifying.md)」の手順に従います。

## CLI を使用したパラレルクエリクラスターの作成
<a name="aurora-mysql-parallel-query-creating-cluster-cli"></a>

 次のように、CLI で新しいパラレルクエリクラスターを作成できます。

**AWS CLI コンソールでパラレルクエリクラスターを作成するには**

1.  (オプション) パラレルクエリを使用するクラスターと互換性のある Aurora MySQL のバージョンを確認します。これを行うには、`describe-db-engine-versions` コマンドを使用して、`SupportsParallelQuery` フィールドの値を確認します。例については、「[パラレルクエリと Aurora MySQL のバージョンの互換性の確認](aurora-mysql-parallel-query-optimizing.md#aurora-mysql-parallel-query-checking-compatibility)」を参照してください。

1.  (オプション) `aurora_parallel_query=ON` 設定と `aurora_disable_hash_join=OFF` 設定を使用して、カスタム DB クラスターパラメータグループを作成します。以下のようなコマンドを使用します。

   ```
   aws rds create-db-cluster-parameter-group --db-parameter-group-family aurora-mysql8.0 --db-cluster-parameter-group-name pq-enabled-80-compatible
   aws rds modify-db-cluster-parameter-group --db-cluster-parameter-group-name pq-enabled-80-compatible \
     --parameters ParameterName=aurora_parallel_query,ParameterValue=ON,ApplyMethod=pending-reboot
   aws rds modify-db-cluster-parameter-group --db-cluster-parameter-group-name pq-enabled-80-compatible \
     --parameters ParameterName=aurora_disable_hash_join,ParameterValue=OFF,ApplyMethod=pending-reboot
   ```

    このステップを行う場合は、後続の `--db-cluster-parameter-group-name my_cluster_parameter_group` ステートメントで `create-db-cluster` オプションを指定します。パラメータグループの名前は、使用するものに置き換えてください。このステップを省略する場合は、「[Aurora MySQL での並列クエリのオン/オフの切り替え](aurora-mysql-parallel-query-enabling.md)」の説明に従って、後でパラメータグループを作成してクラスターに関連付けます。

1.  「AWS CLI」一般的な [Amazon Aurora DB クラスターの作成](Aurora.CreateInstance.md) の手順に従います。

1. 以下のオプションのセットを指定します。
   + `--engine` オプションでは、`aurora-mysql` を使用します。これらの値は、MySQL 5.7 または 8.0 と互換性があるパラレルクエリクラスターを生成します。
   +  `--db-cluster-parameter-group-name` オプションには、作成してパラメータの値に `aurora_parallel_query=ON` を指定した DB クラスターパラメータグループの名前を指定します。このオプションを省略すると、デフォルトのパラメータグループを使用してクラスターを作成してから、後でこのようなカスタムパラメータグループを使用するように変更できます。
   + `--engine-version` オプションには、パラレルクエリと互換性がある Aurora MySQL のバージョンを使用します。必要に応じて、「[Aurora MySQL での並列クエリの最適化パラレルクエリクラスターの計画](aurora-mysql-parallel-query-optimizing.md#aurora-mysql-parallel-query-planning)」の手順に従ってバージョンの一覧を取得します。

     次のサンプルはその方法を示しています。*\$1CLUSTER\$1ID* などの環境可変は、それぞれ使用する値に置き換えてください。この例では、`--manage-master-user-password` オプションも指定して、マスターユーザーパスワードを生成し、Secrets Manager で管理します。詳細については、「[Amazon Aurora および AWS Secrets Manager によるパスワード管理](rds-secrets-manager.md)」を参照してください。または、`--master-password` オプションを使用して、自分でパスワードを指定して管理することもできます。

     ```
     aws rds create-db-cluster --db-cluster-identifier $CLUSTER_ID \
       --engine aurora-mysql --engine-version 8.0.mysql_aurora.3.04.1 \
       --master-username $MASTER_USER_ID --manage-master-user-password \
       --db-cluster-parameter-group-name $CUSTOM_CLUSTER_PARAM_GROUP
     
     aws rds create-db-instance --db-instance-identifier ${INSTANCE_ID}-1 \
       --engine same_value_as_in_create_cluster_command \
       --db-cluster-identifier $CLUSTER_ID --db-instance-class $INSTANCE_CLASS
     ```

1. 作成または復元したクラスターにパラレルクエリ機能が使用可能であることを確認します。

   `aurora_parallel_query` 設定が存在することを確認します。この設定の値が 1 の場合は、パラレルクエリを使用する準備ができています。この設定の値が 0 の場合は、パラレルクエリを使用するために 1 に設定します。どちらの場合も、クラスターでパラレルクエリを実行できます。

   ```
   mysql> select @@aurora_parallel_query;
   +------------------------+
   | @@aurora_parallel_query|
   +------------------------+
   |                      1 |
   +------------------------+
   ```

**AWS CLI を使用してスナップショットをパラレルクエリクラスターに復元するには。**

1.  パラレルクエリを使用するクラスターと互換性のある Aurora MySQL のバージョンを確認します。これを行うには、`describe-db-engine-versions` コマンドを使用して、`SupportsParallelQuery` フィールドの値を確認します。例については、「[パラレルクエリと Aurora MySQL のバージョンの互換性の確認](aurora-mysql-parallel-query-optimizing.md#aurora-mysql-parallel-query-checking-compatibility)」を参照してください。復元したクラスターで使用するバージョンを決定します。

1.  Aurora MySQL 互換クラスターのスナップショットの位置を特定します。

1. 「AWS CLI」一般的な [DB クラスタースナップショットからの復元](aurora-restore-snapshot.md) の手順に従います。

   ```
   aws rds restore-db-cluster-from-snapshot \
     --db-cluster-identifier mynewdbcluster \
     --snapshot-identifier mydbclustersnapshot \
     --engine aurora-mysql
   ```

1.  作成または復元したクラスターにパラレルクエリ機能が使用可能であることを確認します。[CLI を使用したパラレルクエリクラスターの作成](#aurora-mysql-parallel-query-creating-cluster-cli) と同じ確認手順を使用してください。

# Aurora MySQL での並列クエリのオン/オフの切り替え
<a name="aurora-mysql-parallel-query-enabling"></a>

並列クエリが有効になっている場合、Aurora MySQL はランタイムにクエリごとにそれを使用するかを決定します。結合、ユニオン、サブクエリなどの場合、Aurora MySQL は各クエリブロックに対して実行時にパラレルクエリを使用するかどうかを決定します。詳細については、「[Aurora MySQL の並列クエリを使用しているステートメントの確認](aurora-mysql-parallel-query-verifying.md)」および「[Aurora MySQL の並列クエリ用の SQL コンストラクト](aurora-mysql-parallel-query-sql.md)」を参照してください。

**aurora\$1parallel\$1query** オプションを使用して、DB インスタンスのグローバルレベルとセッションレベルの両方でパラレルクエリのオン/オフを動的に切り替えることができます。DB クラスターグループの `aurora_parallel_query` の設定を変更すると、デフォルトのパラレルクエリの有効と無効を切り替えることができます。

```
mysql> select @@aurora_parallel_query;
+------------------------+
| @@aurora_parallel_query|
+------------------------+
|                      1 |
+------------------------+
```

 `aurora_parallel_query` パラメータをセッションレベルで切り替えるには、スタンダードの方法を使用してクライアントの設定を変更します。例えば、`mysql` コマンドラインや JDBC または ODBC アプリケーションで変更できます。このスタンダードの MySQL クライアントのコマンドは `set session aurora_parallel_query = {'ON'/'OFF'}` です。セッションレベルのパラメータを JDBC 構成またはアプリケーションコード内に追加して、パラレルクエリを動的にオンまたはオフにすることもできます。

 `aurora_parallel_query` パラメータの設定は、特定の DB インスタンスまたはクラスター全体に対して永続的に変更することができます。DB パラメータグループでこのパラメータの値を指定すると、その値はクラスターの特定の DB インスタンスにのみ適用されます。DB クラスターパラメータグループでこのパラメータの値を指定すると、クラスターのすべての DB インスタンスで同じ設定が継承されます。`aurora_parallel_query` パラメータをクラスターレベルで切り替えるには、「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」で説明されているパラメータグループの使用方法に従います。以下のステップに従ってください。

1.  カスタムクラスターパラメータグループ (推奨) またはカスタム DB パラメータグループを作成します。

1.  このパラメータグループで、`parallel_query` を必要な値に更新します。

1.  DB クラスターパラメータグループと DB パラメータグループのどちらを作成したかによって、パラレルクエリ機能を使用する Aurora クラスターまたは特定の DB インスタンスにパラメータグループをアタッチします。
**ヒント**  
`aurora_parallel_query` は動的パラメータであるため、この設定を変更した後にクラスターを再起動する必要はありません。ただし、このオプションを切り替える前に並行クエリを使用していた接続は、接続が閉じられるか、インスタンスが再起動されるまで、引き続き実行されます。

 パラレルクエリパラメータは、API オペレーションの [ModifyDBClusterParameterGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBClusterParameterGroup.html) や [ModifyDBParameterGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBParameterGroup.html) または AWS マネジメントコンソールを使用して変更できます。

並列クエリクラスターのハッシュ結合をオンにしたり、Amazon RDS コンソールまたは AWS CLI を使用して並列クエリのオンとオフを切り替えたり、並列クエリオプティマイザを上書きしたりすることができます。

**Contents**
+ [パラレルクエリクラスターのハッシュ結合の有効化](#aurora-mysql-parallel-query-enabling-hash-join)
+ [コンソールを使用したパラレルクエリのオン/オフを切り替える](#aurora-mysql-parallel-query-enabling-console)
+ [CLI を使用したパラレルクエリのオン/オフ切り替え](#aurora-mysql-parallel-query-enabling-cli)
+ [パラレルクエリオプティマイザの上書き](#aurora-mysql-parallel-query-enabling.aurora_pq_force)

## パラレルクエリクラスターのハッシュ結合の有効化
<a name="aurora-mysql-parallel-query-enabling-hash-join"></a>

パラレルクエリは通常、ハッシュ結合の最適化による利点がある、大量のリソースを使用する種類のクエリに使用されます。そのため、パラレルクエリを使用する予定のクラスターでハッシュ結合を有効にしておくと便利です。ハッシュ結合を効果的に使用する方法については、[ハッシュ結合を使用した大規模な Aurora MySQL 結合クエリの最適化](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.HashJoin) を参照してください。

## コンソールを使用したパラレルクエリのオン/オフを切り替える
<a name="aurora-mysql-parallel-query-enabling-console"></a>

 パラメータグループを使用して、DB インスタンスレベルまたは DB クラスターレベルでパラレルクエリをオン/オフに切り替えることができます。

**AWS マネジメントコンソール で DB クラスターのパラレルクエリをオンまたはオフにする方法**

1.  「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」の説明に従って、カスタムパラメータグループを作成します。

1. **aurora\$1parallel\$1query** を **1** (オン) または **0** (オフ) に更新します。パラレルクエリ特徴が利用可能なクラスターでは、**aurora\$1parallel\$1query** はデフォルトで無効になっています。

1.  カスタムクラスターパラメータグループを使用する場合は、パラレルクエリ機能を使用する Aurora DB クラスターにアタッチします。カスタム DB パラメータグループを使用する場合は、クラスターの 1 つ以上の DB インスタンスにアタッチします。クラスターパラメータグループを使用することをお勧めします。そうすることにより、クラスターのすべての DB インスタンスでパラレルクエリとそれに関連するハッシュ結合などの機能の設定が同じになります。

## CLI を使用したパラレルクエリのオン/オフ切り替え
<a name="aurora-mysql-parallel-query-enabling-cli"></a>

 パラレルクエリのパラメータは、`modify-db-cluster-parameter-group` または `modify-db-parameter-group` コマンドを使用して変更することができます。DB クラスターパラメータグループまたは DB パラメータグループのどちらを使用して `aurora_parallel_query` の値を指定するかに応じて、適切なコマンドを選択してください。

**CLI で DB クラスターのパラレルクエリを有効または無効にする方法**
+  パラレルクエリパラメータは、`modify-db-cluster-parameter-group` コマンドを使用して変更します。以下のようなコマンドを使用します。カスタムパラメータグループの名前は、使用する適切なものに置き換えてください。`ON` オプションの `OFF` の部分の `ParameterValue` または `--parameters` も置き換えてください。

  ```
  $ aws rds modify-db-cluster-parameter-group --db-cluster-parameter-group-name cluster_param_group_name \
    --parameters ParameterName=aurora_parallel_query,ParameterValue=ON,ApplyMethod=pending-reboot
  {
      "DBClusterParameterGroupName": "cluster_param_group_name"
  }
  
  aws rds modify-db-cluster-parameter-group --db-cluster-parameter-group-name cluster_param_group_name \
    --parameters ParameterName=aurora_pq,ParameterValue=ON,ApplyMethod=pending-reboot
  ```

 またセッションレベルでパラレルクエリを有効または無効にすることも可能で、例えば `mysql` コマンドライン経由や JDBC や ODBC アプリケーション内などで実行できます。これを行うには、スタンダードメソッドを使用してクライアントの構成設定を変更します。例えば、Aurora MySQL では、スタンダード MySQL クライアントに対するコマンドは `set session aurora_parallel_query = {'ON'/'OFF'}` です。

 セッションレベルのパラメータを JDBC 構成またはアプリケーションコード内に追加して、パラレルクエリを動的にオンまたはオフにすることもできます。

## パラレルクエリオプティマイザの上書き
<a name="aurora-mysql-parallel-query-enabling.aurora_pq_force"></a>

`aurora_pq_force` セッション変数を使用して、パラレルクエリオプティマイザを上書きし、クエリごとにパラレルクエリを行うことができます。これはテスト目的でのみ行うことをお勧めします。次の例では、セッションで `aurora_pq_force` を使用する方法を示します。

```
set SESSION aurora_parallel_query = ON;
set SESSION aurora_pq_force = ON;
```

上書きを無効にするには、以下の手順を実行します。

```
set SESSION aurora_pq_force = OFF;
```

# Aurora MySQL での並列クエリの最適化
<a name="aurora-mysql-parallel-query-optimizing"></a>

DB クラスターを並列クエリ用に最適化するには、どの DB クラスターが並列クエリの恩恵を受けられるか、また並列クエリ用にアップグレードするかどうかを検討します。次に、ワークロードを調整し、並列クエリ用のスキーマオブジェクトを作成します。

**Contents**
+ [パラレルクエリクラスターの計画](#aurora-mysql-parallel-query-planning)
  + [パラレルクエリと Aurora MySQL のバージョンの互換性の確認](#aurora-mysql-parallel-query-checking-compatibility)
+ [パラレルクエリのアップグレードに関する考慮事項](#aurora-mysql-parallel-query-upgrade)
  + [Aurora MySQL バージョン 3 への パラレルクエリクラスターのアップグレード](#aurora-mysql-parallel-query-upgrade-pqv2)
  + [Aurora MySQL 2.09 以降へのアップグレード](#aurora-mysql-parallel-query-upgrade-2.09)
+ [パラレルクエリのパフォーマンスチューニング](#aurora-mysql-parallel-query-performance)
+ [パラレルクエリを利用するためのスキーマオブジェクトの作成](#aurora-mysql-parallel-query-tables)

## パラレルクエリクラスターの計画
<a name="aurora-mysql-parallel-query-planning"></a>

パラレルクエリが有効な DB クラスターを計画するには、いくつかの選択を行う必要があります。これには、セットアップステップ (完全な Aurora MySQL クラスターの作成または復元) の実行、および DB クラスター全体でパラレルクエリを有効にする範囲の決定が含まれます。

計画の一環として、以下の点を検討してください。
+ MySQL 5.7 と互換性のある Aurora MySQL を使用する場合は、プロビジョニングされたクラスターを作成する必要があります。その上で、`aurora_parallel_query` パラメータを使用してパラレルクエリを有効にします。

  既存の Aurora MySQL クラスターがある場合は、パラレルクエリを使用するために新しいクラスターを作成する必要はありません。クラスターまたはクラスター内の特定の DB インスタンスを、 `aurora_parallel_query` パラメータが有効になっているパラメータグループに関連付けることができます。これにより、パラレルクエリで使用する関連データを設定する時間と手間を減らすことができます。
+ アクセス時にパラレルクエリを使用できるように見直す必要がある大きなテーブルについての計画を立てます。いくつかの大きなテーブルでは、パラレルクエリが役立つように新しいものを作成する必要がある場合があります。例えば、全文検索インデックスを削除するなどが必要になる場合があります。詳細については、「[パラレルクエリを利用するためのスキーマオブジェクトの作成](#aurora-mysql-parallel-query-tables)」を参照してください。

### パラレルクエリと Aurora MySQL のバージョンの互換性の確認
<a name="aurora-mysql-parallel-query-checking-compatibility"></a>

パラレルクエリを使用するクラスターと互換性のある Aurora MySQL のバージョンを確認するには、AWS CLI コマンドの `describe-db-engine-versions` を使用して、`SupportsParallelQuery` フィールドの値を確認します。次のコード例は、指定された AWS リージョンのパラレルクエリクラスターで使用可能な組み合わせを確認する方法を示しています。`--query` パラメータのすべての文字列は、必ず 1 行で指定してください。

```
aws rds describe-db-engine-versions --region us-east-1 --engine aurora-mysql \
--query '*[]|[?SupportsParallelQuery == `true`].[EngineVersion]' --output text
```

上記のコマンドを実行すると、次のような出力が返されます。この出力は、指定した AWS リージョンで使用可能な Aurora MySQL のバージョンによって異なります。

```
5.7.mysql_aurora.2.11.1
5.7.mysql_aurora.2.11.2
5.7.mysql_aurora.2.11.3
5.7.mysql_aurora.2.11.4
5.7.mysql_aurora.2.11.5
5.7.mysql_aurora.2.11.6
5.7.mysql_aurora.2.12.0
5.7.mysql_aurora.2.12.1
5.7.mysql_aurora.2.12.2
5.7.mysql_aurora.2.12.3
5.7.mysql_aurora.2.12.4
8.0.mysql_aurora.3.04.0
8.0.mysql_aurora.3.04.1
8.0.mysql_aurora.3.04.2
8.0.mysql_aurora.3.04.3
8.0.mysql_aurora.3.05.2
8.0.mysql_aurora.3.06.0
8.0.mysql_aurora.3.06.1
8.0.mysql_aurora.3.07.0
8.0.mysql_aurora.3.07.1
```

 クラスターでパラレルクエリの使用をスタートしたら、パフォーマンスをモニタリングして、パラレルクエリを使用する上での障害を取り除くことができます。これらの手順については、「[パラレルクエリのパフォーマンスチューニング](#aurora-mysql-parallel-query-performance)」を参照してください。

## パラレルクエリのアップグレードに関する考慮事項
<a name="aurora-mysql-parallel-query-upgrade"></a>

 パラレルクエリクラスターをアップグレードする際の元のバージョンと移行先のバージョンによっては、パラレルクエリで最適化できるクエリのタイプが強化される場合があります。またパラレルクエリに特別なエンジンモードパラメータを指定する必要がないこともあります。次のセクションでは、パラレルクエリが有効になっているクラスターをアップグレードする際の考慮事項について説明します。

### Aurora MySQL バージョン 3 への パラレルクエリクラスターのアップグレード
<a name="aurora-mysql-parallel-query-upgrade-pqv2"></a>

 SQL ステートメント、句、およびデータタイプのいくつかには、Aurora MySQL バージョン 3 からスタートした新しいパラレルクエリサポートまたは改善されたサポートが含まれています。バージョン 3 より前のリリースからアップグレードする場合は、追加のクエリがパラレルクエリ最適化の恩恵を受けることができるかどうかをチェックしてください。これらのパラレルクエリの強化については、[列のデータ型](aurora-mysql-parallel-query-sql.md#aurora-mysql-parallel-query-sql-datatypes)、[パーティションテーブル](aurora-mysql-parallel-query-sql.md#aurora-mysql-parallel-query-sql-partitioning)、および [集計関数、GROUP BY 句、HAVING 句](aurora-mysql-parallel-query-sql.md#aurora-mysql-parallel-query-sql-aggregation) を参照してください。

Aurora MySQL 2.08 以前からパラレルクエリクラスターをアップグレードする場合は、パラレルクエリを有効にする方法の変更についても確認してください。これを行うには、[Aurora MySQL 2.09 以降へのアップグレード](#aurora-mysql-parallel-query-upgrade-2.09) を読んでください。

Aurora MySQL バージョン 3 では、ハッシュ結合の最適化はデフォルトで有効になっています。以前のバージョンからの `aurora_disable_hash_join` 設定オプションは使用されません。

### Aurora MySQL 2.09 以降へのアップグレード
<a name="aurora-mysql-parallel-query-upgrade-2.09"></a>

Aurora MySQL バージョン 2.09 以上では、パラレルクエリはプロビジョニングされたクラスターで使用できるため、`parallelquery` エンジンモードパラメータは必要ありません。そのため、これらのバージョンでパラレルクエリを使用するために新しいクラスターを作成したり、既存のスナップショットから復元したりする必要はありません。これらのバージョンでは、「[Aurora MySQL DB クラスターのマイナーバージョンまたはパッチレベルのアップグレード](AuroraMySQL.Updates.Patching.md)」で説明されているアップグレード手順に従ってクラスターをアップグレードできます。古いクラスターでは、パラレルクエリを使用するクラスターかプロビジョニングされたクラスターかにかかわらずアップグレードできます。[**Engine version (エンジンバージョン)**] メニューの選択肢の数を減らすには、[**Show versions that support the parallel query feature (パラレルクエリ機能がサポートされているバージョンを表示)**] をオンにしてメニューのエントリをフィルタリングします。その上で、Aurora MySQL 2.09 以上を選択します。

以前のパラレルクエリクラスターを Aurora MySQL 2.09 以上にアップグレードした後、アップグレードしたクラスターでパラレルクエリを有効にします。これらのバージョンではパラレルクエリはデフォルトで無効になっており、有効にする手順も異なります。またハッシュ結合の最適化もデフォルトで無効になっているため、個別に有効にする必要があります。そのため、アップグレード後にはこれらの設定をもう一度有効にしてください。その手順については、「[Aurora MySQL での並列クエリのオン/オフの切り替え](aurora-mysql-parallel-query-enabling.md)」および「[パラレルクエリクラスターのハッシュ結合の有効化](aurora-mysql-parallel-query-enabling.md#aurora-mysql-parallel-query-enabling-hash-join)」を参照してください。

特に、`aurora_pq_supported` と `aurora_pq` ではなく、`aurora_parallel_query=ON` と `aurora_disable_hash_join=OFF` の設定パラメータを使用してパラレルクエリを有効にするようにしてください。`aurora_pq_supported` パラメータと `aurora_pq` パラメータは、Aurora MySQL の新しいバージョンでは非推奨になっています。

 アップグレードしたクラスターでは、`EngineMode` 属性の値は `provisioned` ではなく、`parallelquery` になります。指定したエンジンバージョンでパラレルクエリが使用できるかどうかを確認するには、`SupportsParallelQuery` コマンドの `describe-db-engine-versions` の出力の AWS CLI フィールドの値を確認します。Aurora MySQL の以前のバージョンでは、`parallelquery` の一覧に `SupportedEngineModes` があることを確認していました。

Aurora MySQL バージョン 2.09 以上にアップグレードすると、以下の機能を利用できるようになります。これらの機能は、Aurora MySQL の古いバージョンが実行されているパラレルクエリを使用するクラスターでは使用できません。
+ パフォーマンスインサイト。詳細については、「[Amazon Aurora での Performance Insights を使用したDB 負荷のモニタリング](USER_PerfInsights.md)」を参照してください。
+ バックトラック。詳細については、「[Aurora DB クラスターのバックトラック](AuroraMySQL.Managing.Backtrack.md)」を参照してください。
+ クラスターの停止とスタート。詳細については、「[Amazon Aurora DB クラスターの停止と開始](aurora-cluster-stop-start.md)」を参照してください。

## パラレルクエリのパフォーマンスチューニング
<a name="aurora-mysql-parallel-query-performance"></a>

 パラレルクエリを使用してワークロードのパフォーマンスを管理するには、この最適化が最も役立つクエリに対してパラレルクエリが使用されていることを確認します。

 そのためには、以下を実行できます。
+  大きなテーブルがパラレルクエリと互換性があるようにします。テーブルのプロパティを変更したり、一部のテーブルを作成し直したりして、それらのテーブルに対するクエリでパラレルクエリの最適化を利用できるようにします。この方法については、「[パラレルクエリを利用するためのスキーマオブジェクトの作成](#aurora-mysql-parallel-query-tables)」を参照してください。
+  パラレルクエリを使用するクエリをモニタリングします。この方法については、「[Aurora MySQL の並列クエリのモニタリング](aurora-mysql-parallel-query-monitoring.md)」を参照してください。
+  パラレルクエリが最もデータ集約型で実行に時間がかかるクエリに使用され、ワークロードに適したレベルの同時実行性があることを確認します。この方法については、「[Aurora MySQL の並列クエリを使用しているステートメントの確認](aurora-mysql-parallel-query-verifying.md)」を参照してください。
+  SQL コードを調整し、パラレルクエリを有効にして目的のクエリに適用します。この方法については、「[Aurora MySQL の並列クエリ用の SQL コンストラクト](aurora-mysql-parallel-query-sql.md)」を参照してください。

## パラレルクエリを利用するためのスキーマオブジェクトの作成
<a name="aurora-mysql-parallel-query-tables"></a>

 パラレルクエリで使用するテーブルを作成または変更するには、「[前提条件](aurora-mysql-parallel-query.md#aurora-mysql-parallel-query-prereqs)」および「[制限](aurora-mysql-parallel-query.md#aurora-mysql-parallel-query-limitations)」で説明されている要件を理解しておく必要があります。

 パラレルクエリでは、テーブルに `ROW_FORMAT=Compact` または `ROW_FORMAT=Dynamic` の設定が使用されている必要があるため、Aurora の設定で `INNODB_FILE_FORMAT` 設定オプションへの変更を確認してください。`SHOW TABLE STATUS` ステートメントを発行して、データベース内のすべてのテーブルの行形式を確認します。

 より多くのテーブルを処理するためにパラレルクエリをオンにするようにスキーマを変更する前に、必ずテストを行ってください。テストでは、パラレルクエリによってそれらのテーブルのパフォーマンスが実際に向上するかどうかを確認する必要があります。また、パラレルクエリのスキーマ要件が目標に適合していることを確認してください。

 例えば、`ROW_FORMAT=Compressed` から `ROW_FORMAT=Compact` または `ROW_FORMAT=Dynamic` に切り替える前には、元のテーブルと新しいテーブルでワークロードのパフォーマンスをテストします。また、データ量の増加などの潜在的な影響も考慮してください。

# Aurora MySQL の並列クエリを使用しているステートメントの確認
<a name="aurora-mysql-parallel-query-verifying"></a>

 一般的な操作では、パラレルクエリを利用するために特別なアクションを実行する必要はありません。クエリがパラレルクエリの必須要件を満たした後、クエリオプティマイザは、特定のクエリごとにパラレルクエリを使用するかどうかを自動的に決定します。

 開発環境やテスト環境で実験を行うと、テーブルの行数や全体のデータ量が少ないためにパラレルクエリが使用されないことがあります。特に実験を実行するために最近作成したテーブルの場合、テーブルのデータも完全にバッファプールにある可能性があります。

 クラスターのパフォーマンスをモニタリングまたは調整する場合は、パラレルクエリが適切な状況で使用されているかどうかを確認する必要があります。この機能を利用するには、データベースのスキーマ、設定、SQL クエリ、またはクラスタートポロジとアプリケーションの接続設定を調整する必要があります。

 クエリでパラレルクエリが使用されているかどうかを確認するには、[EXPLAIN](https://dev.mysql.com/doc/refman/5.7/en/execution-plan-information.html) ステートメントを実行してクエリプラン (explain プラン) を確認します。パラレルクエリの `EXPLAIN` 出力に SQL ステートメント、句および表現がどのように影響するかの例は、「[Aurora MySQL の並列クエリ用の SQL コンストラクト](aurora-mysql-parallel-query-sql.md)」を参照してください。

 次の例は、従来のクエリプランとパラレルクエリプランの違いを示しています。この explain プランは、TPC-H ベンチマークのクエリ 3 のものです。このセクションのサンプルクエリの多くは、TPC-H データセットのテーブルを使用しています。テーブル定義、クエリ、サンプルデータを生成する `dbgen` プログラムは、[TPC-H のウェブサイト](http://www.tpc.org/tpch/)から入手できます。

```
EXPLAIN SELECT l_orderkey,
  sum(l_extendedprice * (1 - l_discount)) AS revenue,
  o_orderdate,
  o_shippriority
FROM customer,
  orders,
  lineitem
WHERE c_mktsegment = 'AUTOMOBILE'
AND c_custkey = o_custkey
AND l_orderkey = o_orderkey
AND o_orderdate < date '1995-03-13'
AND l_shipdate > date '1995-03-13'
GROUP BY l_orderkey,
  o_orderdate,
  o_shippriority
ORDER BY revenue DESC,
  o_orderdate LIMIT 10;
```

 デフォルトでは、クエリには以下のようなプランがあります。クエリプランでハッシュ結合が使用されていない場合は、初期に最適化がオンになっていることを確認してください。

```
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------------------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows     | filtered | Extra                                              |
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------------------+
|  1 | SIMPLE      | customer | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  1480234 |    10.00 | Using where; Using temporary; Using filesort       |
|  1 | SIMPLE      | orders   | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 14875240 |     3.33 | Using where; Using join buffer (Block Nested Loop) |
|  1 | SIMPLE      | lineitem | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 59270573 |     3.33 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------------------+
```

Aurora MySQL バージョン 3 の場合、次のステートメントを発行すると、セッションレベルでハッシュ結合を有効にできます。

```
SET optimizer_switch='block_nested_loop=on';
```

Aurora MySQL バージョン 2.09 以降では、`aurora_disable_hash_join` DB パラメーターまたは DB クラスターパラメータを `0` (オフ) に設定します。`aurora_disable_hash_join` をオフにすると、`optimizer_switch` の値が `hash_join=on` に設定されます。

ハッシュ結合を有効にした後、`EXPLAIN` ステートメントをもう一度実行してみてください。ハッシュ結合を効果的に使用する方法については、[ハッシュ結合を使用した大規模な Aurora MySQL 結合クエリの最適化](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.HashJoin) を参照してください。

 ハッシュ結合がオンになっているがパラレルクエリがオフになっている場合、クエリには次のようなプランが含まれる可能性があります。これは、ハッシュ結合を使用しますが、パラレルクエリは使用しません。

```
+----+-------------+----------+...+-----------+-----------------------------------------------------------------+
| id | select_type | table    |...| rows      | Extra                                                           |
+----+-------------+----------+...+-----------+-----------------------------------------------------------------+
|  1 | SIMPLE      | customer |...|   5798330 | Using where; Using index; Using temporary; Using filesort       |
|  1 | SIMPLE      | orders   |...| 154545408 | Using where; Using join buffer (Hash Join Outer table orders)   |
|  1 | SIMPLE      | lineitem |...| 606119300 | Using where; Using join buffer (Hash Join Outer table lineitem) |
+----+-------------+----------+...+-----------+-----------------------------------------------------------------+
```

 パラレルクエリが有効になると、`EXPLAIN` 出力の `Extra` カラムに表示されるように、このクエリプランの 2 つのステップでパラレルクエリの最適化が使用できます。これらのステップに対する I/O 集約型および CPU 集約型の処理は、ストレージレイヤーにプッシュダウンされます。

```
+----+...+--------------------------------------------------------------------------------------------------------------------------------+
| id |...| Extra                                                                                                                          |
+----+...+--------------------------------------------------------------------------------------------------------------------------------+
|  1 |...| Using where; Using index; Using temporary; Using filesort                                                                      |
|  1 |...| Using where; Using join buffer (Hash Join Outer table orders); Using parallel query (4 columns, 1 filters, 1 exprs; 0 extra)   |
|  1 |...| Using where; Using join buffer (Hash Join Outer table lineitem); Using parallel query (4 columns, 1 filters, 1 exprs; 0 extra) |
+----+...+--------------------------------------------------------------------------------------------------------------------------------+
```

 パラレルクエリの出力およびパラレルクエリが適用できる SQL ステートメントの部分の `EXPLAIN` 出力を解釈する方法については、「[Aurora MySQL の並列クエリ用の SQL コンストラクト](aurora-mysql-parallel-query-sql.md)」を参照してください。

 次の出力例は、コールドバッファプールを持つ db.r4.2xlarge インスタンスで前のクエリを実行した結果を示しています。パラレルクエリを使用すると、クエリが大幅に高速化されます。

**注記**  
 タイミングは多くの環境要因に依存するため、結果が異なる場合があります。自分の環境、ワークロードなどで結果を確認するには、常に独自のパフォーマンステストを実施してください。

```
-- Without parallel query
+------------+-------------+-------------+----------------+
| l_orderkey | revenue     | o_orderdate | o_shippriority |
+------------+-------------+-------------+----------------+
|   92511430 | 514726.4896 | 1995-03-06  |              0 |
.
.
|   28840519 | 454748.2485 | 1995-03-08  |              0 |
+------------+-------------+-------------+----------------+
10 rows in set (24 min 49.99 sec)
```

```
-- With parallel query
+------------+-------------+-------------+----------------+
| l_orderkey | revenue     | o_orderdate | o_shippriority |
+------------+-------------+-------------+----------------+
|   92511430 | 514726.4896 | 1995-03-06  |              0 |
.
.
|   28840519 | 454748.2485 | 1995-03-08  |              0 |
+------------+-------------+-------------+----------------+
10 rows in set (1 min 49.91 sec)
```

 このセクション全体のサンプルクエリの多くは、この TPC-H データセットのテーブル、特に 2000 万行と以下の定義を持つ `PART` テーブルを使用しています。

```
+---------------+---------------+------+-----+---------+-------+
| Field         | Type          | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| p_partkey     | int(11)       | NO   | PRI | NULL    |       |
| p_name        | varchar(55)   | NO   |     | NULL    |       |
| p_mfgr        | char(25)      | NO   |     | NULL    |       |
| p_brand       | char(10)      | NO   |     | NULL    |       |
| p_type        | varchar(25)   | NO   |     | NULL    |       |
| p_size        | int(11)       | NO   |     | NULL    |       |
| p_container   | char(10)      | NO   |     | NULL    |       |
| p_retailprice | decimal(15,2) | NO   |     | NULL    |       |
| p_comment     | varchar(23)   | NO   |     | NULL    |       |
+---------------+---------------+------+-----+---------+-------+
```

 ワークロードを試して、個々の SQL ステートメントがパラレルクエリを利用できるかどうかを理解してください。次に、以下のモニタリング方法を使用して、実際のワークロードでパラレルクエリが使用される頻度を時間をかけて確認します。実際のワークロードでは、同時実行制限などの追加の要素が適用されます。

# Aurora MySQL の並列クエリのモニタリング
<a name="aurora-mysql-parallel-query-monitoring"></a>

 Aurora MySQL クラスターがパラレルクエリを使用している場合、`VolumeReadIOPS` 値が増加することがあります。パラレルクエリでは、バッファプールは使用されません。したがって、クエリは高速ですが、この最適化された処理により、読み取り操作とそれに関連する料金が増加する可能性があります。

 [Amazon RDS コンソールでのメトリクスの表示](USER_Monitoring.md) で説明されている Amazon CloudWatch メトリクスに加えて、Aurora は他のグローバルなステータス可変を提供します。これらのグローバルステータス可変を使用して、パラレルクエリの実行のモニタリングに役立てることができます。これらの変数からは、オプティマイザが特定の状況でパラレルクエリを使用したり、使用しなかったりする理由についてのインサイトを得ることができます。これらの可変にアクセスするには、`[SHOW GLOBAL STATUS](https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html)` コマンドを使用します。これらの可変は次のとおりです。

 パラレルクエリセッションは、データベースによって実行されるクエリと必ずしも 1 対 1 のマッピングにはなっていません。例えば、クエリプランにパラレルクエリを使用する 2 つのステップがあるとします。この場合、クエリには 2 つのパラレルセッションが含まれ、試行された要求と成功したリクエストのカウンターは 2 つずつ増分されます。

 `EXPLAIN` ステートメントを発行してパラレルクエリを試してみると、実際にはクエリが実行されていなくても「選択されていません」と指定されたカウンターの増加が見込まれます。本稼働環境でパラレルクエリを処理する場合、「選択されていない」カウンターが予想どおりに高速に増加しているかどうかを確認できます。その段階で、目的のクエリでパラレルクエリが実行されるように調整できます。これを行うには、パラレルクエリが有効になっている クラスターの設定、クエリの組み合わせ、DB インスタンスなどを変更します。

 これらのカウンターは、DB インスタンスレベルで追跡されます。別のエンドポイントに接続すると、各 DB インスタンスが独自のパラレルクエリセットを実行するため、別のメトリクスが表示されることがあります。リーダーエンドポイントがセッションごとに異なる DB インスタンスに接続すると、別のメトリクスが表示されることもあります。


| 名前 | 説明 | 
| --- | --- | 
|  `Aurora_pq_bytes_returned`  |  パラレルクエリ中にヘッドノードに送信されたタプルデータ構造のバイト数。`Aurora_pq_pages_pushed_down` と比較するために 16,384 で割ります。  | 
|  `Aurora_pq_max_concurrent_requests`  |  この Aurora DB インスタンスで同時に実行できるパラレルクエリセッションの最大数。これは、AWS の DB インスタンスクラスによって異なる固定の数です。  | 
|  `Aurora_pq_pages_pushed_down`  |  パラレルクエリがヘッドノードへのネットワーク送信を回避したデータページ数 (それぞれ 16 KiB の固定サイズ)。  | 
|  `Aurora_pq_request_attempted`  |  リクエストされたパラレルクエリセッションの数。この値は、サブクエリや結合などの SQL 構成に応じて、クエリごとに複数のセッションを表す場合があります。  | 
|  `Aurora_pq_request_executed`  |  パラレルクエリセッションの数は正常に実行されます。  | 
|  `Aurora_pq_request_failed`  |  クライアントにエラーを戻したパラレルクエリセッションの数。場合によっては、例えば、ストレージレイヤーの問題のために、パラレルクエリのリクエストが失敗することがあります。このような場合、失敗したクエリ部分は、非パラレルクエリメカニズムを使用して再試行されます。再試行されたクエリも失敗すると、エラーがクライアントに返され、このカウンターが増分されます。  | 
|  `Aurora_pq_request_in_progress`  |  現在進行中のパラレルクエリセッションの数。この数は、Aurora DB クラスター全体ではなく、接続している特定の Aurora DB インスタンスのものが適用されます。DB インスタンスが同時実行の制限に近いかどうかを調べるには、この値を `Aurora_pq_max_concurrent_requests` と比較します。  | 
|  `Aurora_pq_request_not_chosen`  |  クエリを満たすためにパラレルクエリが選択されなかった回数。この値は、他のいくつかのより細かいカウンターの合計です。`EXPLAIN` ステートメントでは、クエリが実際に実行されていない場合でもこのカウンターは増加します。  | 
|  `Aurora_pq_request_not_chosen_below_min_rows`  |  テーブル内の行数のためにパラレルクエリが選択されなかった回数。`EXPLAIN` ステートメントでは、クエリが実際に実行されていない場合でもこのカウンターは増加します。  | 
|  `Aurora_pq_request_not_chosen_column_bit`  |  射影された列の中にサポートされていないデータ型があるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_column_geometry`  |  テーブルに `GEOMETRY` データ型の列があるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。この制限を解除する Aurora MySQL のバージョンについては、[Aurora MySQL バージョン 3 への パラレルクエリクラスターのアップグレード](aurora-mysql-parallel-query-optimizing.md#aurora-mysql-parallel-query-upgrade-pqv2) を参照してください。  | 
|  `Aurora_pq_request_not_chosen_column_lob`  |  `LOB` データタイプ、または宣言された長さのため外部に保存された `VARCHAR` カラムをテーブルが持っていることが原因で、非パラレルクエリの処理パスを使用したパラレルクエリのリクエスト数。この制限を解除する Aurora MySQL のバージョンについては、[Aurora MySQL バージョン 3 への パラレルクエリクラスターのアップグレード](aurora-mysql-parallel-query-optimizing.md#aurora-mysql-parallel-query-upgrade-pqv2) を参照してください。  | 
|  `Aurora_pq_request_not_chosen_column_virtual`  |  テーブルに仮想列があるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_custom_charset`  |  テーブルにカスタム文字セットの列があるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_fast_ddl`  |  テーブルが高速 DDL の `ALTER` ステートメントによって変更中であるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_few_pages_outside_buffer_pool`  |  パラレルクエリを価値のあるものにするためのバッファされていないテーブルデータが十分ないため、テーブルデータの 95 パーセント未満がバッファプールにあったにもかかわらず、パラレルクエリの回数は選択されませんでした。  | 
|  `Aurora_pq_request_not_chosen_full_text_index`  |  テーブルに全文インデックスがあるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_high_buffer_pool_pct`  |  テーブルデータの高パーセンテージ (現在は 95 パーセント以上) が既にバッファプールに入っていたため、パラレルクエリが選択されなかった回数。このような場合、オプティマイザは、バッファプールからのデータの読取りがより効率的であると判断します。`EXPLAIN` ステートメントでは、クエリが実際に実行されていない場合でもこのカウンターは増加します。  | 
|  `Aurora_pq_request_not_chosen_index_hint`  |  クエリにインデックスヒントが含まれているために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_innodb_table_format`  |  テーブルが、サポートされていない InnoDB の行形式を使用しているために、パラレルクエリ以外の処理方法が適用されるパラレルクエリのリクエスト数。Aurora のパラレルクエリは、`COMPACT`、`REDUNDANT`,および `DYNAMIC` の行形式にのみ適用されます。  | 
|  `Aurora_pq_request_not_chosen_long_trx`  |  長時間実行トランザクション内でクエリがスタートされているために、非パラレルクエリ処理パスを使用したパラレルクエリリクエストの数。`EXPLAIN` ステートメントでは、クエリが実際に実行されていない場合でもこのカウンターは増加します。  | 
|  `Aurora_pq_request_not_chosen_no_where_clause`  |  クエリに `WHERE` 句がないために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_range_scan`  |  インデックスの範囲スキャンを使用しているために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_row_length_too_long`  |  すべての列の合計長が長すぎるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_small_table`  |  行数および平均行長によって決定される、テーブルの全体的なサイズのためにパラレルクエリが選択されなかった回数。`EXPLAIN` ステートメントでは、クエリが実際に実行されていない場合でもこのカウンターは増加します。  | 
|  `Aurora_pq_request_not_chosen_temporary_table`  |  クエリでサポートされていない `MyISAM` また `memory` テーブルタイプを使用しているテンポラリテーブルを参照しているために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_tx_isolation`  |  クエリでサポートされていないトランザクション分離レベルを使用しているために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。リーダー DB インスタンスでは、パラレルクエリは `REPEATABLE READ` および `READ COMMITTED` 分離レベルにのみ適用されます。  | 
|  `Aurora_pq_request_not_chosen_update_delete_stmts`  |  クエリが `UPDATE` または `DELETE` ステートメントの一部であるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_unsupported_access`  |  `WHERE` 句がパラレルクエリの基準を満たしていないために、非パラレルクエリ処理パスを使用するパラレルクエリリクエストの数。この結果は、クエリがデータ集約型スキャンを必要としない場合、またはクエリが `DELETE` または `UPDATE` ステートメントである場合に発生します。  | 
|  `Aurora_pq_request_not_chosen_unsupported_storage_type`  |  Aurora MySQL DB クラスターがサポートされている Aurora クラスターストレージ設定を使用していないために非並列クエリ処理パスを使用する並列クエリリクエストの数。このパラメータは、Aurora MySQL バージョン 3.04 以降で使用できます。詳細については、「[制限](aurora-mysql-parallel-query.md#aurora-mysql-parallel-query-limitations)」を参照してください。  | 
|  `Aurora_pq_request_throttled`  |  特定の Aurora DB インスタンスで既に実行されている同時パラレルクエリの最大数のために、パラレルクエリが選択されなかった回数。  | 

# Aurora MySQL の並列クエリ用の SQL コンストラクト
<a name="aurora-mysql-parallel-query-sql"></a>

 このセクションでは、特定の SQL ステートメントでパラレルクエリが使用される理由と使用されない理由について詳しく説明します。また、Aurora MySQL の機能とパラレルクエリのインタラクションについても説明します。これらの内容は、パラレルクエリを使用するクラスターのパフォーマンスの問題を診断したり、特定のワークロードにパラレルクエリがどのように適用されるかを理解したりするために役立ちます。

 パラレルクエリを使用するかどうかの決定は、ステートメントが実行される時点で発生する多くの要因に依存します。したがって、パラレルクエリは、特定の条件の下で常に使用される、特定の条件の下では決して使用されない、または特定の条件の下でのみ使用される特定のクエリに対して使用される可能性があります。

**ヒント**  
 以下の例を HTML で表示している場合は、記載されている各コードの右上隅にある**コピー**ウィジェットを使用して SQL コードをコピーして使用することができます。この**コピー**ウィジェットを使用すると、`mysql>` プロンプトとそれに続く `->` の行の周りの余分な文字がコピーされません。

**Topics**
+ [EXPLAIN ステートメント](#aurora-mysql-parallel-query-sql-explain)
+ [WHERE 句](#aurora-mysql-parallel-query-sql-where)
+ [データ定義言語 (DDL)](#aurora-mysql-parallel-query-sql-ddl)
+ [列のデータ型](#aurora-mysql-parallel-query-sql-datatypes)
+ [パーティションテーブル](#aurora-mysql-parallel-query-sql-partitioning)
+ [集計関数、GROUP BY 句、HAVING 句](#aurora-mysql-parallel-query-sql-aggregation)
+ [WHERE 句での関数呼び出し](#aurora-mysql-parallel-query-sql-functions)
+ [LIMIT 句](#aurora-mysql-parallel-query-sql-limit)
+ [比較演算子](#aurora-mysql-parallel-query-sql-comparisons)
+ [Joins](#aurora-mysql-parallel-query-sql-joins)
+ [サブクエリ](#aurora-mysql-parallel-query-sql-subqueries)
+ [UNION](#aurora-mysql-parallel-query-sql-union)
+ [ビュー](#aurora-mysql-parallel-query-sql-views)
+ [データ操作言語 (DML) ステートメント](#aurora-mysql-parallel-query-sql-dml)
+ [トランザクションとロック](#aurora-mysql-parallel-query-sql-transactions)
+ [B ツリーインデックス](#aurora-mysql-parallel-query-sql-indexes)
+ [全文検索 (FTS) インデックス](#aurora-mysql-parallel-query-sql-fts)
+ [仮想列](#aurora-mysql-parallel-query-sql-virtual-column)
+ [組み込みキャッシュメカニズム](#aurora-mysql-parallel-query-sql-caching)
+ [オプティマイザヒント](#aurora-mysql-parallel-query-hints)
+ [MyISAM テンポラリテーブル](#aurora-mysql-parallel-query-sql-myisam)

## EXPLAIN ステートメント
<a name="aurora-mysql-parallel-query-sql-explain"></a>

 このセクションの例で示すように、`EXPLAIN` ステートメントは、クエリの各ステージが現在パラレルクエリに適しているかどうかを示します。また、クエリのどの側面をストレージレイヤーにプッシュダウンできるかを示します。以下に、クエリプランで最も重要な点を示します。
+  `NULL` 列の `key` 以外の値は、インデックスのルックアップを使用してクエリを効率的に実行できることを示しています。またパラレルクエリは効率的には実行できません。
+  `rows` 列の値が小さい場合 (値が百万単位に達しない場合) は、クエリでアクセスしているデータがパラレルクエリが役立つほどの量ではないことを示しています。そのため、パラレルクエリが使用されることはあまりありません。
+  `Extra` 列には、パラレルクエリを使用することが予想されるかどうかを示します。この出力は、次の例のようになります。

  ```
  Using parallel query (A columns, B filters, C exprs; D extra)
  ```

   `columns` の数は、クエリブロックで参照される列の数を表します。

   `filters` の数は、列の値と定数の簡単な比較を表す `WHERE` 述語の数を表します。比較には、等価、不等値、または範囲を使用することができます。Aurora は、これらの種類の述語を最も効果的にパラレル化できます。

   `exprs` の数は、関数呼び出し、演算子、またはパラレル化できる他の表現の数を表しますが、フィルター条件ほど効果的ではありません。

   `extra` の数は、プッシュダウンできず、ヘッドノードによって実行される表現の数を表します。

 例えば、次の `EXPLAIN` 出力を考えてみます。

```
mysql> explain select p_name, p_mfgr from part
    -> where p_brand is not null
    -> and upper(p_type) is not null
    -> and round(p_retailprice) is not null;
+----+-------------+-------+...+----------+----------------------------------------------------------------------------+
| id | select_type | table |...| rows     | Extra                                                                      |
+----+-------------+-------+...+----------+----------------------------------------------------------------------------+
|  1 | SIMPLE      | part  |...| 20427936 | Using where; Using parallel query (5 columns, 1 filters, 2 exprs; 0 extra) |
+----+-------------+-------+...+----------+----------------------------------------------------------------------------+
```

 `Extra` 列の情報は、各行から 5 つの列が抽出され、クエリ条件を評価し結果セットを構成することを示しています。1 つの `WHERE` 述語にはフィルター、つまり `WHERE` 句で直接テストされた列が含まれます。2 つの `WHERE` 句では、この場合は関数呼び出しを含む、より複雑な表現を評価する必要があります。`0 extra` フィールドは、`WHERE` 句のすべての操作がパラレルクエリ処理の一部としてストレージレイヤーにプッシュダウンされることを確認します。

 パラレルクエリが選択されていない場合は、通常、`EXPLAIN` 出力の他の列から理由を推測できます。例えば、`rows` 値が小さすぎたり、`possible_keys` 列が、データ集約型スキャンではなくインデックスルックアップを使用できることを示します。次の例は、オプティマイズがクエリでスキャンする行の数が少ないとみなすクエリを示しています。これは、主キーの文字数に基づいて判断されます。この場合、パラレルクエリは不要です。

```
mysql> explain select count(*) from part where p_partkey between 1 and 100;
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
|  1 | SIMPLE      | part  | range | PRIMARY       | PRIMARY | 4       | NULL |   99 | Using where; Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
```

 パラレルクエリを使用するかどうかを示す出力には、`EXPLAIN` ステートメントが実行された時点で利用可能なすべての要素が考慮されます。その間に状況が変わった場合、オプティマイザはクエリが実際に実行されたときに別の選択肢を作る場合もあります。例えば、`EXPLAIN` は、ステートメントがパラレルクエリを使用すると報告する場合があります。しかし、クエリが実際に後で実行される場合は、条件に基づいてパラレルクエリを使用しないことがあります。このような条件には、同時に実行されている他の複数のパラレルクエリが含まれます。また、テーブルから削除される行、作成される新しいインデックス、実行中のトランザクションに時間がかかりすぎていることなども含まれます。

## WHERE 句
<a name="aurora-mysql-parallel-query-sql-where"></a>

 クエリがパラレルクエリの最適化を使用するには、`WHERE` 句を含める*必要があります*。

 パラレルクエリの最適化は、`WHERE` 句で使用される多くの種類の表現を高速化します。
+  列の値と定数の簡単な比較は、*フィルター*として知られています。これらの比較は、ストレージレイヤーへのプッシュダウンを最大限に活用します。クエリのフィルター表現の数は、`EXPLAIN` 出力でレポートされます。
+  `WHERE` 句にある他の種類の表現も、可能であれば、ストレージレイヤーにプッシュダウンされます。クエリ内のそのような表現の数は、`EXPLAIN` 出力でレポートされます。これらの表現は、関数呼び出し、`LIKE` 演算子、`CASE` 表現などです。
+  特定の関数と演算子は、現在、パラレルクエリによってプッシュダウンされていません。クエリ内のそのような表現の数は、`extra` 出力の `EXPLAIN` カウンターとしてレポートされます。残りのクエリは引き続きパラレルクエリを使用できます。
+  選択リスト内の表現はプッシュダウンされませんが、そのような関数を含むクエリは、パラレルクエリの中間結果のネットワークトラフィックが減少しても有益です。例えば、選択リスト内の集計関数を呼び出すクエリでは、集計関数がプッシュダウンされていなくても、パラレルクエリを使用できます。

 例えば、次のクエリはテーブル全体のスキャンを実行し、`P_BRAND` 列のすべての値を処理します。ただし、クエリには `WHERE` 句が含まれていないため、パラレルクエリは使用されません。

```
mysql> explain select count(*), p_brand from part group by p_brand;
+----+-------------+-------+------+---------------+------+---------+------+----------+---------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows     | Extra                           |
+----+-------------+-------+------+---------------+------+---------+------+----------+---------------------------------+
|  1 | SIMPLE      | part  | ALL  | NULL          | NULL | NULL    | NULL | 20427936 | Using temporary; Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+----------+---------------------------------+
```

 対照的に、次のクエリには、結果をフィルタリングする `WHERE` 述語が含まれているため、パラレルクエリを適用できます。

```
mysql> explain select count(*), p_brand from part where p_name is not null
    ->   and p_mfgr in ('Manufacturer#1', 'Manufacturer#3') and p_retailprice > 1000
    -> group by p_brand;
+----+...+----------+-------------------------------------------------------------------------------------------------------------+
| id |...| rows     | Extra                                                                                                       |
+----+...+----------+-------------------------------------------------------------------------------------------------------------+
|  1 |...| 20427936 | Using where; Using temporary; Using filesort; Using parallel query (5 columns, 1 filters, 2 exprs; 0 extra) |
+----+...+----------+-------------------------------------------------------------------------------------------------------------+
```

 オプティマイザが、クエリブロックの戻される行数が少ないと見積もった場合、そのクエリブロックに対してパラレルクエリは使用されません。次の例は、プライマリキー列のより大きい演算子が数百万行にも適用され、パラレルクエリが使用される場合を示しています。その反対に数の少ないテストでは、ほんの数行にしか適用されず、パラレルクエリは使用されません。

```
mysql> explain select count(*) from part where p_partkey > 10;
+----+...+----------+----------------------------------------------------------------------------+
| id |...| rows     | Extra                                                                      |
+----+...+----------+----------------------------------------------------------------------------+
|  1 |...| 20427936 | Using where; Using parallel query (1 columns, 1 filters, 0 exprs; 0 extra) |
+----+...+----------+----------------------------------------------------------------------------+

mysql> explain select count(*) from part where p_partkey < 10;
+----+...+------+--------------------------+
| id |...| rows | Extra                    |
+----+...+------+--------------------------+
|  1 |...|    9 | Using where; Using index |
+----+...+------+--------------------------+
```

## データ定義言語 (DDL)
<a name="aurora-mysql-parallel-query-sql-ddl"></a>

Aurora MySQL バージョン 2 では、パラレルクエリは、高速データ定義言語 (DDL) オペレーションが保留されていないテーブルでのみ利用可能です。Aurora MySQL バージョン 3 では、インスタント DDL オペレーションと同時にテーブルに対してパラレルクエリを使用できます。

Aurora MySQL バージョン 3 のインスタント DDL では、Aurora MySQL バージョン 2 の高速 DDL 機能が置き換えられます。DDL ステートメントの詳細については、[インスタント DDL (Aurora MySQL バージョン 3)](AuroraMySQL.Managing.FastDDL.md#AuroraMySQL.mysql80-instant-ddl) を参照してください。

## 列のデータ型
<a name="aurora-mysql-parallel-query-sql-datatypes"></a>

 Aurora MySQL バージョン 3 では、パラレルクエリはデータタイプ `TEXT`、`BLOB`、`JSON`、および `GEOMETRY` のカラムを含むテーブルで使用できます。また、宣言された長さの最大数が 768 バイト以上の `VARCHAR` 、および `CHAR` のカラムでも使用することが可能です。クエリがそのようなラージオブジェクトタイプを含む列を参照している場合、それを取得するための追加作業によってクエリ処理にオーバーヘッドが発生します。その場合、それらの列への参照をクエリが省略できるかチェックしてください。そうでない場合は、ベンチマークを実行し、パラレルクエリをオンまたはオフにしてた状態でこのようなクエリが高速であるかどうかを確認します。

Aurora MySQL バージョン 2 では、ラージオブジェクトタイプに対してパラレルクエリは次の制限があります。
+ `TEXT`、`BLOB`、`JSON`、`GEOMETRY` データ型は、並列クエリではサポートされていません。これらの型の列を参照するクエリは、並列クエリを使用できません。
+ 可変長の列 (`VARCHAR` および `CHAR`) は、最大 768 バイトの宣言された最大長までの並列クエリと互換性があります。上記より長い最大長で宣言された型の列を参照するクエリは、並列クエリを使用できません。マルチバイト文字セットを使用する列の場合、バイト制限には文字セット内の最大バイト数が考慮されます。例えば、最大文字長が 4 バイトの文字セット `utf8mb4` の場合、`VARCHAR(192)` 列はパラレルクエリと互換性がありますが、`VARCHAR(193)` 列は互換性はありません。

## パーティションテーブル
<a name="aurora-mysql-parallel-query-sql-partitioning"></a>

 Aurora MySQL バージョン 3 では、パーティショニングされたテーブルをパラレルクエリで使用できます。パーティショニングテーブルは内部的に複数の小さなテーブルとして表されるため、非パーティションテーブルに対してパラレルクエリを使用するクエリでは、同一のパーティショニングテーブルに対してパラレルクエリを使用しない場合があります。Aurora MySQL は、テーブル全体のサイズを評価するのではなく、各パーティションがパラレルクエリ最適化の対象となるのに十分な大きさがあるかどうかを検討します。パーティショニングテーブルのクエリがパラレルクエリを使用しない場合、`Aurora_pq_request_not_chosen_small_table` ステータス 可変がインクリメントされているかどうかをチェックしてください。

 例えば、`PARTITION BY HASH (column) PARTITIONS 2` でパーティショニングされている一つのテーブルと、`PARTITION BY HASH (column) PARTITIONS 10` でパーティション分散されている別のテーブルについて考えてみます。2 つのパーティションがあるテーブルでは、パーティションは 10 個のパーティションを持つテーブルの 5 倍になります。したがって、パラレルクエリは、パーティションがより少ないテーブルに対するクエリに使用される可能性が高くなります。次の例では、テーブル `PART_BIG_PARTITIONS` には 2 つのパーティションがあり、`PART_SMALL_PARTITIONS` には 10 個のパーティションがあります。同一データでは、大きなパーティションがより少ないテーブルに対してパラレルクエリは使用される可能性が高くなります。

```
mysql> explain select count(*), p_brand from part_big_partitions where p_name is not null
    ->   and p_mfgr in ('Manufacturer#1', 'Manufacturer#3') and p_retailprice > 1000 group by p_brand;
+----+-------------+---------------------+------------+-------------------------------------------------------------------------------------------------------------------+
| id | select_type | table               | partitions | Extra                                                                                                             |
+----+-------------+---------------------+------------+-------------------------------------------------------------------------------------------------------------------+
|  1 | SIMPLE      | part_big_partitions | p0,p1      | Using where; Using temporary; Using parallel query (4 columns, 1 filters, 1 exprs; 0 extra; 1 group-bys, 1 aggrs) |
+----+-------------+---------------------+------------+-------------------------------------------------------------------------------------------------------------------+

mysql> explain select count(*), p_brand from part_small_partitions where p_name is not null
    ->   and p_mfgr in ('Manufacturer#1', 'Manufacturer#3') and p_retailprice > 1000 group by p_brand;
+----+-------------+-----------------------+-------------------------------+------------------------------+
| id | select_type | table                 | partitions                    | Extra                        |
+----+-------------+-----------------------+-------------------------------+------------------------------+
|  1 | SIMPLE      | part_small_partitions | p0,p1,p2,p3,p4,p5,p6,p7,p8,p9 | Using where; Using temporary |
+----+-------------+-----------------------+-------------------------------+------------------------------+
```

## 集計関数、GROUP BY 句、HAVING 句
<a name="aurora-mysql-parallel-query-sql-aggregation"></a>

 集計関数を含むクエリは、大規模なテーブル内の多数の行をスキャンするため、パラレルクエリに適しています。

 Aurora MySQL 3 では、パラレルクエリは選択リストと `HAVING` 句内の集計関数呼び出しを最適化できます。

 Aurora MySQL 3 より前では、選択リストまたは `HAVING` 句の集計関数呼び出しはストレージレイヤーにプッシュダウンされませんでした。ただし、パラレルクエリは、集計関数を使用してこのようなクエリのパフォーマンスを向上させることができます。これは、初期にストレージレイヤーでパラレルに raw データページから列値を抽出することによって行われます。次に、それらの値をデータページ全体ではなくコンパクトなタプル形式でヘッドノードに戻します。今回も、クエリにはパラレルクエリを有効にするための少なくとも 1 つの `WHERE` 述語が必要です。

 次の簡単な例は、パラレルクエリの利点を受ける集約クエリの種類を示しています。これは、中間結果をコンパクト形式でヘッドノードに戻し、一致しない行を中間結果から除外するか、またはその両方を行うことによって行います。

```
mysql> explain select sql_no_cache count(distinct p_brand) from part where p_mfgr = 'Manufacturer#5';
+----+...+----------------------------------------------------------------------------+
| id |...| Extra                                                                      |
+----+...+----------------------------------------------------------------------------+
|  1 |...| Using where; Using parallel query (2 columns, 1 filters, 0 exprs; 0 extra) |
+----+...+----------------------------------------------------------------------------+

mysql> explain select sql_no_cache p_mfgr from part where p_retailprice > 1000 group by p_mfgr having count(*) > 100;
+----+...+-------------------------------------------------------------------------------------------------------------+
| id |...| Extra                                                                                                       |
+----+...+-------------------------------------------------------------------------------------------------------------+
|  1 |...| Using where; Using temporary; Using filesort; Using parallel query (3 columns, 0 filters, 1 exprs; 0 extra) |
+----+...+-------------------------------------------------------------------------------------------------------------+
```

## WHERE 句での関数呼び出し
<a name="aurora-mysql-parallel-query-sql-functions"></a>

 Aurora は、`WHERE` 句のほとんどの組み込み関数への呼び出しにパラレルクエリの最適化を適用できます。これらの関数呼び出しをパラレル化すると、いくつかの CPU 作業がヘッドノードからオフロードされます。最も早いクエリステージで述語関数を並行して評価することで、Aurora は後のステージで送信および処理されるデータ量を最小限に抑えることができます。

 現在、パラレル化は選択リストの関数呼び出しには適用されません。これらの関数は、同じ関数呼び出しが `WHERE` 句に現れても、ヘッドノードによって評価されます。関連する列からの元の値は、ストレージノードからヘッドノードに送信されたタプルに含まれます。ヘッドノードは、`UPPER`、`CONCATENATE` などの変換を行って、結果セットの最終的な値を生成します。

 次の例では、`LOWER` 句にあるため、パラレルクエリは `WHERE` の呼び出しをパラレル化します。`SUBSTR` と `UPPER` の呼び出しは選択したリストにあるため、パラレルクエリには影響されません。

```
mysql> explain select sql_no_cache distinct substr(upper(p_name),1,5) from part
    -> where lower(p_name) like '%cornflower%' or lower(p_name) like '%goldenrod%';
+----+...+---------------------------------------------------------------------------------------------+
| id |...| Extra                                                                                       |
+----+...+---------------------------------------------------------------------------------------------+
|  1 |...| Using where; Using temporary; Using parallel query (2 columns, 0 filters, 1 exprs; 0 extra) |
+----+...+---------------------------------------------------------------------------------------------+
```

 `CASE` 表現や `LIKE` 演算子など、他の表現にも同じ考慮事項が適用されます。次の例では、パラレルクエリは、`CASE` 句の `LIKE` 表現と `WHERE`演算子を評価します。

```
mysql> explain select p_mfgr, p_retailprice from part
    -> where p_retailprice > case p_mfgr
    ->   when 'Manufacturer#1' then 1000
    ->   when 'Manufacturer#2' then 1200
    ->   else 950
    -> end
    -> and p_name like '%vanilla%'
    -> group by p_retailprice;
+----+...+-------------------------------------------------------------------------------------------------------------+
| id |...| Extra                                                                                                       |
+----+...+-------------------------------------------------------------------------------------------------------------+
|  1 |...| Using where; Using temporary; Using filesort; Using parallel query (4 columns, 0 filters, 2 exprs; 0 extra) |
+----+...+-------------------------------------------------------------------------------------------------------------+
```

## LIMIT 句
<a name="aurora-mysql-parallel-query-sql-limit"></a>

 現在のところ、`LIMIT` 句を含むクエリブロックでは、パラレルクエリは使用されません。`GROUP` by、`ORDER BY`、または結合を使用して、以前のクエリフェーズでもパラレルクエリを使用することができます。

## 比較演算子
<a name="aurora-mysql-parallel-query-sql-comparisons"></a>

 オプティマイザは、比較演算子を評価するためにスキャンする行数を推定し、その推定値に基づいてパラレルクエリを使用するかどうかを決定します。

 次の初期の例は、プライマリキー列との等価比較をパラレルクエリなしで効率的に実行できることを示しています。次の 2 番目の例では、インデックス作成されていない列に対する同様の比較では数百万行のスキャンが必要なため、パラレルクエリのメリットが得られます。

```
mysql> explain select * from part where p_partkey = 10;
+----+...+------+-------+
| id |...| rows | Extra |
+----+...+------+-------+
|  1 |...|    1 | NULL  |
+----+...+------+-------+

mysql> explain select * from part where p_type = 'LARGE BRUSHED BRASS';
+----+...+----------+----------------------------------------------------------------------------+
| id |...| rows     | Extra                                                                      |
+----+...+----------+----------------------------------------------------------------------------+
|  1 |...| 20427936 | Using where; Using parallel query (9 columns, 1 filters, 0 exprs; 0 extra) |
+----+...+----------+----------------------------------------------------------------------------+
```

 等しくないテストや、より小さい、より大きい、等しい、または `BETWEEN` などの範囲比較にも同じ考慮事項が適用されます。オプティマイザは、スキャンする行数を推定し、I/O 全体の量に基づいてパラレルクエリが有効かどうかを判断します。

## Joins
<a name="aurora-mysql-parallel-query-sql-joins"></a>

 大きなテーブルを使用した結合クエリには、通常、パラレルクエリの最適化のメリットを受けるデータ集約型操作が含まれます。現在、複数のテーブル (つまり、結合述語自体) 間の列値の比較パラレルパラレル化されません。ただし、パラレルクエリは、ハッシュ結合中に Bloom フィルターを構築するなど、他の結合フェーズの内部処理の一部をプッシュダウンできます。パラレルクエリは、`WHERE` 句がなくても結合クエリに適用できます。したがって、結合クエリは、パラレルクエリを使用するために `WHERE` 句が必要であるという規則に対する例外です。

 結合処理の各フェーズが評価され、パラレルクエリに適格であるかどうかがチェックされます。複数のフェーズでパラレルクエリを使用できる場合は、これらのフェーズが順番に実行されます。したがって、各結合クエリは、同時実行制限に関して単一のパラレルクエリセッションとしてカウントされます。

 例えば、結合クエリが結合テーブルの 1 つから行をフィルタリングする `WHERE` 述語を含む場合、そのフィルタリングオプションはパラレルクエリを使用できます。別の例として、結合クエリがハッシュ結合メカニズムを使用するとします。例えば、大きなテーブルを小さなテーブルに結合する場合などです。この場合、Bloom フィルターデータ構造を生成するためのテーブルスキャンは、パラレルクエリを使用することができます。

**注記**  
 パラレルクエリは通常、ハッシュ結合の最適化による利点がある、大量のリソースを使用する種類のクエリに使用されます。ハッシュ結合の最適化を有効にする方法は、Aurora MySQL のバージョンによって異なります。各バージョンの詳細については、[パラレルクエリクラスターのハッシュ結合の有効化](aurora-mysql-parallel-query-enabling.md#aurora-mysql-parallel-query-enabling-hash-join) を参照してください。ハッシュ結合を効果的に使用する方法については、[ハッシュ結合を使用した大規模な Aurora MySQL 結合クエリの最適化](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.HashJoin) を参照してください。

```
mysql> explain select count(*) from orders join customer where o_custkey = c_custkey;
+----+...+----------+-------+---------------+-------------+...+-----------+-----------------------------------------------------------------------------------------------------------------+
| id |...| table    | type  | possible_keys | key         |...| rows      | Extra                                                                                                           |
+----+...+----------+-------+---------------+-------------+...+-----------+-----------------------------------------------------------------------------------------------------------------+
|  1 |...| customer | index | PRIMARY       | c_nationkey |...|  15051972 | Using index                                                                                                     |
|  1 |...| orders   | ALL   | o_custkey     | NULL        |...| 154545408 | Using join buffer (Hash Join Outer table orders); Using parallel query (1 columns, 0 filters, 1 exprs; 0 extra) |
+----+...+----------+-------+---------------+-------------+...+-----------+-----------------------------------------------------------------------------------------------------------------+
```

 ネストされたループメカニズムを使用する結合クエリの場合、最も外側のネストされたループブロックはパラレルクエリを使用する場合があります。パラレルクエリの使用は、`WHERE` 句に追加のフィルター条件が存在するなど、通常と同じ要素に依存します。

```
mysql> -- Nested loop join with extra filter conditions can use parallel query.
mysql> explain select count(*) from part, partsupp where p_partkey != ps_partkey and p_name is not null and ps_availqty > 0;
+----+-------------+----------+...+----------+----------------------------------------------------------------------------+
| id | select_type | table    |...| rows     | Extra                                                                      |
+----+-------------+----------+...+----------+----------------------------------------------------------------------------+
|  1 | SIMPLE      | part     |...| 20427936 | Using where; Using parallel query (2 columns, 1 filters, 0 exprs; 0 extra) |
|  1 | SIMPLE      | partsupp |...| 78164450 | Using where; Using join buffer (Block Nested Loop)                         |
+----+-------------+----------+...+----------+----------------------------------------------------------------------------+
```

## サブクエリ
<a name="aurora-mysql-parallel-query-sql-subqueries"></a>

 外部クエリブロックと内部サブクエリブロックでは、そのそれぞれでパラレルクエリを使用するかどうかが決定されます。各ブロックで使用するかどうかは、テーブルの通常の特徴や `WHERE` 句などに基づきます。例えば、次のクエリでは、外部ブロックではなくサブクエリブロックに対してパラレルクエリが使用されます。

```
mysql> explain select count(*) from part where
   --> p_partkey < (select max(p_partkey) from part where p_name like '%vanilla%');
+----+-------------+...+----------+----------------------------------------------------------------------------+
| id | select_type |...| rows     | Extra                                                                      |
+----+-------------+...+----------+----------------------------------------------------------------------------+
|  1 | PRIMARY     |...|     NULL | Impossible WHERE noticed after reading const tables                        |
|  2 | SUBQUERY    |...| 20427936 | Using where; Using parallel query (2 columns, 0 filters, 1 exprs; 0 extra) |
+----+-------------+...+----------+----------------------------------------------------------------------------+
```

 現在、相関サブクエリはパラレルクエリ最適化を使用できません。

## UNION
<a name="aurora-mysql-parallel-query-sql-union"></a>

 `UNION` クエリの各クエリブロックは、`WHERE` の各部分に対して、テーブルの通常の特性、または `UNION` 句などに基づいてパラレルクエリを使用するかどうかを指定できます。

```
mysql> explain select p_partkey from part where p_name like '%choco_ate%'
    -> union select p_partkey from part where p_name like '%vanil_a%';
+----+----------------+...+----------+----------------------------------------------------------------------------+
| id | select_type    |...| rows     | Extra                                                                      |
+----+----------------+...+----------+----------------------------------------------------------------------------+
|  1 | PRIMARY        |...| 20427936 | Using where; Using parallel query (2 columns, 0 filters, 1 exprs; 0 extra) |
|  2 | UNION          |...| 20427936 | Using where; Using parallel query (2 columns, 0 filters, 1 exprs; 0 extra) |
| NULL | UNION RESULT | <union1,2> |...|     NULL | Using temporary                                           |
+----+--------------+...+----------+----------------------------------------------------------------------------+
```

**注記**  
 クエリ内の各 `UNION` 句は順番に実行されます。クエリにすべてがパラレルクエリを使用する複数のステージが含まれていても、常に 1 つのパラレルクエリしか実行されません。したがって、複雑な複数ステージのクエリであっても、同時並行クエリの制限として 1 つだけカウントされます。

## ビュー
<a name="aurora-mysql-parallel-query-sql-views"></a>

 オプティマイザは、基になるテーブルを使用して、より長いクエリとしてビューを使用するクエリをすべて書き換えます。したがって、パラレルクエリは、テーブル参照がビューでも実テーブルであっても同じように機能します。クエリに対してパラレルクエリを使用するかどうか、およびプッシュダウンする部分については、最終的に書き直されたクエリに同じ考慮事項が適用されます。

 例えば、次のクエリプランは、通常はパラレルクエリを使用しないビューの定義を示しています。追加の `WHERE` 句でビューがクエリされると、Aurora MySQL はパラレルクエリを使用します。

```
mysql> create view part_view as select * from part;
mysql> explain select count(*) from part_view where p_partkey is not null;
+----+...+----------+----------------------------------------------------------------------------+
| id |...| rows     | Extra                                                                      |
+----+...+----------+----------------------------------------------------------------------------+
|  1 |...| 20427936 | Using where; Using parallel query (1 columns, 0 filters, 0 exprs; 1 extra) |
+----+...+----------+----------------------------------------------------------------------------+
```

## データ操作言語 (DML) ステートメント
<a name="aurora-mysql-parallel-query-sql-dml"></a>

 `INSERT` 部分がパラレルクエリの他の条件を満たしている場合、`SELECT` ステートメントは処理の `SELECT` フェーズに対してパラレルクエリを使用できます。

```
mysql> create table part_subset like part;
mysql> explain insert into part_subset select * from part where p_mfgr = 'Manufacturer#1';
+----+...+----------+----------------------------------------------------------------------------+
| id |...| rows     | Extra                                                                      |
+----+...+----------+----------------------------------------------------------------------------+
|  1 |...| 20427936 | Using where; Using parallel query (9 columns, 1 filters, 0 exprs; 0 extra) |
+----+...+----------+----------------------------------------------------------------------------+
```

**注記**  
 通常、`INSERT` ステートメントの後に、新しく挿入された行のデータがバッファプールにあります。したがって、多数の行を挿入した直後に、テーブルがパラレルクエリに適格でない可能性があります。後で、通常の操作中にバッファプールからデータが除去された後に、テーブルに対するクエリがパラレルクエリを再び使用し始める可能性があります。

 ステートメントの `CREATE TABLE AS SELECT` 部分がパラレルクエリに適格であっても、`SELECT` ステートメントはパラレルクエリを使用しません。このステートメントの DDL 側面は、パラレルクエリ処理と互換性がありません。対照的に、`INSERT ... SELECT` ステートメントでは、`SELECT` 部分はパラレルクエリを使用できます。

 パラレルクエリは、`DELETE` 句のテーブルおよび述語のサイズに関係なく、`UPDATE`ステートメントまたは `WHERE` ステートメントには使用されません。

```
mysql> explain delete from part where p_name is not null;
+----+-------------+...+----------+-------------+
| id | select_type |...| rows     | Extra       |
+----+-------------+...+----------+-------------+
|  1 | SIMPLE      |...| 20427936 | Using where |
+----+-------------+...+----------+-------------+
```

## トランザクションとロック
<a name="aurora-mysql-parallel-query-sql-transactions"></a>

 すべての分離レベルは、Aurora プライマリインスタンスで使用できます。

Aurora リーダー DB インスタンスでは、パラレルクエリは `REPEATABLE READ` の分離レベルの下で実行されるステートメントに適用されます。Aurora MySQL バージョン 2.09 以降では、リーダー DB インスタンスに対して `READ COMMITTED` 分離レベルも使用されます。`REPEATABLE READ` は、Aurora リーダー DB インスタンスのデフォルトの分離レベルです。リーダー DB インスタンスで `READ COMMITTED` 分離レベルを使用するには、セッションレベルで `aurora_read_replica_read_committed` 設定オプションを設定する必要があります。`READ COMMITTED`リーダーインスタンスの分離レベルは SQL のスタンダード動作に準拠しています。ただし、この分離は、クエリがライターインスタンスで `READ COMMITTED` 分離レベルを使用する場合よりも、リーダーインスタンスでは厳密ではありません。

 Aurora の分離レベル、特にライターインスタンスとリーダーインスタンス間での `READ COMMITTED` の違いについては、[Aurora MySQL の分離レベル](AuroraMySQL.Reference.IsolationLevels.md) を参照してください。

 大きなトランザクションが終了した後、テーブルの統計情報は古くなっている可能性があります。このような古くなった統計では、Aurora が正確に行数を見積もるには、`ANALYZE TABLE` ステートメントが必要になることがあります。大規模な DML ステートメントでは、テーブルデータのかなりの部分がバッファプールに持ち込まれる可能性があります。このデータをバッファプールに入れると、データがプールから削除されるまで、パラレルクエリの選択頻度が低くなります。

 セッションが長時間実行トランザクション (デフォルトでは 10 分) 内にある場合、そのセッション内の以降のクエリはパラレルクエリを使用しません。1 つの長期実行クエリ中にもタイムアウトが発生する可能性があります。このタイプのタイムアウトは、パラレルクエリ処理がスタートされるまでの最大間隔 (現在は 10 分) より長くクエリが実行された場合に発生する可能性があります。

 `autocommit=1` セッションに `mysql` を設定して、偶発的に長時間実行トランザクションがスタートされる機会を減らすことができます。テーブルに対する `SELECT` ステートメントでさえ、読み取りビューを作成してトランザクションをスタートします。*読み取りビュー*は、トランザクションがコミットされるまで続くクエリ用の一貫したデータセットです。このようなアプリケーションは `autocommit` 設定をオフにして実行する可能性があるため、Aurora で JDBC または ODBC アプリケーションを使用する場合にもこの制限に注意してください。

 次の例は、`autocommit` 設定をオフにして、テーブルに対してクエリを実行すると、暗黙的にトランザクションをスタートする読み取りビューが作成される方法を示しています。すぐ後で実行されるクエリは引き続きパラレルクエリを使用できます。ただし、数分の休止後は、クエリはもはやパラレルクエリの対象となりません。`COMMIT` または `ROLLBACK` を使用してトランザクションを終了すると、パラレルクエリの適格性が復元されます。

```
mysql> set autocommit=0;

mysql> explain select sql_no_cache count(*) from part where p_retailprice > 10.0;
+----+...+---------+----------------------------------------------------------------------------+
| id |...| rows    | Extra                                                                      |
+----+...+---------+----------------------------------------------------------------------------+
|  1 |...| 2976129 | Using where; Using parallel query (1 columns, 1 filters, 0 exprs; 0 extra) |
+----+...+---------+----------------------------------------------------------------------------+

mysql> select sleep(720); explain select sql_no_cache count(*) from part where p_retailprice > 10.0;
+------------+
| sleep(720) |
+------------+
|          0 |
+------------+
1 row in set (12 min 0.00 sec)

+----+...+---------+-------------+
| id |...| rows    | Extra       |
+----+...+---------+-------------+
|  1 |...| 2976129 | Using where |
+----+...+---------+-------------+

mysql> commit;

mysql> explain select sql_no_cache count(*) from part where p_retailprice > 10.0;
+----+...+---------+----------------------------------------------------------------------------+
| id |...| rows    | Extra                                                                      |
+----+...+---------+----------------------------------------------------------------------------+
|  1 |...| 2976129 | Using where; Using parallel query (1 columns, 1 filters, 0 exprs; 0 extra) |
+----+...+---------+----------------------------------------------------------------------------+
```

 クエリが長時間実行トランザクションのためにパラレルクエリに適格でなかった回数を確認するには、ステータス可変 `Aurora_pq_request_not_chosen_long_trx` を確認します。

```
mysql> show global status like '%pq%trx%';
+---------------------------------------+-------+
| Variable_name                         | Value |
+---------------------------------------+-------+
| Aurora_pq_request_not_chosen_long_trx | 4     |
+-------------------------------+-------+
```

 `SELECT` 構文や `SELECT FOR UPDATE` 構文などのロックを取得するすべての `SELECT LOCK IN SHARE MODE` ステートメントでは、パラレルクエリを使用できません。

 パラレルクエリは、`LOCK TABLES` ステートメントによってロックされているテーブルに対して機能します。

```
mysql> explain select o_orderpriority, o_shippriority from orders where o_clerk = 'Clerk#000095055';
+----+...+-----------+----------------------------------------------------------------------------+
| id |...| rows      | Extra                                                                      |
+----+...+-----------+----------------------------------------------------------------------------+
|  1 |...| 154545408 | Using where; Using parallel query (3 columns, 1 filters, 0 exprs; 0 extra) |
+----+...+-----------+----------------------------------------------------------------------------+

mysql> explain select o_orderpriority, o_shippriority from orders where o_clerk = 'Clerk#000095055' for update;
+----+...+-----------+-------------+
| id |...| rows      | Extra       |
+----+...+-----------+-------------+
|  1 |...| 154545408 | Using where |
+----+...+-----------+-------------+
```

## B ツリーインデックス
<a name="aurora-mysql-parallel-query-sql-indexes"></a>

 `ANALYZE TABLE` ステートメントによって収集される統計は、各列のデータの特性に基づいて、パラレルクエリまたはインデックスのルックアップをいつ使用するかをオプティマイザが決定するのに役立ちます。テーブル内のデータを大幅に変更する DML 操作の後で `ANALYZE TABLE` を実行することにより、統計情報を最新の状態に保ちます。

 インデックスのルックアップがデータ集約型スキャンなしで効率的にクエリを実行できる場合は、Aurora は インデックスのルックアップを使用する可能性があります。そうすることにより、パラレルクエリ処理のオーバーヘッドが回避されます。また、どの Aurora DB クラスターでも同時に実行できるパラレルクエリの数には同時実行制限があります。テーブルのインデックス付けにベストプラクティスを使用して、最も頻繁で最も並行性の高いクエリがインデックスのルックアップを使用するようにしてください。

## 全文検索 (FTS) インデックス
<a name="aurora-mysql-parallel-query-sql-fts"></a>

 現在のところ、全文検索インデックスを含むテーブルでは、クエリで全文検索インデックスのある列を参照しているか `MATCH` 演算子を使用しているかどうかにかかわらず、パラレルクエリは使用されません。

## 仮想列
<a name="aurora-mysql-parallel-query-sql-virtual-column"></a>

 現在のところ、仮想列を含むテーブルでは、クエリで仮想列を参照しているかどうかにかかわらず、パラレルクエリは使用されません。

## 組み込みキャッシュメカニズム
<a name="aurora-mysql-parallel-query-sql-caching"></a>

 Aurora には、組み込みキャッシュメカニズム、つまりバッファプールとクエリキャッシュが組み込まれています。Aurora オプティマイザは、どのクエリが特定のクエリに対して最も効果的かに応じて、これらのキャッシュメカニズムとパラレルクエリを選択します。

 パラレルクエリが行をフィルタリングし、列の値を変換して抽出すると、データはデータページではなくタプルとしてヘッドノードに返されます。したがって、パラレルクエリを実行しても、バッファプールにはページが追加されず、既にバッファプールにあるページは削除されます。

 Aurora は、バッファプール内に存在するテーブルデータのページ数と、その番号が表すテーブルデータの割合を検証します。Aurora はその情報を使用して、パラレルクエリを使用する方が効率的かどうかを判断します (また、バッファプール内のデータをバイパスします)。または、Aurora はバッファプールにキャッシュされたデータを使用する非パラレルクエリ処理パスを使用することがあります。キャッシュされるページと、データ集約型のクエリがキャッシュおよび削除に与える影響は、バッファプールに関連する構成設定によって異なります。したがって、バッファプール内の常に変化するデータに依存するため、特定のクエリでパラレルクエリが使用されているかどうかを予測することは困難です。

 また、Aurora はパラレルクエリに同時実行制限を課します。すべてのクエリがパラレルクエリを使用するわけではないので、複数のクエリによって同時にアクセスされるテーブルは、通常、バッファプール内のデータのかなりの部分を占めます。したがって、Aurora はパラレルクエリに対してこれらのテーブルを選択しないことがよくあります。

 同じテーブルで非パラレルクエリのシーケンスを実行すると、データがバッファプールにないため、初期のクエリが遅くなる可能性があります。これでバッファプールが「ウォームアップ」状態になるため、2 番目以降のクエリは非常に高速になります。パラレルクエリは、通常、テーブルに対する初期のクエリからの一貫したパフォーマンスを示します。パフォーマンステストを実行するときは、コールドバッファプールとウォームバッファプールの両方を使用して、非パラレルクエリを評価します。場合によっては、ウォームバッファプールを使用した結果は、パラレルクエリ時間とよく比較できます。その場合、そのテーブルに対するクエリの頻度などの要因を考慮してください。また、そのテーブルのデータをバッファプールに保持するメリットがあるかどうかも考慮してください。

 クエリキャッシュは、同じクエリが送信されたときに基になるテーブルのデータに変更がない場合に、クエリがもう一度実行されることを防ぎます。パラレルクエリ機能によって最適化されたクエリは、クエリキャッシュに入り、効果的に再度実行することができます。

**注記**  
 パフォーマンスの比較を行うとき、クエリキャッシュは意図的に低いタイミング数を生成する可能性があります。したがって、ベンチマークのような状況では、`sql_no_cache` ヒントを使用できます。このヒントは、以前に同じクエリが実行された場合でも、クエリキャッシュから結果が提供されるのを防ぎます。ヒントは、クエリの `SELECT` ステートメントの直後に表示されます。このトピック内のパラレルクエリ例の多くにはこのヒントが含まれているので、パラレルクエリで有効化されているクエリとそうでないクエリのバージョン間で、クエリ時間を比較できます。  
 パラレルクエリの本稼働使用に移行するときは、出典からこのヒントを削除するようにしてください。

## オプティマイザヒント
<a name="aurora-mysql-parallel-query-hints"></a>

オプティマイザを制御するもう 1 つの方法は、オプティマイザヒントを使用することです。オプティマイザヒントは個々のステートメント内で指定できます。例えば、ステートメント内の 1 つのテーブルの最適化を有効にして、別のテーブルの最適化を無効にすることができます。これらのヒントの詳細については、*MySQL リファレンスマニュアル*の「[オプティマイザヒント](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html)」を参照してください。

Aurora MySQL クエリで SQL ヒントを使用して、パフォーマンスを微調整できます。ヒントを使用して、重要なクエリの実行計画が予測不可能な条件のために変更されないようにすることもできます。

SQL ヒント機能を拡張して、クエリプランのオプティマイザの選択を制御できるようにしました。これらのヒントは、パラレルクエリ最適化を使用するクエリに適用されます。詳細については、「[Aurora MySQL のヒント](AuroraMySQL.Reference.Hints.md)」を参照してください。

## MyISAM テンポラリテーブル
<a name="aurora-mysql-parallel-query-sql-myisam"></a>

パラレルクエリの最適化は、InnoDB テーブルにのみ適用されます。Aurora MySQL はテンポラリテーブルの背後で MyISAM を使用するため、テンポラリテーブルを含む内部クエリフェーズではパラレルクエリは使用されません。これらのクエリフェーズは、`Using temporary` 出力に `EXPLAIN` によって示されています。

# Amazon Aurora MySQL DB クラスターでのアドバンストな監査の使用
<a name="AuroraMySQL.Auditing"></a><a name="auditing"></a><a name="advanced_auditing"></a>

Amazon Aurora MySQL では、パフォーマンスの高い高度な監査機能を使用して、データベースアクティビティを監査できます。そのためには、複数の DB クラスターパラメータを設定することによって監査ログの収集を有効にします。高度な監査を有効にすると、この機能を使用して、サポートされているイベントの任意の組み合わせを記録できます。

 監査ログを表示またはダウンロードして、一度に 1 つの DB インスタンスの監査情報を確認することができます。そのためには、「[Amazon Aurora ログファイルのモニタリング](USER_LogAccess.md)」に記載された手順を使用します。

**ヒント**  
 複数の DB インスタンスを含む Aurora DB クラスターの場合、この方法の方が、クラスター内のすべてのインスタンスの監査ログを調べるために便利なことがあります。これを行うために、CloudWatch Logs を使用します。クラスターレベルで設定を有効にし、Aurora MySQL での監査ログデータを CloudWatch のロググループに発行します。その後、CloudWatch インターフェイスを使用して、監査ログの表示やフィルタリング、および検索が行えます。詳細については、「[Amazon CloudWatch Logs への Amazon Aurora MySQL ログの発行](AuroraMySQL.Integrating.CloudWatch.md)」を参照してください。

## アドバンストな監査の有効化
<a name="AuroraMySQL.Auditing.Enable"></a>

DB クラスターの高度な監査を有効にして設定するには、このセクションで説明されているパラメータを使用します。

より高度な監査を有効化または無効化するには、`server_audit_logging` パラメータを使用します。

ログ記録するイベントを指定するには、`server_audit_events` パラメータを使用します。

`server_audit_incl_users` パラメータと `server_audit_excl_users` パラメータを使用して、監査するユーザーを指定します。デフォルトでは、すべてのユーザーが監査されます。一方または両方を空のままにした場合、または両方で同じユーザ名が指定されている場合に、これらのパラメータがどのように機能するかについては、「[server\$1audit\$1incl\$1users](#AuroraMySQL.Auditing.Enable.server_audit_incl_users)」ならびに「[server\$1audit\$1excl\$1users](#AuroraMySQL.Auditing.Enable.server_audit_excl_users)」を参照してください。

高度な監査は、DB クラスターにより使用されているパラメータグループでこれらのパラメータを設定することにより設定します。「[Amazon Aurora の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」に示されている手順を使用し、AWS マネジメントコンソールを使用して DB クラスターパラメータを変更できます。AWS CLI コマンドの [modify-db-cluster-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster-parameter-group.html) 、または Amazon RDS API の [ModifyDBClusterParameterGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBClusterParameterGroup.html) オペレーションを使用して、プログラム的に DB クラスターパラメータを変更できます。

パラメータグループが既にクラスターに関連付けられていれば、これらのパラメータを変更しても、DB クラスターを再起動する必要はありません。パラメータグループをクラスターに初めて関連付ける場合は、クラスターの再起動が必要です。

**Topics**
+ [server\$1audit\$1logging](#AuroraMySQL.Auditing.Enable.server_audit_logging)
+ [server\$1audit\$1events](#AuroraMySQL.Auditing.Enable.server_audit_events)
+ [server\$1audit\$1incl\$1users](#AuroraMySQL.Auditing.Enable.server_audit_incl_users)
+ [server\$1audit\$1excl\$1users](#AuroraMySQL.Auditing.Enable.server_audit_excl_users)

### server\$1audit\$1logging
<a name="AuroraMySQL.Auditing.Enable.server_audit_logging"></a>

高度な監査を有効または無効にします。このパラメータのデフォルトは OFF です。高度な監査を有効にするには、ON に設定します。

 監査するイベントのタイプを、`server_audit_events` パラメータを使用して 1 つ以上定義しない限り、監査データはログに表示されません。

 DB インスタンスの監査データがログに記録されていることを確認するには、そのインスタンスのログファイルに、`audit/audit.log.other_identifying_information` の形式で名前が付けられたものがあることを確認します。ログファイルの名前を表示するには、「[データベースログファイルの表示とリスト化](USER_LogAccess.Procedural.Viewing.md)」に記載されてい手順に従ってください。

### server\$1audit\$1events
<a name="AuroraMySQL.Auditing.Enable.server_audit_events"></a>

記録するイベントのコンマ区切りリストが含まれています。イベントはすべて大文字で指定する必要があります。リスト要素間に空白があってはいけません。例: `CONNECT,QUERY_DDL`。このパラメータのデフォルトは空の文字列です。

次のイベントの任意の組み合わせを記録できます。
+ CONNECT - 成功した接続と失敗した接続の両方、および切断を記録します。このイベントにはユーザー情報が含まれています。
+ QUERY - すべてのクエリをプレーンテキストで記録します (構文またはアクセス権限エラーで失敗したエラーを含む)。
**ヒント**  
 このイベントタイプを有効にすると、監査データには、Aurora が自動的に行う継続的なモニタリングとヘルスチェックに関する情報が含まれます。特定の種類のオペレーションのみを確認したい場合は、イベントの種類をより具体的に指定できます。また、CloudWatch インターフェイスを使用して、ログ内の特定のデータベース、テーブル、またはユーザーに関連するイベントを検索することもできます。
+ QUERY\$1DCL - QUERY イベントと同様ですが、データ制御言語 (DCL) クエリ (GRANT、REVOKE など) のみ返します。
+ QUERY\$1DDL - QUERY イベントと同様ですが、データ定義言語 (DDL) クエリ (CREATE、ALTER など) のみ返します。
+ QUERY\$1DML - QUERY イベントと同様ですが、データ操作言語 (DML) クエリ (INSERT、UPDATE などと、SELECT) のみ返します。
+ TABLE - クエリ実行の影響を受けたテーブルを記録します。

**注記**  
Aurora には、監査ログから特定のクエリを除外するフィルターはありません。`SELECT` クエリを除外するには、すべての DML ステートメントを除外する必要があります。  
特定のユーザーがこれらの内部 `SELECT` クエリを監査ログで報告している場合は、[server\$1audit\$1excl\$1users](#AuroraMySQL.Auditing.Enable.server_audit_excl_users) DB クラスターパラメータを設定して、そのユーザーを除外できます。ただし、そのユーザーが他のアクティビティでも使用され、省略できない場合、`SELECT` クエリを除外するための他のオプションはありません。

### server\$1audit\$1incl\$1users
<a name="AuroraMySQL.Auditing.Enable.server_audit_incl_users"></a>

アクティビティを記録するユーザーのカンマ区切りのユーザー名リストが含まれています。リストの要素間にスペースは挿入しないでください。例えば、`user_3,user_4` などです。このパラメータのデフォルトは空の文字列です。最大長は 1024 文字です。指定したユーザー名は、`User` テーブルの `mysql.user` 列の対応する値と一致する必要があります。ユーザー名の詳細については、MySQL のドキュメントの「[アカウントユーザー名とパスワード](https://dev.mysql.com/doc/refman/8.0/en/user-names.html)」を参照してください。

 `server_audit_incl_users` と `server_audit_excl_users` の両方が空 (デフォルト) の場合、すべてのユーザーが監査されます。

 ユーザーを `server_audit_incl_users` に追加して `server_audit_excl_users` を空のままにした場合、それらのユーザーだけが検査されます。

 ユーザーを `server_audit_excl_users` に追加して `server_audit_incl_users` を空のままにした場合、`server_audit_excl_users` にリストされているものを除き、すべてのユーザーが監査されます。

 `server_audit_excl_users` と `server_audit_incl_users` の両方に同じユーザーを追加した場合、それらのユーザーが監査されます。同じユーザーが両方の設定にリストされている場合、`server_audit_incl_users` に対し、より高い優先順位が与えられます。

接続および切断イベントは、この可変の影響を受けません。指定された場合は常に記録されます。`server_audit_incl_users` の方が優先順位が高いため、ユーザーが `server_audit_excl_users` パラメータでも指定されている場合も、そのユーザーは記録されます。

### server\$1audit\$1excl\$1users
<a name="AuroraMySQL.Auditing.Enable.server_audit_excl_users"></a>

アクティビティがを記録しないユーザーのカンマ区切りのユーザー名リストが含まれています。リストの要素間にスペースは挿入しないでください。例えば、`rdsadmin,user_1,user_2` などです。このパラメータのデフォルトは空の文字列です。最大長は 1024 文字です。指定したユーザー名は、`User` テーブルの `mysql.user` 列の対応する値と一致する必要があります。ユーザー名の詳細については、MySQL のドキュメントの「[アカウントユーザー名とパスワード](https://dev.mysql.com/doc/refman/8.0/en/user-names.html)」を参照してください。

 `server_audit_incl_users` と `server_audit_excl_users` の両方が空 (デフォルト) の場合、すべてのユーザーが監査されます。

 ユーザーを `server_audit_excl_users` に追加して `server_audit_incl_users` を空のままにすると、`server_audit_excl_users` にリストしたユーザーだけを監査せずに、他のすべてのユーザーを監査することができます。

 `server_audit_excl_users` と `server_audit_incl_users` の両方に同じユーザーを追加した場合、それらのユーザーが監査されます。同じユーザーが両方の設定にリストされている場合、`server_audit_incl_users` に対し、より高い優先順位が与えられます。

接続および切断イベントは、この可変の影響を受けません。指定された場合は常に記録されます。ユーザーが `server_audit_incl_users` パラメータでも指定されている場合、そのユーザーは記録されます。この設定の方が `server_audit_excl_users` より優先順位が高いためです。

## 監査ログの表示
<a name="AuroraMySQL.Auditing.View"></a>

 監査ログを表示およびダウンロードするには、コンソールを使用します。[**データベース**] ページで、DB インスタンスをクリックして詳細を表示し、[**ログ**] セクションまでスクロールします。高度な監査機能によって生成される監査ログには、`audit/audit.log.other_identifying_information` の形式で名前が付けられています。

ログファイルをダウンロードするには、[**ログ**] セクションでファイルを選択してから、[**ダウンロード**] を選択します。

[describe-db-log-files](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-log-files.html) AWS CLI コマンドを使用して、ログファイルのリストを取得することもできます。ログファイルの内容は、AWS CLI の [download-db-log-file-portion](https://docs.aws.amazon.com/cli/latest/reference/rds/download-db-log-file-portion.html) コマンドを実行してダウンロードできます。詳細については、「[データベースログファイルの表示とリスト化](USER_LogAccess.Procedural.Viewing.md)」および「[データベースログファイルのダウンロード](USER_LogAccess.Procedural.Downloading.md)」を参照してください。

## 監査ログの詳細
<a name="AuroraMySQL.Auditing.Logs"></a>

ログファイルは、UTF-8 形式のカンマ区切り変数 (CSV) ファイルとして表されます。クエリも一重引用符 (') で囲まれます。

監査ログは、各 Aurora MySQL DB インスタンスのローカルストレージに個別に保存されます。各インスタンスは、一度に 4 つのログファイルに書き込みを分散します。ログファイルの最大サイズは 100 MB です。この設定不可能な制限に達すると、Aurora はファイルを回転し、新しいファイルを生成します。

**ヒント**  
ログファイルのエントリは、順番になっていません。エントリを順序付けするには、タイムスタンプ値を使用します。最新のイベントを表示するには、すべてのログファイルの確認が必要な場合があります。ログデータの並べ替えと検索をより柔軟に行うためには、監査ログを CloudWatch にアップロードするための設定を有効にし、CloudWatch インターフェイスを使用してそれらを表示します。  
 より多くのタイプのフィールドを含み、JSON 形式で出力された監査データを表示するには、データベースのアクティビティストリーム機能を使用することもできます。詳細については、「[データベースアクティビティストリームを使用した Amazon Aurora のモニタリング](DBActivityStreams.md)」を参照してください。

監査ログファイルの行には、次のカンマ区切りの情報が指定された順序で含まれています。


| フィールド | 説明 | 
| --- | --- | 
|  timestamp  |  記録されたイベントの UNIX タイムスタンプ (マイクロ秒の精度)。  | 
|  serverhost  |  イベントが記録されているインスタンスの名前。  | 
|  username  |  ユーザーの接続されたユーザー名。  | 
|  host  |  ユーザーの接続元のホスト。  | 
|  connectionid  |  記録されたオペレーションの接続 ID 番号。  | 
|  queryid  |  クエリ ID 番号。リレーショナルテーブルイベントと関連するクエリの検索に使用できます。`TABLE` イベントの場合、複数の行が追加されます。  | 
|  オペレーション  |  記録されたアクションの種類。指定できる値は `CONNECT`、`QUERY`、`READ`、`WRITE`、`CREATE`、`ALTER`、`RENAME`、`DROP` です。  | 
|  データベース  |  `USE` コマンドにより設定されたアクティブなデータベース。  | 
|  オブジェクト  |  `QUERY` イベントの場合、この値は、データベースが実行したクエリを示します。`TABLE` イベントの場合、テーブル名を示します。  | 
|  retcode  |  記録されたオペレーションのリターンコード。  | 

# Amazon Aurora MySQL でのレプリケーション
<a name="AuroraMySQL.Replication"></a><a name="replication"></a>

 Aurora MySQL レプリケーション機能は、クラスターの高可用性とパフォーマンスにとって重要な要素です。Aurora では、最大 15 個の Aurora レプリカを使用して、簡単にクラスターの作成またはサイズ変更を行うことができます。

 すべてのレプリカは同じ基盤となるデータから機能します。一部のデータベースインスタンスがオフラインになると、他のデータベースインスタンスがクエリの処理を続行します。あるいは、必要に応じてライターの機能を引き継ぐことができます。Aurora は複数のデータベースインスタンスに読み取り専用接続を自動的に分散させ、Aurora クラスターがクエリ負荷の重いワークロードをサポートできるようにします。

以下のトピックでは、Aurora MySQL レプリケーションのしくみと、レプリケーション設定を最大限の可用性とパフォーマンスを得るために調整する方法について説明します。

**Topics**
+ [Aurora レプリカの使用](#AuroraMySQL.Replication.Replicas)
+ [Amazon Aurora MySQL のレプリケーションオプション](#AuroraMySQL.Replication.Options)
+ [Amazon Aurora MySQL レプリケーションのパフォーマンスに関する考慮事項](#AuroraMySQL.Replication.Performance)
+ [ダウンタイムのない再起動 (ZDR) (Amazon Aurora MySQL 用)](AuroraMySQL.Replication.Availability.md)
+ [Aurora MySQL でのレプリケーションフィルターの設定](AuroraMySQL.Replication.Filters.md)
+ [Amazon Aurora MySQL レプリケーションのモニタリング](#AuroraMySQL.Replication.Monitoring)
+ [AWS リージョン 間での Amazon Aurora MySQL DB クラスターのレプリケーション](AuroraMySQL.Replication.CrossRegion.md)
+ [Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)
+ [GTID ベースレプリケーションを使用する](mysql-replication-gtid.md)

## Aurora レプリカの使用
<a name="AuroraMySQL.Replication.Replicas"></a>

 Aurora レプリカは、Aurora DB クラスター内の独立したエンドポイントであり、読み取りオペレーションのスケーリングと可用性の向上に最適です。最大 15 個の Aurora レプリカを、AWS リージョン 内で DB クラスターがまたがるアベイラビリティーゾーン全体に分散できます。DB クラスターボリュームは DB クラスターのデータの複数のコピーで構成されますが、クラスターボリューム内のデータは、DB クラスター内のプライマリインスタンスと Aurora レプリカに対する単一の論理的なボリュームとして表されます。Aurora レプリカの詳細については、「[Aurora レプリカ](Aurora.Replication.md#Aurora.Replication.Replicas)」を参照してください。

 Aurora レプリカは、クラスターボリュームでの読み取りオペレーションに特化しているため、読み取りのスケーリングに最適です。書き込みオペレーションはプライマリインスタンスによって管理されます。クラスターボリュームは Aurora MySQL DB クラスター内のすべてのインスタンスで共有されるため、Aurora レプリカごとにデータのコピーをレプリケートする追加作業は必要ありません。対照的に、MySQL のリードレプリカは、単一スレッドで、出典 DB インスタンスからローカルデータストアへのすべての書き込みオペレーションを再生する必要があります。この制限により、大量の読み取りトラフィックをサポートする MySQL リードレプリカの能力に影響を与える可能性があります。

 Aurora MySQL では、Aurora レプリカが削除されるとそのインスタンスエンドポイントは直ちに削除され、Aurora レプリカもリーダーエンドポイントから削除されます。削除中の Aurora レプリカで実行されているステートメントがある場合は、削除までに 3 分の猶予期間があります。既存のステートメントは、猶予期間中に適切に終了する場合があります。猶予期間が終了すると、Aurora レプリカはシャットダウンし、削除されます。

**重要**  
 Aurora MySQL の Aurora レプリカは常に、InnoDB テーブル上のオペレーションに、デフォルトのトランザクション分離レベル `REPEATABLE READ` を使用します。`SET TRANSACTION ISOLATION LEVEL` コマンドは、Aurora MySQL DB クラスターのプライマリインスタンスのトランザクションレベルを変更する場合にのみ使用できます。この制限により、Aurora レプリカ上でのユーザーレベルのロックを回避し、Aurora レプリカがレプリカの遅延を最小限に抑えたまま何千ものアクティブユーザーの接続のサポートをできるようにします。

**注記**  
 プライマリインスタンスで実行された DDL ステートメントにより、関連付けられた Aurora レプリカのデータベース接続が中断される場合があります。Aurora レプリカ接続でテーブルなどのデータベースオブジェクトを使用中である場合、そのオブジェクトが DDL ステートメントを使用してプライマリインスタンスで変更されると、Aurora レプリカ接続は中断されます。

**注記**  
 中国 (寧夏) リージョンは、クロスリージョンリードレプリカをサポートしません。

## Amazon Aurora MySQL のレプリケーションオプション
<a name="AuroraMySQL.Replication.Options"></a>

次のいずれのオプションの間でもレプリケーションを設定できます。
+ 異なる AWS リージョン の 2 つの Aurora MySQL DB クラスター (Aurora MySQL DB クラスターのクロスリージョンリードレプリカを作成)。

  詳細については、「[AWS リージョン 間での Amazon Aurora MySQL DB クラスターのレプリケーション](AuroraMySQL.Replication.CrossRegion.md)」を参照してください。
+ 同一の AWS リージョン の 2 つの Aurora MySQL DB クラスター (MySQL バイナリログ (binlog) のレプリケーションを使用)。

  詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。
+ 出典としての RDS for MySQL DB インスタンスと Aurora MySQL DB クラスター (RDS for MySQL DB インスタンスの Aurora リードレプリカを作成)。

  このアプローチを使用すると、Aurora への移行中に既存および進行中のデータ変更を Aurora MySQL に取り込むことができます。詳細については、「[Aurora リードレプリカを使用した、RDS for MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターへのデータの移行](AuroraMySQL.Migrating.RDSMySQL.Replica.md)」を参照してください。

  また、このアプローチを使用して、データの読み取りクエリのスケーラビリティを向上させることもできます。これを行うには、読み取り専用 Aurora MySQL クラスター内の複数の DB インスタンスを使用してデータをクエリします。詳細については、「[Amazon Aurora を使用した MySQL データベースの読み取りスケーリング](AuroraMySQL.Replication.ReadScaling.md)」を参照してください。
+ 1 つの AWS リージョン 内の Aurora MySQL DB クラスターと、異なるリージョンにある最大 5 つの Aurora 読み取り専用 Aurora MySQL DB クラスター (Aurora Global Database を作成)。

  Aurora Global Database を使用して、ワールドワイドなフットプリントを持つアプリケーションをサポートできます。プライマリ Aurora MySQL DB クラスターには、ライターインスタンスと最大 15 個の Aurora レプリカがあります。読み取り専用セカンダリ Aurora MySQL DB クラスターは、それぞれ最大 16 個の Aurora レプリカで構成できます。詳細については、「[Amazon Aurora Global Database の使用](aurora-global-database.md)」を参照してください。

**注記**  
また、Amazon Aurora DB クラスターのプライマリインスタンスを再起動すると、DB クラスター全体の一貫した読み取り/書き込みを保証するエントリポイントを再確立するために、DB クラスターの Aurora レプリカも自動的に再起動します。

## Amazon Aurora MySQL レプリケーションのパフォーマンスに関する考慮事項
<a name="AuroraMySQL.Replication.Performance"></a>

以下の機能を使用して、Aurora MySQL レプリケーションのパフォーマンスを微調整することができます。

レプリカログ圧縮機能は、レプリケーションメッセージのネットワーク帯域幅を自動的に縮小します。各メッセージはすべての Aurora レプリカに送信されるため、大規模なクラスターではメリットが大きくなります。この機能には、圧縮を実行する書き込みノードの CPU オーバーヘッドが含まれます。Aurora MySQL バージョン 2 とバージョン 3 では、常に有効になっています。

バイナリログフィルタ処理機能は、レプリケーションメッセージのネットワーク帯域幅を自動的に縮小します。レプリケーションメッセージに含まれるバイナリログ情報は、Aurora レプリカで使用されないため、これらのノードに送信されるメッセージからは除外されます。

Aurora MySQL バージョン 2 の場合、`aurora_enable_repl_bin_log_filtering` パラメーターを変更することにより、この機能を制御できます。このパラメータはデフォルトでオンになっています。この最適化は透過的であることを意図されているため、この設定をオフにできるのは、レプリケーションに関する問題の診断時またはトラブルシューティング時に限られる場合があります。この機能を使用できない古い Aurora MySQL クラスターなどの場合は、その動作に合わせてこの設定をオフにすることができます。

Aurora MySQL バージョン 3 の場合、バイナリログフィルタリングは常に有効です。

# ダウンタイムのない再起動 (ZDR) (Amazon Aurora MySQL 用)
<a name="AuroraMySQL.Replication.Availability"></a><a name="zdr"></a>

ダウンタイムのない再起動 (ZDR) 機能は、特定の種類の再起動中に DB インスタンスへのアクティブな接続の一部または全部を保持できます。ZDR は、Aurora がエラー条件 (レプリカが出典より遅すぎるなど) を解決するために自動的に実行する再起動に適用されます。

**重要**  
ZDR メカニズムはベストエフォートベースで動作します。ZDR が適用される場合を決定する Aurora MySQL バージョン、インスタンスクラス、エラー条件、互換性のある SQL オペレーション、およびその他の要因は、いつでも変更される可能性があります。

Aurora MySQL 2.x の ZDR にはバージョン 2.10 以降が必要です。ZDR は Aurora MySQL 3.x のすべてのマイナーバージョンで利用可能です。Aurora MySQL バージョン 2 と 3 では、ZDR メカニズムはデフォルトでオンになっており、Aurora は `aurora_enable_zdr` パラメータを使用しません。

Aurora は、停止時間ゼロの再起動に関連するアクティビティに関するレポートを、 [**イベント**] ページに表示します。Aurora は、ZDR メカニズムを使用して再起動を試みる際にイベントを記録します。このイベントは、Aurora が再起動を実行する理由を示します。その後、Aurora は再起動の完了時に別のイベントを記録します。この最終イベントは、再起動中にプロセスに要した時間、および保持またはドロップされた接続の数を報告します。データベースエラーログを参照して、再起動中に発生した処理の詳細を確認できます。

ZDR オペレーションが成功した後も接続はそのまま残りますが、一部の可変と機能は再初期化されます。次の種類の情報は、ダウンタイムのない再起動によって生じる再起動を通じては保持されません。
+ グローバル可変 Aurora はセッション可変を復元しますが、再起動後のグローバル可変の復元は行いません。
+ ステータス可変。特に、エンジンのステータスによって報告される稼働時間の値はリセットされます。
+ `LAST_INSERT_ID`. 
+ テーブルのメモリ内 `auto_increment` 状態。メモリ内自動インクリメント状態が再初期化されます。自動インクリメント値の詳細については、[MySQL リファレンスマニュアル](https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html#innodb-auto-increment-initialization)を参照してください。
+ `INFORMATION_SCHEMA` および `PERFORMANCE_SCHEMA` テーブルからの診断情報。この診断情報は、`SHOW PROFILE` や `SHOW PROFILES` などのコマンドの出力にも表示されます。

次の表では、クラスター内の DB インスタンスを再起動するときに Aurora が ZDR メカニズムを使用できるかどうかを決定するバージョン、インスタンスロール、およびその他の状況を示しています。


| Aurora MySQL バージョン | ZDR はライターに適用されますか? | ZDR はリーダーに適用されますか？ | ZDR は常に有効ですか？ | メモ | 
| --- | --- | --- | --- | --- | 
|  2.x、2.10.0 未満  |  不可  |  いいえ  |  該当なし  |  ZDR はこれらのバージョンでは利用できません。  | 
|  2.10.0～2.11.0  |  あり  |  はい  |  可能  |  Aurora は、アクティブな接続で進行中のトランザクションをロールバックします。アプリケーションはトランザクションを再試行する必要があります。 Aurora は、TLS/SSL、一時テーブル、テーブルロック、またはユーザーロックを使用するすべての接続をキャンセルします。  | 
|  2.11.1 以降  |  あり  |  はい  |  可能  |  Aurora は、アクティブな接続で進行中のトランザクションをロールバックします。アプリケーションはトランザクションを再試行する必要があります。 Aurora は、一時テーブル、テーブルロック、またはユーザーロックを使用するすべての接続をキャンセルします。  | 
|  3.01～3.03  |  あり  |  はい  |  可能  |  Aurora は、アクティブな接続で進行中のトランザクションをロールバックします。アプリケーションはトランザクションを再試行する必要があります。 Aurora は、TLS/SSL、一時テーブル、テーブルロック、またはユーザーロックを使用するすべての接続をキャンセルします。  | 
|  3.04 以上  |  あり  |  はい  |  可能  |  Aurora は、アクティブな接続で進行中のトランザクションをロールバックします。アプリケーションはトランザクションを再試行する必要があります。 Aurora は、一時テーブル、テーブルロック、またはユーザーロックを使用するすべての接続をキャンセルします。  | 

# Aurora MySQL でのレプリケーションフィルターの設定
<a name="AuroraMySQL.Replication.Filters"></a>

レプリケーションフィルターを使用して、リードレプリカでレプリケートするデータベースとテーブルを指定できます。レプリケーションフィルターは、データベースとテーブルをレプリケーションに含めることも、レプリケーションから除外することもできます。

レプリケーションフィルターの使用例は以下のとおりです。
+ リードレプリカのサイズを縮小します。レプリケーションフィルタリングを使用すると、リードレプリカで必要のないデータベースとテーブルを除外できます。
+ セキュリティ上の理由から、データベースとテーブルをリードレプリカから除外するため。
+ 異なるリードレプリカで、特定のユースケースごとにさまざまなデータベースとテーブルを複製するため。例えば、分析やシャーディングに特定のリードレプリカを使用できます。
+ 異なる AWS リージョン にリードレプリカがある DB クラスターで、異なる AWS リージョン に異なるデータベースまたはテーブルを複製するには。
+ インバウンドレプリケーショントポロジでレプリカとして設定されている Aurora MySQL DB クラスターでレプリケートするデータベースとテーブルを指定するには。この設定の詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。

**Topics**
+ [Aurora MySQL のレプリケーションフィルターパラメータの設定](#AuroraMySQL.Replication.Filters.Configuring)
+ [Aurora MySQL のレプリケーションフィルターの制限](#AuroraMySQL.Replication.Filters.Limitations)
+ [Aurora MySQL のレプリケーションフィルターの例](#AuroraMySQL.Replication.Filters.Examples)
+ [リードレプリカのレプリケーションフィルターを表示する](#AuroraMySQL.Replication.Filters.Viewing)

## Aurora MySQL のレプリケーションフィルターパラメータの設定
<a name="AuroraMySQL.Replication.Filters.Configuring"></a>

レプリケーションフィルターを設定するには、次のパラメータを設定します。
+ `binlog-do-db` - 指定されたバイナリログテーブルに変更を複製します。バイナリログソースクラスターに対してこのパラメータを設定すると、パラメータで指定されたバイナリログのみが複製されます。
+ `binlog-ignore-db` - 指定されたバイナリログテーブルに変更を複製しません。バイナリログソースクラスターに対して `binlog-do-db` パラメータが設定されている場合、このパラメータは評価されません。
+ `replicate-do-db` - 指定したデータベースに変更を複製します。バイナリログソースクラスターに対してこのパラメータを設定すると、パラメータで指定されたデータベースのみが複製されます。
+ `replicate-ignore-db` - 指定したデータベースに変更を複製しないでください。バイナリログレプリカスクラスターに対して `replicate-do-db` パラメータが設定されている場合、このパラメータは評価されません。
+ `replicate-do-table` -指定されたテーブルに変更を複製します。このパラメータをリードレプリカに設定した場合、パラメータで指定したテーブルのみが複製されます。また、`replicate-do-db` または `replicate-ignore-db` パラメータが設定されている場合は、指定されたテーブルを含むデータベースを、必ずバイナリログレプリカクラスターのレプリケーションに含めます。
+ `replicate-ignore-table` - 指定したテーブルに変更を複製しないでください。バイナリログレプリカスクラスターに対して `replicate-do-table` パラメータが設定されている場合、このパラメータは評価されません。
+ `replicate-wild-do-table` - 指定したデータベースおよびテーブル名のパターンに基づいてテーブルを複製します。`%` および `_` ワイルドカードの文字がサポート対象となります。`replicate-do-db` または `replicate-ignore-db` パラメータが設定されている場合は、指定されたテーブルを含むデータベースを、必ずバイナリログレプリカクラスターのレプリケーションに含めます。
+ `replicate-wild-ignore-table` - 指定したデータベースおよびテーブル名のパターンに基づいてテーブルを複製しないでください。`%` および `_` ワイルドカードの文字がサポート対象となります。バイナリログレプリカスクラスターに対して `replicate-do-table` または `replicate-wild-do-table` パラメータが設定されている場合、このパラメータは評価されません。

パラメータは、記載されている順序に沿って評価されます。これらのパラメータの詳細な仕組みについては、MySQL のドキュメントを参照してください。
+ 一般的な情報については、[ Replica Server Options and Variables](https://dev.mysql.com/doc/refman/8.0/en/replication-options-replica.html) を参照してください。
+ データベースレプリケーションのフィルターパラメータを評価する方法については、[ Evaluation of Database-Level Replication and Binary Logging Options](https://dev.mysql.com/doc/refman/8.0/en/replication-rules-db-options.html) を参照してください。
+ テーブルレプリケーションのフィルターパラメータを評価する方法については、[Evaluation of Table-Level Replication Options](https://dev.mysql.com/doc/refman/8.0/en/replication-rules-table-options.html) を参照してください。

デフォルトでは、これらの各パラメータの値は空です。各バイナリログクラスターで、これらのパラメータを使用してレプリケーションフィルターを設定、変更、削除することができます。これらのパラメータの 1 つを設定する場合は、各フィルターを他のフィルターとコンマで区切ります。

`%` および `_` パラメータで `replicate-wild-do-table` および `replicate-wild-ignore-table` ワイルドカードの文字を使用できます。`%` ワイルドカードは任意の文字数と一致し、`_` ワイルドカードは 1 文字のみと一致します。

ソース DB インスタンスのバイナリログ形式は、データ変更のレコードを決定するため、レプリケーションでは重要です。`binlog_format` パラメータの設定により、レプリケーションが行ベースかステートメントベースかが決まります。詳細については、「[シングル AZ データベースの Aurora MySQL バイナリログの設定](USER_LogAccess.MySQL.BinaryFormat.md)」を参照してください。

**注記**  
ソース DB インスタンスの `binlog_format` 設定に関係なく、すべてのデータ定義言語 (DDL) ステートメントはステートメントとして複製されます。

## Aurora MySQL のレプリケーションフィルターの制限
<a name="AuroraMySQL.Replication.Filters.Limitations"></a>

Aurora MySQL のレプリケーションフィルターには、次の制限が適用されます。
+ レプリケーションフィルターは、Aurora MySQL バージョン 3 でのみサポートされます。
+ 各レプリケーションフィルターのパラメータには、2,000 文字といった制限があります。
+ レプリケーションフィルターでは、カンマはサポートされていません。
+ レプリケーションフィルタリングは、XA トランザクションをサポートしていません。

  詳細については、MySQL ドキュメントの「[Restrictions on XA Transactions](https://dev.mysql.com/doc/refman/8.0/en/xa-restrictions.html)」を参照してください。

## Aurora MySQL のレプリケーションフィルターの例
<a name="AuroraMySQL.Replication.Filters.Examples"></a>

リードレプリカのレプリケーションフィルタリングを設定するには、リードレプリカに関連付けられている DB クラスターパラメータグループのレプリケーションフィルタリングパラメータを変更します。

**注記**  
デフォルトの DB クラスターパラメータグループを変更することはできません。リードレプリカがデフォルトのパラメータグループを使用している場合は、新しいパラメータグループを作成してリードレプリカに関連付けます。DB クラスターパラメータグループの詳細については、「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。

AWS マネジメントコンソール、AWS CLI、または RDS API を使用して、DB クラスターパラメータグループのパラメータを設定できます。パラメータの設定の詳細については、「[Amazon Aurora の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。DB クラスターパラメータグループのパラメータを設定すると、そのパラメータグループに関連付けられているすべての DB クラスターがパラメータ設定を使用します。DB クラスターパラメータグループでレプリケーションフィルタリングパラメータを設定する場合は、パラメータグループがリードレプリカクラスターにのみ関連付けられていることを確認してください。ソース DB インスタンスのレプリケーションフィルターのパラメータは空のままにします。

次の例では、AWS CLI を使用してパラメータを設定します。これらの例では、CLI コマンドが完了した直後にパラメータの変更が行われるように `ApplyMethod` を `immediate` に設定しています。リードレプリカの再起動後に保留中の変更を適用する場合は、`ApplyMethod` を `pending-reboot` に設定します。

以下の例では、レプリケーションフィルターを設定します。
+ [Including databases in replication](#rep-filter-in-dbs-ams)
+ [Including tables in replication](#rep-filter-in-tables-ams)
+ [Including tables in replication with wildcard characters](#rep-filter-in-tables-wildcards-ams)
+ [Excluding databases from replication](#rep-filter-ex-dbs-ams)
+ [Excluding tables from replication](#rep-filter-ex-tables-ams)
+ [Excluding tables from replication using wildcard characters](#rep-filter-ex-tables-wildcards-ams)<a name="rep-filter-in-dbs-ams"></a>

**Example レプリケーションにデータベースを含める**  
次の例では、レプリケーションに `mydb1` データベースと `mydb2` データベースを含めています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-do-db,ParameterValue='mydb1,mydb2',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-do-db,ParameterValue='mydb1,mydb2',ApplyMethod=immediate"
```<a name="rep-filter-in-tables-ams"></a>

**Example レプリケーションにテーブルを含める**  
次の例では、データベース `mydb1` の `table1` テーブルと `table2` テーブルをレプリケーションに含めています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-do-table,ParameterValue='mydb1.table1,mydb1.table2',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-do-table,ParameterValue='mydb1.table1,mydb1.table2',ApplyMethod=immediate"
```<a name="rep-filter-in-tables-wildcards-ams"></a>

**Example ワイルドカードの文字を使用してレプリケーションにテーブルを含める**  
次の例では、データベース `mydb` の `order` および `return` で始まる名前のテーブルをレプリケーションに含めています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-wild-do-table,ParameterValue='mydb.order%,mydb.return%',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-wild-do-table,ParameterValue='mydb.order%,mydb.return%',ApplyMethod=immediate"
```<a name="rep-filter-ex-dbs-ams"></a>

**Example レプリケーションからデータベースを除外する**  
次の例では、`mydb5` データベースと `mydb6` データベースをレプリケーションから除外しています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-ignore-db,ParameterValue='mydb5,mydb6',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-ignore-db,ParameterValue='mydb5,mydb6,ApplyMethod=immediate"
```<a name="rep-filter-ex-tables-ams"></a>

**Example レプリケーションからテーブルを除外する**  
次の例では、データベース `mydb5` のテーブル `table1` とデータベース `mydb6` の `table2` をレプリケーションから除外しています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-ignore-table,ParameterValue='mydb5.table1,mydb6.table2',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-ignore-table,ParameterValue='mydb5.table1,mydb6.table2',ApplyMethod=immediate"
```<a name="rep-filter-ex-tables-wildcards-ams"></a>

**Example ワイルドカードの文字を使用したレプリケーションからテーブルを除外する**  
次の例では、データベース `mydb7` の `order` および `return` で始まる名前のテーブルをレプリケーションから除外しています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-wild-ignore-table,ParameterValue='mydb7.order%,mydb7.return%',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-wild-ignore-table,ParameterValue='mydb7.order%,mydb7.return%',ApplyMethod=immediate"
```

## リードレプリカのレプリケーションフィルターを表示する
<a name="AuroraMySQL.Replication.Filters.Viewing"></a>

リードレプリカのレプリケーションフィルターは、次の方法で表示できます。
+ リードレプリカに関連付けられているパラメータグループのレプリケーションフィルタリングパラメータの設定を確認してください。

  手順については、「[Amazon Aurora のDB パラメータグループのパラメータ値の表示](USER_WorkingWithParamGroups.Viewing.md)」を参照してください。
+ MySQL クライアントで、リードレプリカに接続し、`SHOW REPLICA STATUS` ステートメントを実行します。

  出力の次のフィールドには、リードレプリカのレプリケーションフィルターが表示されます。
  + `Binlog_Do_DB`
  + `Binlog_Ignore_DB`
  + `Replicate_Do_DB`
  + `Replicate_Ignore_DB`
  + `Replicate_Do_Table`
  + `Replicate_Ignore_Table`
  + `Replicate_Wild_Do_Table`
  + `Replicate_Wild_Ignore_Table`

  これらのフィールドの詳細については、MySQL のドキュメントの [Checking Replication Status](https://dev.mysql.com/doc/refman/8.0/en/replication-administration-status.html) を参照してください。

## Amazon Aurora MySQL レプリケーションのモニタリング
<a name="AuroraMySQL.Replication.Monitoring"></a>

読み取りのスケーリングと高可用性は最短遅延時間に左右されます。Amazon CloudWatch `AuroraReplicaLag` メトリクスをモニタリングすることによって、Aurora レプリカが Aurora MySQL DB クラスターのプライマリインスタンスからどれくらい遅延しているかを確認できます。`AuroraReplicaLag` メトリクスは各 Aurora レプリカに記録されます。

プライマリ DB インスタンスは、`AuroraReplicaLagMaximum` メトリクスと `AuroraReplicaLagMinimum` Amazon CloudWatch メトリクスも記録します。`AuroraReplicaLagMaximum` メトリクスは、DB クラスターのプライマリ DB インスタンスと各 Aurora レプリカの間の最大遅延量を記録します。`AuroraReplicaLagMinimum` メトリクスは、DB クラスターのプライマリ DB インスタンスと各 Aurora レプリカの間の最小遅延量を記録します。

Aurora レプリカの遅延について最新の値が必要な場合は、Amazon CloudWatch で `AuroraReplicaLag` メトリクスを確認できます。Aurora レプリカの遅延は、`information_schema.replica_host_status` テーブル内にある Aurora MySQL DB クラスターの各 Aurora レプリカにも記録されます。このテーブルの詳細については、「[information\$1schema.replica\$1host\$1status](AuroraMySQL.Reference.ISTables.md#AuroraMySQL.Reference.ISTables.replica_host_status)」を参照してください。

RDS インスタンスと CloudWatch メトリックスのモニタリングの詳細については、「[Amazon Aurora クラスターでのメトリクスのモニタリング](MonitoringAurora.md)」を参照してください。

# AWS リージョン 間での Amazon Aurora MySQL DB クラスターのレプリケーション
<a name="AuroraMySQL.Replication.CrossRegion"></a>

 Amazon Aurora MySQL DB クラスターを、出典 DB クラスターとは異なる AWS リージョン に、リードレプリカとして作成できます。このアプローチを使用すると、災害対策機能が向上し、ユーザーに近い AWS リージョン への読み取りオペレーションをスケールして、AWS リージョン 間の移行を容易にすることができます。

 暗号化されている DB クラスターと暗号化されていない DB クラスターの両方のリードレプリカを作成できます。出典 DB クラスターが暗号化されている場合、リードレプリカを暗号化する必要があります。

 出典 DB クラスターごとに、リードレプリカとすることができるクロスリージョン DB クラスターは最大 5 つです。

**注記**  
 クロスリージョンリードレプリカの代わりに、 Aurora Global Database を使用して、最小限のラグタイムで読み取り操作をスケールできます。Aurora Global Database では、1 つの AWS リージョンにプライマリ Aurora DB クラスターがあり、異なるリージョンに最大 10 の読み取り専用セカンダリ DB クラスターがあります。各セカンダリ DB クラスターには、最大 16 個の (15 ではなく) Aurora レプリカを含めることができます。プライマリ DB クラスターからすべてのセカンダリへのレプリケーションは、データベースエンジンではなく Aurora ストレージレイヤーによって処理されるため、変更をレプリケートする際のラグタイムは非常に短く、通常は 1 秒未満となります。データベースエンジンをレプリケーションプロセスから除外するということは、データベースエンジンがワークロードの処理のみを実行することを意味します。また、Aurora MySQL の binlog (バイナリログ) のレプリケーションを設定または管理する必要もありません。詳細については[Amazon Aurora Global Database の使用](aurora-global-database.md)を参照してください。

 別の AWS リージョン に Aurora MySQL DB クラスターのリードレプリカを作成する場合は、以下の点に注意してください。
+  出典 DB クラスターとクロスリージョンリードレプリカ DB クラスターのどちらにも、最大 15 個の Aurora レプリカを DB クラスターのプライマリインスタンスと同時に作成できます。この機能により、出典 AWS リージョン とレプリケーションターゲットの AWS リージョン の両方で、読み取りオペレーションをスケールできるようになります。
+  クロスリージョンシナリオでは、AWS リージョン 間のネットワークチャネルが長くなるため、出典 DB クラスターとリードレプリカ間のラグタイムが長くなります。
+  クロスリージョンレプリケーションから転送されたデータには、Amazon RDS のデータ転送料金が発生します。以下のクロスリージョンレプリケーションアクションでは、出典 AWS リージョン から転送されるデータに対して料金が発生します。
  +  リードレプリカを作成すると、Amazon RDS によって出典クラスターのスナップショットが作成され、リードレプリカを保持する AWS リージョン に、そのスナップショットが転送されます。
  +  出典データベースのデータが変更されるたびに、Amazon RDS によって、出典リージョンからリードレプリカを保持する AWS リージョン にデータが転送されます。

   Amazon RDS データ転送料金の詳細については、「[Amazon Aurora の料金](https://aws.amazon.com/rds/aurora/pricing/)」を参照してください。
+  同じ出典 DB クラスターを参照するリードレプリカに対して、複数の同時作成または削除アクションを実行できます。ただし、出典 DB クラスターごとに作成できるリードレプリカは 5 つまでです。
+  レプリケーションを効率的に実行するには、各リードレプリカに、出典 DB クラスターと同程度のコンピューティングおよびストレージリソースが必要です。出典 DB クラスターを拡張した場合、リードレプリカも拡張する必要があります。

**Topics**
+ [スタートする前に](#AuroraMySQL.Replication.CrossRegion.Prerequisites)
+ [Aurora MySQL のクロスリージョンリードレプリカ DB クラスターの作成](AuroraMySQL.Replication.CrossRegion.Creating.md)
+ [リードレプリカの Aurora MySQL DB クラスターへの昇格](AuroraMySQL.Replication.CrossRegion.Promote.md)
+ [Amazon Aurora MySQL クロスリージョンレプリカのトラブルシューティング](AuroraMySQL.Replication.CrossRegion.Troubleshooting.md)

## スタートする前に
<a name="AuroraMySQL.Replication.CrossRegion.Prerequisites"></a>

 クロスリージョンリードレプリカとなる Aurora MySQL DB クラスターを作成する前に、出典 Aurora MySQL DB クラスターでバイナリログを有効にする必要があります。Aurora MySQL のクロスリージョンレプリケーションは、MySQL バイナリレプリケーションを使用してクロスリージョンリードレプリカ DB クラスターでの変更を再生します。

 Aurora MySQL DB クラスターでバイナリログ記録を有効にするには、出典 DB クラスターの `binlog_format` パラメータを更新します。`binlog_format` パラメータはクラスターレベルのパラメータであり、デフォルトクラスターパラメータグループにあります。DB クラスターがデフォルトクラスター DB パラメータグループを使用している場合、新しい DB クラスターパラメータグループを作成して `binlog_format` 設定を変更します。`binlog_format` を `MIXED` に設定することをお勧めします。ただし、特定バイナリログ形式が必要な場合は `binlog_format` を `ROW` または `STATEMENT` に設定する必要もあります。変更を適用するには、Aurora DB クラスターを再起動します。

 Aurora MySQL でバイナリログ記録を使用する方法の詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。Aurora MySQL 設定パラメータの変更の詳細については、「[Amazon Aurora の DB クラスターパラメータと DB インスタンスパラメータ](USER_WorkingWithDBClusterParamGroups.md#Aurora.Managing.ParameterGroups)」および「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。

# Aurora MySQL のクロスリージョンリードレプリカ DB クラスターの作成
<a name="AuroraMySQL.Replication.CrossRegion.Creating"></a>

 AWS マネジメントコンソール、AWS Command Line Interface (AWS CLI)、または Amazon RDS API を使用して、クロスリージョンリードレプリカである Aurora DB クラスターを作成できます。暗号化されている DB クラスターと暗号化されていない DB クラスターの両方からクロスリージョンリードレプリカを作成できます。

 AWS マネジメントコンソール を使用して Aurora MySQL のクロスリージョンリードレプリカを作成すると、Amazon RDS はターゲットの AWS リージョン に DB クラスターを作成した後、その DB クラスターのプライマリインスタンスとなる DB インスタンスを自動的に作成します。

 AWS CLI または RDS API を使用してクロスリージョンリードレプリカを作成する場合は、まずターゲット AWS リージョン で DB クラスターを作成し、アクティブになるまで待ちます。アクティブになったら、その DB クラスターのプライマリインスタンスとなる DB インスタンスを作成します。

 レプリケーションは、リードレプリカ DB クラスターのプライマリインスタンスが使用可能になるとスタートされます。

 Aurora MySQL DB クラスターからクロスリージョンリードレプリカを作成するには、以下の手順に従います。これらの手順は、暗号化されている DB クラスターまたは暗号化されていない DB クラスターからリードレプリカを作成するために使用できます。

## コンソール
<a name="AuroraMySQL.Replication.CrossRegion.Creating.Console"></a>

**AWS マネジメントコンソール を使用してクロスリージョンリードレプリカとなる Aurora MySQL DB クラスターを作成するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/) を開きます。

1.  AWS マネジメントコンソール の右上隅で、出典 DB クラスターをホストする AWS リージョン を選択します。

1.  ナビゲーションペインで、**データベース**を選択します。

1.  クロスリージョンリードレプリカを作成する DB クラスターを選択します。

1. **[Actions]** (アクション) として、**[Create cross-Region read replica]** (クロスリージョンリードレプリカの作成) を選択します。

1.  [**クロスリージョンのリードレプリカの作成**] ページで、以下の表に示すように、クロスリージョンリードレプリカ DB クラスターのオプション設定を選択します。    
<a name="cross-region-read-replica-settings"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.CrossRegion.Creating.html)

1.  [**作成**] を選択して、Aurora のクロスリージョンリードレプリカを作成します。

## AWS CLI
<a name="AuroraMySQL.Replication.CrossRegion.Creating.CLI"></a>

**CLI でクロスリージョンリードレプリカとなる Aurora MySQL DB クラスターを作成するには**

1.  リードレプリカ DB クラスターを作成する AWS リージョン で、AWS CLI [create-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html) コマンドを呼び出します。`--replication-source-identifier` オプションを含め、リードレプリカを作成する出典 DB クラスターの Amazon リソースネーム (ARN) を指定します。

    `--replication-source-identifier` により識別される DB クラスターが暗号化されているクロスリージョンレプリケーションの場合、`--kms-key-id` オプションと `--storage-encrypted` オプションを指定します。
**注記**  
 `--storage-encrypted` を指定して、`--kms-key-id` の値を指定することにより、暗号化されていない DB クラスターから暗号化されているリードレプリカへのクロスリージョンレプリケーションをセットアップできます。

    `--master-username` パラメータ `--master-user-password` とパラメータは指定できません。これらの値は、出典 DB クラスターから取得されます。

    次のコード例では、us-west-2 リージョンにある暗号化されていない DB クラスタースナップショットから us-east-1 リージョンにリードレプリカが作成されます。このコマンドは、us-east-1 リージョンで呼び出されます。この例では、マスターユーザーパスワードを生成して Secrets Manager で管理する `--manage-master-user-password` オプションを指定しています。詳細については、「[Amazon Aurora および AWS Secrets Manager によるパスワード管理](rds-secrets-manager.md)」を参照してください。または、`--master-password` オプションを使用して、自分でパスワードを指定して管理することもできます。

   Linux、macOS、Unix の場合:

   ```
   aws rds create-db-cluster \
     --db-cluster-identifier sample-replica-cluster \
     --engine aurora-mysql \
     --engine-version 8.0.mysql_aurora.3.08.0 \
     --replication-source-identifier arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster
   ```

   Windows の場合:

   ```
   aws rds create-db-cluster ^
     --db-cluster-identifier sample-replica-cluster ^
     --engine aurora-mysql ^
     --engine-version 8.0.mysql_aurora.3.08.0 ^
     --replication-source-identifier arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster
   ```

    次のコード例では、us-west-2 リージョンにある暗号化されている DB クラスタースナップショットから us-east-1 リージョンにリードレプリカが作成されます。このコマンドは、us-east-1 リージョンで呼び出されます。

   Linux、macOS、Unix の場合:

   ```
   aws rds create-db-cluster \
     --db-cluster-identifier sample-replica-cluster \
     --engine aurora-mysql \
     --engine-version 8.0.mysql_aurora.3.08.0 \
     --replication-source-identifier arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster \
     --kms-key-id my-us-east-1-key \
     --storage-encrypted
   ```

   Windows の場合:

   ```
   aws rds create-db-cluster ^
     --db-cluster-identifier sample-replica-cluster ^
     --engine aurora-mysql ^
     --engine-version 8.0.mysql_aurora.3.08.0 ^
     --replication-source-identifier arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster ^
     --kms-key-id my-us-east-1-key ^
     --storage-encrypted
   ```

   `--source-region` GovCloud (米国東部) リージョンと AWS GovCloud (米国西部) リージョン間のクロスリージョンレプリケーションには、AWS で識別される DB クラスターが暗号化されている場合、`--replication-source-identifier` オプションが必要です。`--source-region` には、ソース DB クラスターの AWS リージョン を指定します。

   `--source-region` を指定しない場合、`--pre-signed-url` の値を指定します。*署名付きの URL* は、ソースの AWS リージョン で呼び出される `create-db-cluster` コマンドに対する、署名バージョン 4 で署名されたリクエストを含む URL です。`pre-signed-url` オプションの詳細については、*AWS CLI コマンドリファレンス*の「[create-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html)」を参照してください。

1.  以下の例に示すように、AWS CLI の [describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) コマンドを使用して、DB クラスターが使用できる状態であることを確認します。

   ```
   aws rds describe-db-clusters --db-cluster-identifier sample-replica-cluster
   ```

    **`describe-db-clusters`** の結果にステータス `available` と表示されたら、レプリケーションをスタートできるように DB クラスターのプライマリインスタンスを作成します。そのためには、以下の例に示すように AWS CLI [create-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) コマンドを使用します。

   Linux、macOS、Unix の場合:

   ```
   aws rds create-db-instance \
     --db-cluster-identifier sample-replica-cluster \
     --db-instance-class db.r5.large \
     --db-instance-identifier sample-replica-instance \
     --engine aurora-mysql
   ```

   Windows の場合:

   ```
   aws rds create-db-instance ^
     --db-cluster-identifier sample-replica-cluster ^
     --db-instance-class db.r5.large ^
     --db-instance-identifier sample-replica-instance ^
     --engine aurora-mysql
   ```

    DB インスタンスが作成されて使用可能になると、レプリケーションが始まります。DB インスタンスが使用可能かどうかを確認するには、AWS CLI の [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) コマンドを呼び出します。

## RDS API
<a name="AuroraMySQL.Replication.CrossRegion.Creating.API"></a>

**API を使用して、クロスリージョンリードレプリカとなる Aurora MySQL DB クラスターを作成するには**

1.  リードレプリカ DB クラスターを作成する AWS リージョン で、RDS API [CreateDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBCluster.html) オペレーションを呼び出します。`ReplicationSourceIdentifier` パラメータを含め、リードレプリカを作成する出典 DB クラスターの Amazon リソースネーム (ARN) を指定します。

    `ReplicationSourceIdentifier` により識別される DB クラスターが暗号化されているクロスリージョンレプリケーションの場合、`KmsKeyId` パラメータを指定して、`StorageEncrypted` パラメータを `true` に設定します。
**注記**  
 `StorageEncrypted` を **true** と指定し、`KmsKeyId` の値を指定することにより、暗号化されていない DB クラスターから暗号化されているリードレプリカへのクロスリージョンレプリケーションをセットアップできます。この場合、`PreSignedUrl` を指定する必要はありません。

    `MasterUsername` パラメータと `MasterUserPassword` パラメータは、出典 DB クラスターから取得されるため、これらの値を追加する必要はありません。

    次のコード例では、us-west-2 リージョンにある暗号化されていない DB クラスタースナップショットから us-east-1 リージョンにリードレプリカが作成されます。このアクションは、us-east-1 リージョンで呼び出されます。

   ```
   https://rds.us-east-1.amazonaws.com/
     ?Action=CreateDBCluster
     &ReplicationSourceIdentifier=arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster
     &DBClusterIdentifier=sample-replica-cluster
     &Engine=aurora-mysql
     &SignatureMethod=HmacSHA256
     &SignatureVersion=4
     &Version=2014-10-31
     &X-Amz-Algorithm=AWS4-HMAC-SHA256
     &X-Amz-Credential=AKIADQKE4SARGYLE/20161117/us-east-1/rds/aws4_request
     &X-Amz-Date=20160201T001547Z
     &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
     &X-Amz-Signature=a04c831a0b54b5e4cd236a90dcb9f5fab7185eb3b72b5ebe9a70a4e95790c8b7
   ```

    次のコード例では、us-west-2 リージョンにある暗号化されている DB クラスタースナップショットから us-east-1 リージョンにリードレプリカが作成されます。このアクションは、us-east-1 リージョンで呼び出されます。

   ```
   https://rds.us-east-1.amazonaws.com/
     ?Action=CreateDBCluster
     &KmsKeyId=my-us-east-1-key
     &StorageEncrypted=true
     &PreSignedUrl=https%253A%252F%252Frds.us-west-2.amazonaws.com%252F
            %253FAction%253DCreateDBCluster
            %2526DestinationRegion%253Dus-east-1
            %2526KmsKeyId%253Dmy-us-east-1-key
            %2526ReplicationSourceIdentifier%253Darn%25253Aaws%25253Ards%25253Aus-west-2%25253A123456789012%25253Acluster%25253Asample-master-cluster
            %2526SignatureMethod%253DHmacSHA256
            %2526SignatureVersion%253D4
            %2526Version%253D2014-10-31
            %2526X-Amz-Algorithm%253DAWS4-HMAC-SHA256
            %2526X-Amz-Credential%253DAKIADQKE4SARGYLE%252F20161117%252Fus-west-2%252Frds%252Faws4_request
            %2526X-Amz-Date%253D20161117T215409Z
            %2526X-Amz-Expires%253D3600
            %2526X-Amz-SignedHeaders%253Dcontent-type%253Bhost%253Buser-agent%253Bx-amz-content-sha256%253Bx-amz-date
            %2526X-Amz-Signature%253D255a0f17b4e717d3b67fad163c3ec26573b882c03a65523522cf890a67fca613
     &ReplicationSourceIdentifier=arn:aws:rds:us-west-2:123456789012:cluster:sample-master-cluster
     &DBClusterIdentifier=sample-replica-cluster
     &Engine=aurora-mysql
     &SignatureMethod=HmacSHA256
     &SignatureVersion=4
     &Version=2014-10-31
     &X-Amz-Algorithm=AWS4-HMAC-SHA256
     &X-Amz-Credential=AKIADQKE4SARGYLE/20161117/us-east-1/rds/aws4_request
     &X-Amz-Date=20160201T001547Z
     &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
     &X-Amz-Signature=a04c831a0b54b5e4cd236a90dcb9f5fab7185eb3b72b5ebe9a70a4e95790c8b7
   ```

   AWS GovCloud (米国東部) リージョンと AWS GovCloud (米国西部) リージョン間のクロスリージョンレプリケーションで、`ReplicationSourceIdentifier` で識別される DB クラスターが暗号化されている場合、`PreSignedUrl` パラメータも指定します。署名付き URL は、レプリケートする暗号化された DB クラスターを含む出典 AWS リージョン で実行可能な `CreateDBCluster` API オペレーションの有効なリクエストである必要があります。KMS キー識別子は、リードレプリカを暗号化するために使用され、送信先 AWS リージョン で有効な KMS キーである必要があります。署名付き URL を手動ではなく自動的に生成するには、`--source-region` オプションを使用して AWS CLI の [create-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html) コマンドを使用します。

1.  次の例に示すように、RDS API [DescribeDBClusters](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html) オペレーションを使用して、DB クラスターが使用可能になっていることを確認します。

   ```
   https://rds.us-east-1.amazonaws.com/
     ?Action=DescribeDBClusters
     &DBClusterIdentifier=sample-replica-cluster
     &SignatureMethod=HmacSHA256
     &SignatureVersion=4
     &Version=2014-10-31
     &X-Amz-Algorithm=AWS4-HMAC-SHA256
     &X-Amz-Credential=AKIADQKE4SARGYLE/20161117/us-east-1/rds/aws4_request
     &X-Amz-Date=20160201T002223Z
     &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
     &X-Amz-Signature=84c2e4f8fba7c577ac5d820711e34c6e45ffcd35be8a6b7c50f329a74f35f426
   ```

    `DescribeDBClusters` の結果にステータス `available` と表示されたら、レプリケーションをスタートできるように DB クラスターのプライマリインスタンスを作成します。そのためには、次の例に示すように RDS API [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) アクションを使用します。

   ```
   https://rds.us-east-1.amazonaws.com/
     ?Action=CreateDBInstance
     &DBClusterIdentifier=sample-replica-cluster
     &DBInstanceClass=db.r5.large
     &DBInstanceIdentifier=sample-replica-instance
     &Engine=aurora-mysql
     &SignatureMethod=HmacSHA256
     &SignatureVersion=4
     &Version=2014-10-31
     &X-Amz-Algorithm=AWS4-HMAC-SHA256
     &X-Amz-Credential=AKIADQKE4SARGYLE/20161117/us-east-1/rds/aws4_request
     &X-Amz-Date=20160201T003808Z
     &X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
     &X-Amz-Signature=125fe575959f5bbcebd53f2365f907179757a08b5d7a16a378dfa59387f58cdb
   ```

    DB インスタンスが作成されて使用可能になると、レプリケーションが始まります。DB インスタンスが使用可能かどうかを確認するには、AWS CLI の [DescribeDBInstances](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBInstances.html) コマンドを呼び出します。

## Amazon Aurora MySQL クロスリージョンレプリカの表示
<a name="AuroraMySQL.Replication.CrossRegion.Viewing"></a>

 Amazon Aurora MySQL DB クラスターのクロスリージョンレプリケーションの関係を表示するには、[describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) AWS CLI コマンドまたは [DescribeDBClusters](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html) RDS API オペレーションを呼び出します。レスポンスでは、`ReadReplicaIdentifiers` フィールドを参照して、クロスリージョンリードレプリカ DB クラスターの識別子を確認します。レプリケーションソースであるソース DB クラスターの ARN の `ReplicationSourceIdentifier` 要素を参照してください。

# リードレプリカの Aurora MySQL DB クラスターへの昇格
<a name="AuroraMySQL.Replication.CrossRegion.Promote"></a>

 Aurora MySQL リードレプリカをスタンドアロンの DB クラスターに昇格できます。Aurora MySQL リードレプリカを昇格させると、DB インスタンスの再起動後に利用可能になります。

 通常、出典 DB クラスターに障害が発生した場合のデータリカバリースキームとして、Aurora MySQL リードレプリカをスタンドアロン DB クラスターに昇格させます。

 これを行うには、初期にリードレプリカを作成し、次に出典 DB クラスターで障害をモニタリングします。障害が発生した場合、以下の作業を行います。

1.  リードレプリカを昇格させます。

1.  昇格された DB クラスターにデータベーストラフィックを向けます。

1.  昇格された DB クラスターを出典として使用して置き換え用のリードレプリカを作成します。

 リードレプリカを昇格させると、リードレプリカはスタンドアロン Aurora DB クラスターになります。リードレプリカのサイズによっては、昇格プロセスが完了するまで数分以上かかる場合があります。リードレプリカを新しい DB クラスターに昇格させると、他の DB クラスターと同等になります。例えば、そのリードレプリカを作成して、ポイントインタイム復元オペレーションを実行できます。また、その DB クラスターの Aurora レプリカを作成することもできます。

 昇格された DB クラスターはリードレプリカではなくなったため、レプリケーションターゲットとしては使用できません。

 以下のステップは、DB クラスターにリードレプリカを昇格させる一般的なプロセスを示しています。

1.  リードレプリカ出典 DB クラスターへのトランザクションの書き込みを停止し、すべての更新がリードレプリカに加えられるまで待ちます。データベース更新は、出典 DB クラスターで行われた後にリードレプリカで行われるため、このレプリケーションラグは大きく変動する場合があります。`ReplicaLag` メトリクスを使用して、リードレプリカにすべての更新がいつ加えられたかを確認できます。`ReplicaLag` メトリクスは、出典 DB インスタンスからのリードレプリカ DB インスタンスのラグの時間を記録します。`ReplicaLag` メトリクスが `0` に達すると、リードレプリカが出典 DB インスタンスに追いついています。

1.  Amazon RDS コンソールの **[Promote]** (昇格) オプション、AWS CLI コマンド [promote-read-replica-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica-db-cluster.html)、または [PromoteReadReplicaDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplicaDBCluster.html) Amazon RDS API オペレーションを使用して、リードレプリカを昇格させます。

    Aurora MySQL DB インスタンスを選択してリードレプリカを昇格させます。リードレプリカが昇格されると、Aurora MySQL DB クラスターがスタンドアロン DB クラスターに昇格します。フェイルオーバー優先度が最も高い DB インスタンスが DB クラスターのプライマリ DB インスタンスに昇格されます。他の DB インスタンスは Aurora レプリカになります。
**注記**  
 昇格プロセスの完了までには数分かかります。リードレプリカを昇格させると、レプリケーションが停止され、DB インスタンスが再起動されます。再起動が完了すると、リードレプリカは新しい DB クラスターとして使用可能になります。

## コンソール
<a name="AuroraMySQL.Replication.CrossRegion.Promote.Console"></a>

**Aurora MySQL リードレプリカを DB クラスターに昇格するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1.  コンソールで、[**Instances (インスタンス)**] を選択します。

    [**Instance**] ペインが表示されます。

1.  [**Instances (インスタンス)**] ペインで、昇格させるリードレプリカを選択します。

    リードレプリカは、Aurora MySQL DB インスタンスとして表示されます。

1.  [**アクション**] で [**リードレプリカの昇格**] を選択します。

1.  確認ページで、[**リードレプリカの昇格**] を選択します。

## AWS CLI
<a name="AuroraMySQL.Replication.CrossRegion.Promote.CLI"></a>

 リードレプリカを DB クラスターに昇格させるには、AWS CLI [promote-read-replica-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/promote-read-replica-db-cluster.html) コマンドを使用します。

**Example**  
Linux、macOS、Unix の場合:  

```
aws rds promote-read-replica-db-cluster \
    --db-cluster-identifier mydbcluster
```
Windows の場合:  

```
aws rds promote-read-replica-db-cluster ^
    --db-cluster-identifier mydbcluster
```

## RDS API
<a name="AuroraMySQL.Replication.CrossRegion.Promote.API"></a>

 リードレプリカを DB クラスターに昇格させるには、[PromoteReadReplicaDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_PromoteReadReplicaDBCluster.html) を呼び出します。

# Amazon Aurora MySQL クロスリージョンレプリカのトラブルシューティング
<a name="AuroraMySQL.Replication.CrossRegion.Troubleshooting"></a>

 Amazon Aurora クロスリージョンリードレプリカを作成するときに発生する可能性がある一般的なエラーメッセージの一覧と、示されたエラーの解決策を次に示します。

## 出典クラスター [DB クラスター ARN] でバイナリログが有効になっていません
<a name="AuroraMySQL.Replication.CrossRegion.Troubleshooting.1"></a>

 この問題を解決するには、出典 DB クラスターでバイナリログ記録を有効にします。詳細については、「[スタートする前に](AuroraMySQL.Replication.CrossRegion.md#AuroraMySQL.Replication.CrossRegion.Prerequisites)」を参照してください。

## 出典クラスター [DB クラスター ARN] に、書き込みで同期されているクラスターパラメータグループがありません
<a name="AuroraMySQL.Replication.CrossRegion.Troubleshooting.2"></a>

 このエラーは、`binlog_format` DB クラスターパラメータを更新しても、DB クラスターのプライマリインスタンスを再起動しなかった場合に発生します。DB クラスターのプライマリインスタンス (つまり、書き込み) を再起動し、再試行します。

## 出典クラスター [DB クラスター ARN] は、既にこのリージョンにリードレプリカを持っています
<a name="AuroraMySQL.Replication.CrossRegion.Troubleshooting.3"></a>

 任意の AWS リージョン の出典 DB クラスターごとに、リードレプリカとすることができるクロスリージョン DB クラスターを最大 5 つまで用意できます。特定の AWS リージョン の DB クラスターに最大数のリードレプリカが既に存在する場合、そのリージョンで新しいクロスリージョン DB クラスターを作成する前に、既存のリードレプリカのいずれかを削除する必要があります。

## DB クラスター [DB クラスター ARN] は、クロスリージョンレプリケーションをサポートするために、データベースエンジンのアップグレードを必要とする
<a name="AuroraMySQL.Replication.CrossRegion.Troubleshooting.4"></a>

 この問題を解決するには、出典 DB クラスターのすべてのインスタンスのデータベースエンジンバージョンを最新のデータベースエンジンバージョンにアップグレードした後、クロスリージョンリードレプリカ DB を再作成してください。

# Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)
<a name="AuroraMySQL.Replication.MySQL"></a><a name="binlog_replication"></a><a name="binlog"></a>

Amazon Aurora MySQL は MySQL と互換性があるため、MySQL データベースと Amazon Aurora MySQL DB クラスターとの間のレプリケーションを設定できます。このタイプのレプリケーションでは、MySQL バイナリログレプリケーションが使用され、*バイナリログレプリケーション*とも呼ばれます。Aurora でバイナリログレプリケーションを使用する場合は、MySQL データベースで MySQL バージョン 5.5 以降を実行することをお勧めします。Aurora MySQL DB クラスターがレプリケーション出典またはレプリカである場合は、レプリケーションを設定できます。Amazon RDS MySQL DB インスタンス、Amazon RDS の外部の MySQL データベース、または別の Aurora MySQL DB クラスターを使用してレプリケートできます。

**注記**  
特定のタイプの Aurora クラスター間では、バイナリログレプリケーションを使用できません。特に、バイナリログレプリケーションは、Aurora Serverless v1 クラスターでは使用できません。`SHOW MASTER STATUS` と `SHOW SLAVE STATUS` (Aurora MySQL バージョン 2)、 または `SHOW REPLICA STATUS` (Aurora MySQL バージョン 3) ステートメントが出力を返さない場合は、使用しているクラスターがバイナリログレプリケーションをサポートしていることを確認してください。

また、別の AWS リージョン で、RDS for MySQL DB インスタンスまたは Aurora MySQL DB クラスターに、レプリケートすることもできます。AWS リージョン 間のレプリケーションを実行する場合は、DB クラスターと DB インスタンスがパブリックにアクセス可能であることを確認してください。Aurora MySQL DB クラスターが VPC のプライベートサブネットにある場合は、AWS リージョン 間で VPC ピアリングを使用します。詳細については、「[VPC 内の DB クラスターに別の VPC 内の EC2 インスタンスからアクセスする](USER_VPC.Scenarios.md#USER_VPC.Scenario3)」を参照してください。

Aurora MySQL DB クラスターと別の AWS リージョン の Aurora MySQL DB クラスター間のレプリケーションを設定する場合、Aurora MySQL DB クラスターをソース DB クラスターとは別の AWS リージョン のリードレプリカとして作成できます。詳細については、「[AWS リージョン 間での Amazon Aurora MySQL DB クラスターのレプリケーション](AuroraMySQL.Replication.CrossRegion.md)」を参照してください。

Aurora MySQL 2 および 3 では、レプリケーションにグローバルトランザクション識別子 (GTID) を使用する外部のソースまたはターゲットと Aurora MySQL との間でレプリケートできます。Aurora MySQL DB クラスターの GTID 関連のパラメータ内に、外部データベースの GTID ステータスと互換性がある設定が含まれていることを確認してください。これを行う方法については、「[GTID ベースレプリケーションを使用する](mysql-replication-gtid.md)」を参照してください。Aurora MySQL バージョン 3.01 以降では、GTID を使用しない出典からレプリケートされたトランザクションに GTID を割り当てる方法を選択できます。その設定を制御するストアドプロシージャの詳細については、[mysql.rds\$1assign\$1gtids\$1to\$1anonymous\$1transactions (Aurora MySQL バージョン 3)](mysql-stored-proc-gtid.md#mysql_assign_gtids_to_anonymous_transactions) を参照してください。

**警告**  
 Aurora MySQL と MySQL との間で複製する場合は、必ず InnoDB テーブルのみを使用してください。MyISAM テーブルをレプリケートする場合は、これらのテーブルを以下のコマンドを使用して InnoDB に変換してから、レプリケーションを設定できます。  

```
alter table <schema>.<table_name> engine=innodb, algorithm=copy;
```

以下のセクションでは、レプリケーションの設定、レプリケーションの停止、データベースの読み取りのスケール、バイナリログレプリケーションの最適化、拡張バイナリログの設定を行います。

**Topics**
+ [Aurora MySQL のバイナリログレプリケーションの設定](AuroraMySQL.Replication.MySQL.SettingUp.md)
+ [Aurora MySQL のバイナリログレプリケーションの停止](AuroraMySQL.Replication.MySQL.Stopping.md)
+ [Amazon Aurora を使用した MySQL データベースの読み取りスケーリング](AuroraMySQL.Replication.ReadScaling.md)
+ [Aurora MySQL でのバイナリログのレプリケーションの最適化](binlog-optimization.md)
+ [Aurora MySQL の拡張バイナリログの設定](AuroraMySQL.Enhanced.binlog.md)

# Aurora MySQL のバイナリログレプリケーションの設定
<a name="AuroraMySQL.Replication.MySQL.SettingUp"></a>

Aurora MySQL と MySQL との間でレプリケーションを設定するには、次のステップを使用します。各ステップについては、このトピックで詳しく説明します。

**Contents**
+ [1. レプリケーション出典のバイナリログ記録を有効にする](#AuroraMySQL.Replication.MySQL.EnableBinlog)
+ [2. レプリケーション出典のバイナリログを不要になるまで保持する](#AuroraMySQL.Replication.MySQL.RetainBinlogs)
+ [3. レプリケーションソースのコピーまたはダンプを作成する](#AuroraMySQL.Replication.MySQL.CreateSnapshot)
+ [4. レプリカターゲットにダンプをロードする (必要な場合)](#AuroraMySQL.Replication.MySQL.LoadSnapshot)
+ [5. レプリケーションソースでレプリケーションユーザーを作成する](#AuroraMySQL.Replication.MySQL.CreateReplUser)
+ [6. レプリカターゲットでレプリケーションを有効にする](#AuroraMySQL.Replication.MySQL.EnableReplication)
  + [リードレプリカへのレプリケーションを停止する場所の設定](#AuroraMySQL.Replication.StartReplicationUntil)
+ [7. レプリカをモニタリングする](#AuroraMySQL.Replication.MySQL.Monitor)
+ [レプリケーション出典とレプリケーションターゲット間でのパスワードの同期](#AuroraMySQL.Replication.passwords)

## 1. レプリケーション出典のバイナリログ記録を有効にする
<a name="AuroraMySQL.Replication.MySQL.EnableBinlog"></a>

 以下のデータベースエンジンのレプリケーション出典で、バイナリログを有効にする手順を確認します。


|  データベースエンジン  |  手順  | 
| --- | --- | 
|   Aurora MySQL   |   **Aurora MySQL DB クラスターのバイナリログ記録を有効にするには**  `binlog_format` DB クラスターパラメータを `ROW`、`STATEMENT`、または `MIXED` に設定します。特定のバイナリログ形式の必要性がない限り、`MIXED` をお勧めします。(デフォルト値は`OFF`です。) `binlog_format` パラメータを変更するには、カスタム DB クラスターパラメータグループを作成し、そのカスタムパラメータグループを DB クラスターに関連付けます。デフォルト DB クラスターパラメータグループのパラメータは変更できません。 `binlog_format` パラメータを `OFF` から別の値に変更した場合、変更を有効にするには、Aurora DB クラスターを再起動する必要があります。  詳細については、「[Amazon Aurora の DB クラスターパラメータと DB インスタンスパラメータ](USER_WorkingWithDBClusterParamGroups.md#Aurora.Managing.ParameterGroups)」および「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。  | 
|   RDS for MySQL   |   **Amazon RDS DB インスタンスのバイナリログ記録を有効にするには**   Amazon RDS DB インスタンスでは、バイナリログ記録を直接有効にすることはできませんが、以下のいずれかの操作により有効にすることができます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 
|   MySQL (外部)  |  **暗号化レプリケーションを設定するには** Aurora MySQL バージョン 2 を使用してデータを安全に複製するには、暗号化されたレプリケーションを使用できます。   暗号化レプリケーションを使う必要がない場合、このステップをスキップできます。   暗号化レプリケーションを使用するための前提条件は次のとおりです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  暗号化のレプリケーション中、Aurora MySQL DB クラスターはクライアントとして MySQL データベースサーバーに動作します。Aurora MySQL 用の証明書およびキーは、.pem 形式のファイルにあります。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  **外部 MySQL データベースのバイナリログ記録を有効にするには**  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 

## 2. レプリケーション出典のバイナリログを不要になるまで保持する
<a name="AuroraMySQL.Replication.MySQL.RetainBinlogs"></a>

MySQL バイナリログのレプリケーションを使用する場合、Amazon RDS はレプリケーションプロセスを管理しません。したがって、レプリケーション出典のバイナリログファイルは、変更がレプリカに適用されるまで保持する必要があります。このメンテナンスによって、障害発生時にソースデータベースを復元しやすくなります。

次のステップに従って、データベースエンジンのバイナリログを保持します。


|  データベースエンジン  |  手順  | 
| --- | --- | 
|   Aurora MySQL  |  **Aurora MySQL DB クラスターのバイナリログを保持するには** Aurora MySQL DB クラスターのバイナリログファイルにはアクセスできません。そのため、確実に変更がレプリカに適用されてから、レプリケーション出典のバイナリログファイルが Amazon RDS によって削除されるように、バイナリログファイルの保持期間は十分に長く設定する必要があります。Aurora MySQL DB クラスターのバイナリログファイルは最大 90 日間、保持できます。 MySQL データベースまたは RDS for MySQL DB インスタンスをレプリカとしてレプリケーションを設定する場合、レプリカを作成するデータベースが巨大なときには、レプリカへのデータベースの初期のコピーが完了し、レプリカラグが 0 に達するまで、バイナリログファイルが保持されるように、保持期間を長く設定してください。 バイナリログの保持期間を設定するには、「[mysql.rds\$1set\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_set_configuration)」の手順を使用して、DB クラスターのバイナリログファイルの保持時間数に合わせて、`'binlog retention hours'` の設定パラメータを指定します。Aurora MySQL バージョン 2 以降、およびバージョン 3 の最大値は 2160 (90 日) です。 以下の例では、バイナリログファイルの保持期間を 6 日に設定しています。 <pre>CALL mysql.rds_set_configuration('binlog retention hours', 144);</pre> レプリケーションが開始された後、レプリカに対して `SHOW SLAVE STATUS` (Aurora MySQL バージョン 2) または `SHOW REPLICA STATUS` (Aurora MySQL バージョン 3) コマンドを実行し、`Seconds behind master` フィールドを調べることで、変更がレプリカに適用されたことを確認できます。`Seconds behind master` フィールドが 0 の場合、レプリカラグはありません。レプリカラグがないときは、`binlog retention hours` 設定パラメータをより短い期間に設定することで、バイナリログファイルの保持期間を短くします。 この設定を指定しない場合、Aurora MySQL のデフォルト値は 24 (1 日) です。 `'binlog retention hours'` に最大値より大きい値を指定すると、Aurora MySQL は最大値を使用します。  | 
|   RDS for MySQL   |   **Amazon RDS DB インスタンスのバイナリログを保持するには**   前の行で説明したように、Amazon RDS DB インスタンスのバイナリログファイルを保持するには、保持期間を Aurora MySQL DB クラスターと同様に設定します。 DB インスタンスのリードレプリカを作成しても、Amazon RDS DB インスタンスのバイナリログファイルを保持できます。このリードレプリカはバイナリログファイルの保持専用に一時的に作成されます。リードレプリカが作成されたら、リードレプリカに対して [mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) プロシージャを呼び出します。レプリケーションの停止中に Amazon RDS がレプリケーション出典のバイナリログファイルを削除することはありません。永続レプリカとのレプリケーションを設定した後、レプリケーション出典と永続レプリカ間のレプリカラグ (`Seconds behind master` フィールド) が 0 に達したときに、リードレプリカを削除できます。  | 
|   MySQL (外部)   |  **外部 MySQL データベースのバイナリログを有効にするには** 外部 MySQL データベースのバイナリログファイルは Amazon RDS によって管理されていないため、手動で削除されるまでは保持されます。 レプリケーションが開始された後、レプリカに対して `SHOW SLAVE STATUS` (Aurora MySQL バージョン 2) または `SHOW REPLICA STATUS` (Aurora MySQL バージョン 3) コマンドを実行し、`Seconds behind master` フィールドを調べることで、変更がレプリカに適用されたことを確認できます。`Seconds behind master` フィールドが 0 の場合、レプリカラグはありません。レプリカラグがないときは、古いバイナリログファイルを削除できます。  | 

## 3. レプリケーションソースのコピーまたはダンプを作成する
<a name="AuroraMySQL.Replication.MySQL.CreateSnapshot"></a>

レプリケーションソースのスナップショット、クローン、またはダンプを使用して、データのベースラインコピーをレプリカにロードします。次に、その時点からレプリケーションを開始します。

次の指示に従って、データベースエンジンのレプリケーションソースのコピーまたはダンプを作成します。


| データベースエンジン | 手順 | 
| --- | --- | 
|   Aurora MySQL   |  **Aurora MySQL DB クラスターのコピーを作成するには** 次のいずれかの方法を使用します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html) **バイナリログファイルの名前と位置を確認するには** 次のいずれかの方法を使用します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html) **Aurora MySQL DB クラスターのダンプを作成するには** レプリカターゲットが外部 MySQL データベースまたは RDS for MySQL DB インスタンスの場合、Aurora DB クラスターからダンプファイルを作成する必要があります。 作成したソース DB クラスターのコピーに対して、必ず `mysqldump` コマンドを実行してください。これは、ダンプを取る際のロックに関する考慮事項を避けるためです。ダンプがソース DB クラスターで直接作成された場合は、ダンプの進行中にソーステーブルへの同時書き込みを防ぐために、ソーステーブルをロックする必要があります。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 
|  RDS for MySQL  |  **Amazon RDS DB インスタンスのスナップショットを作成するには** Amazon RDS DB インスタンスのリードレプリカを作成します。詳細については、*Amazon Relational Database Service ユーザーガイド*の「[リードレプリカの作成](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ReadRepl.html#USER_ReadRepl.Create)」を参照してください。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 
|  MySQL (外部)  |  **外部 MySQL データベースのダンプを作成するには** [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 

## 4. レプリカターゲットにダンプをロードする (必要な場合)
<a name="AuroraMySQL.Replication.MySQL.LoadSnapshot"></a>

Amazon RDS の外部 MySQL データベースのダンプからデータをロードする場合、ダンプファイルのコピー先となる EC2 インスタンスを作成しなければならない場合があります。その後、その EC2 インスタンスから DB クラスターまたは DB インスタンスにデータをロードできます。この方法では、ダンプファイルを EC2 インスタンスにコピーする前に圧縮して、Amazon RDS へのデータのコピーに関連するネットワークコストを削減できます。また、ダンプファイルを暗号化して、ネットワーク経由で転送されるデータを保護することもできます。

**注記**  
レプリカターゲットとして新しい Aurora MySQL DB クラスターを作成する場合、ダンプファイルをロードする必要はありません。  
DB クラスタースナップショットから復元することで新しい DB クラスターを作成できます。詳細については、「[DB クラスタースナップショットからの復元](aurora-restore-snapshot.md)」を参照してください。
ソース DB クラスターのクローンを作成して、新しい DB クラスターを作成できます。詳細については、「[Amazon Aurora DB クラスターのボリュームのクローン作成](Aurora.Managing.Clone.md)」を参照してください。
DB インスタンススナップショットから新しい DB クラスターにデータを移行できます。詳細については、「[Amazon Aurora MySQL DB クラスターへのデータの移行](AuroraMySQL.Migrating.md)」を参照してください。

次のステップに従って、レプリケーションソースのダンプをデータベースエンジンのレプリカターゲットにロードします。


| データベースエンジン | 手順 | 
| --- | --- | 
|  Aurora MySQL   |   **Aurora MySQL DB クラスターにダンプをロードするには**  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 
|   RDS for MySQL   |  **Amazon RDS DB インスタンスにダンプをロードするには** [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 
|  MySQL (外部)  |  **外部 MySQL データベースにダンプをロードするには** 外部 MySQL データベースに DB スナップショットまたは DB クラスターのスナップショットをロードすることはできません。代わりに、`mysqldump` コマンドの出力を使用する必要があります。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 

## 5. レプリケーションソースでレプリケーションユーザーを作成する
<a name="AuroraMySQL.Replication.MySQL.CreateReplUser"></a>

レプリケーション専用のユーザー ID をソースに作成します。次の例は、RDS for MySQL または外部の MySQL ソースデータベース用です。

```
mysql> CREATE USER 'repl_user'@'domain_name' IDENTIFIED BY 'password';
```

Aurora MySQL ソースデータベースの場合、`skip_name_resolve`DB クラスターパラメータは `1` (`ON`) に設定され、変更できないため、ドメイン名の代わりにホストの IP アドレスを使用する必要があります。詳細については、MySQL ドキュメントの「[skip\$1name\$1resolve](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_skip_name_resolve)」を参照してください。

```
mysql> CREATE USER 'repl_user'@'IP_address' IDENTIFIED BY 'password';
```

ユーザーには `REPLICATION CLIENT` および `REPLICATION SLAVE` 権限が必要です。ユーザーのこれらの権限を付与します。

暗号化レプリケーションを使用する必要がある場合は、レプリケーションのユーザーに対して SSL 接続を要求します。例えば、以下のいずれかのステートメントを使用して、ユーザーアカウント `repl_user` に SSL 接続を要求できます。

```
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'IP_address';
```

```
GRANT USAGE ON *.* TO 'repl_user'@'IP_address' REQUIRE SSL;
```

**注記**  
`REQUIRE SSL` が含まれていない場合には、レプリケーション接続がメッセージの表示なしで非暗号化接続に戻る場合があります。

## 6. レプリカターゲットでレプリケーションを有効にする
<a name="AuroraMySQL.Replication.MySQL.EnableReplication"></a>

レプリケーションを有効化する前に、MySQL DB インスタンスレプリカターゲットの Aurora MySQL DB クラスターまたは RDS のスナップショットを手動で作成することをお勧めします。問題が発生し、DB クラスターまたは DB インスタンスレプリカターゲットとのレプリケーションを再開する必要がある場合は、このスナップショットから DB クラスターまたは DB インスタンスを復元できます。そのために、再びレプリカターゲットにデータをインポートする必要はありません。

次のステップに従って、データベースエンジンでレプリケーションを有効にします。


|  データベースエンジン  |  手順  | 
| --- | --- | 
|   Aurora MySQL   |  **Aurora MySQL DB クラスターからのレプリケーションを有効にするには**  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html) SSL 暗号化を使用するには、最終値を `0` ではなく `1` に設定します。  | 
|   RDS for MySQL   |   **Amazon RDS DB インスタンスからのレプリケーションを有効にするには**  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html) SSL 暗号化を使用するには、最終値を `0` ではなく `1` に設定します。  | 
|   MySQL (外部)   |   **外部 MySQL データベースからのレプリケーションを有効にするには**  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.SettingUp.html)  | 

レプリケーションが失敗した場合、レプリカにおいて意図しない I/O が大幅に増加することで、パフォーマンスが低下する可能性があります。レプリケーションが失敗するか、不要になった場合は、[mysql.rds\$1reset\$1external\$1master (Aurora MySQL バージョン 2)](mysql-stored-proc-replicating.md#mysql_rds_reset_external_master) または [mysql.rds\$1reset\$1external\$1source (Aurora MySQL バージョン 3)](mysql-stored-proc-replicating.md#mysql_rds_reset_external_source) ストアドプロシージャを実行して、レプリケーション設定を削除できます。

### リードレプリカへのレプリケーションを停止する場所の設定
<a name="AuroraMySQL.Replication.StartReplicationUntil"></a>

Aurora MySQL バージョン 3.04 以降では、[mysql.rds\$1start\$1replication\$1until(Aurora MySQL バージョン 3)](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until) ストアドプロシージャを使用してレプリケーションを開始してバイナリログファイルの指定した位置で停止できます。

**リードレプリカへのレプリケーションをスタートして指定の位置でレプリケーションを停止するには**

1. MySQL クライアントを使用して、マスターユーザーとしてレプリカ Aurora MySQL DB クラスターに接続します。

1. [mysql.rds\$1start\$1replication\$1until(Aurora MySQL バージョン 3)](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until) ストアドプロシージャを実行します。

   次の例では、レプリケーションをスタートし、`120` バイナリログファイルの場所 `mysql-bin-changelog.000777` に達するまで変更をレプリケートします。災害対策シナリオでは、場所 `120` は災害発生直前の時点として想定されます。

   ```
   call mysql.rds_start_replication_until(
     'mysql-bin-changelog.000777',
     120);
   ```

停止ポイントに達すると、レプリケーションは自動的に停止します。RDS イベントとして、`Replication has been stopped since the replica reached the stop point specified by the rds_start_replication_until stored procedure` が生成されます。

GTID ベースのレプリケーションを使用する場合は、[mysql.rds\$1start\$1replication\$1until\$1gtid(Aurora MySQL バージョン 3)](mysql-stored-proc-gtid.md#mysql_rds_start_replication_until_gtid) ストアドプロシージャの代わりに、[mysql.rds\$1start\$1replication\$1until(Aurora MySQL バージョン 3)](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until) ストアドプロシージャを実行します。GTID ベースのレプリケーションの詳細については、「[GTID ベースレプリケーションを使用する](mysql-replication-gtid.md)」を参照してください。

## 7. レプリカをモニタリングする
<a name="AuroraMySQL.Replication.MySQL.Monitor"></a>

 Aurora MySQL DB クラスターと MySQL との間のレプリケーションを設定する場合、Aurora MySQL DB クラスターがレプリカターゲットであれば、そのクラスターのフェイルオーバーイベントをモニタリングする必要があります。フェイルオーバーが発生すると、レプリカターゲットである DB クラスターが、新しいホスト上に別のネットワークアドレスで再作成されます。フェイルオーバーイベントをモニタリングする方法については、「[Amazon RDS イベント通知の操作](USER_Events.md)」を参照してください。

 また、レプリカターゲットがどれほどレプリケーションソースに遅れをとっているかをモニタリングするには、レプリカターゲットに接続して、`SHOW SLAVE STATUS` (Aurora MySQL バージョン 2) または `SHOW REPLICA STATUS` (Aurora MySQL バージョン 3) コマンドを実行します。このコマンドの出力の `Seconds Behind Master` フィールドに、マスターからレプリカターゲットへのコピーの進行状況が示されます。

**重要**  
DB クラスターをアップグレードし、カスタムパラメータグループを指定した場合は、アップグレード終了後にクラスターを手動で再起動してください。これにより、クラスターは新しいカスタムパラメータ設定を使用し、バイナリログレプリケーションを再開します。

## レプリケーション出典とレプリケーションターゲット間でのパスワードの同期
<a name="AuroraMySQL.Replication.passwords"></a>

 SQL ステートメントを使用してレプリケーション出典のユーザーアカウントとパスワードを変更すると、それらの変更はレプリケーションターゲットに自動的にレプリケートされます。

 AWS マネジメントコンソール、AWS CLI、または RDS API を使用してレプリケーション出典のマスターパスワードを変更した場合、それらの変更はレプリケーションターゲットに自動的にレプリケートされません。出典システムとターゲットシステム間でマスターユーザーとマスターパスワードを同期する場合は、レプリケーションターゲットに対して同様の変更を自分で行う必要があります。

# Aurora MySQL のバイナリログレプリケーションの停止
<a name="AuroraMySQL.Replication.MySQL.Stopping"></a>

MySQL DB インスタンス、外部 MySQL データベース、または別の Aurora DB クラスターでのバイナリログのレプリケーションを停止するには、このトピックの後で詳しく説明するステップに従ってください。

[1. レプリカターゲットでバイナリログのレプリケーションを停止する](#AuroraMySQL.Replication.MySQL.Stopping.StopReplication)

[2. レプリケーション出典のバイナリログ記録を無効にする](#AuroraMySQL.Replication.MySQL.Stopping.DisableBinaryLogging)

## 1. レプリカターゲットでバイナリログのレプリケーションを停止する
<a name="AuroraMySQL.Replication.MySQL.Stopping.StopReplication"></a>

データベースエンジンのバイナリログレプリケーションを停止するには、以下の説明を参照してください。


|  データベースエンジン  |  手順  | 
| --- | --- | 
|   Aurora MySQL   |  **Aurora MySQL DB クラスターレプリカターゲットでのバイナリログのレプリケーションを停止するには** レプリカターゲットである Aurora DB クラスターに接続し、[mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) プロシージャを呼び出します。  | 
|   RDS for MySQL   |  **Amazon RDS DB インスタンスのバイナリログのレプリケーションを停止するには** レプリカターゲットである RDS DB インスタンスに接続し、[mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) プロシージャを呼び出します。  | 
|   MySQL (外部)   |  **外部 MySQL データベースのバイナリログのレプリケーションを停止するには** MySQL データベースに接続し、`STOP SLAVE` (バージョン 5.7) または`STOP REPLICA` (バージョン 8.0) コマンドを実行します。  | 

## 2. レプリケーション出典のバイナリログ記録を無効にする
<a name="AuroraMySQL.Replication.MySQL.Stopping.DisableBinaryLogging"></a>

次の表の説明に従って、データベースエンジンのレプリケーションソースで、バイナリログを無効にします。


| データベースエンジン | 手順 | 
| --- | --- | 
|   Aurora MySQL   |  **Amazon Aurora DB クラスターのバイナリログ記録を無効にするには** [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.Stopping.html)  | 
|   RDS for MySQL   |  **Amazon RDS DB インスタンスのバイナリログ記録を無効にするには** Amazon RDS DB インスタンスでは、バイナリログ記録を直接無効にすることはできませんが、以下のいずれかの操作により有効にすることができます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.Stopping.html)  | 
|   MySQL (外部)   |  **外部 MySQL データベースのバイナリログ記録を無効にするには** MySQL データベースに接続して、`STOP REPLICATION` コマンドを呼び出します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.Stopping.html)  | 

# Amazon Aurora を使用した MySQL データベースの読み取りスケーリング
<a name="AuroraMySQL.Replication.ReadScaling"></a>

MySQL DB インスタンスで Amazon Aurora を使用することで、Amazon Aurora の読み取りスケーリング機能を活用して MySQL DB インスタンスの読み取りワークロードを拡張できます。Aurora を使用して MySQL DB インスタンスの読み取りを拡張するには、Amazon Aurora MySQL DB クラスターを作成し、MySQL DB インスタンスのリードレプリカに指定します。これは、RDS for MySQL DB インスタンス、または Amazon RDS の外部で実行されている MySQL データベースに適用されます。

Amazon Aurora DB クラスターの作成については、「[Amazon Aurora DB クラスターの作成](Aurora.CreateInstance.md)」を参照してください。

MySQL DB インスタンスと Amazon Aurora DB クラスターの間でレプリケーションを設定するときは、以下のガイドラインに従ってください。
+ Amazon Aurora DB クラスターを参照するときは、Amazon Aurora MySQL DB クラスターのエンドポイントアドレスを使用します。フェイルオーバーが発生すると、Aurora MySQL DB クラスターのプライマリインスタンスに昇格された Aurora レプリカで、引き続きこの DB クラスターのエンドポイントアドレスが使用されます。
+ ライターインスタンスのバイナリログが Aurora レプリカに適用されたことを確認するまで、これらのバイナリログを保持します。このメンテナンスによって、障害発生時にライターインスタンスを復元できます。

**重要**  
自己管理型レプリケーションを使用する場合、ユーザー自身で発生する可能性のあるすべてのレプリケーションの問題をモニタリングし、解決する必要があります。詳細については、「[リードレプリカ間の遅延の診断と解決](CHAP_Troubleshooting.md#CHAP_Troubleshooting.MySQL.ReplicaLag)」を参照してください。

**注記**  
Amazon Aurora MySQL DB クラスターでレプリケーションを開始するために必要なアクセス許可は制限されており、Amazon RDS マスターユーザーは使用できません。このため、Aurora MySQL DB クラスターと MySQL DB インスタンスの間でレプリケーションを設定するには、[mysql.rds\$1set\$1external\$1master (Aurora MySQL バージョン 2)](mysql-stored-proc-replicating.md#mysql_rds_set_external_master) または [mysql.rds\$1set\$1external\$1source (Aurora MySQL バージョン 3)](mysql-stored-proc-replicating.md#mysql_rds_set_external_source) と [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) プロシージャを使用する必要があります。

## 外部のソースインスタンスと Aurora MySQL DB クラスターの間でレプリケーションを開始する
<a name="AuroraMySQL.Replication.ReadScaling.Procedure"></a>

1.  出典 MySQL DB インスタンスを読み取り専用にします。

   ```
   mysql> FLUSH TABLES WITH READ LOCK;
   mysql> SET GLOBAL read_only = ON;
   ```

1.  出典 MySQL DB インスタンスで `SHOW MASTER STATUS` コマンドを実行して、binlog の場所を特定します。以下の例のような出力を受け取ります。

   ```
   File                        Position
   ------------------------------------
    mysql-bin-changelog.000031      107
   ------------------------------------
   ```

1. `mysqldump` を使用して、外部の MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターにデータベースをコピーします。大規模なデータベースの場合、「*Amazon Relational Database Service ユーザーガイド*」の「[ダウンタイムを短縮して Amazon RDS for MySQL データベースにデータをインポートする](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-importing-data-reduced-downtime.html)」の手順を使用することが必要になる場合があります。

   Linux、macOS、Unix の場合:

   ```
   mysqldump \
       --databases <database_name> \
       --single-transaction \
       --compress \
       --order-by-primary \
       -u local_user \
       -p local_password | mysql \
           --host aurora_cluster_endpoint_address \
           --port 3306 \
           -u RDS_user_name \
           -p RDS_password
   ```

   Windows の場合:

   ```
   mysqldump ^
       --databases <database_name> ^
       --single-transaction ^
       --compress ^
       --order-by-primary ^
       -u local_user ^
       -p local_password | mysql ^
           --host aurora_cluster_endpoint_address ^
           --port 3306 ^
           -u RDS_user_name ^
           -p RDS_password
   ```
**注記**  
`-p` オプションと入力するパスワードの間にスペースがないことを確認します。

   `--host` コマンドで、`--user (-u)`、`--port`、`-p`、`mysql` オプションを使用して、Aurora DB クラスターに接続するためのホスト名、ユーザー名、ポート、パスワードを指定します。このホスト名は、Amazon Aurora DB クラスターのエンドポイントの DNS 名 (例えば `mydbcluster.cluster-123456789012.us-east-1.rds.amazonaws.com`) です。エンドポイントの値は、Amazon RDS マネジメントコンソールでクラスターの詳細を確認できます。

1. もう一度出典 MySQL DB インスタンスを書き込み可能にします。

   ```
   mysql> SET GLOBAL read_only = OFF;
   mysql> UNLOCK TABLES;
   ```

   レプリケーションで使用するバックアップの作成の詳細については、MySQL ドキュメントの [http://dev.mysql.com/doc/refman/8.0/en/replication-solutions-backups-read-only.html](http://dev.mysql.com/doc/refman/8.0/en/replication-solutions-backups-read-only.html) を参照してください。

1. Amazon RDS マネジメントコンソールで、出典 MySQL データベースをホストするサーバーの IP アドレスを、Amazon Aurora DB クラスターの VPC セキュリティグループに追加します。VPC セキュリティグループの変更方法の詳細については、**「Amazon Virtual Private Cloud ユーザーガイド」の「[VPC のセキュリティグループ](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)」を参照してください。

   出典 MySQL インスタンスと通信できるようにするために、Amazon Aurora DB クラスターの IP アドレスからの接続を許可するようにローカルネットワークを設定することも必要になる場合があります。Amazon Aurora DB クラスターの IP アドレスを確認するには、`host` コマンドを使用します。

   ```
   host aurora_endpoint_address
   ```

   このホスト名は、Amazon Aurora DB クラスターのエンドポイントからの DNS 名です。

1. 選択したクライアントを使用して、外部の MySQL インスタンスに接続し、レプリケーションに使用される MySQL ユーザーを作成します。このアカウントはレプリケーション専用に使用され、セキュリティを強化するためにドメインに制限する必要があります。次に例を示します。

   ```
   CREATE USER 'repl_user'@'example.com' IDENTIFIED BY 'password';
   ```

1. 外部の MySQL インスタンスについて、`REPLICATION CLIENT` と `REPLICATION SLAVE` の特権をレプリケーションユーザーに付与します。例えば、すべてのデータベースに対する `REPLICATION CLIENT` および `REPLICATION SLAVE` 権限を "`repl_user`" ユーザーに付与するには、以下のコマンドを実行します。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'example.com'
       IDENTIFIED BY 'password';
   ```

1. レプリケーションを設定する前に、Aurora MySQL DB クラスターの手動スナップショットをリードレプリカに指定します。DB クラスターをリードレプリカとしてレプリケーションを再構築する必要がある場合は、このスナップショットから Aurora MySQL DB クラスターを復元でき、MySQL DB インスタンスから新しい Aurora MySQL DB クラスターにデータをインポートする必要はありません。

1. Amazon Aurora DB クラスターをレプリカとして指定します。Amazon Aurora DB クラスターにマスターユーザーとして接続し、[mysql.rds\$1set\$1external\$1master (Aurora MySQL バージョン 2)](mysql-stored-proc-replicating.md#mysql_rds_set_external_master) または [mysql.rds\$1set\$1external\$1source (Aurora MySQL バージョン 3)](mysql-stored-proc-replicating.md#mysql_rds_set_external_source) と [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) プロシージャを使用して、ソース MySQL データベースをレプリケーションソースとして指定します。

   ステップ 2 で特定したバイナリログファイル名と場所を使用します。以下に例を示します。

   ```
   For Aurora MySQL version 2:
   CALL mysql.rds_set_external_master ('mymasterserver.example.com', 3306,
       'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 0);
   
   For Aurora MySQL version 3:
   CALL mysql.rds_set_external_source ('mymasterserver.example.com', 3306,
       'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 0);
   ```

1. Amazon Aurora DB クラスターで、[mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) プロシージャを呼び出してレプリケーションを開始します。

   ```
   CALL mysql.rds_start_replication; 
   ```

出典 MySQL DB インスタンスと Amazon Aurora DB クラスター間のレプリケーションが確立されると、Aurora レプリカを Amazon Aurora DB クラスターに追加できます。その後で、Aurora レプリカに接続してデータの読み取りを拡張できます。Aurora レプリカの作成については、「[DB クラスターに Aurora レプリカを追加する](aurora-replicas-adding.md)」を参照してください。

# Aurora MySQL でのバイナリログのレプリケーションの最適化
<a name="binlog-optimization"></a>

 次に、Aurora MySQL でバイナリログのレプリケーションのパフォーマンスを最適化し、関連する問題のトラブルシューティングを行う方法について説明します。

**ヒント**  
 この説明は、MySQL バイナリログのレプリケーションメカニズムとその仕組みに精通していることを前提としています。背景情報については、MySQL ドキュメントの「[レプリケーション実装ガイド](https://dev.mysql.com/doc/refman/8.0/en/replication-implementation.html)」を参照してください。

## マルチスレッドバイナリログレプリケーション
<a name="binlog-optimization-multithreading"></a>

マルチスレッドのバイナリログレプリケーションでは、SQL スレッドはリレーログからイベントを読み取り、SQL ワーカースレッドが適用されるようにキューに入れます。SQL ワーカースレッドは、コーディネータスレッドによって管理されます。バイナリログイベントは、可能な場合はパラレルに適用されます。並列処理のレベルは、バージョン、パラメータ、スキーマ設計、ワークロード特性などの要因によって異なります。

マルチスレッドバイナリログレプリケーションは、Aurora MySQL バージョン 3 および Aurora MySQL バージョン 2.12.1 以降でサポートされています。マルチスレッドレプリカがバイナリログイベントを効率的に並列処理するには、マルチスレッドバイナリログレプリケーションのソースを設定し、ソースでバイナリログファイルに並列処理情報を含むバージョンを使用する必要があります。

Aurora MySQL DB インスタンスがバイナリログレプリケーションを使用するように構成されている場合、レプリカインスタンスはデフォルトで 3.04 より前の Aurora MySQL バージョンに対してシングルスレッドレプリケーションを使用します。マルチスレッドレプリケーションを有効にするには、カスタムパラメータグループの `replica_parallel_workers` パラメータを `1` より大きい値に設定します。

Aurora MySQL バージョン 3.04 以降では、レプリケーションはデフォルトでマルチスレッド化され、`replica_parallel_workers` は `4` に設定されています。このパラメータはカスタムパラメータグループで変更できます。

予期しない停止に対するデータベースの耐障害性を高めるには、ソースで GTID レプリケーションを有効にし、レプリカで GTID を許可することをお勧めします。GTID レプリケーションを許可するには、ソースとレプリカの両方で `gtid_mode` を `ON_PERMISSIVE` に設定します。GTID ベースのレプリケーションの詳細については、「[GTID ベースレプリケーションを使用する](mysql-replication-gtid.md)」を参照してください。

以下の構成オプションを使用して、マルチスレッドレプリケーションを微調整することができます。使用量に関する情報については、*MySQL リファレンスマニュアル*の[レプリケーションとバイナリログのオプションと可変](https://dev.mysql.com/doc/refman/8.0/en/replication-options.html)を参照してください。マルチスレッドレプリケーションの詳細については、MySQL ブログ「[https://dev.mysql.com/blog-archive/improving-the-parallel-applier-with-writeset-based-dependency-tracking/](https://dev.mysql.com/blog-archive/improving-the-parallel-applier-with-writeset-based-dependency-tracking/)」を参照してください。

最適なパラメータ値は、いくつかの要因によって決まります。例えば、バイナリログレプリケーションのパフォーマンスは、データベースワークロードの特性と、レプリカが実行されている DB インスタンスクラスの影響を受けます。したがって、新しいパラメータ設定を本番インスタンスに適用する前に、これらの構成パラメータに対するすべての変更を徹底的にテストすることをお勧めします。
+ `binlog_format recommended value` - に設定`ROW`
+ `binlog_group_commit_sync_delay`
+ `binlog_group_commit_sync_no_delay_count`
+ `binlog_transaction_dependency_history_size`
+ `binlog_transaction_dependency_tracking` - 推奨値は `WRITESET` です。
+ `replica_preserve_commit_order`
+ `replica_parallel_type` - 推奨値は `LOGICAL_CLOCK` です。
+ `replica_parallel_workers`
+ `replica_pending_jobs_size_max`
+ `transaction_write_set_extraction` - 推奨値は `XXHASH64` です。

スキーマとワークロードの特性は、レプリケーションに並行して影響を与える要因です。最も一般的な問題を次に挙げます。
+ プライマリキーがない – RDS は、プライマリキーがないテーブルの writeset 依存関係を確立できません。`ROW` 形式を使用すると、ソースに対して 1 回のフルテーブルスキャンで 1 つの複数行ステートメントを実行できますが、レプリカで変更された行ごとに 1 回のフルテーブルスキャンになります。プライマリキーがないと、レプリケーションスループットが大幅に低下します。
+ 外部キーの存在 – 外部キーが存在する場合、Amazon RDS は FK 関係を持つテーブルの並列処理に writeset 依存関係を使用できません。
+ トランザクションのサイズ – 1 つのトランザクションが数十または数百メガバイトまたはギガバイトに及ぶ場合、コーディネータースレッドとワーカースレッドの 1 つがそのトランザクションのみの処理に長時間かかることがあります。その間、他のすべてのワーカースレッドは、以前のトランザクションの処理が終了した後もアイドル状態のままになる可能性があります。

Aurora MySQL バージョン 3.06 以降では、複数のセカンダリインデックスを持つ大きなテーブルのトランザクションをレプリケートするときにバイナリログレプリカのパフォーマンスを向上させることができます。この機能により、バイナリログレプリカにセカンダリインデックスの変更を並列で適用するスレッドプールが導入されます。この機能は `aurora_binlog_replication_sec_index_parallel_workers` DB クラスターパラメータによって制御されます。これにより、セカンダリインデックスの変更を適用できる並列スレッドの総数が制御されます。パラメータは、デフォルトで `0` (無効) に設定されています。この機能を有効にしてもインスタンスを再起動する必要はありません。この機能を有効にするには、進行中のレプリケーションを停止し、必要な数の並列ワーカースレッドを設定してから、レプリケーションを再開します。

## バイナリログのレプリケーションの最適化
<a name="binlog-optimization-binlog-io-cache"></a><a name="binlog_boost"></a><a name="binlog_io_cache"></a>

 Aurora MySQL 2.10 以降では、Aurora は、バイナリログのレプリケーションにバイナリログ I/O キャッシュと呼ばれる最適化を自動的に適用します。最後にコミットされたバイナリログイベントをキャッシュすることにより、この最適化は、バイナリログ出典インスタンスでのフォアグラウンドトランザクションへの影響を制限しながら、バイナリログのダンプスレッドのパフォーマンスを向上するように設計されています。

**注記**  
 この機能に使用されるこのメモリは、MySQL `binlog_cache` 設定とは無関係です。  
 この機能は、`db.t2` および `db.t3` インスタンスクラスを使用する Aurora DB インスタンスには適用されません。

この最適化を有効にするために、設定パラメータを調整する必要はありません。特に、以前の Aurora MySQL バージョンで設定パラメータ `aurora_binlog_replication_max_yield_seconds` をゼロ以外の値に調整した場合は、現在使用可能なバージョンでゼロに設定し直します。

これらのステータス変数 `aurora_binlog_io_cache_reads` と `aurora_binlog_io_cache_read_requests` は、バイナリログ I/O キャッシュからデータが読み込まれる頻度をモニタリングするのに役立ちます。
+  `aurora_binlog_io_cache_read_requests` はキャッシュからのバイナリログ I/O 読み取りリクエストの数を示します。
+  `aurora_binlog_io_cache_reads` はキャッシュから情報を取得するバイナリログ I/O 読み取り数を示します。

 次の SQL クエリは、キャッシュされた情報を利用するバイナリログ読み取りリクエストの割合を計算します。この場合、比率が 100 に近づくほど、より良好であることを意味します。

```
mysql> SELECT
  (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS
    WHERE VARIABLE_NAME='aurora_binlog_io_cache_reads')
  / (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS
    WHERE VARIABLE_NAME='aurora_binlog_io_cache_read_requests')
  * 100
  as binlog_io_cache_hit_ratio;
+---------------------------+
| binlog_io_cache_hit_ratio |
+---------------------------+
|         99.99847949080622 |
+---------------------------+
```

 バイナリログ I/O キャッシュ機能には、バイナリログのダンプスレッドに関連する新しいメトリクスも含まれています。*ダンプスレッド*は、新しいバイナリログレプリカがバイナリログ出典インスタンスに接続したときに作成されるスレッドです。

ダンプスレッドメトリクスは、60 秒ごとにプレフィックス `[Dump thread metrics]` を伴ってデータベースログに出力されます。メトリクスには、`Secondary_id`、`Secondary_uuid`、バイナリログのファイル名、各レプリカが読み込んでいる位置など、各バイナリログのレプリカの情報が含まれます。メトリクスには、レプリケーション出典とレプリカの間の距離をバイト単位で表す `Bytes_behind_primary` も含まれます。このメトリクスは、レプリカ I/O スレッドのラグを測定します。この数値は、バイナリログのレプリカの `seconds_behind_master` メトリクスによって表されるレプリカ SQL 適用元スレッドのラグとは異なります。距離が減少するか増加するかを確認することで、バイナリログレプリカが出典に追いついているのか、遅れているのかを判断できます。

## インメモリリレーログ
<a name="binlog-optimization-in-memory-relay-log"></a>

Aurora MySQL バージョン 3.10 以降では、レプリケーションのスループットを向上させるために、インメモリリレーログと呼ばれる最適化を導入しています。この最適化では、すべての中間リレーログコンテンツをメモリにキャッシュすることで、リレーログの I/O パフォーマンスを向上させます。その結果、リレーログコンテンツはメモリ内で簡単にアクセスできる状態となるため、ストレージ I/O オペレーションが最小限に抑えられ、コミットレイテンシーが短縮されます。

デフォルトでは、レプリカが次のいずれかの設定を満たす場合、インメモリリレーログ機能は Aurora マネージドレプリケーションシナリオ (ブルー/グリーンデプロイ、Aurora-Aurora レプリケーション、クロスリージョンレプリカなど) で自動的に有効になります。
+ シングルスレッドレプリケーションモード (replica\$1parallel\$1workers = 0)
+ GTID モードが有効になっているマルチスレッドレプリケーション:
  + 自動位置設定の有効化
  + レプリカで GTID モードを ON に設定
+ replica\$1preserve\$1commit\$1order = ON によるファイルベースのレプリケーション

インメモリリレーログ機能は、t3.large より大きいインスタンスクラスでサポートされていますが、Aurora Serverless インスタンスでは利用できません。リレーログの循環バッファのサイズは 128 MB に固定されています。この機能のメモリ消費量をモニタリングするには、次のクエリを実行できます。

```
SELECT event_name, current_alloc FROM sys.memory_global_by_current_bytes WHERE event_name = 'memory/sql/relaylog_io_cache';
```

インメモリリレーログ機能は、aurora\$1in\$1memory\$1relaylog パラメータで制御します。このパラメータは、DB クラスターまたはインスタンスレベルで設定できます。この機能は、インスタンスを再起動しなくても、動的に有効化または無効化できます。

1. 進行中のレプリケーションを停止する

1. パラメータグループで aurora\$1in\$1memory\$1relaylog を ON (有効) または OFF (無効) に設定します。

1. レプリケーションを再開する

例:

```
CALL mysql.rds_stop_replication;
set aurora_in_memory_relaylog to ON to enable or OFF to disable in cluster parameter group
CALL mysql.rds_start_replication;
```

aurora\$1in\$1memory\$1relaylog を ON に設定している場合でも、特定の条件下ではインメモリリレーログ機能が無効になっている場合があります。この機能の現在のステータスを確認するには、次のコマンドを使用できます。

```
SHOW GLOBAL STATUS LIKE 'Aurora_in_memory_relaylog_status';
```

この機能が予期せず無効になっている場合は、次のコマンドを実行して理由を特定できます。

```
SHOW GLOBAL STATUS LIKE 'Aurora_in_memory_relaylog_disabled_reason';
```

このコマンドは、この機能が現在無効になっている理由を説明するメッセージを返します。

# Aurora MySQL の拡張バイナリログの設定
<a name="AuroraMySQL.Enhanced.binlog"></a>

拡張バイナリログを使用すると、バイナリログを有効にすることによるコンピューティングパフォーマンスのオーバーヘッドを、場合によっては最大 50% まで削減できます。拡張バイナリログを使用すると、このオーバーヘッドを約 13% まで削減できます。オーバーヘッドを減らすために、拡張バイナリログはバイナリログとトランザクションログをストレージに並行に書き込みます。これにより、トランザクションコミット時に書き込まれるデータが最小限に抑えられます。

また、拡張バイナリログを使用すると、コミュニティ MySQL バイナリログと比較して、再起動およびフェイルオーバー後のデータベースの回復時間が最大 99% 向上します。拡張バイナリログは既存のバイナリログベースのワークロードと互換性があり、コミュニティ MySQL バイナリログと同じ方法で操作できます。

拡張バイナリログは Aurora MySQL 3.03.1 バージョン以降で利用できます。

**Topics**
+ [拡張バイナリログパラメータの設定](#AuroraMySQL.Enhanced.binlog.enhancedbinlog.parameters)
+ [その他の関連パラメータ](#AuroraMySQL.Enhanced.binlog.other.parameters)
+ [拡張バイナリログとコミュニティ MySQL バイナリログの違い](#AuroraMySQL.Enhanced.binlog.differences)
+ [拡張バイナリログの Amazon CloudWatch メトリクス](#AuroraMySQL.Enhanced.binlog.cloudwatch.metrics)
+ [拡張バイナリログの制限](#AuroraMySQL.Enhanced.binlog.limitations)

## 拡張バイナリログパラメータの設定
<a name="AuroraMySQL.Enhanced.binlog.enhancedbinlog.parameters"></a>

拡張バイナリログパラメータをオン/オフにすることで、コミュニティ MySQL バイナリログと拡張バイナリログを切り替えることができます。既存のバイナリログコンシューマーは、バイナリログファイルシーケンスにギャップがなく、引き続きバイナリログファイルを読み込んで使用できます。

拡張バイナリログを有効にするには、次のパラメータを設定します。


| パラメータ  | デフォルト  | 説明  | 
| --- | --- | --- | 
| binlog\$1format | – | binlog\$1format パラメータを、選択したバイナリログ形式に設定して、拡張バイナリログをオンにします。binlog\$1format parameter がオフに設定されていないことを確認してください。詳細については、「[Aurora MySQL バイナリログの設定](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.MySQL.BinaryFormat.html)」を参照してください。 | 
| aurora\$1enhanced\$1binlog | 0 | Aurora MySQL クラスターに関連付けられている DB クラスターのパラメータグループで、このパラメータの値を 1 に設定します。このパラメータの値を変更する場合、DBClusterParameterGroupStatus 値が pending-reboot と表示されている状態でライターインスタンスを再起動する必要があります。 | 
| binlog\$1backup | 1 |  拡張バイナリログをオンにするには、このパラメータをオフにしてください。そのためには、このパラメータの値を 0 に設定します。 | 
| binlog\$1replication\$1globaldb | 1 |  拡張バイナリログをオンにするには、このパラメータをオフにしてください。そのためには、このパラメータの値を 0 に設定します。 | 

**重要**  
`binlog_backup` と `binlog_replication_globaldb` パラメータは、拡張バイナリログを使用する場合にのみオフにできます。

拡張バイナリログを無効にするには、次のパラメータを設定します。


| パラメータ | 説明 | 
| --- | --- | 
| aurora\$1enhanced\$1binlog | Aurora MySQL クラスターに関連付けられている DB クラスターのパラメータグループで、このパラメータの値を 0 に設定します。このパラメータの値を変更する際は必ず、DBClusterParameterGroupStatus 値が pending-reboot と表示されている状態でライターインスタンスを再起動する必要があります。 | 
| binlog\$1backup | 拡張バイナリログをオフにするには、このパラメータをオンにしてください。そのためには、このパラメータの値を 1 に設定します。 | 
| binlog\$1replication\$1globaldb | 拡張バイナリログをオフにするには、このパラメータをオンにしてください。そのためには、このパラメータの値を 1 に設定します。 | 

拡張バイナリログがオンになっているかどうかを確認するには、MySQL クライアントで次のコマンドを実行します。

```
mysql>show status like 'aurora_enhanced_binlog';
              
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| aurora_enhanced_binlog | ACTIVE |
+------------------------+--------+
1 row in set (0.00 sec)
```

拡張バイナリログがオンになっている場合、`aurora_enhanced_binlog` の出力は `ACTIVE` と表示されます。

## その他の関連パラメータ
<a name="AuroraMySQL.Enhanced.binlog.other.parameters"></a>

拡張バイナリログを有効にすると、次のパラメータが影響を受けます。
+ `max_binlog_size` パラメータは表示されますが、変更できません。デフォルト値 `134217728` は、拡張バイナリログがオンになったときに `268435456` に自動調整されます。
+ コミュニティ MySQL バイナリログとは異なり、拡張バイナリログがオンになっていても、`binlog_checksum` は動的パラメータとして動作しません。このパラメータへの変更を有効にするには、`ApplyMethod` が `immediate` の場合にも DB クラスターを手動で再起動する必要があります。
+ `binlog_order_commits` パラメータに設定した値は、拡張バイナリログがオンになっているときのコミットの順序には影響しません。コミットは常に順序付けられ、それ以上パフォーマンスへの影響はありません。

## 拡張バイナリログとコミュニティ MySQL バイナリログの違い
<a name="AuroraMySQL.Enhanced.binlog.differences"></a>

拡張バイナリログは、コミュニティ MySQL バイナリログと比較したとき、クローン、バックアップ、Aurora グローバルデータベースとのインタラクションが異なります。拡張バイナリログを使用する前に、次の違いを理解しておくことをお勧めします。
+ ソース DB クラスターの拡張バイナリログファイルは、クローンされた DB クラスターでは使用できません。
+ 拡張バイナリファイルは Aurora バックアップには含まれていません。そのため、DB クラスターに保持期間が設定されていても、DB クラスターを復元した後は、ソース DB クラスターの拡張バイナリログファイルを使用できません。
+ Aurora グローバルデータベースで使用する場合、プライマリ DB クラスターの拡張バイナリログファイルはセカンダリリージョンの DB クラスターに複製されません。

****例****  
次の例は、拡張バイナリログとコミュニティ MySQL バイナリログの違いを示しています。

**復元またはクローンされた DB クラスター上**

拡張バイナリログがオンになっている場合、復元またはクローンされた DB クラスターでは過去のバイナリログファイルを使用できません。復元またはクローン操作の後、バイナリログがオンになっている場合、新しい DB クラスターは 1 (mysql-bin-changelog.000001) から始まる独自のバイナリログファイルのシーケンスの書き込みを開始します。

復元またはクローン操作後に拡張バイナリログを有効にするには、復元またはクローンされた DB クラスターに必要な DB クラスターパラメーターを設定します。詳細については、「[拡張バイナリログパラメータの設定](#AuroraMySQL.Enhanced.binlog.enhancedbinlog.parameters)」を参照してください。

**Example 例: 拡張バイナリログがオンになっているときに実行されるクローンまたは復元操作**  
ソース DB クラスター:  

```
mysql> show binary logs;
                      
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        |
| mysql-bin-changelog.000002 |       156 | No        |
| mysql-bin-changelog.000003 |       156 | No        |
| mysql-bin-changelog.000004 |       156 | No        | --> Enhanced Binlog turned on
| mysql-bin-changelog.000005 |       156 | No        | --> Enhanced Binlog turned on
| mysql-bin-changelog.000006 |       156 | No        | --> Enhanced Binlog turned on
+----------------------------+-----------+-----------+
6 rows in set (0.00 sec)
```
 復元またはクローンされた DB クラスターでは、拡張バイナリログがオンになっていても、バイナリログファイルはバックアップされません。バイナリログデータの不連続性を避けるため、拡張バイナリログを有効にする前に書き込まれたバイナリログファイルも使用できません。  

```
mysql>show binary logs;
                      
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        | --> New sequence of Binlog files
+----------------------------+-----------+-----------+ 
1 row in set (0.00 sec)
```

**Example 例: 拡張バイナリログがオフになっているときに実行されるクローンまたは復元操作**  
ソース DB クラスター:  

```
mysql>show binary logs;
                                                
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        |
| mysql-bin-changelog.000002 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000003 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000004 |       156 | No        | 
| mysql-bin-changelog.000005 |       156 | No        | 
| mysql-bin-changelog.000006 |       156 | No        |
+----------------------------+-----------+-----------+
6 rows in set (0.00 sec)
```
拡張バイナリログは `mysql-bin-changelog.000003` の後に無効になります。復元またはクローンされた DB クラスターでは、拡張バイナリログをオフにした後に書き込まれたバイナリログファイルを使用できます。  

```
mysql>show binary logs;
                      
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000004 |       156 | No        | 
| mysql-bin-changelog.000005 |       156 | No        | 
| mysql-bin-changelog.000006 |       156 | No        |
+----------------------------+-----------+-----------+
1 row in set (0.00 sec)
```

**Amazon Aurora Global Database で**

Amazon Aurora Global Database では、プライマリ DB クラスターのバイナリログデータはセカンダリ DB クラスターに複製レプリケートされません。クロスリージョンフェイルオーバープロセスの後、新たに昇格されたプライマリ DB クラスターでバイナリログデータを使用できなくなります。バイナリログがオンになっている場合、新たに昇格された DB クラスターは 1 (mysql-bin-changelog.000001) から始まる独自のバイナリログファイルのシーケンスを開始します。

フェイルオーバー後に拡張バイナリログを有効にするには、セカンダリ DB クラスターで必要な DB クラスターパラメータを設定する必要があります。詳細については、「[拡張バイナリログパラメータの設定](#AuroraMySQL.Enhanced.binlog.enhancedbinlog.parameters)」を参照してください。

**Example 例: 拡張バイナリログがオンになっている場合、グローバルデータベースフェイルオーバー操作が実行されます。**  
古いプライマリ DB クラスター (フェイルオーバー前):  

```
mysql>show binary logs;
                  
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        |
| mysql-bin-changelog.000002 |       156 | No        |
| mysql-bin-changelog.000003 |       156 | No        |
| mysql-bin-changelog.000004 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000005 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000006 |       156 | No        | --> Enhanced Binlog enabled
+----------------------------+-----------+-----------+
6 rows in set (0.00 sec)
```
新しいプライマリ DB クラスター (フェイルオーバー後):  
拡張バイナリログがオンになっている場合、バイナリログファイルはセカンダリリージョンに複製されません。バイナリログデータの不連続性を避けるため、拡張バイナリログを有効にする前に書き込まれたバイナリログファイルは使用できません。  

```
mysql>show binary logs;
                      
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        | --> Fresh sequence of Binlog files
+----------------------------+-----------+-----------+ 
1 row in set (0.00 sec)
```

**Example 例: 拡張バイナリログがオフになっている場合、グローバルデータベースフェイルオーバー操作が実行されます。**  
ソース DB クラスター:  

```
mysql>show binary logs;
                  
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000001 |       156 | No        |
| mysql-bin-changelog.000002 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000003 |       156 | No        | --> Enhanced Binlog enabled
| mysql-bin-changelog.000004 |       156 | No        | 
| mysql-bin-changelog.000005 |       156 | No        | 
| mysql-bin-changelog.000006 |       156 | No        |
+----------------------------+-----------+-----------+
6 rows in set (0.00 sec)
```
**復元またはクローンされた DB クラスター:**  
拡張バイナリログは `mysql-bin-changelog.000003` の後に無効になります。拡張バイナリログをオフにした後に書き込まれたバイナリログファイルは複製され、新たに格された DB クラスターで使用できます。  

```
mysql>show binary logs;
                  
+----------------------------+-----------+-----------+
| Log_name                   | File_size | Encrypted |
+----------------------------+-----------+-----------+
| mysql-bin-changelog.000004 |       156 | No        | 
| mysql-bin-changelog.000005 |       156 | No        | 
| mysql-bin-changelog.000006 |       156 | No        |
+----------------------------+-----------+-----------+
3 rows in set (0.00 sec)
```

## 拡張バイナリログの Amazon CloudWatch メトリクス
<a name="AuroraMySQL.Enhanced.binlog.cloudwatch.metrics"></a>

以下の Amazon CloudWatch メトリクスは、拡張バイナリログがオンになっている場合にのみ公開されます。


| [CloudWatch メトリクス] | 説明 | 単位 | 
| --- | --- | --- | 
| ChangeLogBytesUsed | 拡張バイナリログで使用されるストレージ容量。 | バイト | 
| ChangeLogReadIOPs | 5 分以内の、拡張バイナリログで実行される読み取り I/O オペレーションの数。 | 5 分あたりのカウント | 
| ChangeLogWriteIOPs | 5 分以内の、拡張バイナリログで実行される書き込みディスク I/O オペレーションの数。 | 5 分あたりのカウント | 

## 拡張バイナリログの制限
<a name="AuroraMySQL.Enhanced.binlog.limitations"></a>

拡張バイナリログがオンになっている場合、Amazon Aurora DB クラスターには次の制限が適用されます。
+ 拡張バイナリログは Aurora MySQL 3.03.1 バージョン以降でのみサポートされています。
+ プライマリ DB クラスターに書き込まれた拡張バイナリログファイルは、クローンまたは復元された DB クラスターにはコピーされません。
+ Amazon Aurora Global Database で使用する場合、プライマリ DB クラスターの拡張バイナリログファイルはセカンダリ DB クラスターに複製されません。そのため、フェイルオーバープロセス後、過去のバイナリログデータは新しいプライマリ DB クラスターで使用できなくなります。
+ 以下のバイナリログ設定パラメータは無視されます。
  + `binlog_group_commit_sync_delay`
  + `binlog_group_commit_sync_no_delay_count`
  + `binlog_max_flush_queue_time`
+ データベース内の破損したテーブルを削除したり、名前を変更したりすることはできません。これらのテーブルを削除するには、サポート にお問い合わせください。
+ 拡張バイナリログがオンになっている場合、バイナリログ I/O キャッシュは無効になります。詳細については、「[Aurora MySQL でのバイナリログのレプリケーションの最適化](binlog-optimization.md)」を参照してください。
**注記**  
拡張バイナリログでは、バイナリログ I/O キャッシュと同様の読み取りパフォーマンスと、向上した書き込みパフォーマンスが提供されます。
+ バックトラック機能はサポートされていません。次の条件では、拡張バイナリログを DB クラスターで有効にできません。
  + バックトラック機能が現在有効になっている DB クラスター。
  + バックトラック機能が以前に有効になっていたが、現在は無効化されていない DB クラスター。
  + ソース DB クラスターまたはバックトラック機能が有効になっているスナップショットから復元された DB クラスター。

# GTID ベースレプリケーションを使用する
<a name="mysql-replication-gtid"></a>

以下では、Aurora MySQL クラスターと外部ソースとの間において、バイナリログ (binlog) レプリケーションでグローバルトランザクション ID (GTID) を使用する方法について説明します。

**注記**  
Aurora では、この機能は、外部 MySQL データベースとの間で binlog レプリケーションを使用する Aurora MySQL クラスターでのみ使用できます。もう一方のデータベースは、Amazon RDS MySQL インスタンス、オンプレミス MySQL データベース、または別の AWS リージョン にある Aurora DB クラスターです。その種類のレプリケーションを設定する方法については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。

binlog レプリケーションを使用する際に MySQL での GTID ベースのレプリケーションに慣れていない場合は、MySQL ドキュメントの「[Replication with global transaction identifiers](https://dev.mysql.com/doc/refman/5.7/en/replication-gtids.html)」を参照してください。

GTID ベースのレプリケーションは、Aurora MySQL バージョン 2 および 3 でサポートされています。

**Topics**
+ [グローバルトランザクション ID (GTID) の概要](#mysql-replication-gtid.overview)
+ [GTID ベースレプリケーションのパラメータ](#mysql-replication-gtid.parameters)
+ [Aurora MySQL クラスターの GTID ベースのレプリケーションを有効にする](mysql-replication-gtid.configuring-aurora.md)
+ [Aurora MySQL DB クラスターの GTID ベースレプリケーションを無効にする](mysql-replication-gtid.disabling.md)

## グローバルトランザクション ID (GTID) の概要
<a name="mysql-replication-gtid.overview"></a>

*グローバルトランザクション ID (GTID)* はコミットされた MySQL トランザクションに対して生成される一意の ID です。GTID を使用することで、簡単に binlog をレプリケーションおよびトラブルシューティングできるようになります。

**注記**  
Aurora がクラスター内の DB インスタンス間でデータを同期する場合、そのレプリケーションメカニズムにバイナリログ (binlog) は含まれません。Aurora MySQL では、GTID ベースのレプリケーションは、binlog レプリケーションも使用して外部の MySQL 互換データベースから Aurora MySQL DB クラスター間でレプリケートする場合にのみ適用されます。

MySQL では、binlog レプリケーションに 2 種類のトランザクションを使用します。
+ *GTID トランザクション* - GTID によって識別されるトランザクション。
+ *匿名トランザクション* - GTID が割り当てられていないトランザクション。

レプリケーション設定では、GTID はすべての DB インスタンスで一意です。GTID を使用すると、ログファイルの位置を参照する必要がないため、GTID はレプリケーション設定を簡素化します。GTID はまた、レプリケートされたトランザクションを追跡し、出典インスタンスとレプリカが一致しているかどうかの判断を容易にします。

 外部の MySQL 互換データベースから Aurora クラスターにレプリケートする場合は通常、GTID ベースのレプリケーションを Aurora と共に使用します。このレプリケーション設定は、オンプレミスまたは Amazon RDS データベースから Aurora MySQL への移行の一環として行うことができます。外部データベースで既に GTID が使用されている場合に、Aurora クラスターに対して GTID ベースのレプリケーションを有効にすると、レプリケーションプロセスが簡単になります。

 Aurora MySQL クラスター用に GTID ベースのレプリケーションを設定するには、まず DB クラスターパラメータグループの関連設定パラメータを設定します。その後、そのパラメータグループとクラスターを関連付けます。

## GTID ベースレプリケーションのパラメータ
<a name="mysql-replication-gtid.parameters"></a>

以下のパラメータを使用して、GTID ベースレプリケーションを設定します。


| Parameter | 有効な値 | 説明 | 
| --- | --- | --- | 
|  `gtid_mode`  |  `OFF`, `OFF_PERMISSIVE`, `ON_PERMISSIVE`, `ON`  |  `OFF` は新しいトランザクションが匿名トランザクション (つまり GTID を持たない) であることを指定し、トランザクションは匿名でレプリケートされる必要があります。 `OFF_PERMISSIVE` は新しいトランザクションが匿名トランザクションであることを指定しますが、すべてのトランザクションをレプリケートできます。 `ON_PERMISSIVE` は新しいトランザクションが GTID トランザクションであることを指定しますが、すべてのトランザクションをレプリケートできます。 `ON` は新しいトランザクションが GTID トランザクションであることを指定し、トランザクションは複製される GTID トランザクションでなければなりません。  | 
|  `enforce_gtid_consistency`  |  `OFF`, `ON`, `WARN`  |  `OFF` はトランザクションが GTID の整合性に違反することを許可します。 `ON` はトランザクションが GTID の整合性に違反することを防ぎます。 `WARN` は、トランザクションが GTID の整合性に違反することを許可しますが、違反が発生すると警告を生成します。  | 

**注記**  
AWS マネジメントコンソール では、`gtid_mode` パラメータは `gtid-mode` のように表示されます。

GTID ベースのレプリケーションでは、Aurora MySQL DB クラスターの DB クラスターパラメータグループでこれらの設定を使用します。
+ `ON` と `ON_PERMISSIVE` は、Aurora MySQL クラスターからの送信レプリケーションにのみ適用されます。いずれの値でも、Aurora DB クラスターは、外部データベースにレプリケートされるトランザクションに GTID を使用します。`ON` の場合は、外部データベースも GTID ベースのレプリケーションを使用する必要があります。`ON_PERMISSIVE` の場合、GTID ベースのレプリケーションは、外部データベースでオプションになります。
+ `OFF_PERMISSIVE` が設定された場合、これは、Aurora DB クラスターが、外部データベースからの受信レプリケーションを受け入れることができることを意味します。これは、外部データベースで GTID ベースのレプリケーションが使用されているかどうかにかかわらず実行することができます。
+  `OFF` が設定された場合、これは、Aurora DB クラスターが、GTID ベースのレプリケーションを使用しない外部データベースからの受信レプリケーションのみを受け入れることができることを意味します。

**ヒント**  
受信レプリケーションは、Aurora MySQL クラスターの最も一般的な binlog レプリケーションのシナリオです。受信レプリケーションでは、GTID モードを `OFF_PERMISSIVE` に設定することをお勧めします。この設定では、レプリケーション出典の GTID 設定に関係なく、外部データベースからの受信レプリケーションが可能になります。

パラメータグループの詳細については、「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。

# Aurora MySQL クラスターの GTID ベースのレプリケーションを有効にする
<a name="mysql-replication-gtid.configuring-aurora"></a><a name="gtid"></a>

GTID ベースのレプリケーションが Aurora MySQL DB クラスターで有効になっている場合、GTID 設定は、インバウンドとアウトバウンドの binlog レプリケーションのいずれにも適用されます。

**Aurora MySQL クラスターの GTID ベースのレプリケーションを有効にするには**

1. DB クラスターパラメータグループを作成または編集するには、以下のパラメータ設定を使用します。
   + `gtid_mode` - `ON` または `ON_PERMISSIVE`
   + `enforce_gtid_consistency` – `ON`

1. DB クラスターパラメータグループを Aurora MySQL クラスターに関連付けます。そのためには、「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」の手順に従います。

1. (オプション) GTID を含まないトランザクションに GTID を割り当てる方法を指定します。これを行うには、[mysql.rds\$1assign\$1gtids\$1to\$1anonymous\$1transactions (Aurora MySQL バージョン 3)](mysql-stored-proc-gtid.md#mysql_assign_gtids_to_anonymous_transactions) でストアドプロシージャを呼び出します。

# Aurora MySQL DB クラスターの GTID ベースレプリケーションを無効にする
<a name="mysql-replication-gtid.disabling"></a>

Aurora MySQL DB クラスターに対する GTID ベースのレプリケーションは、無効にすることができます。これを行うと、Aurora クラスターは、GTID ベースのレプリケーションを使用する外部データベースとのインバウンドまたはアウトバウンドの binlog レプリケーションを実行できなくなります。

**注記**  
次の手順で、*リードレプリカ*は、外部データベースとの間で binlog レプリケーションを伴う Aurora 設定のレプリケーションターゲットを意味します。読み取り専用の Aurora レプリカ DB インスタンスを意味するものではありません。例えば、Aurora クラスターが外部出典からの受信レプリケーションを受け入れる場合、Aurora プライマリインスタンスは binlog レプリケーションのリードレプリカとして機能します。

このセクションで示されているストアドプロシージャの詳細については、「[Aurora MySQL ストアドプロシージャリファレンス](AuroraMySQL.Reference.StoredProcs.md)」を参照してください。

**に対して Aurora MySQL DB クラスターの GTID ベースのレプリケーションを無効にするには**

1. Aurora レプリカで、次の手順を実行します。

   バージョン 3 の場合

   ```
   CALL mysql.rds_set_source_auto_position(0);
   ```

   バージョン 2 の場合

   ```
   CALL mysql.rds_set_master_auto_position(0);
   ```

1. `gtid_mode` を `ON_PERMISSIVE` にリセットします。

   1. Aurora MySQL クラスターに関連付けられている DB クラスターパラメータグループで、`gtid_mode` が `ON_PERMISSIVE` に設定されていることを確認します。

      パラメータグループを使用して設定パラメータの設定の詳細については、「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。

   1. Aurora MySQL DB クラスターを再起動します。

1. `gtid_mode` を `OFF_PERMISSIVE` にリセットします。

   1. Aurora MySQL クラスターに関連付けられている DB クラスターパラメータグループで、`gtid_mode` が `OFF_PERMISSIVE` に設定されていることを確認します。

   1. Aurora MySQL DB クラスターを再起動します。

1. すべての GTID トランザクションが Aurora プライマリインスタンスに適用されるまで待ちます。適用されたことを確認するには、次の手順を実行します。

   1.  Aurora プライマリインスタンスで、`SHOW MASTER STATUS` コマンドを実行します。

      出力は次のようになります。

      ```
      File                        Position
      ------------------------------------
      mysql-bin-changelog.000031      107
      ------------------------------------
      ```

      出力のファイルと位置に注意してください。

   1. リードレプリカごとに、前のステップで得たソースインスタンスのファイルと位置の情報を使用して、次のクエリを実行します。

      バージョン 3 の場合

      ```
      SELECT SOURCE_POS_WAIT('file', position);
      ```

      バージョン 2 の場合

      ```
      SELECT MASTER_POS_WAIT('file', position);
      ```

      例えば、ファイル名が `mysql-bin-changelog.000031` で、場所が `107` の場合は、次のステートメントを実行します。

      バージョン 3 の場合

      ```
      SELECT SOURCE_POS_WAIT('mysql-bin-changelog.000031', 107);
      ```

      バージョン 2 の場合

      ```
      SELECT MASTER_POS_WAIT('mysql-bin-changelog.000031', 107);
      ```

1. GTID パラメータをリセットして、GTID ベースのレプリケーションを無効にします。

   1. Aurora MySQL クラスターに関連付けられた DB クラスターパラメータグループに次のパラメータが設定されていることを確認します。
      + `gtid_mode` – `OFF`
      + `enforce_gtid_consistency` – `OFF`

   1. Aurora MySQL DB クラスターを再起動します。

# Amazon Aurora MySQL DB クラスターでのローカル書き込み転送の使用
<a name="aurora-mysql-write-forwarding"></a>

ローカル (クラスター内) 書き込み転送により、アプリケーションは Aurora レプリカで直接、読み取り/書き込みトランザクションを発行できます。その後、これらのトランザクションはライター DB インスタンスに転送されてコミットされます。アプリケーションで*書き込み後の読み取り一貫性* (トランザクション内の最新の書き込みを読み取る機能) が必要なときには、ローカル書き込み転送を使用できます。

リードレプリカは、ライターから非同期で更新を受け取ります。書き込み転送を行わないと、書き込み後の読み取り一貫性を必要とする読み取りをライター DB インスタンス上で処理する必要があります。または、複数のリードレプリカを活用してスケーラビリティを高めるために、複雑なカスタムアプリケーションロジックを開発する必要があります。アプリケーションは、トラフィックを正しいエンドポイントに送信するために、すべての読み取りトラフィックと書き込みトラフィックを完全に分割して、2 セットのデータベース接続を維持する必要があります。クエリがアプリケーション内の単一の論理セッション、つまりトランザクションの一部である場合、この開発オーバーヘッドはアプリケーションの設計を複雑にします。さらに、レプリケーションの遅延はリードレプリカによって異なる場合があるため、データベース内のすべてのインスタンスでグローバルな読み取りの一貫性を実現することは困難です。

書き込み転送により、これらのトランザクションを分割したり、ライターのみに送信したりする必要がなくなるため、アプリケーション開発が簡単になります。この新機能により、トランザクション内の最新の書き込みを読み取る必要があり、書き込み遅延の影響を受けないワークロードの読み取りスケールを簡単に実現できます。

ローカル書き込み転送は、Aurora グローバルデータベースのセカンダリ DB クラスターからプライマリ DB クラスターに書き込みを転送するグローバル書き込み転送とは異なります。Aurora グローバルデータベースの一部である DB クラスターでは、ローカル書き込み転送を使用できます。詳細については、「[Amazon Aurora Global Database の書き込み転送を使用する](aurora-global-database-write-forwarding.md)」を参照してください。

ローカル書き込み転送には Aurora MySQL バージョン 3.04 以降が必要です。

**Topics**
+ [ローカル書き込み転送の有効化](aurora-mysql-write-forwarding-enabling.md)
+ [DB クラスターの書き込み転送が有効になっているかどうかの確認](#aurora-mysql-write-forwarding-describing)
+ [書き込み転送とアプリケーションおよび SQL の互換性](#aurora-mysql-write-forwarding-compatibility)
+ [書き込み転送の分離レベル](#aurora-mysql-write-forwarding-isolation)
+ [書き込み転送の読み取り整合性](aurora-mysql-write-forwarding-consistency.md)
+ [書き込み転送を使用したマルチパートステートメントの実行](#aurora-mysql-write-forwarding-multipart)
+ [書込み転送を使用したトランザクション](#aurora-mysql-write-forwarding-txns)
+ [書き込み転送の設定パラメータ](#aurora-mysql-write-forwarding-params)
+ [書き込み転送のための Amazon CloudWatch メトリクスと Aurora MySQL ステータス変数](aurora-mysql-write-forwarding-cloudwatch.md)
+ [転送されたトランザクションとクエリの識別](#aurora-write-forwarding-processlist)

# ローカル書き込み転送の有効化
<a name="aurora-mysql-write-forwarding-enabling"></a>

デフォルトでは、Aurora MySQL DB クラスターのローカル書き込み転送は有効になっていません。ローカル書き込み転送は、インスタンスレベルではなくクラスターレベルで有効にします。

**重要**  
バイナリロギングを使用するクロスリージョンリードレプリカに対してローカル書き込み転送を有効にすることもできますが、書き込み操作はソース AWS リージョン に転送されません。これらは、binlog リードレプリカクラスターのライター DB インスタンスに転送されます。  
この方法は、セカンダリ AWS リージョン の binlog リードレプリカへの書き込みの用途がある場合にのみ使用してください。そうしないと、複製されたデータセットが互いに矛盾する「スプリットブレイン」シナリオになってしまう可能性があります。  
どうしても必要な場合を除いて、クロスリージョンのリードレプリカでのローカル書き込み転送ではなく、グローバルデータベースでのグローバル書き込み転送を使用することをお勧めします。詳細については、「[Amazon Aurora Global Database の書き込み転送を使用する](aurora-global-database-write-forwarding.md)」を参照してください。

## コンソール
<a name="aurora-mysql-write-forwarding-enabling.CON"></a>

DB クラスターを作成または変更するときに、AWS マネジメントコンソール を使用して、**[リードレプリカの書き込み転送]** の **[ローカル書き込み転送を有効にする]** チェックボックスを選択します。

## AWS CLI
<a name="aurora-mysql-write-forwarding-enabling.CLI"></a>

AWS CLI で書き込み転送を有効にするには、`--enable-local-write-forwarding` オプションを使用します。このオプションは、`create-db-cluster` コマンドを使用して新しい DB クラスターを作成するときに機能します。`modify-db-cluster` コマンドを使用して、既存の DB クラスターを変更する場合にも機能します。これらの同じ CLI コマンドで `--no-enable-local-write-forwarding` オプションを使用することで、書き込み転送をオフにすることができます。

次の例では、書き込み転送を有効にした Aurora MySQL DB クラスターを作成します。

```
aws rds create-db-cluster \
  --db-cluster-identifier write-forwarding-test-cluster \
  --enable-local-write-forwarding \
  --engine aurora-mysql \
  --engine-version 8.0.mysql_aurora.3.04.0 \
  --master-username myuser \
  --master-user-password mypassword \
  --backup-retention 1
```

次に、書き込み転送を使用できるように、ライター DB インスタンスとリーダー DB インスタンスを作成します。詳細については、「[Amazon Aurora DB クラスターの作成](Aurora.CreateInstance.md)」を参照してください。

## RDS API
<a name="aurora-mysql-write-forwarding-enabling.API"></a>

Amazon RDS API を使用して書き込み転送を有効にするには、`EnableLocalWriteForwarding` パラメータを `true` に設定します。このパラメータは、`CreateDBCluster` オペレーションを使用して新しい DB クラスターを作成するときに機能します。この操作は、`ModifyDBCluster` オペレーションを使用して既存の DB クラスターを変更する場合にも機能します。`EnableLocalWriteForwarding` パラメータを `false` に設定することで、書き込み転送をオフにすることができます。

## データベースセッションの書き込み転送を有効にする
<a name="aurora-mysql-write-forwarding-enabling-session"></a>

`aurora_replica_read_consistency` パラメータは、書き込み転送を有効にする DB パラメータと DB クラスターパラメータです。読み取り整合性レベルには、`EVENTUAL`、`SESSION`、または `GLOBAL` を指定できます。整合性レベルの詳細については、[書き込み転送の読み取り整合性](aurora-mysql-write-forwarding-consistency.md) を参照してください。

このパラメータには、次の規則が適用されます。
+ デフォルト値は null です。
+ 書き込み転送は、`aurora_replica_read_consistency` を `EVENTUAL`、`SESSION`、または `GLOBAL` に設定した場合にのみ使用できます。このパラメータは、書き込み転送が有効な DB クラスターのリーダーインスタンスにのみ関係します。
+ マルチステートメントトランザクション内で、このパラメータを設定したり (空の場合)、設定解除したり (既に設定されている場合) することはできません。そのようなトランザクション中に、ある有効な値から別の有効な値に変更できますが、このアクションはお勧めしません。

## DB クラスターの書き込み転送が有効になっているかどうかの確認
<a name="aurora-mysql-write-forwarding-describing"></a>

DB クラスターで書き込み転送を使用できるかどうかを判断するには、クラスターの属性 `LocalWriteForwardingStatus` が `enabled` に設定されていることを確認します。

AWS マネジメントコンソール のクラスターの詳細ページの **[設定]** タブで、**[ローカルリードレプリカの書き込み転送]** のステータスが **[有効]** と表示されます。

すべてのクラスターの書き込み転送設定のステータスを表示するには、次の AWS CLI コマンドを実行します。

**Example**  

```
aws rds describe-db-clusters \
--query '*[].{DBClusterIdentifier:DBClusterIdentifier,LocalWriteForwardingStatus:LocalWriteForwardingStatus}'

[
    {
        "LocalWriteForwardingStatus": "enabled",
        "DBClusterIdentifier": "write-forwarding-test-cluster-1"
    },
    {
        "LocalWriteForwardingStatus": "disabled",
        "DBClusterIdentifier": "write-forwarding-test-cluster-2"
    },
    {
        "LocalWriteForwardingStatus": "requested",
        "DBClusterIdentifier": "test-global-cluster-2"
    },
    {
        "LocalWriteForwardingStatus": "null",
        "DBClusterIdentifier": "aurora-mysql-v2-cluster"
    }
]
```

DB クラスターは、`LocalWriteForwardingStatus` として以下の値を持ちます。
+ `disabled` — 書き込み転送は無効です。
+ `disabling` — 書き込み転送は無効化中です。
+ `enabled` — 書き込み転送は有効です。
+ `enabling` — 書き込み転送は有効化中です。
+ `null` — この DB クラスターでは書き込み転送は使用できません。
+ `requested` — 書き込み転送がリクエストされていますが、まだアクティブではありません。

## 書き込み転送とアプリケーションおよび SQL の互換性
<a name="aurora-mysql-write-forwarding-compatibility"></a>

書き込み転送では、次の種類の SQL ステートメントを使用できます。
+ `INSERT`、`DELETE`、および `UPDATE` などのデータ操作言語 (DML) ステートメント。書き込み転送で使用できるこれらのステートメントのプロパティには、以下で説明するように、いくつかの制限があります。
+ `SELECT ... LOCK IN SHARE MODE` と `SELECT FOR UPDATE` ステートメント。
+ `PREPARE` と `EXECUTE` ステートメント。

書き込み転送機能を持つ DB クラスターでは、特定のステートメントの使用が許可されていないか、古い結果を生成する可能性があります。また、ユーザー定義関数とユーザー定義プロシージャはサポートされていません。したがって、DB クラスターでは、`EnableLocalWriteForwarding` 設定はデフォルトで無効になっています。有効にする前に、アプリケーションコードがこれらの制限の影響を受けないことを確認してください。

書き込み転送で使用する SQL ステートメントには、次の制限が適用されます。場合によっては、書き込み転送が有効な DB クラスターでステートメントを使用できます。この方法は、`aurora_replica_read_consistency` 設定パラメータによってセッション内で書き込み転送が有効化されていない場合に機能します。書き込み転送のために許可されていないステートメントを使用しようとすると、次のようなエラーメッセージが表示されます。

```
ERROR 1235 (42000): This version of MySQL doesn't yet support 'operation with write forwarding'.
```

**データ定義言語 (DDL)**  
ライター DB インスタンスに接続して DDL ステートメントを実行します。リーダー DB インスタンスからは実行できません。

**テンポラリテーブルのデータを使用した永続テーブルの更新**  
書き込み転送が有効な DB クラスターでテンポラリテーブルを使用できます。ただし、ステートメントがテンポラリテーブルを参照している場合は、DML ステートメントを使用して永続テーブルを変更することはできません。例えば、テンポラリテーブルからデータを取る `INSERT ... SELECT` ステートメントを使用することはできません。

**XA トランザクション**  
セッション内で書き込み転送が有効になっている場合、DB クラスターで次のステートメントを使用することはできません。これらのステートメントは、書き込み転送が有効になっていない DB クラスター、または `aurora_replica_read_consistency` 設定が空のセッションで使用できます。セッション内で書き込み転送を有効にする前に、コードでこれらのステートメントが使用されているかどうかを確認してください。  

```
XA {START|BEGIN} xid [JOIN|RESUME]
XA END xid [SUSPEND [FOR MIGRATE]]
XA PREPARE xid
XA COMMIT xid [ONE PHASE]
XA ROLLBACK xid
XA RECOVER [CONVERT XID]
```

**永続テーブルの LOAD ステートメント**  
書き込み転送が有効な DB クラスターでは、以下のステートメントを使用できません。  

```
LOAD DATA INFILE 'data.txt' INTO TABLE t1;
LOAD XML LOCAL INFILE 'test.xml' INTO TABLE t1;
```

**プラグインステートメント**  
書き込み転送が有効な DB クラスターでは、以下のステートメントを使用できません。  

```
INSTALL PLUGIN example SONAME 'ha_example.so';
UNINSTALL PLUGIN example;
```

**SAVEPOINT ステートメント**  
セッション内で書き込み転送が有効になっている場合、DB クラスターで次のステートメントを使用することはできません。これらのステートメントは、書き込み転送が有効になっていない DB クラスター、または `aurora_replica_read_consistency` 設定が空白のセッションで使用できます。セッション内で書き込み転送を有効にする前に、コードでこれらのステートメントが使用されているかどうかを確認してください。  

```
SAVEPOINT t1_save;
ROLLBACK TO SAVEPOINT t1_save;
RELEASE SAVEPOINT t1_save;
```

## 書き込み転送の分離レベル
<a name="aurora-mysql-write-forwarding-isolation"></a>

書き込み転送を使用するセッションでは、`REPEATABLE READ` 分離レベルのみを使用できます。Aurora レプリカで `READ COMMITTED` 分離レベルを使用することもできますが、その分離レベルは書き込み転送では機能しません。`REPEATABLE READ` および `READ COMMITTED` 分離レベルの詳細については、「[Aurora MySQL の分離レベル](AuroraMySQL.Reference.IsolationLevels.md)」を参照してください。

# 書き込み転送の読み取り整合性
<a name="aurora-mysql-write-forwarding-consistency"></a>

DB クラスターの読み取り整合性の程度を制御できます。読み取り整合性レベルによって、一部またはすべての変更がライターからレプリケートされるように、各読み取りオペレーションの前の DB クラスターの待機時間が決まります。読み取り整合性レベルを調整して、セッションから転送されたすべての書き込みオペレーションが、後続のクエリの前に DB クラスターに表示することができます。また、この設定を使用して、DB クラスターのクエリに、常にライターからの最新の更新が表示されるようにすることもできます。この設定は、他のセッションまたは他のクラスターによって送信されるクエリにも適用されます。アプリケーションでこの種類の動作を指定するには、`aurora_replica_read_consistency` DB パラメータまたは DB クラスターパラメータの値を選択します。

**重要**  
書き込みを転送するときには、必ず、`aurora_replica_read_consistency` DB パラメータまたは DB クラスターパラメータを設定してください。そうしないと、Aurora は書き込みを転送しません。デフォルトでは、このパラメータに空の値があるため、このパラメータを使用する場合は特定の値を選択してください。`aurora_replica_read_consistency` パラメータは、書き込み転送が有効な DB クラスターまたはインスタンスにのみ影響します。

整合性レベルを上げると、アプリケーションは、DB インスタンス間で変更が伝播されるのを待つ時間が長くなります。応答時間の短縮と、クエリを実行する前に他の DB インスタンスで行われた変更が完全に使用可能であることのバランスを選択できます。

`aurora_replica_read_consistency` パラメータには以下の値を指定できます。
+ `EVENTUAL` — 同じセッションでの書き込み操作の結果は、ライター DB インスタンスで書き込み操作が実行されるまで表示されません。クエリは、更新された結果が使用可能になるのを待つことはありません。したがって、ステートメントのタイミングとレプリケーションの遅延の量によっては、古いデータや更新されたデータが取得される可能性があります。これは、書き込み転送を使用しない Aurora MySQL DB クラスターの場合と同じ整合性です。
+ `SESSION` — 書き込み転送を使用するすべてのクエリには、そのセッションで行われたすべての変更の結果が表示されます。トランザクションがコミットされているかどうかにかかわらず、変更が表示されます。必要に応じて、クエリは、転送された書き込み操作の結果がレプリケートされるまで待機します。
+ `GLOBAL` — セッションには、DB クラスター内のすべてのセッションとインスタンスでコミットされたすべての変更が表示されます。各クエリは、セッション遅延の量に応じて変化する期間を待つことがあります。クエリは、クエリが開始された時点の、DB クラスターがライターからコミットされたすべてのデータを含む最新状態になったときに実行されます。

書き込み転送に関連する設定パラメータの詳細については、「[書き込み転送の設定パラメータ](aurora-mysql-write-forwarding.md#aurora-mysql-write-forwarding-params)」を参照してください。

**注記**  
跡えば次のように、`aurora_replica_read_consistency` をセッション変数として使用することもできます。  

```
mysql> set aurora_replica_read_consistency = 'session';
```

## 書き込み転送の使用例
<a name="aurora-mysql-write-forwarding-examples"></a>

この例は、`INSERT` ステートメントの後に `SELECT` ステートメントが実行される場合の `aurora_replica_read_consistency` パラメータの影響を示しています。`aurora_replica_read_consistency` の値とステートメントのタイミングによっては、結果が異なる場合があります。

一貫性を高めるには、`SELECT` ステートメントを発行する前にしばらくお待ちください。または Aurora は、結果のレプリケーションが完了するまで自動的に待機してから、`SELECT` 処理を続行することができます。

DB パラメータの設定の詳細については、「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。

**Example `aurora_replica_read_consistency` が `EVENTUAL` に設定された**  
`INSERT` ステートメントの直後に `SELECT` ステートメントを実行すると、新しい行が挿入される前の行数を示す `COUNT(*)` の値が返されます。しばらくしてから `SELECT` を再度実行すると、更新された行数が返されます。`SELECT` ステートメントは待機しません。  

```
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)

mysql> insert into t1 values (6); select count(*) from t1;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)
```

**Example `aurora_replica_read_consistency` が `SESSION` に設定された**  
`INSERT` の直後の `SELECT` ステートメントは、`INSERT` ステートメントからの変更が反映されるまで待機します。後続の `SELECT` ステートメントは待機しません。  

```
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.01 sec)

mysql> insert into t1 values (6); select count(*) from t1; select count(*) from t1;
Query OK, 1 row affected (0.08 sec)
+----------+
| count(*) |
+----------+
|        7 |
+----------+
1 row in set (0.37 sec)
+----------+
| count(*) |
+----------+
|        7 |
+----------+
1 row in set (0.00 sec)
```
読み取り整合性設定を `SESSION` に設定したまま、`INSERT` ステートメントの実行後に短い待機を行うと、次の `SELECT` ステートメントが実行されるまでに更新された行カウントが使用可能になります。  

```
mysql> insert into t1 values (6); select sleep(2); select count(*) from t1;
Query OK, 1 row affected (0.07 sec)
+----------+
| sleep(2) |
+----------+
|        0 |
+----------+
1 row in set (2.01 sec)
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.00 sec)
```

**Example `aurora_replica_read_consistency` が `GLOBAL` に設定された**  
各 `SELECT` ステートメントは、クエリを実行する前に、ステートメントの開始時刻の時点でのすべてのデータ変更が表示されるように待機します。各 `SELECT` ステートメントの待機時間は、レプリケーションラグの量によって異なります。  

```
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.75 sec)

mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.37 sec)

mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.66 sec)
```

## 書き込み転送を使用したマルチパートステートメントの実行
<a name="aurora-mysql-write-forwarding-multipart"></a>

DML ステートメントは、`INSERT ... SELECT` ステートメントや `DELETE ... WHERE` ステートメントなど、複数の部分から構成される場合があります。この場合、ステートメント全体がライター DB インスタンスに転送され、そこで実行されます。

## 書込み転送を使用したトランザクション
<a name="aurora-mysql-write-forwarding-txns"></a>

トランザクションアクセスモードが読み取り専用に設定されている場合、書き込み転送は使用されません。`SET TRANSACTION` ステートメントまたは `START TRANSACTION` ステートメントを使用して、トランザクションのアクセスモードを指定できます。[transaction\$1read\$1only](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_transaction_read_only) セッション変数の値を変更することで、トランザクションアクセスモードを指定することもできます。このセッション値は、書き込み転送が有効な DB クラスターに接続しているときにのみ変更できます。

長時間実行されるトランザクションがかなりの期間ステートメントを発行しない場合、アイドルタイムアウト期間を超える可能性があります。この期間のデフォルトは 1 分です。`aurora_fwd_writer_idle_timeout` パラメータを設定して、最大 1 日まで増やすことができます。アイドルタイムアウトを超えたトランザクションは、ライターインスタンスによってキャンセルされます。次に送信するステートメントは、タイムアウトエラーを受け取ります。その後、Aurora はトランザクションをロールバックします。

このタイプのエラーは、書き込み転送が使用できなくなった場合に発生する可能性があります。例えば、DB クラスターを再起動した場合や、書き込み転送を無効にした場合、Aurora は書き込み転送を使用するすべてのトランザクションをキャンセルします。

ローカル書き込み転送を使用しているクラスター内のライターインスタンスが再起動されると、ローカル書き込み転送を使用しているリーダーインスタンス上のアクティブで転送されたトランザクションとクエリは自動的に閉じられます。ライターインスタンスが再び使用可能になったら、これらのトランザクションを再試行できます。

## 書き込み転送の設定パラメータ
<a name="aurora-mysql-write-forwarding-params"></a>

Aurora DB パラメータグループには、書き込み転送機能の設定が含まれています。これらのパラメータの詳細を次の表にまとめ、表に続いて使用上の注意を記載してください。


| パラメータ | スコープ | タイプ | デフォルト値 | 有効値 | 
| --- | --- | --- | --- | --- | 
| aurora\$1fwd\$1writer\$1idle\$1timeout | クラスター | 符号なし整数 | 60 | 1-86,400 | 
| aurora\$1fwd\$1writer\$1max\$1connections\$1pct | クラスター | 符号なし長整数 | 10 | 0-90 | 
| aurora\$1replica\$1read\$1consistency | クラスターまたはインスタンス | 列挙型 | null | EVENTUAL, SESSION, GLOBAL | 

受信する書き込み要求を制御するには、以下の設定を使用してください。
+ `aurora_fwd_writer_idle_timeout` — リーダーインスタンスから転送された接続で、ライター DB インスタンスがアクティビティを待ってから、接続を閉じるまでの秒数。この期間を超えてセッションがアイドル状態のままである場合、Aurora はセッションをキャンセルします。
+ `aurora_fwd_writer_max_connections_pct` - リーダーから転送されたクエリを処理するためにライター DB インスタンスで使用できるデータベース接続の上限。これは、ライターの `max_connections` 設定のパーセンテージで表されます。例えば、`max_connections` が800 回、`aurora_fwd_master_max_connections_pct`または`aurora_fwd_writer_max_connections_pct`が 10 回 の場合、書き込みは最大 80 回 の同時転送セッションを許可します。これらの接続は、`max_connections` 設定によって管理される同じ接続プールから取得されます。

  この設定は、書き込み転送が有効なライターにのみ適用されます。この値を小さくしても、既存の接続は影響を受けません。Aurora は、DB クラスターから新しい接続の作成を試みるときに、この新しい設定値を参照します。デフォルト値は 10 で、`max_connections` 値の 10% を表します。

**注記**  
`aurora_fwd_writer_idle_timeout` と `aurora_fwd_writer_max_connections_pct` は DB クラスターのパラメータであるため、各クラスターのすべての DB インスタンスは、これらのパラメータに同じ値を持ちます。

`aurora_replica_read_consistency` の詳細については、「[書き込み転送の読み取り整合性](aurora-mysql-write-forwarding-consistency.md)」を参照してください。

DB パラメータグループの詳細については、「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。

# 書き込み転送のための Amazon CloudWatch メトリクスと Aurora MySQL ステータス変数
<a name="aurora-mysql-write-forwarding-cloudwatch"></a>

以下の Amazon CloudWatch メトリクスと Aurora MySQL ステータス変数は、Aurora MySQL に対して書き込み転送を使用するときに適用されます。Aurora MySQL ライターおよびリーダー DB インスタンスのメトリクスの詳細については、以下のトピックを参照してください。

**Topics**
+ [Aurora MySQL ライター DB インスタンスの書き込み転送のメトリクス](#aurora-mysql-write-forwarding-cloudwatch-writer-metrics)
+ [Aurora MySQL リーダー DB インスタンスの書き込み転送のメトリクス](#aurora-mysql-write-forwarding-cloudwatch-reader-metrics)

## Aurora MySQL ライター DB インスタンスの書き込み転送のメトリクス
<a name="aurora-mysql-write-forwarding-cloudwatch-writer-metrics"></a>

以下の Amazon CloudWatch メトリクスは、1 つ以上の DB クラスターで書き込み転送を使用するときに適用されます。これらのメトリクスはすべて、ライター DB インスタンスで測定されます。


| CloudWatch メトリクス | Unit | 説明 | 
| --- | --- | --- | 
|  `ForwardingWriterDMLLatency`  | ミリ秒 |  書き込み DB インスタンスで転送された各 DML ステートメントを処理する平均時間。 DB クラスターが書き込みリクエストを転送する時間や、変更をライターに複製する時間は含まれません。  | 
|  `ForwardingWriterDMLThroughput`   | 1 秒あたりのカウント数 | この書き込み DB インスタンスによって 1 秒間に処理される、転送された DML ステートメントの数。 | 
|  `ForwardingWriterOpenSessions`  | カウント | 書き込み DB インスタンスで転送されたセッションの数。 | 

以下の Aurora MySQL ステータス変数は、1 つ以上の DB クラスターで書き込み転送を使用するときに適用されます。これらのステータス変数はすべて、ライター DB インスタンスで測定されます。


| Aurora MySQL ステータス変数 | Unit | 説明 | 
| --- | --- | --- | 
| Aurora\$1fwd\$1writer\$1dml\$1stmt\$1count | カウント | この書き込み DB インスタンスに転送された DML ステートメントの合計数。 | 
| Aurora\$1fwd\$1writer\$1dml\$1stmt\$1duration | マイクロ秒 | この書き込み DB インスタンスに転送された DML ステートメントの合計期間。 | 
| Aurora\$1fwd\$1writer\$1open\$1sessions | カウント | 書き込み DB インスタンスで転送されたセッションの数。 | 
| Aurora\$1fwd\$1writer\$1select\$1stmt\$1count | カウント | この書き込み DB インスタンスに転送された SELECT ステートメントの総数。 | 
| Aurora\$1fwd\$1writer\$1select\$1stmt\$1duration | マイクロ秒 | この書き込み DB インスタンスに転送された SELECT ステートメントの合計期間。 | 

## Aurora MySQL リーダー DB インスタンスの書き込み転送のメトリクス
<a name="aurora-mysql-write-forwarding-cloudwatch-reader-metrics"></a>

以下の CloudWatch メトリクスは、書き込み転送が有効な DB クラスター内の各リーダー DB インスタンスで測定されます。


| CloudWatch メトリクス | Unit | 説明 | 
| --- | --- | --- | 
|  `ForwardingReplicaDMLLatency`  | ミリ秒 | レプリカ上で転送された DML の平均応答時間。 | 
|  `ForwardingReplicaDMLThroughput`  | 1 秒あたりのカウント数 | 1 秒あたりに処理された転送 DML ステートメントの数。 | 
|  `ForwardingReplicaOpenSessions`  | カウント | リーダー DB インスタンスで書き込み転送を使用しているセッションの数。 | 
|  `ForwardingReplicaReadWaitLatency`  | ミリ秒 |  リーダー DB インスタンス上の `SELECT` ステートメントがライターに追いつくのを待機する平均待機時間。 クエリを処理する前にリーダー DB インスタンスが待機する程度は、`aurora_replica_read_consistency` 設定によって異なります。  | 
|  `ForwardingReplicaReadWaitThroughput`  | 1 秒あたりのカウント数 | 書き込みを転送しているすべてのセッションで、1 秒間処理した SELECT ステートメントの総数。 | 
|   `ForwardingReplicaSelectLatency`  | ミリ秒 | 転送済み SELECT レイテンシー。モニタリング期間内に転送されたすべての SELECT ステートメントの平均値。 | 
|   `ForwardingReplicaSelectThroughput`  | 1 秒あたりのカウント数 | モニタリング期間内の 1 秒あたりの転送済み SELECT スループット。 | 

以下の Aurora MySQL ステータス変数は、書き込み転送が有効な DB クラスター内の各リーダー DB インスタンスで測定されます。


| Aurora MySQL ステータス変数 | Unit | 説明 | 
| --- | --- | --- | 
| Aurora\$1fwd\$1replica\$1dml\$1stmt\$1count | カウント | このリーダー DB インスタンスから転送された DML ステートメントの合計数。 | 
| Aurora\$1fwd\$1replica\$1dml\$1stmt\$1duration | マイクロ秒 | このリーダー DB インスタンスから転送された DML ステートメントの合計期間。 | 
| Aurora\$1fwd\$1replica\$1errors\$1session\$1limit | カウント |  以下のエラー条件のいずれかが原因でプライマリクラスターが拒否したセッションの数。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-mysql-write-forwarding-cloudwatch.html)  | 
| Aurora\$1fwd\$1replica\$1open\$1sessions | カウント | リーダー DB インスタンスで書き込み転送を使用しているセッションの数。 | 
| Aurora\$1fwd\$1replica\$1read\$1wait\$1count | カウント | このリーダー DB インスタンスでの書き込み後の読み取り待機の合計数。 | 
| Aurora\$1fwd\$1replica\$1read\$1wait\$1duration | マイクロ秒 | このリーダー DB インスタンスの読み取り整合性設定による待機時間の合計。 | 
| Aurora\$1fwd\$1replica\$1select\$1stmt\$1count | カウント | このリーダー DB インスタンスから転送された SELECT ステートメントの合計数。 | 
| Aurora\$1fwd\$1replica\$1select\$1stmt\$1duration | マイクロ秒 | このリーダー DB インスタンスから転送された SELECT ステートメントの合計期間。 | 

## 転送されたトランザクションとクエリの識別
<a name="aurora-write-forwarding-processlist"></a>

`information_schema.aurora_forwarding_processlist` テーブルを使用して、転送されたトランザクションとクエリを識別できます。このテーブルの詳細については、「[information\$1schema.aurora\$1forwarding\$1processlist](AuroraMySQL.Reference.ISTables.md#AuroraMySQL.Reference.ISTables.aurora_forwarding_processlist)」を参照してください。

次の例は、ライター DB インスタンス上のすべての転送された接続を示しています。

```
mysql> select * from information_schema.AURORA_FORWARDING_PROCESSLIST where IS_FORWARDED=1 order by REPLICA_SESSION_ID;

+-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+
| ID  | USER     | HOST               | DB       | COMMAND | TIME | STATE        | INFO                                       | IS_FORWARDED | REPLICA_SESSION_ID | REPLICA_INSTANCE_IDENTIFIER     | REPLICA_CLUSTER_NAME | REPLICA_REGION |
+-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+---------------------------------------+
| 648 | myuser   | IP_address:port1   | sysbench | Query   |    0 | async commit | UPDATE sbtest58 SET k=k+1 WHERE id=4802579 |            1 |                637 | my-db-cluster-instance-2        | my-db-cluster        | us-west-2      |
| 650 | myuser   | IP_address:port2   | sysbench | Query   |    0 | async commit | UPDATE sbtest54 SET k=k+1 WHERE id=2503953 |            1 |                639 | my-db-cluster-instance-2        | my-db-cluster        | us-west-2      |
+-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+
```

転送側のリーダー DB インスタンスで、`SHOW PROCESSLIST` を実行することにより、これらのライター DB 接続に関連するスレッドを確認できます。ライターの `REPLICA_SESSION_ID` の値、637 と 639 は、リーダーの `Id` 値と同じです。

```
mysql> select @@aurora_server_id;

+---------------------------------+
| @@aurora_server_id              |
+---------------------------------+
| my-db-cluster-instance-2        |
+---------------------------------+
1 row in set (0.00 sec)

mysql> show processlist;

+-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+
| Id  | User     | Host               | db       | Command | Time | State        | Info                                        |
+-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+
| 637 | myuser   | IP_address:port1   | sysbench | Query   |    0 | async commit | UPDATE sbtest12 SET k=k+1 WHERE id=4802579  |
| 639 | myuser   | IP_address:port2   | sysbench | Query   |    0 | async commit | UPDATE sbtest61 SET k=k+1 WHERE id=2503953  |
+-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+
12 rows in set (0.00 sec)
```

# Amazon Aurora MySQL と他の AWS のサービスの統合
<a name="AuroraMySQL.Integrating"></a>

Amazon Aurora MySQL を他の AWS のサービスと統合することで、Aurora MySQL DB クラスターを拡張して AWS クラウドの追加機能を使用できるようになります。Aurora MySQL DB クラスターでは、AWS のサービスを使用して以下のことができます。
+ ネイティブ関数 AWS Lambda または `lambda_sync` を使用して、`lambda_async` 関数を同期または非同期に呼び出します。詳細については、「[Amazon Aurora MySQL DB クラスターからの Lambda 関数の呼び出し](AuroraMySQL.Integrating.Lambda.md)」を参照してください。
+ `LOAD DATA FROM S3` コマンドまたは `LOAD XML FROM S3` コマンドを使用して、Amazon Simple Storage Service (Amazon S3) バケットに格納されているテキストファイルや XML ファイルのデータを DB クラスター内にロードする。詳細については、「[Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード](AuroraMySQL.Integrating.LoadFromS3.md)」を参照してください。
+ `SELECT INTO OUTFILE S3` コマンドを使用して DB クラスターから Amazon S3 バケット内のテキストファイルにデータを保存する。詳細については、「[Amazon Aurora MySQL DB クラスターから Amazon S3 バケット内のテキストファイルへのデータの保存](AuroraMySQL.Integrating.SaveIntoS3.md)」を参照してください。
+ アプリケーションの Auto Scaling で Aurora レプリカを自動的に追加または削除します。詳細については、「[Aurora レプリカでの Amazon Aurora Auto Scaling](Aurora.Integrating.AutoScaling.md)」を参照してください。
+  Amazon Comprehend で感情分析を実行するか、SageMaker AI で多種多様な機械学習アルゴリズムを実行する。詳細については、「[Amazon Aurora 機械学習の使用](aurora-ml.md)」を参照してください。

Aurora は、AWS Identity and Access Management (IAM) を使用して他の AWS のサービスに確実にアクセスできるようにします。他の AWS のサービスにアクセスする権限を付与するには、必要なアクセス許可を持つ IAM ロールを作成し、そのロールを DB クラスターに関連付けます。Aurora MySQL DB クラスターから他の AWS のサービスへのアクセスを許可する方法の詳細と手順については、「[ユーザーの代わりに Amazon Aurora MySQL が他の AWS のサービスにアクセスすることを許可する](AuroraMySQL.Integrating.Authorizing.md)」を参照してください。

# ユーザーの代わりに Amazon Aurora MySQL が他の AWS のサービスにアクセスすることを許可する
<a name="AuroraMySQL.Integrating.Authorizing"></a>

Aurora MySQL DB クラスターに、ユーザーに代わって他のサービスにアクセスさせるには、AWS Identity and Access Management (IAM) ロールを作成および設定します。このロールは、DB クラスターのデータベースユーザーが他の AWS のサービスにアクセスする権限を付与します。詳細については、「[AWS のサービスにアクセスするための IAM ロールの設定](AuroraMySQL.Integrating.Authorizing.IAM.md)」を参照してください。

ターゲット AWS サービスへのアウトバウンド接続を許可するように、Aurora DB クラスターを設定する必要もあります。詳細については、「[Amazon Aurora から他の AWS のサービスへのネットワーク通信の有効化](AuroraMySQL.Integrating.Authorizing.Network.md)」を参照してください。

これにより、データベースユーザーは AWS の他のサービスを使用して以下のアクションを実行できるようになります。
+ ネイティブ関数 AWS Lambda または `lambda_sync` を使用して、`lambda_async` 関数を同期または非同期に呼び出します。または、AWS Lambda プロシージャを使用して `mysql.lambda_async` 関数を非同期に呼び出します。詳細については、「[Aurora MySQL ネイティブ関数を使用した Lambda 関数の呼び出し](AuroraMySQL.Integrating.NativeLambda.md)」を参照してください。
+ `LOAD DATA FROM S3` ステートメントまたは `LOAD XML FROM S3` ステートメントを使用して、Amazon S3 バケットに保存されているテキストファイルや XML ファイルのデータを DB クラスター内にロードする。詳細については、「[Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード](AuroraMySQL.Integrating.LoadFromS3.md)」を参照してください。
+ `SELECT INTO OUTFILE S3` ステートメントを使用して、DB クラスターのデータを Amazon S3 バケットに保存されているテキストファイル内に保存する。詳細については、「[Amazon Aurora MySQL DB クラスターから Amazon S3 バケット内のテキストファイルへのデータの保存](AuroraMySQL.Integrating.SaveIntoS3.md)」を参照してください。
+ ログデータを Amazon CloudWatch Logs MySQL にエクスポートします。詳細については、「[Amazon CloudWatch Logs への Amazon Aurora MySQL ログの発行](AuroraMySQL.Integrating.CloudWatch.md)」を参照してください。
+ アプリケーションの Auto Scaling で Aurora レプリカを自動的に追加または削除します。詳細については、「[Aurora レプリカでの Amazon Aurora Auto Scaling](Aurora.Integrating.AutoScaling.md)」を参照してください。

# AWS のサービスにアクセスするための IAM ロールの設定
<a name="AuroraMySQL.Integrating.Authorizing.IAM"></a>

Aurora DB クラスターから別の AWS サービスにアクセスすることを許可するには、以下のことを行います。

1. AWS のサービスにアクセス権限を付与する IAM ポリシーを作成します。詳細については、以下のトピックを参照してください。
   + [Amazon S3 リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.S3CreatePolicy.md)
   + [AWS Lambda リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.LambdaCreatePolicy.md)
   + [CloudWatch Logs リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.CWCreatePolicy.md)
   + [AWS KMS リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.KMSCreatePolicy.md)

1. IAM ロールを作成し、作成したポリシーをアタッチします。詳細については、「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」を参照してください。

1. その IAM ロールを Aurora DB クラスターに関連付けます。詳細については、「[IAM ロールと Amazon Aurora MySQL DB クラスターの関連付け](AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.md)」を参照してください。

# Amazon S3 リソースにアクセスするための IAM ポリシーの作成
<a name="AuroraMySQL.Integrating.Authorizing.IAM.S3CreatePolicy"></a>

Aurora では、Amazon S3 のリソースにアクセスして Aurora DB クラスターにデータをロードしたり、Aurora DB クラスターのデータを保存したりできます。ただし、初期に IAM ポリシーを作成してバケットおよびオブジェクトのアクセス許可を付与し、Aurora から Amazon S3 にアクセスできるようにする必要があります。

次の表は、ユーザー名で Amazon S3 バケットにアクセスできる Aurora の機能と、各機能に必要な最小限のバケットとオブジェクトのアクセス許可の一覧です。


| 機能 | Bucket permissions (バケットのアクセス許可) | オブジェクトのアクセス許可 | 
| --- | --- | --- | 
|  `LOAD DATA FROM S3`  |  `ListBucket`  |  `GetObject` `GetObjectVersion`  | 
| LOAD XML FROM S3 |  `ListBucket`  |  `GetObject` `GetObjectVersion`  | 
|  `SELECT INTO OUTFILE S3`  |  `ListBucket`  |  `AbortMultipartUpload` `DeleteObject` `GetObject` `ListMultipartUploadParts` `PutObject`  | 

次のポリシーは、ユーザー名で Amazon S3 バケットにアクセスするために Aurora で必要となるアクセス許可を追加します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowAuroraToExampleBucket",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:AbortMultipartUpload",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:GetObjectVersion",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*",
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        }
    ]
}
```

------

**注記**  
 `Resource` 値の両方のエントリを含んでいることを確認します。Aurora には、バケット自体とバケット内のすべてのオブジェクトの両方に対するアクセス許可が必要です。  
ユースケースによっては、ポリシーのサンプルにすべてのアクセス許可を追加する必要がない場合があります。また、その他のアクセス許可が必要になる可能性もあります。例えば、Amazon S3 バケットが暗号化されている場合には、 `kms:Decrypt` アクセス許可を追加する必要があります。

以下のステップを使用して、ユーザーの代わりに Aurora から Amazon S3 バケットにアクセスするために必要な最低のアクセス権限を提供する IAM ポリシーを作成できます。Aurora からすべての Amazon S3 バケットへのアクセスを許可するには、以下のステップをスキップし、独自のポリシーを作成する代わりに定義済みの IAM ポリシーである `AmazonS3ReadOnlyAccess` または `AmazonS3FullAccess` を使用できます。

**Amazon S3 リソースへのアクセスを許可する IAM ポリシーを作成するには**

1. [IAM マネジメントコンソール](https://console.aws.amazon.com/iam/home?#home)を開きます。

1. ナビゲーションペインで、[**ポリシー**] を選択します。

1. [**ポリシーの作成**] を選択します。

1. [**Visual editor**] タブで、[**Choose a service**] を選択し、[**S3**] を選択します。

1. [**アクション**] で [**すべて展開**] を選択してから、IAM ポリシーに必要なバケットへのアクセス許可とオブジェクトへのアクセス許可を選択します。

   オブジェクトへのアクセス許可は、Amazon S3 のオブジェクトオペレーションのアクセス許可であり、バケット自体ではなくバケット内のオブジェクトに付与する必要があります。Amazon S3 におけるオブジェクトオペレーションのアクセス許可の詳細については、「[オブジェクトオペレーションに対するアクセス許可](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-objects)」を参照してください。

1. [**リソース**] を選択し、[**バケット**] に [**ARN の追加**] を選択します。

1. [**ARN の追加**] ダイアログボックスで、リソースの詳細を指定し、[**追加**] を選択します。

   アクセスを許可する Amazon S3 バケットを指定します。例えば、*amzn-s3-demo-bucket* という名前の Amazon S3 バケットへのアクセスを Aurora に許可するには、Amazon リソースネーム (ARN) の値を `arn:aws:s3:::amzn-s3-demo-bucket` に設定します。

1. [**オブジェクト**] リソースがリストされた場合は、[**オブジェクト**] に対して [**ARN の追加**] を選択します。

1. [**Add ARN(s)**] ダイアログボックスで、リソースの詳細を指定します。

   Amazon S3 バケットの場合は、アクセスを許可する Amazon S3 バケットを指定します。オブジェクトの場合は、[**Any**] を選択してバケット内の任意のオブジェクトにアクセス許可を付与できます。
**注記**  
Aurora から Amazon S3 バケット内の特定のファイルやフォルダにのみアクセスすることを許可するには、[**Amazon リソースネーム (ARN)**] により具体的な ARN 値を設定することができます。Amazon S3 のアクセスポリシーの定義方法については、「[Amazon S3 リソースへのアクセス許可の管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html)」を参照してください。

1. (オプション) **バケット**の [**ARN の追加**] を選択して、別の Amazon S3 バケットをポリシーに追加し、そのバケットに対して前のステップを繰り返します。
**注記**  
このステップを繰り返して、対応するバケットのアクセス許可ステートメントを、Aurora からアクセスする各 Amazon S3 バケットのポリシーに追加できます。オプションで、Amazon S3 内のすべてのバケットとオブジェクトへのアクセスを許可できます。

1. [**ポリシーの確認**] を選択します。

1. [** 名前**] に、IAM ポリシーの名前 (例: `AllowAuroraToExampleBucket`) を設定します。IAM ロールを作成して Aurora DB クラスターに関連付ける際に、この名前を使用します。オプションで [**Description**] 値を追加することもできます。

1. [**Create policy**] を選択します。

1. 「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」の各ステップを実行します。

# AWS Lambda リソースにアクセスするための IAM ポリシーの作成
<a name="AuroraMySQL.Integrating.Authorizing.IAM.LambdaCreatePolicy"></a>

ユーザーの代わりに Aurora から AWS Lambda 関数を呼び出すために必要な最低のアクセス許可を付与する、IAM ポリシーを作成できます。

次のポリシーは、Aurora がユーザーに代わって AWS Lambda 関数を呼び出すために必要なアクセス許可を追加します。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowAuroraToExampleFunction",
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:example_function"
    }
  ]
}
```

------

以下のステップを使用して、ユーザーの代わりに Aurora から AWS Lambda 関数を呼び出すために必要な、最低限のアクセス許可を付与する IAM ポリシーを作成できます。Aurora からすべての AWS Lambda 関数を呼び出すことを許可するには、以下のステップをスキップして、独自のポリシーを作成する代わりに定義済みの `AWSLambdaRole` ポリシーを使用できます。

**AWS Lambda 関数への呼び出しを許可する IAM ポリシーを作成するには**

1. [IAM コンソール](https://console.aws.amazon.com/iam/home?#home)を開きます。

1. ナビゲーションペインで、[**Policies (ポリシー)**] を選択します。

1. [**ポリシーの作成**] を選択します。

1. [**ビジュアルエディタ**] タブで、[**サービスの選択**] を選択し、[**Lambda**] を選択します。

1. [**アクション**] の [**すべて展開**] を選択し、IAM ポリシーに必要な AWS Lambda アクセス許可を選択します。

   `InvokeFunction` が選択されていることを確認します。これは、Amazon Aurora から AWS Lambda 関数を呼び出すために必要な最低限のアクセス許可です。

1. [**リソース**] を選択し、[**関数**] に対して [**ARN の追加**] を選択します。

1. [**Add ARN(s)**] ダイアログボックスで、リソースの詳細を指定します。

   アクセスを許可する Lambda 関数を指定します。例えば、Aurora から `example_function` という名前の Lambda 関数にアクセスすることを許可するには、ARN 値として `arn:aws:lambda:::function:example_function` を設定します。

   AWS Lambda のアクセスポリシーを定義する方法の詳細については、「[AWS Lambda に対する認証とアクセス制御](https://docs.aws.amazon.com/lambda/latest/dg/lambda-auth-and-access-control.html)」を参照してください。

1. オプションで、[**さらにアクセス許可を追加する**] を選択して、ポリシーに別の AWS Lambda 関数を追加し、その関数に対して前のステップを繰り返します。
**注記**  
このステップを繰り返して、対応する関数のアクセス許可ステートメントを、Aurora からアクセスする各 AWS Lambda 関数のポリシーに追加できます。

1. [**ポリシーの確認**] を選択します。

1. [**名前**] に、IAM ポリシーの名前 (`AllowAuroraToExampleFunction` など) を設定します。IAM ロールを作成して Aurora DB クラスターに関連付ける際に、この名前を使用します。オプションで [**Description**] 値を追加することもできます。

1. [**Create policy**] を選択します。

1. 「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」の各ステップを実行します。

# CloudWatch Logs リソースにアクセスするための IAM ポリシーの作成
<a name="AuroraMySQL.Integrating.Authorizing.IAM.CWCreatePolicy"></a>

Aurora は CloudWatch Logs にアクセスして Aurora DB クラスターから監査ログデータをエクスポートできます。ただし、初期に IAM ポリシーを作成してロググループおよびログストリーミングのアクセス許可を付与し、Aurora から CloudWatch Logs にアクセスできるようにする必要があります。

以下のポリシーは、ユーザー名で Amazon CloudWatch Logs にアクセスするために Aurora が要求する権限および、ロググループを作成してデータをエクスポートするための最小限の権限を追加します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnableCreationAndManagementOfRDSCloudwatchLogEvents",
            "Effect": "Allow",
            "Action": [
                "logs:GetLogEvents",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/rds/*:log-stream:*"
        },
        {
            "Sid": "EnableCreationAndManagementOfRDSCloudwatchLogGroupsAndStreams",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:PutRetentionPolicy",
                "logs:CreateLogGroup"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/rds/*"
        }
    ]
}
```

------

ポリシーの ARN を変更すると、特定の AWS リージョンおよびアカウントへのアクセスを制限できます。

以下のステップを使用して、ユーザーの代わりに Aurora から CloudWatch Logs にアクセスするために必要な最低のアクセス権限を提供する IAM ポリシーを作成できます。Aurora に CloudWatch Logs へのフルアクセスを付与するには、このステップをスキップして、独自のポリシーを作成する代わりに、定義済みの `CloudWatchLogsFullAccess` IAM ポリシーを使用します。詳細については、*Amazon CloudWatch ユーザーガイド*の「[CloudWatch Logs でアイデンティティベースのポリシー (IAM ポリシー) を使用する](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/iam-identity-based-access-control-cwl.html#managed-policies-cwl)」を参照してください。

**CloudWatch Logs リソースへのアクセスを許可する IAM ポリシーを作成するには**

1. [IAM コンソール](https://console.aws.amazon.com/iam/home?#home)を開きます。

1. ナビゲーションペインで、[**Policies (ポリシー)**] を選択します。

1. [**ポリシーの作成**] を選択します。

1. [**ビジュアルエディタ**] タブで、[**サービスの選択**] を選択し、[**CloudWatch Logs**] を選択します。

1. [**アクション**] で、右側にある [**すべて展開**] を選択し、IAM ポリシーに必要な Amazon CloudWatch Logs アクセス許可を選択します。

   次のアクセス許可が選択されていることを確認します。
   + `CreateLogGroup`
   + `CreateLogStream`
   + `DescribeLogStreams`
   + `GetLogEvents`
   + `PutLogEvents`
   + `PutRetentionPolicy`

1. [**リソース**] を選択し、[**log-group**] に対して [**ARN の追加**] を選択します。

1. [**ARN の追加**] ダイアログボックスで、以下の値を入力します。
   + **リージョン** - AWS リージョンまたは `*`
   + **アカウント** - アカウント番号または `*`
   + **ロググループ名** - `/aws/rds/*`

1. [**ARN の追加**] ダイアログボックスで、[**追加**] を選択します。

1. [**log-stream**] に [**ARN の追加**] を選択します。

1. [**ARN の追加**] ダイアログボックスで、以下の値を入力します。
   + **リージョン** - AWS リージョンまたは `*`
   + **アカウント** - アカウント番号または `*`
   + **ロググループ名**]`/aws/rds/*` - 
   + **ログストリーミング名** - `*`

1. [**ARN の追加**] ダイアログボックスで、[**追加**] を選択します。

1. [**ポリシーの確認**] を選択します。

1. [**名前**] に、IAM ポリシーの名前 (`AmazonRDSCloudWatchLogs` など) を設定します。IAM ロールを作成して Aurora DB クラスターに関連付ける際に、この名前を使用します。オプションで [**Description**] 値を追加することもできます。

1. [**Create policy**] を選択します。

1. 「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」の各ステップを実行します。

# AWS KMS リソースにアクセスするための IAM ポリシーの作成
<a name="AuroraMySQL.Integrating.Authorizing.IAM.KMSCreatePolicy"></a>

Aurora は、データベースバックアップの暗号化に使用された AWS KMS keys にアクセスできます。ただし、初期に IAM ポリシーを作成してアクセス許可を付与し、Aurora が KMS キーにアクセスできるようにする必要があります。

次のポリシーでは、ユーザーの代わりに KMS キーにアクセスするために Aurora で必要となるアクセス許可が追加されています。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowAuroraToAccessKey",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt"
      ],
      "Resource": "arn:aws:kms:us-east-1:123456789012:key/key-ID"
    }
  ]
}
```

------

次のステップを使用して、Aurora がユーザーの代わりに KMS キーにアクセスするために必要な最小限のアクセス許可を付与する IAM ポリシーを作成できます。

**KMS キーへのアクセスを許可する IAM ポリシーを作成するには**

1. [[IAM コンソール](https://console.aws.amazon.com/iam/home?#home)] を開きます。

1. ナビゲーションペインで、[**Policies (ポリシー)**] を選択します。

1. [**ポリシーの作成**] を選択します。

1. [**ビジュアルエディタ**] タブで、[**サービスの選択**] を選択し、[**KMS**] を選択します。

1. [**アクション**] で、[**書き込み**]、[**復号**] の順に選択します。

1. [**リソース**]、[**ARN の追加**] の順に選択します。

1. [**ARN の追加**] ダイアログボックスで、以下の値を入力します。
   + [**リージョン**] - AWS リージョンを (`us-west-2` のように) 入力します。
   + [**アカウント**] - ユーザーアカウント番号を入力します。
   + [**ログストリーミング名**] - KMS キー識別子を入力します。

1. [**ARN の追加**] ダイアログボックスで、[**追加**] を選択します。

1. [**ポリシーの確認**] を選択します。

1. [**名前**] に、IAM ポリシーの名前 (`AmazonRDSKMSKey` など) を設定します。IAM ロールを作成して Aurora DB クラスターに関連付ける際に、この名前を使用します。オプションで [**Description**] 値を追加することもできます。

1. [**Create policy**] を選択します。

1. 「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」の各ステップを実行します。

# Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成
<a name="AuroraMySQL.Integrating.Authorizing.IAM.CreateRole"></a>

Aurora から AWS リソースへのアクセスを許可する IAM ポリシーを作成したら、次に IAM ロールを作成して、この新しい IAM ロールに IAM ポリシーをアタッチする必要があります。

ユーザーに代わって Amazon RDS クラスターが他の AWS のサービスと通信することを許可する IAM ロールを作成するには、以下のステップを実行します。<a name="Create.IAMRole.AWSServices"></a>

**Amazon RDS が AWS のサービスにアクセスすることを許可する IAM ロールを作成するには**

1. [IAM コンソール](https://console.aws.amazon.com/iam/home?#home)を開きます。

1. ナビゲーションペインで **[ロール]** を選択します。

1. [**ロールの作成**] を選択します。

1. [**AWS のサービス**] で [**RDS**] を選択します。

1. [**ユースケースの選択**] で [**RDS - データベースへのロールの追加**] を選択します。

1. [**次へ**] を選択します。

1. [**アクセス許可ポリシーのアタッチ**] ページで、[**検索**] フィールドにポリシーの名前を入力します。

1. ポリシーがリストに表示されたら、次のセクションの説明のいずれかを使用して前に定義したポリシーを選択します。
   + [Amazon S3 リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.S3CreatePolicy.md)
   + [AWS Lambda リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.LambdaCreatePolicy.md)
   + [CloudWatch Logs リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.CWCreatePolicy.md)
   + [AWS KMS リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.KMSCreatePolicy.md)

1. [**次へ**] を選択します。

1. [**ロール名**] に、IAM ロールの名前 (`RDSLoadFromS3` など) を入力します。オプションで [**Description**] 値を追加することもできます。

1. [**ロールの作成**] を選択します。

1. 「[IAM ロールと Amazon Aurora MySQL DB クラスターの関連付け](AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.md)」の各ステップを実行します。

# IAM ロールと Amazon Aurora MySQL DB クラスターの関連付け
<a name="AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster"></a>

Amazon Aurora DB クラスター内のデータベースユーザーから他の AWS のサービスにアクセスすることを許可するには、[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md) で作成した IAM ロールを、その DB クラスターに関連付けます。サービスを直接関連付けることで、AWS に新しい IAM ロールを作成させることもできます。

**注記**  
IAM ロールを Aurora Serverless v1 DB クラスターに関連付けることはできません。詳細については、「[Amazon Aurora Serverless v1 の使用](aurora-serverless.md)」を参照してください。  
IAM ロールを Aurora Serverless v2 DB クラスターに関連付けることはでます。

IAM ロールを DB クラスターに関連付けるには、2 つのことを行います。

1. RDS コンソール、[add-role-to-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/add-role-to-db-cluster.html) AWS CLI コマンド、または [AddRoleToDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_AddRoleToDBCluster.html) RDS API オペレーションを使用して、DB クラスターの関連付けられたロールのリストにロールを追加します。

   Aurora DB クラスターごとに最大 5 つの IAM ロールを追加できます。

1. 関連する AWS のサービスのクラスターレベルのパラメータを、関連付けられた IAM ロールの ARN に設定します。

   次の表では、AWS の他のサービスにアクセスするために使用する IAM ロールのクラスターレベルのパラメータ名について説明します。    
<a name="aurora_cluster_params_iam_roles"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.html)

ユーザーに代わって Amazon RDS クラスターが他の AWS のサービスと通信することを許可する IAM ロールを関連付けるには、以下のステップを実行します。

## コンソール
<a name="AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.CON"></a>

**コンソールを使用して IAM ロールを Aurora DB クラスターに関連付けるには**

1. RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. [**データベース**] をクリックします。

1. IAM ロールを関連付ける Aurora DB クラスターの名前を選択して、詳細を表示します。

1. **[Connectivity & security**] (接続とセキュリティ) タブの **[Manage IAM roles]** (IAM ロールの管理) セクションで、次のいずれかを実行します。
   + **このクラスターに追加する IAM ロールを選択してください** (デフォルト)
   + **このクラスターに接続するサービスを選択してください**  
![\[IAM ロールを DB クラスターに関連付ける\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/AuroraAssociateIAMRole-02.png)

1. 既存の IAM ロールを使用するには、メニューからロールを選択し、**[Add role]** (ロールの追加) を選択します。

   ロールの追加に成功すると、そのステータスは `Pending`、`Available` の順に表示されます。

1. サービスに直接接続するには、以下を実行します。

   1. **[Select a service to connect to this cluster]** (このクラスターに接続するサービスを選択する) を選択します。

   1. メニューからサービスを選択し、**[Connect service]** (サービスに接続する) を選択します。

   1. **[Connect cluster to *Service Name*]** (クラスターをサービス名に接続する) で、サービスへの接続に使用する Amazon リソースネーム (ARN) を入力し、**[Connect service]** (サービスに接続する) を選択します。

   AWS は、サービスに接続するための新しい IAM ロールを作成します。そのステータスは `Pending`、次に `Available` と表示されます。

1. (オプション) DB クラスターへの IAM ロールの関連付けを中止し、関連するアクセス許可を削除するには、ロールの **[Delete]** (削除) を選択します。

**関連する IAM ロールにクラスターレベルのパラメータを設定するには**

1. RDS コンソールで、ナビゲーションペインの [**パラメータグループ**] を選択します。

1. カスタム DB パラメータグループをすでに使用している場合は、DB クラスターの新しいパラメータグループを作成する代わりに、そのグループを選択して使用できます。DB クラスターのデフォルトのパラメータグループを使用している場合は、以下のステップに従って、DB クラスターの新しいパラメータグループを作成します。

   1. [**パラメータグループの作成**]を選択します。

   1. **[パラメータグループファミリー]** で、Aurora MySQL 8.0 互換の DB クラスターには `aurora-mysql8.0` を選択し、Aurora MySQL 5.7 互換の DB クラスターには `aurora-mysql5.7` を選択します｡

   1. [**タイプ**] で、[**DB クラスターのパラメータグループ**] を選択します。

   1. [**グループ名**] に、DB クラスターの新しいパラメータグループの名前を入力します。

   1. [**説明**] に、DB クラスターの新しいパラメータグループの説明を入力します。  
![\[DB クラスターのパラメータグループを作成する\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/AuroraAssociateIAMRole-03.png)

   1. [**作成**] を選択します。

1. [**パラメータグループ**] ページで、DB クラスターパラメータグループを選択して [**パラメータグループアクション**]、[**編集**] の順に選択します。

1. 適切なクラスターレベルの[パラメータ](#aurora_cluster_params_iam_roles)を、関連する IAM ロールの ARN 値に設定します。

   例えば、`aws_default_s3_role` パラメータを`arn:aws:iam::123456789012:role/AllowS3Access` に設定します。

1. [**変更の保存**] をクリックします。

1. DB クラスターの DB クラスターパラメータグループを変更するには、次のステップをすべて行います。

   1. [**データベース**] を選択後、Aurora DB クラスターを選択します。

   1. [**Modify**] を選択します。

   1. [**データベースの選択肢**] までスクロールし、[**DB クラスターのパラメータグループ**] を、DB クラスターのパラメータグループに設定します。

   1. [**続行**] を選択します。

   1. 変更を確認し、[**すぐに適用**] を選択します。

   1. [**クラスタークラスターの変更**] を選択します。

   1. [**データベース**] を選択後、DB クラスターのプライマリインスタンスを選択します。

   1. [**アクション**] で、[**再起動**] を選択します。

      インスタンスが再起動すると、IAM ロールが DB クラスターに関連付けられます。

      クラスターのパラメータグループの詳細については、「[Aurora MySQL 設定パラメータ](AuroraMySQL.Reference.ParameterGroups.md)」を参照してください。

## CLI
<a name="AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.CLI"></a>

**AWS CLI を使用して IAM ロールを DB クラスターに関連付けるには**

1. 以下に示すように、`add-role-to-db-cluster` から AWS CLI コマンドを呼び出して、IAM ロールの ARN を DB クラスターに追加します。

   ```
   PROMPT> aws rds add-role-to-db-cluster --db-cluster-identifier my-cluster --role-arn arn:aws:iam::123456789012:role/AllowAuroraS3Role
   PROMPT> aws rds add-role-to-db-cluster --db-cluster-identifier my-cluster --role-arn arn:aws:iam::123456789012:role/AllowAuroraLambdaRole
   ```

1. DB クラスターのデフォルトのパラメータグループを使用している場合は、DB クラスターの新しいパラメータグループを作成します。カスタム DB パラメータグループをすでに使用している場合は、DB クラスターの新しいパラメータグループを作成する代わりに、そのグループを使用できます。

   DB クラスターの新しいパラメータグループを作成するには、以下に示すように、`create-db-cluster-parameter-group` から AWS CLI コマンドを呼び出します。

   ```
   PROMPT> aws rds create-db-cluster-parameter-group  --db-cluster-parameter-group-name AllowAWSAccess \
        --db-parameter-group-family aurora5.7 --description "Allow access to Amazon S3 and AWS Lambda"
   ```

   Aurora MySQL 5.7 互換 DB クラスターの場合は、`aurora-mysql5.7` に `--db-parameter-group-family` を指定します。Aurora MySQL 8.0 互換 DB クラスターの場合は、`--db-parameter-group-family` に `aurora-mysql8.0` を指定します。

1. 以下に示すように、適切なクラスターレベルの単一あるいは複数のパラメータと関連する IAM ロールの ARN 値を DB クラスターのパラメータグループに設定します。

   ```
   PROMPT> aws rds modify-db-cluster-parameter-group --db-cluster-parameter-group-name AllowAWSAccess \
       --parameters "ParameterName=aws_default_s3_role,ParameterValue=arn:aws:iam::123456789012:role/AllowAuroraS3Role,method=pending-reboot" \
       --parameters "ParameterName=aws_default_lambda_role,ParameterValue=arn:aws:iam::123456789012:role/AllowAuroraLambdaRole,method=pending-reboot"
   ```

1. 以下に示すように、DB クラスターの新しいパラメータグループを使うように DB クラスターを変更し、クラスターを再起動します。

   ```
   PROMPT> aws rds modify-db-cluster --db-cluster-identifier my-cluster --db-cluster-parameter-group-name AllowAWSAccess
   PROMPT> aws rds reboot-db-instance --db-instance-identifier my-cluster-primary
   ```

   インスタンスが再起動すると、IAM ロールが DB クラスターに関連付けられています。

   クラスターのパラメータグループの詳細については、「[Aurora MySQL 設定パラメータ](AuroraMySQL.Reference.ParameterGroups.md)」を参照してください。

# Amazon Aurora から他の AWS のサービスへのネットワーク通信の有効化
<a name="AuroraMySQL.Integrating.Authorizing.Network"></a>

Amazon Aurora で、AWS の特定の他のサービスを使用するには、Aurora DB クラスターのネットワーク設定で、それらのサービスのエンドポイントへのアウトバウンド接続を許可する必要があります。次のオペレーションでは、このネットワーク設定が必要です。
+  AWS Lambda 関数を呼び出す。この機能の詳細については、「[Aurora MySQL ネイティブ関数を使用した Lambda 関数の呼び出し](AuroraMySQL.Integrating.NativeLambda.md)」を参照してください。
+  Amazon S3 からファイルにアクセスする。この機能の詳細については、「[Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード](AuroraMySQL.Integrating.LoadFromS3.md)」および「[Amazon Aurora MySQL DB クラスターから Amazon S3 バケット内のテキストファイルへのデータの保存](AuroraMySQL.Integrating.SaveIntoS3.md)」を参照してください。
+ AWS KMS エンドポイントへのアクセス。AWS KMS へのアクセスは、Aurora MySQL でデータベースアクティビティストリーミングを使用するために必要です。この機能の詳細については、「[データベースアクティビティストリームを使用した Amazon Aurora のモニタリング](DBActivityStreams.md)」を参照してください。
+ SageMaker AI エンドポイントへのアクセス。Aurora MySQL で SageMaker AI 機械学習を使用するには、SageMaker AI へのアクセスが必要です。この機能の詳細については、「[Aurora MySQL で Amazon Aurora 機械学習を使用する](mysql-ml.md)」を参照してください。

サービスのエンドポイントに接続できない場合、Aurora は以下のエラーメッセージを返します。

```
ERROR 1871 (HY000): S3 API returned error: Network Connection
```

```
ERROR 1873 (HY000): Lambda API returned error: Network Connection. Unable to connect to endpoint
```

```
ERROR 1815 (HY000): Internal error: Unable to initialize S3Stream
```

Aurora MySQL を使用するデータベースアクティビティストリーミングでは、DB クラスターが AWS KMS エンドポイントにアクセスできない場合、アクティビティストリーミングは機能を停止します。Aurora は、RDS イベントを使用してこの問題について通知します。Aurora は RDS イベントを使用してこの問題について通知します。

対応する AWS のサービスの使用中にこれらのメッセージが表示された場合は、Aurora DB クラスターがパブリックかプライベートかを確認します。Aurora DB クラスターがプライベートの場合は、接続を有効にするように設定する必要があります。

Aurora DB クラスターがパブリックの場合は、パブリックアクセス可能とマークされている必要があります。この場合、AWS マネジメントコンソール で DB クラスターの詳細を見ると、[**パブリックアクセス可能**] が [**はい**] となっています。DB クラスターは Amazon VPC パブリックサブネットにも存在する必要があります。パブリックアクセス可能な DB インスタンスの詳細については、「[VPC 内の DB クラスターの使用](USER_VPC.WorkingWithRDSInstanceinaVPC.md)」を参照してください。Amazon VPC のパブリックサブネットの詳細については、「[VPC とサブネット](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html)」を参照してください。

Aurora DB クラスターがパブリックアクセス可能ではなく、VPC パブリックサブネットにある場合は、プライベートです。プライベートの DB クラスターがあり、このネットワーク設定を必要とする機能の 1 つを使用する場合があります。その場合、ネットワークアドレス変換 (NAT) を介してインターネットアドレスに接続できるよう、クラスターを設定します。Amazon S3、Amazon SageMaker AI、および AWS Lambda の代わりに、DB クラスターのルートテーブルに他のサービスの VPC エンドポイントが関連付けられるように、VPC を設定することもできます。「[VPC 内の DB クラスターの使用](USER_VPC.WorkingWithRDSInstanceinaVPC.md)」を参照してください。VPC での NAT の設定の詳細については、「[NAT ゲートウェイ](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)」を参照してください。VPC エンドポイントの設定の詳細については、「[VPC エンドポイント](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html)」を参照してください。S3 バケットにアクセスするための S3 ゲートウェイエンドポイントを作成することもできます。詳細については、「[Amazon S3 のゲートウェイエンドポイント](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html)」を参照してください。

また、VPC セキュリティグループのアウトバウンドルールで、ネットワークアクセスコントロールリスト (ACL) のエフェメラルポートを開く必要がある場合もあります。ネットワーク ACL のエフェメラルポートの詳細については、*Amazon Virtual Private Cloud ユーザーガイド*の「[一時ポート](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#nacl-ephemeral-ports)」を参照してください。

## 関連トピック
<a name="AuroraMySQL.Integrating.Authorizing.RelatedTopics"></a>
+ [Aurora と他の AWS のサービスの統合](Aurora.Integrating.md)
+ [Amazon Aurora DB クラスターの管理](CHAP_Aurora.md)

# Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード
<a name="AuroraMySQL.Integrating.LoadFromS3"></a><a name="load_from_s3"></a><a name="load_data"></a><a name="load_xml"></a>

`LOAD DATA FROM S3` または `LOAD XML FROM S3` ステートメントを使用して、Amazon S3 バケットに保存されているファイルからデータをロードできます。Aurora MySQL の場合、ファイルは最初にローカルディスクに保存され、次にデータベースにインポートされます。データベースへのインポートが完了すると、ローカルファイルは削除されます。

**注記**  
テキストファイルからテーブルへのデータのロードは、Aurora Serverless v1 ではサポートされていません。Aurora Serverless v2 に対してサポートされています。

**Contents**
+ [Amazon S3 へのアクセスを Aurora に許可する](#AuroraMySQL.Integrating.LoadFromS3.Authorize)
+ [Amazon Aurora MySQL でデータをロードするための権限の付与](#AuroraMySQL.Integrating.LoadFromS3.Grant)
+ [Amazon S3 バケットへのパス (URI) の指定](#AuroraMySQL.Integrating.LoadFromS3.URI)
+ [LOAD DATA FROM S3](#AuroraMySQL.Integrating.LoadFromS3.Text)
  + [構文](#AuroraMySQL.Integrating.LoadFromS3.Text.Syntax)
  + [パラメータ](#AuroraMySQL.Integrating.LoadFromS3.Text.Parameters)
  + [マニフェストを使用して、ロードするデータファイルを指定する](#AuroraMySQL.Integrating.LoadFromS3.Manifest)
    + [aurora\$1s3\$1load\$1history テーブルを使用してロード済みのファイルを確認する](#AuroraMySQL.Integrating.LoadFromS3.Manifest.History)
  + [例](#AuroraMySQL.Integrating.LoadFromS3.Text.Examples)
+ [LOAD XML FROM S3](#AuroraMySQL.Integrating.LoadFromS3.XML)
  + [構文](#AuroraMySQL.Integrating.LoadFromS3.XML.Syntax)
  + [パラメータ](#AuroraMySQL.Integrating.LoadFromS3.XML.Parameters)

## Amazon S3 へのアクセスを Aurora に許可する
<a name="AuroraMySQL.Integrating.LoadFromS3.Authorize"></a>

Amazon S3 バケットからデータをロードする前に、まず Amazon S3 へのアクセス権限を Aurora MySQL DB クラスターに付与する必要があります。

**Amazon S3 へのアクセス権限を Aurora MySQL に付与するには**

1. バケットおよびオブジェクトのアクセス許可を付与し、Aurora MySQL DB クラスターから Amazon S3 へのアクセスを許可する AWS Identity and Access Management (IAM) ポリシーを作成します。手順については、「[Amazon S3 リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.S3CreatePolicy.md)」を参照してください。
**注記**  
Aurora MySQL バージョン 3.05 以降では、カスタマーマネージド AWS KMS keys を使用して暗号化されたオブジェクトをロードできます。そのためには、IAM ポリシーに `kms:Decrypt` アクセス許可を含めてください。詳細については、「[AWS KMS リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.KMSCreatePolicy.md)」を参照してください。  
AWS マネージドキー または Amazon S3 マネージドキー (SSE-S3) を使用して暗号化されたオブジェクトをロードする場合、このアクセス許可は必要ありません。

1. IAM ロールを作成して、「[Amazon S3 リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.S3CreatePolicy.md)」で作成した IAM ポリシーを新しい IAM ロールにアタッチします。手順については、「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」を参照してください。

1. DB クラスターがカスタム DB クラスターパラメータグループを使用していることを確認します。

   カスタム DB クラスターパラメータグループの作成の詳細については、「[Amazon Aurora での DB クラスターパラメータグループの作成](USER_WorkingWithParamGroups.CreatingCluster.md)」を参照してください。

1. Aurora MySQL バージョン 2 の場合、`aurora_load_from_s3_role` または `aws_default_s3_role` DB クラスターパラメータを、新しい IAM ロールの Amazon リソースネーム (ARN) に設定します。IAM ロールが `aurora_load_from_s3_role` に指定されていない場合、Aurora は `aws_default_s3_role` に指定されている IAM ロールを使用します。

   Aurora MySQL バージョン 3 の場合、`aws_default_s3_role` を使用します。

   クラスターが Aurora Global Database の一部である場合は、このパラメータをグローバルデータベース内の Aurora クラスターごとに設定します。Aurora Global Database 内のプライマリクラスターのみがデータをロードできますが、フェイルオーバー機構によって別のクラスターが昇格されてプライマリクラスターになる場合があります。

   DB クラスターのパラメータの詳細については、「[Amazon Aurora の DB クラスターパラメータと DB インスタンスパラメータ](USER_WorkingWithDBClusterParamGroups.md#Aurora.Managing.ParameterGroups)」を参照してください。

1. Aurora MySQL DB クラスター内のデータベースユーザーが Amazon S3 にアクセスできるように、「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」で作成したロールをその DB クラスターに関連付けます。Aurora Global Database の場合は、グローバルデータベース内の Aurora クラスターごとにロールを関連付けます。DB クラスターへの IAM ロールの関連付けの詳細については、「[IAM ロールと Amazon Aurora MySQL DB クラスターの関連付け](AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.md)」を参照してください。

1. Amazon S3 へのアウトバウンド接続を許可するように Aurora MySQL DB クラスターを設定します。手順については、「[Amazon Aurora から他の AWS のサービスへのネットワーク通信の有効化](AuroraMySQL.Integrating.Authorizing.Network.md)」を参照してください。

    DB クラスターがパブリックアクセス可能ではなく、VPC パブリックサブネットにある場合は、プライベートです。S3 バケットにアクセスするための S3 ゲートウェイエンドポイントを作成することができます。詳細については、「[Amazon S3 のゲートウェイエンドポイント](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html)」を参照してください。

    Aurora Global Database の場合は、グローバルデータベース内の Aurora クラスターごとにアウトバウンド接続を有効にします。

## Amazon Aurora MySQL でデータをロードするための権限の付与
<a name="AuroraMySQL.Integrating.LoadFromS3.Grant"></a>

`LOAD DATA FROM S3`または`LOAD XML FROM S3`ステートメントを発行するデータベースユーザーは、いずれかのステートメントを発行するための特定のロールまたは特権を持っている必要があります。Aurora MySQL バージョン 3 では、`AWS_LOAD_S3_ACCESS` ロールを付与します。Aurora MySQL バージョン 2 では、`LOAD FROM S3` 権限を付与します。DB クラスターの管理ユーザーにはデフォルトで適切なロールまたは権限が付与されます。他のユーザーに権限を付与するには、次のいずれかのコマンドが使用できます。

 Aurora MySQL バージョン 3 では、次のステートメントを使用します: 

```
GRANT AWS_LOAD_S3_ACCESS TO 'user'@'domain-or-ip-address'
```

**ヒント**  
Aurora MySQL バージョン 3 でロールテクニックを使用する場合は、`SET ROLE role_name` または `SET ROLE ALL` ステートメントを使用してロールを有効化することもできます。MySQL 8.0 ロールシステムに馴染みがない場合は、[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model) で詳細を確認頂けます。詳細については、「MySQL リファレンスマニュアル」の「[Using roles](https://dev.mysql.com/doc/refman/8.0/en/roles.html)」を参照してください。**  
これは現在アクティブなセッションにのみ適用されます。再接続するときは、`SET ROLE` ステートメントを再度実行して権限を付与する必要があります。詳細については、*MySQL リファレンスマニュアル*の「[SET ROLE ステートメント](https://dev.mysql.com/doc/refman/8.0/en/set-role.html)」を参照してください。  
ユーザーが DB インスタンスに接続したときに、`activate_all_roles_on_login` DB クラスターパラメータを使用して、すべてのロールを自動的に有効化できます。このパラメータを設定すると、通常、`SET ROLE` ステートメントを明示的に呼び出してロールをアクティブ化する必要はありません。詳細については、*MySQL リファレンスマニュアル*の「[activate\$1all\$1roles\$1on\$1login](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_activate_all_roles_on_login)」を参照してください。  
ただし、ストアドプロシージャを別のユーザーから呼び出す場合は、ストアドプロシージャの先頭で `SET ROLE ALL` を明示的に呼び出してロールをアクティブ化する必要があります。

Aurora MySQL バージョン 2 では、次のステートメントを使用します:

```
GRANT LOAD FROM S3 ON *.* TO 'user'@'domain-or-ip-address'
```

`AWS_LOAD_S3_ACCESS` ロールと `LOAD FROM S3` 権限は Amazon Aurora に固有であり、外部の MySQL データベースまたは RDS for MySQL DB インスタンスでは使用できません。レプリケーションソースとしての Aurora DB クラスターと、レプリケーションクライアントとしての MySQL データベースの間でレプリケーションを設定した場合、ロールまたは権限の `GRANT` ステートメントはエラーとなり、レプリケーションは停止します。エラーをスキップして、レプリケートを再開できます。RDS for MySQL インスタンスでエラーをスキップするには、[ mysql\$1rds\$1skip\$1repl\$1error](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql_rds_skip_repl_error.html) プロシージャを使用します。外部 MySQL データベースでエラーをスキップするには、[slave\$1skip\$1errors](https://dev.mysql.com/doc/refman/5.7/en/replication-options-replica.html#sysvar_slave_skip_errors) システム変数 (Aurora MySQL バージョン 2) または [replica\$1skip\$1errors](https://dev.mysql.com/doc/refman/8.0/en/replication-options-replica.html#sysvar_replica_skip_errors) システム変数 (Aurora MySQL バージョン 3) を使用します。

**注記**  
データベースユーザーには、データをロードする先のデータベースに対する `INSERT` 権限が必要です。

## Amazon S3 バケットへのパス (URI) の指定
<a name="AuroraMySQL.Integrating.LoadFromS3.URI"></a>

Amazon S3 バケットに保存されているファイルへのパスを指定する構文は次のとおりです。

```
s3-region://amzn-s3-demo-bucket/file-name-or-prefix
```

パスに指定する値は以下のとおりです。
+ `region` (オプション) - ロード元の Amazon S3 バケットがある AWS リージョン。この値はオプションです。`region` 値を指定しないと、Aurora は DB クラスターと同じリージョンの Amazon S3 からファイルをロードします。
+ `bucket-name` - ロードするデータが含まれている Amazon S3 バケットの名前。仮想フォルダのパスを識別するオブジェクトプレフィックスがサポートされています。
+ `file-name-or-prefix` - Amazon S3 テキストファイルまたは XML ファイルの名前、あるいはロードする 1 つ以上のテキストファイルまたは XML ファイルを識別するプレフィックス。ロードするテキストファイルを識別するマニフェストファイルを指定することもできます。マニフェストファイルを使用して Amazon S3 からテキストファイルをロードする方法の詳細については、「[マニフェストを使用して、ロードするデータファイルを指定する](#AuroraMySQL.Integrating.LoadFromS3.Manifest)」を参照してください。

**S3 バケット内のファイルの URI をコピーするには**

1. AWS マネジメントコンソール にサインインし、Amazon S3 コンソール [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) を開きます。

1. ナビゲーションペインで **[バケット]** を選択し、URI をコピーするバケットを選択します。

1. S3 からロードするプレフィックスまたはファイルを選択します。

1. **[S3 URI をコピー]** を選択します。

## LOAD DATA FROM S3
<a name="AuroraMySQL.Integrating.LoadFromS3.Text"></a>

`LOAD DATA FROM S3` ステートメントを使用して MySQL [LOAD DATA INFILE](https://dev.mysql.com/doc/refman/8.0/en/load-data.html) ステートメントでサポートされている任意のテキストファイル形式 (カンマ区切りのテキストデータなど) からデータをロードできます。圧縮ファイルはサポートされていません。

**注記**  
Aurora MySQL DB クラスターが S3 へのアウトバウンド接続を許可していることを確認してください。詳細については、「[Amazon Aurora から他の AWS のサービスへのネットワーク通信の有効化](AuroraMySQL.Integrating.Authorizing.Network.md)」を参照してください。

### 構文
<a name="AuroraMySQL.Integrating.LoadFromS3.Text.Syntax"></a>

```
LOAD DATA [FROM] S3 [FILE | PREFIX | MANIFEST] 'S3-URI'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [PARTITION (partition_name,...)]
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number {LINES | ROWS}]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...]
```

**注記**  
Aurora MySQL バージョン 3.05 以降では、キーワード `FROM` はオプションです。

### パラメータ
<a name="AuroraMySQL.Integrating.LoadFromS3.Text.Parameters"></a>

`LOAD DATA FROM S3` ステートメントでは、次の必須パラメータとオプションパラメータを使用します。これらのパラメータの一部の詳細については、MySQL ドキュメントの「[LOAD XML Statement](https://dev.mysql.com/doc/refman/8.0/en/load-data.html)」(LOAD DATA ステートメント) を参照してください。

**ファイル \$1 プレフィックス \$1 マニフェスト**  
データを読み取るのが、1 つのファイルからか、特定のプレフィックスに一致するすべてのファイルからか、指定されたマニフェスト内のすべてのファイルからかを指定します。デフォルトは `FILE` です。

**S3-URI**  
ロードするテキストファイルまたはマニフェストファイルの URI、または、使用する Amazon S3 プレフィックスを指定します。「[Amazon S3 バケットへのパス (URI) の指定](#AuroraMySQL.Integrating.LoadFromS3.URI)」で説明されている構文を使用して URI を指定します。

**置換 \$1 無視**  
入力行とデータベーステーブルの既存の行で一意のキー値が同じである場合、どのアクションを実行するかを決定します。  
+ テーブル内の既存の行を入力行で置き換える場合は、`REPLACE` を指定します。
+ 入力行を破棄する場合は、`IGNORE` を指定します。

**テーブルに**  
入力行をロードする先のデータベーステーブルの名前を指定します。

**PARTITION**  
すべての入力行を、指定されたカンマ区切りのパーティション名のリストに記載されているパーティション内に挿入することを要求します。指定されたパーティションのいずれかに入力行を挿入できない場合、ステートメントは失敗し、エラーが返されます。

**文字セット**  
入力ファイルのデータの文字セットを指定します。

**フィールド \$1 列**  
入力ファイルのフィールドまたは列を区切る方法を指定します。デフォルトでは、フィールドはタブで区切られます。

**LINES**  
入力ファイルの行を区切る方法を指定します。デフォルトでは、行は改行文字 (`'\n'`) で区切られます。

***number* 行を無視 \$1 行**  
入力ファイルの先頭の特定の数の行または列を無視することを指定します。例えば、`IGNORE 1 LINES` では列名を含む初期のヘッダー行がスキップされます。`IGNORE 2 ROWS` では、入力ファイルの先頭から 2 行のデータがスキップされます。また、`PREFIX` を使用すると、`IGNORE` は初期の入力ファイルの先頭にある特定の行数または行をスキップします。

**col\$1name\$1or\$1user\$1var, ..。**  
1 つ以上の列名、またはロードする列を名前で指定するユーザー変数のカンマ区切りのリストを指定します。この目的で使用されるユーザー可変の名前は、プレフィックスを @ とするテキストファイルの要素名と一致する必要があります。フィールド値を対応するユーザー可変に保存して後で再利用できます。  
例えば、次のステートメントでは、入力ファイルの初期の列を `table1` の初期の列内にロードし、さらに `table_column2` の `table1` 列の値として、2 列目の入力値を 100 で割った値を設定します。  

```
LOAD DATA FROM S3 's3://amzn-s3-demo-bucket/data.txt'
    INTO TABLE table1
    (column1, @var1)
    SET table_column2 = @var1/100;
```

**SET**  
テーブル内の列の値を入力ファイルに含まれていない値に設定する代入操作のカンマ区切りのリストを指定します。  
例えば、次のステートメントは `table1` の初期の 2 列を入力ファイルの初期の 2 列の値に設定し、さらに `column3` の `table1` の値を現在のタイムスタンプに設定します。  

```
LOAD DATA FROM S3  's3://amzn-s3-demo-bucket/data.txt'
    INTO TABLE table1
    (column1, column2)
    SET column3 = CURRENT_TIMESTAMP;
```
`SET` 割り当ての右側のサブクエリを使用できます。列に割り当てる値を返すサブクエリとしては、スカラーサブクエリのみ使用できます。また、サブクエリを使用してロード中のテーブルから選択することはできません。

Amazon S3 バケットからデータをロードする場合、`LOAD DATA FROM S3` ステートメントの `LOCAL` キーワードは使用できません。

### マニフェストを使用して、ロードするデータファイルを指定する
<a name="AuroraMySQL.Integrating.LoadFromS3.Manifest"></a>

`LOAD DATA FROM S3` ステートメントの `MANIFEST` キーワードで、JSON 形式のマニフェストファイルを指定して、DB クラスターのテーブルにロードするテキストファイルをリストできます。

次の JSON スキーマはマニフェストファイルの形式と内容を示しています。

```
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "additionalProperties": false,
    "definitions": {},
    "id": "Aurora_LoadFromS3_Manifest",
    "properties": {
        "entries": {
            "additionalItems": false,
            "id": "/properties/entries",
            "items": {
                "additionalProperties": false,
                "id": "/properties/entries/items",
                "properties": {
                    "mandatory": {
                        "default": "false",
                        "id": "/properties/entries/items/properties/mandatory",
                        "type": "boolean"
                    },
                    "url": {
                        "id": "/properties/entries/items/properties/url",
                        "maxLength": 1024,
                        "minLength": 1,
                        "type": "string"
                    }
                },
                "required": [
                    "url"
                ],
                "type": "object"
            },
            "type": "array",
            "uniqueItems": true
        }
    },
    "required": [
        "entries"
    ],
    "type": "object"
}
```

マニフェスト内の各 `url` では、プレフィックスだけでなく、バケットの名前とファイルの完全なオブジェクトパスを使用して URL を指定する必要があります。マニフェストを使用し、異なるバケットやリージョンからファイルをロードしたり、同じプレフィックスを共有しないファイルをロードしたりできます。URL にリージョンを指定していない場合は、ターゲットの Aurora DB クラスターのリージョンが使用されます。以下の例では、異なるバケットから 4 つのファイルをロードするマニフェストファイルを示しています。

```
{
  "entries": [
    {
      "url":"s3://aurora-bucket/2013-10-04-customerdata", 
      "mandatory":true
    },
    {
      "url":"s3-us-west-2://aurora-bucket-usw2/2013-10-05-customerdata",
      "mandatory":true
    },
    {
      "url":"s3://aurora-bucket/2013-10-04-customerdata", 
      "mandatory":false
    },
    {
      "url":"s3://aurora-bucket/2013-10-05-customerdata"
    }
  ]
}
```

ファイルが見つからない場合に、オプションの `mandatory` フラグによって コマンドがエラーを返すかどうかを指定します。`LOAD DATA FROM S3``mandatory` フラグはデフォルトで `false` に設定されています。`mandatory` の設定方法にかかわらず、ファイルが見つからない場合、`LOAD DATA FROM S3` は終了します。

マニフェストファイルには、任意の拡張子を付けることができます。次の例では、前の例にあった「`LOAD DATA FROM S3`」という名前のマニフェストで **customer.manifest** ステートメントを実行しています。

```
LOAD DATA FROM S3 MANIFEST 's3-us-west-2://aurora-bucket/customer.manifest'
    INTO TABLE CUSTOMER
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    (ID, FIRSTNAME, LASTNAME, EMAIL);
```

ステートメントが完了すると、正常にロードされた各ファイルのエントリが `aurora_s3_load_history` テーブルに書き込まれます。

#### aurora\$1s3\$1load\$1history テーブルを使用してロード済みのファイルを確認する
<a name="AuroraMySQL.Integrating.LoadFromS3.Manifest.History"></a>

`LOAD DATA FROM S3` ステートメントが成功するたびに、`aurora_s3_load_history` スキーマの `mysql` テーブルが、ロードされた各ファイルのエントリで更新されます。

`LOAD DATA FROM S3` ステートメントの実行後、`aurora_s3_load_history` テーブルをクエリすることで、どのファイルがロードされたかを確認できます。ステートメントの 1 回のイテレーションからロードされたファイルを確認するには、`WHERE` 句を使用して Amazon S3 URI のレコードをフィルタリングし、ステートメントで使用されたマニフェストファイルを見つけます。以前に同じマニフェストファイルを使用した場合は、`timestamp` フィールドを使用して結果をフィルタリングします。

```
select * from mysql.aurora_s3_load_history where load_prefix = 'S3_URI';
```

以下の表では、`aurora_s3_load_history` テーブルのフィールドについて説明しています。


| フィールド | 説明 | 
| --- | --- | 
| `load_prefix` |  load ステートメントで指定した URI。この URI は、次のいずれかにマッピングできます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.LoadFromS3.html)  | 
|  `file_name`  |  `load_prefix` フィールドで指定した URI を使用して Amazon S3 から Aurora にロードされたファイルの名前。  | 
| `version_number` |  Amazon S3 バケットにバージョン番号がある場合、ロードされた `file_name` フィールドで識別されるファイルのバージョン番号。  | 
|  `bytes_loaded`  |  ロードされたファイルのサイズ (バイト単位)。  | 
| `load_timestamp`  |  `LOAD DATA FROM S3` ステートメントが完了したときのタイムスタンプ。  | 

### 例
<a name="AuroraMySQL.Integrating.LoadFromS3.Text.Examples"></a>

次のステートメントでは、Aurora DB クラスターと同じリージョンにある Amazon S3 バケットからデータをロードします。このステートメントは、*amzn-s3-demo-bucket* Amazon S3 バケットにあるファイル `customerdata.txt` のカンマ区切りデータを読み取り、そのデータをテーブル `store-schema.customer-table` にロードします。

```
LOAD DATA FROM S3 's3://amzn-s3-demo-bucket/customerdata.csv' 
    INTO TABLE store-schema.customer-table
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    (ID, FIRSTNAME, LASTNAME, ADDRESS, EMAIL, PHONE);
```

次のステートメントでは、Aurora DB クラスターとは別のリージョンにある Amazon S3 バケットからデータをロードします。このステートメントは、`us-west-2` リージョンの *amzn-s3-demo-bucket* Amazon S3 バケットで `employee-data` オブジェクトプレフィックスに一致するすべてのファイルからカンマ区切りのデータを読み取り、そのデータを `employees` テーブルにロードします。

```
LOAD DATA FROM S3 PREFIX 's3-us-west-2://amzn-s3-demo-bucket/employee_data'
    INTO TABLE employees
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    (ID, FIRSTNAME, LASTNAME, EMAIL, SALARY);
```

次のステートメントでは、q1\$1sales.json という名前の JSON マニフェストファイルに指定されているファイルから `sales` テーブルにデータをロードします。

```
LOAD DATA FROM S3 MANIFEST 's3-us-west-2://amzn-s3-demo-bucket1/q1_sales.json'
    INTO TABLE sales
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    (MONTH, STORE, GROSS, NET);
```

## LOAD XML FROM S3
<a name="AuroraMySQL.Integrating.LoadFromS3.XML"></a>

`LOAD XML FROM S3` ステートメントを使用して、Amazon S3 バケットに保存されている XML ファイルのデータを以下の 3 種類の XML フォーマットのいずれかでロードできます。
+ `<row>` 要素の属性としての列名。属性値はテーブルフィールドの内容を指定します。

  ```
  <row column1="value1" column2="value2" .../>
  ```
+ `<row>` 要素の子要素としての列名。子要素の値は、テーブルフィールドの内容を指定します。

  ```
  <row>
    <column1>value1</column1>
    <column2>value2</column2>
  </row>
  ```
+ `name` 要素で `<field>` 要素の `<row>` 属性の列名。`<field>` 要素の値は、テーブルフィールドの内容を指定します。

  ```
  <row>
    <field name='column1'>value1</field>
    <field name='column2'>value2</field>
  </row>
  ```

### 構文
<a name="AuroraMySQL.Integrating.LoadFromS3.XML.Syntax"></a>

```
LOAD XML FROM S3 'S3-URI'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [PARTITION (partition_name,...)]
    [CHARACTER SET charset_name]
    [ROWS IDENTIFIED BY '<element-name>']
    [IGNORE number {LINES | ROWS}]
    [(field_name_or_user_var,...)]
    [SET col_name = expr,...]
```

### パラメータ
<a name="AuroraMySQL.Integrating.LoadFromS3.XML.Parameters"></a>

`LOAD XML FROM S3` ステートメントでは、次の必須パラメータとオプションパラメータを使用します。これらのパラメータの一部の詳細については、MySQL ドキュメントの「[LOAD XML Statement](https://dev.mysql.com/doc/refman/8.0/en/load-xml.html)」を参照してください。

**ファイル \$1 プレフィックス**  
データを単一のファイルからロードするか、特定のプレフィックスに一致するすべてのファイルからロードするかを指定します。デフォルトは `FILE` です。

**置換 \$1 無視**  
入力行とデータベーステーブルの既存の行で一意のキー値が同じである場合、どのアクションを実行するかを決定します。  
+ テーブル内の既存の行を入力行で置き換える場合は、`REPLACE` を指定します。
+ 入力行を破棄する場合は、`IGNORE` を指定します。デフォルトは `IGNORE` です。

**テーブルに**  
入力行をロードする先のデータベーステーブルの名前を指定します。

**PARTITION**  
すべての入力行を、指定されたカンマ区切りのパーティション名のリストに記載されているパーティション内に挿入することを要求します。指定されたパーティションのいずれかに入力行を挿入できない場合、ステートメントは失敗し、エラーが返されます。

**文字セット**  
入力ファイルのデータの文字セットを指定します。

**行の識別**  
入力ファイルの行を識別する要素名を指定します。デフォルトは `<row>` です。

***number* 行を無視 \$1 行**  
入力ファイルの先頭の特定の数の行または列を無視することを指定します。例えば、`IGNORE 1 LINES` ではテキストファイルの初期の行がスキップされます。`IGNORE 2 ROWS` では、入力 XML の初期の 2 行のデータがスキップされます。

**field\$1name\$1or\$1user\$1var, ..。**  
ロードする要素を名前で指定する 1 つ以上の XML 要素名またはユーザー変数のカンマ区切りのリストを指定します。この目的で使用されるユーザー可変の名前は、プレフィックスを @ とする XML ファイルの要素名と一致する必要があります。フィールド値を対応するユーザー可変に保存して後で再利用できます。  
例えば、次のステートメントでは、入力ファイルの初期の列を `table1` の初期の列内にロードし、さらに `table_column2` の `table1` 列の値として、2 列目の入力値を 100 で割った値を設定します。  

```
LOAD XML FROM S3 's3://amzn-s3-demo-bucket/data.xml'
   INTO TABLE table1
   (column1, @var1)
   SET table_column2 = @var1/100;
```

**SET**  
テーブル内の列の値を入力ファイルに含まれていない値に設定する代入操作のカンマ区切りのリストを指定します。  
例えば、次のステートメントは `table1` の初期の 2 列を入力ファイルの初期の 2 列の値に設定し、さらに `column3` の `table1` の値を現在のタイムスタンプに設定します。  

```
LOAD XML FROM S3 's3://amzn-s3-demo-bucket/data.xml'
   INTO TABLE table1
   (column1, column2)
   SET column3 = CURRENT_TIMESTAMP;
```
`SET` 割り当ての右側のサブクエリを使用できます。列に割り当てる値を返すサブクエリとしては、スカラーサブクエリのみ使用できます。また、サブクエリを使用してロード中のテーブルから選択することはできません。

# Amazon Aurora MySQL DB クラスターから Amazon S3 バケット内のテキストファイルへのデータの保存
<a name="AuroraMySQL.Integrating.SaveIntoS3"></a><a name="save_into_s3"></a><a name="select_into_outfile"></a>

`SELECT INTO OUTFILE S3` ステートメントを使用して、Amazon Aurora MySQL DB クラスターのデータをクエリし、Amazon S3 バケット内のテキストファイルにデータを保存できます。Aurora MySQL では、ファイルを最初にローカルディスクに保存し、次に S3 にエクスポートします。エクスポートが完了すると、ローカルファイルは削除されます。

Amazon S3 マネージドキー (SSE-S3) または AWS KMS key (SSE-KMS: AWS マネージドキー またはカスタマーマネージドキー) を使用して Amazon S3 バケットを暗号化できます。

`LOAD DATA FROM S3` ステートメントは、`SELECT INTO OUTFILE S3` ステートメントで作成したファイルを使用してデータを Aurora DB クラスター内にロードできます。詳細については、「[Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード](AuroraMySQL.Integrating.LoadFromS3.md)」を参照してください。

**注記**  
この機能は Aurora Serverless v1 DB クラスターに対してサポートされていません。Aurora Serverless v2 DB クラスターでサポートされています。  
AWS マネジメントコンソール、AWS CLI、または Amazon RDS API を使用して、DB クラスターデータと DB クラスタースナップショットデータを Amazon S3 に保存することもできます。詳細については、「[Amazon S3 への DB クラスターデータのエクスポート](export-cluster-data.md)」および「[Amazon S3 への DB クラスタースナップショットデータのエクスポート](aurora-export-snapshot.md)」を参照してください。

**Contents**
+ [Amazon S3 へのアクセスを Aurora MySQL に許可する](#AuroraMySQL.Integrating.SaveIntoS3.Authorize)
+ [Aurora MySQL にデータを保存する権限の付与](#AuroraMySQL.Integrating.SaveIntoS3.Grant)
+ [Amazon S3 バケットへのパスの指定](#AuroraMySQL.Integrating.SaveIntoS3.URI)
+ [データファイルをリスト化するマニフェストの作成](#AuroraMySQL.Integrating.SaveIntoS3.Manifest)
+ [SELECT INTO OUTFILE S3](#AuroraMySQL.Integrating.SaveIntoS3.Statement)
  + [構文](#AuroraMySQL.Integrating.SaveIntoS3.Statement.Syntax)
  + [パラメータ](#AuroraMySQL.Integrating.SaveIntoS3.Statement.Parameters)
  + [考慮事項](#AuroraMySQL.Integrating.SaveIntoS3.Considerations)
  + [例](#AuroraMySQL.Integrating.SaveIntoS3.Examples)

## Amazon S3 へのアクセスを Aurora MySQL に許可する
<a name="AuroraMySQL.Integrating.SaveIntoS3.Authorize"></a>

データを Amazon S3 バケット内に保存する前に、Amazon S3 へのアクセス権限を Aurora MySQL DB クラスターに付与する必要があります。

**Amazon S3 へのアクセス権限を Aurora MySQL に付与するには**

1. バケットおよびオブジェクトのアクセス許可を付与し、Aurora MySQL DB クラスターから Amazon S3 へのアクセスを許可する AWS Identity and Access Management (IAM) ポリシーを作成します。手順については、「[Amazon S3 リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.S3CreatePolicy.md)」を参照してください。
**注記**  
Aurora MySQL バージョン 3.05 以降では、AWS KMS カスタマーマネージドキーを使用してオブジェクトを暗号化できます。そのためには、IAM ポリシーに `kms:GenerateDataKey` アクセス許可を含めてください。詳細については、「[AWS KMS リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.KMSCreatePolicy.md)」を参照してください。  
AWS マネージドキー または Amazon S3 マネージドキー (SSE-S3) を使用してオブジェクトを暗号化する場合にはこのアクセス許可は必要ありません。

1. IAM ロールを作成して、「[Amazon S3 リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.S3CreatePolicy.md)」で作成した IAM ポリシーを新しい IAM ロールにアタッチします。手順については、「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」を参照してください。

1. Aurora MySQL バージョン 2 の場合、`aurora_select_into_s3_role` または `aws_default_s3_role` DB クラスターパラメータを、新しい IAM ロールの Amazon リソースネーム (ARN) に設定します。IAM ロールが `aurora_select_into_s3_role` に指定されていない場合、Aurora は `aws_default_s3_role` に指定されている IAM ロールを使用します。

   Aurora MySQL バージョン 3 の場合、`aws_default_s3_role` を使用します。

   クラスターが Aurora Global Database の一部である場合は、このパラメータをグローバルデータベース内の Aurora クラスターごとに設定します。

   DB クラスターのパラメータの詳細については、「[Amazon Aurora の DB クラスターパラメータと DB インスタンスパラメータ](USER_WorkingWithDBClusterParamGroups.md#Aurora.Managing.ParameterGroups)」を参照してください。

1. Aurora MySQL DB クラスター内のデータベースユーザーが Amazon S3 にアクセスできるように、「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」で作成したロールをその DB クラスターに関連付けます。

   Aurora Global Database の場合は、グローバルデータベース内の Aurora クラスターごとにロールを関連付けます。

   DB クラスターへの IAM ロールの関連付けの詳細については、「[IAM ロールと Amazon Aurora MySQL DB クラスターの関連付け](AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.md)」を参照してください。

1. Amazon S3 へのアウトバウンド接続を許可するように Aurora MySQL DB クラスターを設定します。手順については、「[Amazon Aurora から他の AWS のサービスへのネットワーク通信の有効化](AuroraMySQL.Integrating.Authorizing.Network.md)」を参照してください。

    Aurora Global Database の場合は、グローバルデータベース内の Aurora クラスターごとにアウトバウンド接続を有効にします。

## Aurora MySQL にデータを保存する権限の付与
<a name="AuroraMySQL.Integrating.SaveIntoS3.Grant"></a>

`SELECT INTO OUTFILE S3` ステートメントを発行するデータベースユーザーは、特定のロールまたは権限を保持している必要があります。Aurora MySQL バージョン 3 では、`AWS_SELECT_S3_ACCESS` ロールを付与します。Aurora MySQL バージョン 2 では、`SELECT INTO S3` 権限を付与します。DB クラスターの管理ユーザーにはデフォルトで適切なロールまたは権限が付与されます。他のユーザーに権限を付与するには、次のいずれかのコマンドが使用できます。

 Aurora MySQL バージョン 3 では、次のステートメントを使用します: 

```
GRANT AWS_SELECT_S3_ACCESS TO 'user'@'domain-or-ip-address'
```

**ヒント**  
Aurora MySQL バージョン 3 でロールテクニックを使用する場合は、`SET ROLE role_name` または `SET ROLE ALL` ステートメントを使用してロールを有効化することもできます。MySQL 8.0 ロールシステムに馴染みがない場合は、[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model) で詳細を確認頂けます。詳細については、「MySQL リファレンスマニュアル」の「[Using roles](https://dev.mysql.com/doc/refman/8.0/en/roles.html)」を参照してください。**  
これは現在アクティブなセッションにのみ適用されます。再接続するときは、`SET ROLE` ステートメントを再度実行して権限を付与する必要があります。詳細については、*MySQL リファレンスマニュアル*の「[SET ROLE ステートメント](https://dev.mysql.com/doc/refman/8.0/en/set-role.html)」を参照してください。  
ユーザーが DB インスタンスに接続したときに、`activate_all_roles_on_login` DB クラスターパラメータを使用して、すべてのロールを自動的に有効化できます。このパラメータを設定すると、通常、`SET ROLE` ステートメントを明示的に呼び出してロールをアクティブ化する必要はありません。詳細については、*MySQL リファレンスマニュアル*の「[activate\$1all\$1roles\$1on\$1login](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_activate_all_roles_on_login)」を参照してください。  
ただし、ストアドプロシージャを別のユーザーから呼び出す場合は、ストアドプロシージャの先頭で `SET ROLE ALL` を明示的に呼び出してロールをアクティブ化する必要があります。

Aurora MySQL バージョン 2 では、次のステートメントを使用します:

```
GRANT SELECT INTO S3 ON *.* TO 'user'@'domain-or-ip-address'
```

`AWS_SELECT_S3_ACCESS` ロールまたは `SELECT INTO S3` 権限は Amazon Aurora MySQL に固有であり、MySQL データベースおよび MySQL DB インスタンスの RDS では使用できません。Aurora MySQL DB クラスターをレプリケーションソースとし、MySQL データベースをレプリケーションクライアントとして両者間にレプリケーションを設定した場合、ロールまたは権限の `GRANT` ステートメントはエラーとなり、レプリケーションが停止します。エラーをスキップして、レプリケートを再開できます。RDS for MySQL DB インスタンスでエラーをスキップするには、[ mysql\$1rds\$1skip\$1repl\$1error](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql_rds_skip_repl_error.html) プロシージャを使用します。外部 MySQL データベースでエラーをスキップするには、[slave\$1skip\$1errors](https://dev.mysql.com/doc/refman/5.7/en/replication-options-replica.html#sysvar_slave_skip_errors) システム変数 (Aurora MySQL バージョン 2) または [replica\$1skip\$1errors](https://dev.mysql.com/doc/refman/8.0/en/replication-options-replica.html#sysvar_replica_skip_errors) システム変数 (Aurora MySQL バージョン 3) を使用します。

## Amazon S3 バケットへのパスの指定
<a name="AuroraMySQL.Integrating.SaveIntoS3.URI"></a>

Amazon S3 バケットにデータとマニフェストファイルを保存するためのパスを指定する構文は、次に示すように、`LOAD DATA FROM S3 PREFIX` ステートメントで使用する構文と似ています。

```
s3-region://bucket-name/file-prefix
```

パスに指定する値は以下のとおりです。
+ `region` (オプション) - データの保存先の Amazon S3 バケットがある AWS リージョン。この値はオプションです。`region` 値を指定しないと、Aurora は DB クラスターと同じリージョンの Amazon S3 にファイルを保存します。
+ `bucket-name` - データの保存先である Amazon S3 バケットの名前。仮想フォルダのパスを識別するオブジェクトプレフィックスがサポートされています。
+ `file-prefix` - Amazon S3 に保存するファイルを識別する Amazon S3 オブジェクトプレフィックス。

`SELECT INTO OUTFILE S3` ステートメントで作成したデータファイルでは、次のパスを使用します。*00000* はゼロから始まる 5 桁の整数です。

```
s3-region://bucket-name/file-prefix.part_00000
```

例えば、`SELECT INTO OUTFILE S3` ステートメントでデータファイルの保存先のパスとして `s3-us-west-2://bucket/prefix` を指定し、3 つのデータファイルを作成したとします。この場合、指定した Amazon S3 バケットに保存されるデータファイルは以下のとおりです。
+ s3-us-west-2://bucket/prefix.part\$100000
+ s3-us-west-2://bucket/prefix.part\$100001
+ s3-us-west-2://bucket/prefix.part\$100002

## データファイルをリスト化するマニフェストの作成
<a name="AuroraMySQL.Integrating.SaveIntoS3.Manifest"></a>

`SELECT INTO OUTFILE S3` ステートメントで `MANIFEST ON` オプションを使用すると、このステートメントで作成されるテキストファイルをリストするマニフェストファイルを JSON 形式で作成できます。`LOAD DATA FROM S3` ステートメントでは、このマニフェストファイルを使用してデータファイルを逆に Aurora MySQL DB クラスター内にロードできます。マニフェストファイルを使用して Amazon S3 から Aurora MySQL DB クラスター内にデータファイルをロードする方法の詳細については、「[マニフェストを使用して、ロードするデータファイルを指定する](AuroraMySQL.Integrating.LoadFromS3.md#AuroraMySQL.Integrating.LoadFromS3.Manifest)」を参照してください。

`SELECT INTO OUTFILE S3` ステートメントで作成されたマニフェストでは、このステートメントで作成された順にデータファイルがリストされます。例えば、`SELECT INTO OUTFILE S3` ステートメントでデータファイルの保存先のパスとして `s3-us-west-2://bucket/prefix` を指定し、マニフェストファイルを作成したとします。この場合、指定した Amazon S3 バケットに保存されるマニフェストファイルは `s3-us-west-2://bucket/prefix.manifest` という名前で、以下の内容になります。

```
{
  "entries": [
    {
      "url":"s3-us-west-2://bucket/prefix.part_00000"
    },
    {
      "url":"s3-us-west-2://bucket/prefix.part_00001"
    },
    {
      "url":"s3-us-west-2://bucket/prefix.part_00002"
    }
  ]
}
```

## SELECT INTO OUTFILE S3
<a name="AuroraMySQL.Integrating.SaveIntoS3.Statement"></a>

`SELECT INTO OUTFILE S3` ステートメントを使用して、DB クラスターからクエリしたデータを直接 Amazon S3 バケット内の区切りテキストファイルに保存できます。

圧縮ファイルはサポートされていません。暗号化ファイルは Aurora MySQL バージョン 2.09.0 以降でサポートされています。

### 構文
<a name="AuroraMySQL.Integrating.SaveIntoS3.Statement.Syntax"></a>

```
SELECT
    [ALL | DISTINCT | DISTINCTROW ]
        [HIGH_PRIORITY]
        [STRAIGHT_JOIN]
        [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
        [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
        [PARTITION partition_list]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
        [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
         [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
INTO OUTFILE S3 's3_uri'
[CHARACTER SET charset_name]
    [export_options]
    [MANIFEST {ON | OFF}]
    [OVERWRITE {ON | OFF}]
    [ENCRYPTION {ON | OFF | SSE_S3 | SSE_KMS ['cmk_id']}]

export_options:
    [FORMAT {CSV|TEXT} [HEADER]]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
]
```

### パラメータ
<a name="AuroraMySQL.Integrating.SaveIntoS3.Statement.Parameters"></a>

`SELECT INTO OUTFILE S3` ステートメントでは、Aurora に固有の次の必須パラメータとオプションパラメータを使用します。

**s3-uri**  
Amazon S3 のプレフィックスとして使用する URI を指定します。「[Amazon S3 バケットへのパスの指定](#AuroraMySQL.Integrating.SaveIntoS3.URI)」で説明されている構文を使用してください。

**フォーマット \$1CSV\$1テキスト\$1 [ヘッダー]**  
必要に応じて、データを CSV 形式で保存します。  
`TEXT` オプションはデフォルトで、既存の MySQL エクスポート形式を生成します。  
`CSV` オプションは、カンマ区切りのデータ値を生成します。CSV 形式は、 [RFC-4180](https://tools.ietf.org/html/rfc4180) の仕様に従います。オプションのキーワード `HEADER` を指定すると、出力ファイルに 1 つのヘッダー行が含まれます。ヘッダー行のラベルは、`SELECT` ステートメントの列名に対応します。AWS ML サービスで使用するトレーニングデータモデルに CSV ファイルを使用できます。AWS ML サービスでエクスポートされた Aurora データを使用する方法の詳細については、「[SageMaker AI モデルトレーニング用のデータを Amazon S3 にエクスポートする (高度)](mysql-ml.md#exporting-data-to-s3-for-model-training)」を参照してください。

**マニフェスト \$1オン \$1 オフ\$1**  
Amazon S3 でマニフェストファイルを作成するかどうかを指定します。マニフェストファイルは、JSON (JavaScript Object Notation) ファイルであり、`LOAD DATA FROM S3 MANIFEST` ステートメントでデータを Aurora DB クラスター内にロードする際に使用できます。`LOAD DATA FROM S3 MANIFEST` の詳細については、「[Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード](AuroraMySQL.Integrating.LoadFromS3.md)」を参照してください。  
クエリで `MANIFEST ON` を指定すると、すべてのデータファイルが作成されてアップロードされた後で、Amazon S3 内にマニフェストファイルが作成されます。マニフェストファイルは次のパスで作成されます。  

```
s3-region://bucket-name/file-prefix.manifest
```
マニフェストファイルのコンテンツの詳しい形式については、「[データファイルをリスト化するマニフェストの作成](#AuroraMySQL.Integrating.SaveIntoS3.Manifest)」を参照してください。

**上書き \$1オン \$1 オフ\$1**  
指定した Amazon S3 バケット内の既存のファイルを上書きするかどうかを指定します。`OVERWRITE ON` を指定すると、`s3-uri` に指定した URI のファイルプレフィックスと一致する既存のファイルは上書きされます。上書きされないと、エラーが発生します。

**ENCRYPTION \$1ON \$1 OFF \$1 SSE\$1S3 \$1 SSE\$1KMS ['*cmk\$1id*']\$1**  
Amazon S3 マネージドキーを使ったサーバー側の暗号化 (SSE-S3) または AWS KMS keys (SSE-KMS、AWS マネージドキー およびカスタマーマネージドキーを含む) を使用するかどうかを指定します。`SSE_S3` および `SSE_KMS` 設定は、Aurora MySQL バージョン 3.05 以降で使用できます。  
次の例に示すように、`ENCRYPTION` 句の代わりに `aurora_select_into_s3_encryption_default` セッション変数を使用することもできます。SQL 句またはセッション変数のいずれかを使用しますが、両方は使用できません。  

```
set session set session aurora_select_into_s3_encryption_default={ON | OFF | SSE_S3 | SSE_KMS};
```
`SSE_S3` および `SSE_KMS` 設定は、Aurora MySQL バージョン 3.05 以降で使用できます。  
`aurora_select_into_s3_encryption_default` を次の値に設定した場合:  
+ `OFF` – S3 バケットのデフォルトの暗号化ポリシーが適用されます。`aurora_select_into_s3_encryption_default` の初期値は `OFF` です。
+ `ON` または `SSE_S3` – S3 オブジェクトは Amazon S3 マネージドキー (SSE-S3) を使用して暗号化されます。
+ `SSE_KMS` – S3 オブジェクトは AWS KMS key を使用して暗号化されます。

  この場合は、セッション変数 `aurora_s3_default_cmk_id` も含めます。次に例を示します。

  ```
  set session aurora_select_into_s3_encryption_default={SSE_KMS};
  set session aurora_s3_default_cmk_id={NULL | 'cmk_id'};
  ```
  + `aurora_s3_default_cmk_id` が `NULL` のとき、S3 オブジェクトは AWS マネージドキー を使用して暗号化されます。
  + `aurora_s3_default_cmk_id` がが空でない文字列 `cmk_id` の場合、S3 オブジェクトはカスタマーマネージドキーを使用して暗号化されます。

    `cmk_id` の値は空の文字列にはできません。
`SELECT INTO OUTFILE S3` コマンドを使用すると、Aurora は次のように暗号化を決定します。  
+ SQL コマンドに `ENCRYPTION` 句が含まれている場合、Aurora は `ENCRYPTION` の値のみに依存し、セッション変数を使用しません。
+ `ENCRYPTION` 句がない場合、Aurora はセッション変数の値に依存します。
詳細については、*Amazon Simple Storage Service ユーザーガイド*の「[Amazon S3 マネージドキー (SSE-S3) によるサーバー側の暗号化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html)」および「[AWS KMS キー (SSE-KMS) によるサーバー側の暗号化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)」を参照してください。

他のパラメータの詳細については、MySQL ドキュメントの「[SELECT ステートメント](https://dev.mysql.com/doc/refman/8.0/en/select.html)」と「[LOAD DATA ステートメント](https://dev.mysql.com/doc/refman/8.0/en/load-data.html)」を参照してください。

### 考慮事項
<a name="AuroraMySQL.Integrating.SaveIntoS3.Considerations"></a>

Amazon S3 バケットに書き込まれるファイルの数は、`SELECT INTO OUTFILE S3` ステートメントで選択したデータの量と Aurora MySQL のファイルサイズのしきい値によって異なります。デフォルトのファイルサイズのしきい値は 6 GB です。ステートメントで選択したデータがファイルサイズのしきい値より少ない場合は、1 つのファイルが作成されます。それ以外の場合は、複数のファイルが作成されます。このステートメントで作成されるファイルについては、以下の点にも留意してください。
+ Aurora MySQL では、データファイルの行がファイル境界で分割されないことが保証されます。複数のファイルの場合、最後のファイルを除くすべてのデータファイルは、通常、ファイルサイズのしきい値に近いサイズになります。ただし、ファイルサイズのしきい値を常に下回る必要があるために、1 つの行が 2 つのデータファイル間にまたがる場合がまれにあります。この場合、Aurora MySQL では行が分割されないようにデータファイルを作成するため、ファイルサイズのしきい値を上回ることがあります。
+ Aurora MySQL では各 `SELECT` ステートメントをアトミックトランザクションとして実行するため、`SELECT INTO OUTFILE S3` ステートメントで大きなデータセットを選択すると、実行時間が長引く場合があります。何らかの理由でステートメントが失敗すると、ステートメントの発行をやり直す必要が生じる場合があります。ただし、ステートメントが失敗しても、Amazon S3 にアップロード済みのファイルは保存先の Amazon S3 バケット内に残るため、再実行するステートメントでは初期からではなく残りのデータだけをアップロードできます。
+ 選択するデータが 25 GB を超える場合は、複数回の `SELECT INTO OUTFILE S3` ステートメントを使用してデータを Amazon S3 に保存することをお勧めします。実行するステートメントごとに、保存するデータ部分を選択し、保存先として `file_prefix` パラメータに異なる `s3-uri` を指定します。選択するデータを複数のステートメントでパーティション化すると、1 つのステートメントでエラーから回復しやすくなります。1 つのステートメントでエラーが発生した場合は、データの一部だけを再選択して Amazon S3 にアップロードする必要があります。複数のステートメントを使用すると、1 回のトランザクションの実行時間が短くなり、パフォーマンスも向上します。
+ 複数の `SELECT INTO OUTFILE S3` ステートメント間で、`file_prefix` パラメータに同じ `s3-uri` を指定した場合、これらのステートメントを同時に実行してデータを Amazon S3 に保存しようとしたときの動作は定義されていません。
+ Aurora MySQL では、テーブルスキーマやファイルメタデータなどのメタデータは Amazon S3 にアップロードされません。
+ 障害から回復する目的などで `SELECT INTO OUTFILE S3` を再実行する場合もあります。このような場合は、`s3-uri` で指定するファイルプレフィックスと同じ既存のデータファイルを Amazon S3 バケットから削除するか、`OVERWRITE ON` クエリで `SELECT INTO OUTFILE S3` を指定します。

`SELECT INTO OUTFILE S3` ステートメントの成否に応じて、一般的な MySQL エラー番号およびレスポンスが返されます。MySQL エラー番号およびレスポンスにアクセスできない場合は、最も簡単な確認方法として `MANIFEST ON` をステートメントで指定します。マニフェストファイルは、ステートメントで最後に書き込まれるファイルです。つまり、マニフェストファイルがあれば、ステートメントが完了したことになります。

現在、実行中に `SELECT INTO OUTFILE S3` ステートメントの進行状況を直接モニタリングする方法はありません。ただし、このステートメントを使用して Aurora MySQL から Amazon S3 に大量のデータを書き込む際に、ステートメントで選択されるデータのサイズがわかっている場合があります。このような場合、Amazon S3 でデータファイルの作成をモニタリングすることで、進行状況を推測できます。

そのためには、ステートメントで選択する約 6 GB のデータごとにデータファイルが指定先の Amazon S3 バケットに作成されることに注目します。選択対象のデータのサイズを 6 GB で割り、作成されるデータファイルの推定数を割り出します。次に Amazon S3 にアップロードされたファイルの数をステートメントの実行中にモニタリングして、ステートメントの進行状況を推測できます。

### 例
<a name="AuroraMySQL.Integrating.SaveIntoS3.Examples"></a>

次のステートメントでは、`employees` テーブルからすべてのデータを選択し、そのデータを Aurora MySQL DB クラスターとは異なるリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (`,`) 文字、各行の末尾に改行 (`\n`) 文字が付きます。指定先の Amazon S3 バケットに `sample_employee_data` ファイルプレフィックスと一致するファイルがあると、ステートメントからエラーが返されます。

```
SELECT * FROM employees INTO OUTFILE S3 's3-us-west-2://aurora-select-into-s3-pdx/sample_employee_data'
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n';
```

次のステートメントでは、`employees` テーブルからすべてのデータを選択し、そのデータを Aurora MySQL DB クラスターと同じリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (`,`) 文字、各行の末尾に改行 (`\n`) 文字が付きます。このステートメントでは、マニフェストファイルも作成されます。指定先の Amazon S3 バケットに `sample_employee_data` ファイルプレフィックスと一致するファイルがあると、ステートメントからエラーが返されます。

```
SELECT * FROM employees INTO OUTFILE S3 's3://aurora-select-into-s3-pdx/sample_employee_data'
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    MANIFEST ON;
```

次のステートメントでは、`employees` テーブルからすべてのデータを選択し、そのデータを Aurora DB クラスターとは異なるリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (`,`) 文字、各行の末尾に改行 (`\n`) 文字が付きます。指定先の Amazon S3 バケットで `sample_employee_data` ファイルプレフィックスと一致する既存のファイルは上書きされます。

```
SELECT * FROM employees INTO OUTFILE S3 's3-us-west-2://aurora-select-into-s3-pdx/sample_employee_data'
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    OVERWRITE ON;
```

次のステートメントでは、`employees` テーブルからすべてのデータを選択し、そのデータを Aurora MySQL DB クラスターと同じリージョンにある Amazon S3 バケット内に保存します。このステートメントで作成されるデータファイルでは、各フィールドの末尾にカンマ (`,`) 文字、各行の末尾に改行 (`\n`) 文字が付きます。このステートメントでは、マニフェストファイルも作成されます。指定先の Amazon S3 バケットで `sample_employee_data` ファイルプレフィックスと一致する既存のファイルは上書きされます。

```
SELECT * FROM employees INTO OUTFILE S3 's3://aurora-select-into-s3-pdx/sample_employee_data'
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    MANIFEST ON
    OVERWRITE ON;
```

# Amazon Aurora MySQL DB クラスターからの Lambda 関数の呼び出し
<a name="AuroraMySQL.Integrating.Lambda"></a><a name="lambda"></a>

Amazon Aurora MySQL 互換エディション DB クラスターから AWS Lambda 関数を呼び出すには、ネイティブ関数 `lambda_sync` または `lambda_async` を使用します。Aurora MySQL から Lambda 関数を呼び出すには、Aurora DB クラスターから Lambda にアクセスできる必要があります。Aurora MySQL へのアクセス権の付与の詳細については、[Lambda へのアクセスを Aurora に許可する](AuroraMySQL.Integrating.LambdaAccess.md) を参照してください。`lambda_sync` 関数および `lambda_async` の保存された関数の詳細については、[Aurora MySQL ネイティブ関数を使用した Lambda 関数の呼び出し](AuroraMySQL.Integrating.NativeLambda.md) を参照してください。

 ストアドプロシージャを使用して、AWS Lambda 関数を呼び出すこともできます。しかし、ストアドプロシージャの使用は非推奨です。以下のいずれかのバージョンの Aurora MySQL を使用している場合は、Aurora MySQL ネイティブ関数を使用することを強くお勧めします。
+ MySQL 5.7 互換クラスターの場合は、Aurora MySQL バージョン 2。
+ MySQL 8.0 互換クラスターは、Aurora MySQL バージョン 3.01 以降。ストアドプロシージャは、Aurora MySQL バージョン 3 では使用できません。

Aurora に Lambda へのアクセスを許可し、Lambda 関数を呼び出す方法については、以下のトピックを参照してください。

**Topics**
+ [Lambda へのアクセスを Aurora に許可する](AuroraMySQL.Integrating.LambdaAccess.md)
+ [Aurora MySQL ネイティブ関数を使用した Lambda 関数の呼び出し](AuroraMySQL.Integrating.NativeLambda.md)
+ [Aurora MySQL ストアドプロシージャを使用した Lambda 関数の呼び出し (非推奨)](AuroraMySQL.Integrating.ProcLambda.md)

# Lambda へのアクセスを Aurora に許可する
<a name="AuroraMySQL.Integrating.LambdaAccess"></a>

Aurora MySQL DB クラスターから Lambda 関数を呼び出すには、まず Lambda へのアクセス権限をクラスターに付与する必要があります。

**Lambda へのアクセス権限を Aurora MySQL に付与するには**

1. Aurora MySQL DB クラスターからの Lambda 関数の呼び出しを許可するアクセス許可を付与する AWS Identity and Access Management (IAM) ポリシーを作成します。手順については、「[AWS Lambda リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.LambdaCreatePolicy.md)」を参照してください。

1. IAM ロールを作成して、「[AWS Lambda リソースにアクセスするための IAM ポリシーの作成](AuroraMySQL.Integrating.Authorizing.IAM.LambdaCreatePolicy.md)」で作成した IAM ポリシーを新しい IAM ロールにアタッチします。手順については、「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」を参照してください。

1. DB クラスターの `aws_default_lambda_role` パラメータに新しい IAM ロールの Amazon リソースネーム (ARN) を設定します。

   クラスターが Aurora Global Database の一部である場合は、グローバルデータベース内の Aurora クラスターごとに同じ設定を適用します。

   DB クラスターのパラメータの詳細については、「[Amazon Aurora の DB クラスターパラメータと DB インスタンスパラメータ](USER_WorkingWithDBClusterParamGroups.md#Aurora.Managing.ParameterGroups)」を参照してください。

1. Aurora MySQL DB クラスター内のデータベースユーザーが Lambda 関数を呼び出せるように、「[Amazon Aurora が AWS のサービスにアクセスすることを許可する IAM ロールの作成](AuroraMySQL.Integrating.Authorizing.IAM.CreateRole.md)」で作成したロールをその DB クラスターに関連付けます。DB クラスターへの IAM ロールの関連付けの詳細については、「[IAM ロールと Amazon Aurora MySQL DB クラスターの関連付け](AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.md)」を参照してください。

    クラスターが Aurora Global Database の一部である場合は、グローバルデータベース内の Aurora クラスターごとにロールを関連付けます。

1. Lambda へのアウトバウンド接続を許可するように Aurora MySQL DB クラスターを設定します。手順については、「[Amazon Aurora から他の AWS のサービスへのネットワーク通信の有効化](AuroraMySQL.Integrating.Authorizing.Network.md)」を参照してください。

    クラスターが Aurora Global Database の一部である場合は、グローバルデータベース内の Aurora クラスターごとにアウトバウンド接続を有効にします。

# Aurora MySQL ネイティブ関数を使用した Lambda 関数の呼び出し
<a name="AuroraMySQL.Integrating.NativeLambda"></a>

**注記**  
Aurora MySQL バージョン 2 または Aurora MySQL バージョン 3.01 以降を使用しているときには、ネイティブ関数 `lambda_sync` および `lambda_async` を呼び出すことができます。Aurora MySQL のバージョンの詳細については、「[Amazon Aurora MySQL のデータベースエンジンの更新Amazon Aurora MySQL の長期サポート (LTS) とベータリリース](AuroraMySQL.Updates.md)」を参照してください。

ネイティブ関数 `lambda_sync` および `lambda_async` を呼び出すことで、Aurora MySQL DB クラスターから AWS Lambda 関数を呼び出すことができます。このアプローチは、Aurora MySQL で実行しているデータベースを 他の AWS のサービスと統合するときに便利です。例えば、データベースの特定のテーブルに行が挿入されるたびに Amazon Simple Notification Service (Amazon SNS) を使用して通知を送信するような場合があります。

**Contents**
+ [ネイティブ関数を使用した Lambda 関数の呼び出し](#AuroraMySQL.Integrating.NativeLambda.lambda_functions)
  + [Aurora MySQL バージョン 3 でのロールの付与](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3)
  + [Aurora MySQL バージョン 2 での権限の付与](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2)
  + [lambda\$1sync 関数の構文](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax)
  + [lambda\$1sync 関数のパラメータ](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters)
  + [lambda\$1sync 関数の例](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example)
  + [lambda\$1async 関数の構文](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax)
  + [lambda\$1async 関数のパラメータ](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters)
  + [lambda\$1async 関数の例](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example)
  + [トリガーを使用した Lambda 関数の呼び出し](#AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger)

## ネイティブ関数を使用した Lambda 関数の呼び出し
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions"></a>

`lambda_sync` 関数と `lambda_async` 関数は、Lambda 関数を同期的および非同期に呼び出す組み込みのネイティブ関数です。別のアクションに移る前に、Lambda 関数の結果を知る必要がある場合は、同期関数 `lambda_sync` を使用します。別のアクションに移る前に、呼び出した Lambda 関数の結果を知る必要がない場合は、非同期関数 `lambda_async` を使用します。

### Aurora MySQL バージョン 3 でのロールの付与
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v3"></a>

Aurora MySQL バージョン 3 では、ネイティブ関数を呼び出すユーザーは `AWS_LAMBDA_ACCESS` ロールが付与されている必要があります。ユーザーにこのロールを付与するには、DB インスタンスに管理者ユーザーとして接続し、次のステートメントを実行します。

```
GRANT AWS_LAMBDA_ACCESS TO user@domain-or-ip-address
```

次のステートメントを実行することで、このロールを取り消すことができます。

```
REVOKE AWS_LAMBDA_ACCESS FROM user@domain-or-ip-address
```

**ヒント**  
Aurora MySQL バージョン 3 でロールテクニックを使用する場合は、`SET ROLE role_name` または `SET ROLE ALL` ステートメントを使用してロールを有効化することもできます。MySQL 8.0 ロールシステムに馴染みがない場合は、[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model) で詳細を確認頂けます。詳細については、「MySQL リファレンスマニュアル」の「[Using roles](https://dev.mysql.com/doc/refman/8.0/en/roles.html)」を参照してください。**  
これは現在アクティブなセッションにのみ適用されます。再接続するときは、`SET ROLE` ステートメントを再度実行して権限を付与する必要があります。詳細については、*MySQL リファレンスマニュアル*の「[SET ROLE ステートメント](https://dev.mysql.com/doc/refman/8.0/en/set-role.html)」を参照してください。  
ユーザーが DB インスタンスに接続したときに、`activate_all_roles_on_login` DB クラスターパラメータを使用して、すべてのロールを自動的に有効化できます。このパラメータを設定すると、通常、`SET ROLE` ステートメントを明示的に呼び出してロールをアクティブ化する必要はありません。詳細については、*MySQL リファレンスマニュアル*の「[activate\$1all\$1roles\$1on\$1login](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_activate_all_roles_on_login)」を参照してください。  
ただし、ストアドプロシージャを別のユーザーから呼び出す場合は、ストアドプロシージャの先頭で `SET ROLE ALL` を明示的に呼び出してロールをアクティブ化する必要があります。

Lambda 関数を呼び出そうとしたときに次のようなエラーが表示される場合は、`SET ROLE` ステートメントを実行します。

```
SQL Error [1227] [42000]: Access denied; you need (at least one of) the Invoke Lambda privilege(s) for this operation
```

`mysql.users` テーブルエントリに示すように、ロールを正しいユーザーに付与していることを確認します。同じ名前の複数のユーザーが異なるホストにいる可能性があります。`lambda_sync` 関数を呼び出すアプリケーションまたはホストに応じて、MySQL は `host` 列のエントリに従って最適なユーザーを選択します。

### Aurora MySQL バージョン 2 での権限の付与
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.v2"></a>

Aurora MySQL バージョン 2 では、ネイティブ関数を呼び出すユーザーには `INVOKE LAMBDA` 権限が付与されている必要があります。ユーザーにこの権限を付与するには、DB インスタンスに管理者ユーザーとして接続し、次のステートメントを実行します。

```
GRANT INVOKE LAMBDA ON *.* TO user@domain-or-ip-address
```

次のステートメントを実行することで、この権限を取り消すことができます。

```
REVOKE INVOKE LAMBDA ON *.* FROM user@domain-or-ip-address
```

### lambda\$1sync 関数の構文
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Syntax"></a>

`lambda_sync` 関数を `RequestResponse` 呼び出しタイプで同期的に呼び出します。関数は、JSON ペイロードで Lambda 呼び出しの結果を返します。関数の構文は次のとおりです。

```
lambda_sync (
  lambda_function_ARN,
  JSON_payload
)
```

### lambda\$1sync 関数のパラメータ
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Parameters"></a>

`lambda_sync` 関数には以下のパラメータがあります。

* lambda\$1function\$1ARN *  
呼び出す Lambda 関数の Amazon リソースネーム (ARN)。

* JSON\$1payload *  
呼び出した Lambda 関数の JSON 形式のペイロード

**注記**  
Aurora MySQL バージョン 3 は MySQL 8.0 からの JSON 分析関数をサポートしています。ただし、Aurora MySQL バージョン 2 には、これらの関数は含まれていません。Lambda 関数が、数値や文字列など、アトミック値を返す場合、JSON 分析は必要ありません。

### lambda\$1sync 関数の例
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Sync.Example"></a>

`lambda_sync` に基づく次のクエリは、関数 ARN を使用して Lambda 関数 `BasicTestLambda` を同期的に呼び出します。関数のペイロードは `{"operation": "ping"}` です。

```
SELECT lambda_sync(
    'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda',
    '{"operation": "ping"}');
```

### lambda\$1async 関数の構文
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Syntax"></a>

`lambda_async` 関数を `Event` 呼び出しタイプで非同期に呼び出します。関数は、JSON ペイロードで Lambda 呼び出しの結果を返します。関数の構文は次のとおりです。

```
lambda_async (
  lambda_function_ARN,
  JSON_payload
)
```

### lambda\$1async 関数のパラメータ
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Parameters"></a>

`lambda_async` 関数には以下のパラメータがあります。

* lambda\$1function\$1ARN *  
呼び出す Lambda 関数の Amazon リソースネーム (ARN)。

* JSON\$1payload *  
呼び出した Lambda 関数の JSON 形式のペイロード

**注記**  
Aurora MySQL バージョン 3 は MySQL 8.0 からの JSON 分析関数をサポートしています。ただし、Aurora MySQL バージョン 2 には、これらの関数は含まれていません。Lambda 関数が、数値や文字列など、アトミック値を返す場合、JSON 分析は必要ありません。

### lambda\$1async 関数の例
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.Async.Example"></a>

`lambda_async` に基づく次のクエリは、関数 ARN を使用して Lambda 関数 `BasicTestLambda` を非同期的に呼び出します。関数のペイロードは `{"operation": "ping"}` です。

```
SELECT lambda_async(
    'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda',
    '{"operation": "ping"}');
```

### トリガーを使用した Lambda 関数の呼び出し
<a name="AuroraMySQL.Integrating.NativeLambda.lambda_functions.trigger"></a>

トリガーを使用して、データ変更ステートメントで Lambda を呼び出すことができます。次の例では、`lambda_async` ネイティブ関数を使用して変数に結果を保存します。

```
mysql>SET @result=0;
mysql>DELIMITER //
mysql>CREATE TRIGGER myFirstTrigger
      AFTER INSERT
          ON Test_trigger FOR EACH ROW
      BEGIN
      SELECT lambda_async(
          'arn:aws:lambda:us-east-1:123456789012:function:BasicTestLambda',
          '{"operation": "ping"}')
          INTO @result;
      END; //
mysql>DELIMITER ;
```

**注記**  
トリガーは SQL ステートメントごとに 1 回実行されるのではなく、行ごとに 1 回、一度に 1 行ずつ変更されます。トリガーが実行されると、プロセスは同期されます。data-modifying ステートメントは、トリガーが完了したときにのみ返されます。  
書き込みトラフィックが多いテーブルのトリガーから AWS Lambda 関数を呼び出すときは注意してください。`INSERT`、`UPDATE`、`DELETE` のトリガーは行ごとにアクティブになります。`INSERT`、`UPDATE`、または `DELETE` トリガーがあるテーブルの書き込み負荷が高いと、AWS Lambda 関数の大量の呼び出しが発生します。

# Aurora MySQL ストアドプロシージャを使用した Lambda 関数の呼び出し (非推奨)
<a name="AuroraMySQL.Integrating.ProcLambda"></a>

`mysql.lambda_async` プロシージャを呼び出すことで、Aurora MySQL DB クラスターから AWS Lambda 関数を呼び出すことができます。このアプローチは、Aurora MySQL で実行しているデータベースを 他の AWS のサービスと統合するときに便利です。例えば、データベースの特定のテーブルに行が挿入されるたびに Amazon Simple Notification Service (Amazon SNS) を使用して通知を送信するような場合があります。

**Contents**
+ [Aurora MySQL バージョンに関する考慮事項](#AuroraMySQL.Integrating.ProcLambda.caveats)
+ [mysql.lambda\$1async プロシージャを使用した Lambda 関数の呼び出し (非推奨)](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async)
  + [構文](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Syntax)
  + [パラメータ](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Parameters)
  + [例](#AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Examples)

## Aurora MySQL バージョンに関する考慮事項
<a name="AuroraMySQL.Integrating.ProcLambda.caveats"></a>

Aurora MySQL バージョン 2 から、これらのストアドプロシージャの代わりにネイティブ関数メソッドを使用して Lambda 関数を呼び出すことができます。ネイティブ関数の詳細については、「[ネイティブ関数を使用した Lambda 関数の呼び出し](AuroraMySQL.Integrating.NativeLambda.md#AuroraMySQL.Integrating.NativeLambda.lambda_functions)」を参照してください。

Aurora MySQL バージョン 2 では、ストアドプロシージャ `mysql.lambda_async` はサポートされなくなりました。代わりに、ネイティブの Lambda 関数を使用することを強くお勧めします。

Aurora MySQL バージョン 3 では、ストアドプロシージャは使用できません。

## mysql.lambda\$1async プロシージャを使用した Lambda 関数の呼び出し (非推奨)
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async"></a>

`mysql.lambda_async` プロシージャは、Lambda 関数を非同期的に呼び出す組み込みストアドプロシージャです。このプロシージャを使用するには、`EXECUTE` ストアドプロシージャに対する `mysql.lambda_async` 権限がデータベースユーザーに必要です。

### 構文
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Syntax"></a>

`mysql.lambda_async` プロシージャの構文は次のとおりです。

```
CALL mysql.lambda_async (
  lambda_function_ARN,
  lambda_function_input
)
```

### パラメータ
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Parameters"></a>

`mysql.lambda_async` プロシージャには以下のパラメータがあります。

* lambda\$1function\$1ARN *  
呼び出す Lambda 関数の Amazon リソースネーム (ARN)。

* lambda\$1function\$1input *  
呼び出した Lambda 関数の入力文字列 (JSON 形式)。

### 例
<a name="AuroraMySQL.Integrating.Lambda.mysql_lambda_async.Examples"></a>

ベストプラクティスとして、`mysql.lambda_async` プロシージャへの呼び出しはストアドプロシージャでラップし、トリガーやクライアントコードなどのさまざまな出典から呼び出せるようにすることをお勧めします。このアプローチにより、インピーダンス不整合の問題を回避し、Lambda 関数を簡単に呼び出せるようになります。

**注記**  
書き込みトラフィックが多いテーブルのトリガーから AWS Lambda 関数を呼び出すときは注意してください。`INSERT`、`UPDATE`、`DELETE` のトリガーは行ごとにアクティブになります。`INSERT`、`UPDATE`、または `DELETE` トリガーがあるテーブルの書き込み負荷が高いと、AWS Lambda 関数の大量の呼び出しが発生します。  
`mysql.lambda_async` プロシージャの呼び出しは非同期ですが、トリガーは同期です。大量のトリガーのアクティベーションを発生させるステートメントは、AWS Lambda 関数の呼び出しが完了するのを待機しませんが、クライアントに制御を返す前にトリガーが完了するのを待ちます。

**Example 例: AWS Lambda 関数を呼び出して E メールを送信する**  
次の例では、データベースコードで呼び出せるストアドプロシージャを作成し、Lambda 関数を使用して E メールを送信します。  
**AWS Lambda 機能**  

```
import boto3

ses = boto3.client('ses')

def SES_send_email(event, context):

    return ses.send_email(
        Source=event['email_from'],
        Destination={
            'ToAddresses': [
            event['email_to'],
            ]
        },

        Message={
            'Subject': {
            'Data': event['email_subject']
            },
            'Body': {
                'Text': {
                    'Data': event['email_body']
                }
            }
        }
    )
```
**ストアドプロシージャ**  

```
DROP PROCEDURE IF EXISTS SES_send_email;
DELIMITER ;;
  CREATE PROCEDURE SES_send_email(IN email_from VARCHAR(255),
                                  IN email_to VARCHAR(255),
                                  IN subject VARCHAR(255),
                                  IN body TEXT) LANGUAGE SQL
  BEGIN
    CALL mysql.lambda_async(
         'arn:aws:lambda:us-west-2:123456789012:function:SES_send_email',
         CONCAT('{"email_to" : "', email_to,
             '", "email_from" : "', email_from,
             '", "email_subject" : "', subject,
             '", "email_body" : "', body, '"}')
     );
  END
  ;;
DELIMITER ;
```
**ストアドプロシージャを呼び出して AWS Lambda 関数を呼び出す**  

```
mysql> call SES_send_email('example_from@amazon.com', 'example_to@amazon.com', 'Email subject', 'Email content');
```

**Example 例: AWS Lambda 関数を呼び出してトリガーからイベントを発行する**  
次の例では、Amazon SNS を使用してイベントを発行するストアドプロシージャを作成 します。コードでは、行がテーブルに追加されると、トリガーからプロシージャを呼び出します。  
**AWS Lambda 機能**  

```
import boto3

sns = boto3.client('sns')

def SNS_publish_message(event, context):

    return sns.publish(
        TopicArn='arn:aws:sns:us-west-2:123456789012:Sample_Topic',
        Message=event['message'],
        Subject=event['subject'],
        MessageStructure='string'
    )
```
**ストアドプロシージャ**  

```
DROP PROCEDURE IF EXISTS SNS_Publish_Message;
DELIMITER ;;
CREATE PROCEDURE SNS_Publish_Message (IN subject VARCHAR(255),
                                      IN message TEXT) LANGUAGE SQL
BEGIN
  CALL mysql.lambda_async('arn:aws:lambda:us-west-2:123456789012:function:SNS_publish_message',
     CONCAT('{ "subject" : "', subject,
            '", "message" : "', message, '" }')
     );
END
;;
DELIMITER ;
```
**テーブル**  

```
CREATE TABLE 'Customer_Feedback' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'customer_name' varchar(255) NOT NULL,
  'customer_feedback' varchar(1024) NOT NULL,
  PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
**Trigger トリガー**  

```
DELIMITER ;;
CREATE TRIGGER TR_Customer_Feedback_AI
  AFTER INSERT ON Customer_Feedback
  FOR EACH ROW
BEGIN
  SELECT CONCAT('New customer feedback from ', NEW.customer_name), NEW.customer_feedback INTO @subject, @feedback;
  CALL SNS_Publish_Message(@subject, @feedback);
END
;;
DELIMITER ;
```
**通知をトリガーするには、テーブルに行を挿入します**  

```
mysql> insert into Customer_Feedback (customer_name, customer_feedback) VALUES ('Sample Customer', 'Good job guys!');
```

# Amazon CloudWatch Logs への Amazon Aurora MySQL ログの発行
<a name="AuroraMySQL.Integrating.CloudWatch"></a>

Aurora MySQL DB クラスターを設定して、全般ログ、スローログ、監査ログおよびエラーログのデータを Amazon CloudWatch Logs のロググループに発行できます。CloudWatch Logs を使用すると、ログデータのリアルタイム分析や、CloudWatch を使用したアラームの作成、メトリクスの表示を行うことができます。CloudWatch Logs を使用して、耐久性の高いストレージにログレコードを格納できます。

ログを CloudWatch Logs に発行するには、それぞれのログを有効にする必要があります。エラーログはデフォルトで有効になっていますが、他のタイプのログは明示的に有効にする必要があります。MySQL でログを有効にする方法については、MySQL ドキュメントの「[一般クエリログおよびスロークエリログの出力先の選択](https://dev.mysql.com/doc/refman/8.0/en/log-destinations.html)」を参照してください。Aurora MySQL 監査ログを有効にする方法については、「[アドバンストな監査の有効化](AuroraMySQL.Auditing.md#AuroraMySQL.Auditing.Enable)」を参照してください。

**注記**  
Aurora は、無効化された監査ログデータをエクスポートする場合に、既存のロググループまたはログストリームを削除しません。既存の監査ログデータが無効化されている場合、既存のログは保持期間により、CloudWatch Logs で使用可能となり、保管された監査ログデータに変更を加えることもできます。ログストリーミングとロググループは、CloudWatch Logs コンソール、AWS CLI または CloudWatch Logs API を使用して削除できます。
CloudWatch Logs に監査ログを発行する別の方法は、[高度な監査] を有効にし、カスタウ DB クラスターパラメータグループを作成して、`server_audit_logs_upload` パラメータを `1` に設定することです。`server_audit_logs_upload` DB クラスターパラメータのデフォルト値は `0` です。[高度な監査] を有効にする方法については、「[Amazon Aurora MySQL DB クラスターでのアドバンストな監査の使用](AuroraMySQL.Auditing.md)」を参照してください。  
この代替メソッドを使用する場合、CloudWatch Logs にアクセスして `aws_default_logs_role` クラスターレベルパラメータをこのロールの ARN に設定するには、IAM ロールが必要です。ロールの作成の詳細については、「[AWS のサービスにアクセスするための IAM ロールの設定](AuroraMySQL.Integrating.Authorizing.IAM.md)」を参照してください。ただし、`AWSServiceRoleForRDS` サービスにリンクされたロールがある場合、CloudWatch Logs へのアクセスが提供され、カスタム定義のロールが上書きされます。Amazon RDS のサービスにリンクされたロールの詳細については、「[Amazon Aurora のサービスにリンクされたロールの使用](UsingWithRDS.IAM.ServiceLinkedRoles.md)」を参照してください。
監査ログを CloudWatch Logs にエクスポートしない場合は、監査ログをエクスポートするすべてのメソッドが無効になっていることを確認してください。これらのメソッドは、AWS マネジメントコンソール、AWS CLI、RDS API、および `server_audit_logs_upload` パラメータです。
 Aurora Serverless v1 DB クラスターの手順は、プロビジョンドインスタンスや Aurora Serverless v2 インスタンスを含む DB クラスターの手順とは少し異なります。Aurora Serverless v1 クラスターでは、設定パラメータによって有効にしたすべてのログを自動的にアップロードします。  
したがって、Aurora Serverless v1 DB クラスターでログのアップロードを有効または無効にするには、DB クラスターのパラメータグループでログタイプ別にオンとオフを切り替えます。AWS マネジメントコンソール、AWS CLI、または RDS API でクラスター自体の設定は変更しません。Aurora Serverless v1 クラスターの MySQL ログのオンとオフの詳細については、「[Aurora Serverless v1 のパラメータグループ](aurora-serverless-v1.how-it-works.md#aurora-serverless.parameter-groups)」を参照してください。

## コンソール
<a name="AuroraMySQL.Integrating.CloudWatch.Console"></a>

コンソールを使用して、プロビジョンドクラスターの Aurora MySQL ログを CloudWatch Logs に発行できます。

**コンソールから Aurora MySQL ログを発行するには**

1. Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**データベース**] を選択します。

1. ログデータを公開する Aurora MySQL DB クラスターを選択します。

1. **Modify** を選択します。

1. [**ログのエクスポート**] セクションで、CloudWatch Logs に公開するログを選択します。

1. [**続行**] を選択し、概要ページで [**Modify DB Cluster (DB クラスターの変更)**] を選択します。

## AWS CLI
<a name="AuroraMySQL.Integrating.CloudWatch.CLI"></a>

AWS CLI を使用して、プロビジョンドクラスターの Aurora MySQL ログを公開できます。これを行うには、以下のオプションを指定して [modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html) AWS CLI コマンドを実行します。
+ `--db-cluster-identifier`— DB クラスター識別子。
+ `--cloudwatch-logs-export-configuration` — DB クラスターの CloudWatch Logs へのエクスポートに使用できるログタイプの構成設定。

以下の AWS CLI コマンドのいずれかを実行することで、Aurora MySQL ログを公開することもできます。
+ [create-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html)
+ [restore-db-cluster-from-s3](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-from-s3.html)
+ [restore-db-cluster-from-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-from-snapshot.html)
+ [restore-db-cluster-to-point-in-time](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-cluster-to-point-in-time.html)

以下のオプションを使用して、この AWS CLI コマンドの 1 つを実行します。
+ `--db-cluster-identifier`— DB クラスター識別子。
+ `--engine` — データベースエンジン。
+ `--enable-cloudwatch-logs-exports` — DB クラスターの CloudWatch Logs へのエクスポートに使用できるログタイプの構成設定。

実行する AWS CLI コマンドに応じて、他のオプションが必要となる場合があります。

**Example**  
次のコマンドでは、ログファイルが CloudWatch Logs に発行されるよう既存の Aurora MySQL DB クラスターを変更します。  
Linux、macOS、Unix の場合:  

```
1. aws rds modify-db-cluster \
2.     --db-cluster-identifier mydbcluster \
3.     --cloudwatch-logs-export-configuration '{"EnableLogTypes":["error","general","slowquery","audit","instance"]}'
```
Windows の場合:  

```
1. aws rds modify-db-cluster ^
2.     --db-cluster-identifier mydbcluster ^
3.     --cloudwatch-logs-export-configuration '{"EnableLogTypes":["error","general","slowquery","audit","instance"]}'
```

**Example**  
次のコマンドでは、ログファイルが CloudWatch Logs に発行されるよう Aurora MySQL DB クラスターを作成します。  
Linux、macOS、Unix の場合:  

```
1. aws rds create-db-cluster \
2.     --db-cluster-identifier mydbcluster \
3.     --engine aurora \
4.     --enable-cloudwatch-logs-exports '["error","general","slowquery","audit","instance"]'
```
Windows の場合:  

```
1. aws rds create-db-cluster ^
2.     --db-cluster-identifier mydbcluster ^
3.     --engine aurora ^
4.     --enable-cloudwatch-logs-exports '["error","general","slowquery","audit","instance"]'
```

## RDS API
<a name="AuroraMySQL.Integrating.CloudWatch.API"></a>

RDS API を使用して、プロビジョンドクラスターの Aurora MySQL ログを発行できます。これを行うには、以下のオプションを指定して [ModifyDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBCluster.html) オペレーションを実行します。
+ `DBClusterIdentifier`— DB クラスター識別子。
+ `CloudwatchLogsExportConfiguration` — DB クラスターの CloudWatch Logs へのエクスポートに使用できるログタイプの構成設定。

以下の RDS API オペレーションのいずれかを実行することで、RDS API を使用して Aurora MySQL ログを発行することもできます。
+ [CreateDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBCluster.html)
+ [RestoreDBClusterFromS3](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBClusterFromS3.html)
+ [RestoreDBClusterFromSnapshot](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBClusterFromSnapshot.html)
+ [RestoreDBClusterToPointInTime](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBClusterToPointInTime.html)

次のパラメータを指定して、RDS API オペレーションを実行します。
+ `DBClusterIdentifier`— DB クラスター識別子。
+ `Engine` — データベースエンジン。
+ `EnableCloudwatchLogsExports` — DB クラスターの CloudWatch Logs へのエクスポートに使用できるログタイプの構成設定。

実行する AWS CLI コマンドに応じて、他のパラメータが必要となる場合があります。

## Amazon CloudWatch でログイベントをモニタリングする
<a name="AuroraMySQL.Integrating.CloudWatch.Monitor"></a>

Aurora MySQL ログイベントを有効にすると、Amazon CloudWatch Logs でイベントをモニタリングできます。新しいクラスターロググループは、`cluster-name` が DB クラスター名となり、`log_type` がログタイプとなる次のプレフィックスの Aurora DB クラスターに自動的に作成されます。

```
/aws/rds/cluster/cluster-name/log_type
```

例えば、エクスポート関数を設定して、`mydbcluster` という名前の DB クラスターのスロークエリログを作成すると、スロークエリデータは、`/aws/rds/cluster/mydbcluster/slowquery` ロググループのスロークエリログストリーミングに保存されます。

クラスターのすべてのインスタンスにおけるイベントは、異なるログストリーミングを使用して、ロググループにプッシュされます。この動作は、次の条件のうちのどちらが true であるかによって異なります。
+ 指定された名前のロググループが存在する。

  Aurora は既存のロググループを使用して、クラスターにログデータをエクスポートします。事前定義されたログ保持期間、メトリクスフィルター、カスタムアクセスを持つロググループを作成するために、AWS CloudFormationのような自動設定を使用できます。
+ 指定された名前のロググループが存在しない。

  一致するログエントリがインスタンスのログファイルで検出されると、Aurora MySQL は CloudWatch Logs に新しいロググループを自動的に作成します。ロググループは、**失効しない**デフォルトのログ保持期間を使用します。

  ログの保持期間を変更するには、CloudWatch Logs コンソール、AWS CLI、または CloudWatch Logs API を使用します。CloudWatch Logs でログの保持期間を変更する方法の詳細については、「[CloudWatch Logs でのログデータ保管期間の変更](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SettingLogRetention.html)」を参照してください。

DB クラスターのログイベント内の情報を検索するには、CloudWatch Logs コンソール、AWS CLI、または CloudWatch Logs API を使用します。検索およびログデータのフィルタ処理の詳細については、「[ログデータの検索およびフィルタ処理](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringLogData.html)」を参照してください。

# Amazon Aurora MySQL ラボモード
<a name="AuroraMySQL.Updates.LabMode"></a><a name="labmode"></a>

**重要**  
ラボモードは、[高速 DDL](AuroraMySQL.Managing.FastDDL.md) の最適化で特定の DDL オペレーションの効率を向上させるために、Aurora MySQL バージョン 2 で導入されました。Aurora MySQL バージョン 3 では、ラボモードが削除され、高速 DDL は MySQL 8.0 の[インスタント DDL](https://dev.mysql.com/doc/refman/8.4/en/innodb-online-ddl-operations.html) と呼ばれる機能に置き換えられました。

Aurora ラボモードは、現在の Aurora データベースバージョンで使用できるが、デフォルトでは有効でない Aurora 機能を有効にするために使用されます。本番稼働用 DB クラスターに Aurora ラボモード機能を使用することは推奨されませんが、Aurora ラボモードを使用して開発環境とテスト環境の DB クラスターに対してこれらの機能を有効にすることができます。Aurora ラボモードが有効なときに利用できる Aurora 機能の詳細については、「[Aurora ラボモードの機能](#AuroraMySQL.Updates.LabModeFeatures)」を参照してください。

`aurora_lab_mode` パラメーターはインスタンスレベルのパラメーターであり、デフォルトのクラスターパラメーターグループにあります。デフォルトパラメータグループでは、パラメータは `0` (無効) に設定されます。Aurora ラボモードを有効にするには、カスタムパラメータグループを作成して、`aurora_lab_mode` パラメータをカスタムパラメータグループの `1` (有効) に設定し、カスタムパラメータグループを使用するように、Aurora クラスターの 1 つ以上の DB インスタンスを変更します。次に、ラボモード機能を試用するのに適切なインスタンスのエンドポイントに接続します。DB パラメータグループの変更については、「[Amazon Aurora の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。パラメータグループおよび Amazon Aurora の詳細については、「[Aurora MySQL 設定パラメータ](AuroraMySQL.Reference.ParameterGroups.md)」を参照してください。

## Aurora ラボモードの機能
<a name="AuroraMySQL.Updates.LabModeFeatures"></a>

次の Aurora 機能は、Aurora ラボモードが有効なときに現時点で利用できます。これらの機能を使用する前に、Aurora ラボモードを有効にする必要があります。

**高速 DDL**  
この機能を使用すると、`ALTER TABLE tbl_name ADD COLUMN col_name column_definition` オペレーションをほぼ瞬時に実行できます。このオペレーションでは、テーブルをコピーする必要はありません。他の DML ステートメントに実質的な影響を及ぼすこともありません。これは、テーブルのコピーにテンポラリストレージを使用しないため、スモールインスタンスクラスの大きなテーブルに対しても、DDL ステートメントを使用できます。  
高速 DDL は現在、デフォルトの値を持たない、null が許容される列を、表の末尾に追加する際にのみ使用できます。この機能の使用方法については、「[高速 DDL を使用して Amazon Aurora のテーブルを変更する](AuroraMySQL.Managing.FastDDL.md)」を参照してください。

# Amazon Aurora MySQL を使用する際のベストプラクティス
<a name="AuroraMySQL.BestPractices"></a><a name="best_practices"></a>

このトピックには、Amazon Aurora MySQL DB クラスターの使用およびデータ移行のベストプラクティスとオプションに関する情報が含まれます。このトピックの情報は、[Amazon Aurora DB クラスターの管理](CHAP_Aurora.md) にあるガイドラインや手順を一部要約し、改めて説明したものです。

**Contents**
+ [接続先の DB インスタンスの確認](#AuroraMySQL.BestPractices.DeterminePrimaryInstanceConnection)
+ [Aurora MySQL のパフォーマンスとスケーリングのためのベストプラクティス](AuroraMySQL.BestPractices.Performance.md)
  + [開発やテストのための T インスタンスクラスの使用](AuroraMySQL.BestPractices.Performance.md#AuroraMySQL.BestPractices.T2Medium)
  + [Asynchronous Key Prefetch を使用した Aurora MySQL インデックス付き結合クエリの最適化](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.AKP)
    + [Asynchronous Key Prefetch の有効化](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.AKP.Enabling)
    + [Asynchronous Key Prefetch のクエリの最適化](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.AKP.Optimizing)
  + [ハッシュ結合を使用した大規模な Aurora MySQL 結合クエリの最適化](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.HashJoin)
    + [ハッシュ結合を有効にする](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.HashJoin.Enabling)
    + [ハッシュ結合のクエリの最適化](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.HashJoin.Optimizing)
  + [Amazon Aurora を使用した MySQL データベースの読み取りスケーリング](AuroraMySQL.BestPractices.Performance.md#AuroraMySQL.BestPractices.ReadScaling)
  + [タイムスタンプ操作の最適化](AuroraMySQL.BestPractices.Performance.md#AuroraMySQL.BestPractices.Performance.TimeZone)
  + [仮想インデックス ID オーバーフローエラー](AuroraMySQL.BestPractices.Performance.md#AuroraMySQL.BestPractices.Performance.VirtualIndexIDOverflow)
+ [Aurora MySQL の高可用性のベストプラクティス](AuroraMySQL.BestPractices.HA.md)
  + [Amazon Aurora を使用した MySQL データベースのディザスタリカバリ](AuroraMySQL.BestPractices.HA.md#AuroraMySQL.BestPractices.DisasterRecovery)
  + [ダウンタイムを短縮して MySQL から Amazon Aurora MySQL に移行する](AuroraMySQL.BestPractices.HA.md#AuroraMySQL.BestPractices.Migrating)
  + [Aurora MySQL DB インスタンスの低パフォーマンス、自動再起動、フェイルオーバーの回避](AuroraMySQL.BestPractices.HA.md#AuroraMySQL.BestPractices.Avoiding)
+ [Aurora MySQL の MySQL 機能の推奨事項](AuroraMySQL.BestPractices.FeatureRecommendations.md)
  + [Aurora MySQL でのマルチスレッドレプリケーションの使用](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.MTReplica)
  + [ネイティブ MySQL 関数を使用した AWS Lambda 関数の呼び出し](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.Lambda)
  + [Amazon Aurora MySQL での XA トランザクションの回避](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.XA)
  + [DML ステートメント中に外部キーを有効にしておく](AuroraMySQL.BestPractices.FeatureRecommendations.md#Aurora.BestPractices.ForeignKeys)
  + [ログバッファをフラッシュする頻度の設定](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.Flush)
  + [Aurora MySQL デッドロックの最小化とトラブルシューティング](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.deadlocks)
    + [InnoDB デッドロックの最小化](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.deadlocks-minimize)
    + [InnoDB デッドロックのモニタリング](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.deadlocks-monitor)
+ [Amazon CloudWatch メトリクスで Aurora MySQL インスタンスの使用量を評価する](AuroraMySQL.BestPractices.CW.md)

## 接続先の DB インスタンスの確認
<a name="AuroraMySQL.BestPractices.DeterminePrimaryInstanceConnection"></a>

Aurora MySQL DB クラスター内のどの DB インスタンスに接続しているかを確認するには、次の例に示すように、`innodb_read_only` グローバル可変をチェックします。

```
SHOW GLOBAL VARIABLES LIKE 'innodb_read_only'; 
```

リーダー DB インスタンスに接続している場合、`innodb_read_only` 可変が `ON` に設定されます。プロビジョニングされたクラスターのプライマリインスタンスなどのライター DB インスタンスに接続している場合、この設定は `OFF` です。

この方法は、ワークロードを分散させるロジックや、書き込みオペレーションで適切な接続が使用されているかを確認するロジックを、アプリケーションコードに追加する場合に便利です。

# Aurora MySQL のパフォーマンスとスケーリングのためのベストプラクティス
<a name="AuroraMySQL.BestPractices.Performance"></a>

次のベストプラクティスを適用して、Aurora MySQL クラスターのパフォーマンスとスケーラビリティを向上させることができます。

**Topics**
+ [開発やテストのための T インスタンスクラスの使用](#AuroraMySQL.BestPractices.T2Medium)
+ [Asynchronous Key Prefetch を使用した Aurora MySQL インデックス付き結合クエリの最適化](#Aurora.BestPractices.AKP)
+ [ハッシュ結合を使用した大規模な Aurora MySQL 結合クエリの最適化](#Aurora.BestPractices.HashJoin)
+ [Amazon Aurora を使用した MySQL データベースの読み取りスケーリング](#AuroraMySQL.BestPractices.ReadScaling)
+ [タイムスタンプ操作の最適化](#AuroraMySQL.BestPractices.Performance.TimeZone)
+ [仮想インデックス ID オーバーフローエラー](#AuroraMySQL.BestPractices.Performance.VirtualIndexIDOverflow)

## 開発やテストのための T インスタンスクラスの使用
<a name="AuroraMySQL.BestPractices.T2Medium"></a>

`db.t2`、`db.t3`、または `db.t4g` DB インスタンスクラスを使用する Amazon Aurora MySQL インスタンスは、長い時間大量のワークロードをサポートしないアプリケーションに最適です。T インスタンスは、適度なベースラインパフォーマンスを実現したり、ワークロードの必要に応じて非常に高いパフォーマンスまでバーストする機能を実現できるように設計されています。常時または一貫して CPU をフルに使用するわけではないが、バーストが必要なことがあるワークロード向けに用意されています。T DB インスタンスクラスを、開発サーバーおよびテストサーバー、または他の本稼働以外のサーバーにのみ使用することをお勧めします。T インスタンスクラスの詳細については、「[バーストパフォーマンスインスタンス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html)」を参照してください。

Aurora クラスターが 40 TB より大きい場合は、T インスタンスクラスを使用しないでください。データベースに大量のデータがある場合、スキーマオブジェクトを管理するためのメモリオーバーヘッドが T インスタンスの容量を超えることがあります。

Amazon Aurora MySQL T インスタンスに対して MySQL パフォーマンススキーマを有効にしないでください。パフォーマンススキーマが有効な場合、インスタンスはメモリ不足になることがあります。

**ヒント**  
 データベースがときにはアイドル状態になるが、それ以外では相当なワークロードがある場合は、T インスタンスの代替として Aurora Serverless v2 を使用できます。Aurora Serverless v2 では、容量範囲を定義すると、Aurora は現在のワークロードに応じてデータベースを自動的にスケールアップまたはスケールダウンします。使用方法の詳細については、「[Aurora Serverless v2 の使用](aurora-serverless-v2.md)」を参照してください。Aurora Serverless v2 で使用できるデータベースエンジンのバージョンについては、「[Aurora Serverless v2 の要件と制限](aurora-serverless-v2.requirements.md)」を参照してください。

T インスタンスを Aurora MySQL DB クラスターの DB インスタンスとして使用する場合は、次のことをお勧めします。
+ DB クラスター内のすべてのインスタンスに同じ DB インスタンスクラスを使用します。例えば、ライターインスタンスに `db.t2.medium` を使用する場合は、リーダーインスタンスにも `db.t2.medium` を使用することをお勧めします。
+ メモリ関連の構成設定 (`innodb_buffer_pool_size` など) を調整しないでください。Aurora は、T インスタンスのメモリバッファに、高度に調整された一連のデフォルト値を使用します。これらの特殊なデフォルトは、メモリに制約のあるインスタンスで Aurora を実行するために必要です。T インスタンスでメモリ関連の設定を変更すると、バッファサイズを増やすための変更であっても、メモリ不足状態が発生する可能性が高くなります。
+ CPU クレジットバランス (`CPUCreditBalance`) をモニタリングして、持続可能なレベルにあることを確認します。つまり、CPU のクレジットは使用されるのと同じレートで累積されています。

  インスタンス用の CPU クレジットが枯渇した場合、利用可能な CPU が急減するため、そのインスタンスに対する読み取りおよび書き込みレイテンシーが長くなります。この状況になると、インスタンス全体のパフォーマンスが大幅に低下します。

  CPU クレジット残高が持続可能なレベルにない場合、サポートされているいずれかの R DB インスタンスクラスを使用するように DB インスタンスを変更すること (コンピューティングのスケーリング) をお勧めします。

  モニタリングメトリクスの詳細については、「[Amazon RDS コンソールでのメトリクスの表示](USER_Monitoring.md)」を参照してください。
+ ライターインスタンスとリーダーインスタンスの間のレプリカラグ (`AuroraReplicaLag`) をモニタリングします。

  ライターインスタンスよりも前にリーダーインスタンスで CPU クレジットが枯渇した場合、結果として生じるラグにより、リーダーインスタンスが頻繁に再起動することがあります。このような結果になるのは一般的に、アプリケーション側で負荷の高い読み取り操作がリーダーインスタンス間に分散されるときに、ライターインスタンス側で書き込み操作の負荷が最小限に抑えられている場合です。

  レプリカラグの増加が持続している場合、DB クラスターのリーダーインスタンスの CPU クレジット残高が枯渇していないことを確認します。

  CPU クレジット残高が持続可能なレベルにない場合は、サポートされているいずれかの R DB インスタンスクラスを使用するように DB インスタンスを変更すること (コンピューティングのスケーリング) をお勧めします。
+ バイナリログが有効な DB クラスターのトランザクションあたりの挿入の数を 100 万以下に維持します。

  DB クラスターの DB クラスターパラメータグループで `binlog_format` パラメータを `OFF` 以外の値に設定している場合、DB クラスターに 1,000,000 行以上の挿入を含むトランザクションがあると、DB クラスターでメモリが不足することがあります。解放可能なメモリ (`FreeableMemory`) メトリクスをモニタリングして、DB クラスターで使用可能なメモリが不足しているかどうかを判断できます。その後、書き込みオペレーション (`VolumeWriteIOPS`) メトリクスをモニタリングして、書き込みインスタンスで書き込みオペレーションの負荷が高いかどうかを確認します。メモリが不足し、書き込みオペレーションの負荷が高い場合は、トランザクションの挿入数を 100 万未満に制限するようにアプリケーションを更新することをお勧めします。または、サポートされているいずれかの R DB インスタンスクラスを使用するようにインスタンスを変更すること (コンピューティングのスケーリング) もできます。

## Asynchronous Key Prefetch を使用した Aurora MySQL インデックス付き結合クエリの最適化
<a name="Aurora.BestPractices.AKP"></a>

Aurora MySQL は Asynchronous Key Prefetch (AKP) を使用すると、インデックス間でテーブルを結合するクエリのパフォーマンスが向上することがあります。この機能は、JOIN クエリで Batched Key Access (BKA) 結合アルゴリズムと Multi-Range Read (MRR) 最適化機能が必要な場合、クエリの実行に必要な行を予測することで、パフォーマンスを向上させます。BKA と MRR の詳細については、MySQL ドキュメントの「[Block Nested-Loop 結合と Batched Key Access 結合](https://dev.mysql.com/doc/refman/5.6/en/bnl-bka-optimization.html)」および「[Multi-Range Read の最適化](https://dev.mysql.com/doc/refman/5.6/en/mrr-optimization.html)」を参照してください。

AKP 機能を利用するには、クエリで BKA と MRR の両方を使用する必要があります。通常、このようなクエリは、クエリの JOIN 句でセカンダリインデックスを使用するが、プライマリインデックスからの一部の列を必要とする場合に発生します。例えば、JOIN 句が小さい外部テーブルと大きい内部テーブル間のインデックス値の等価結合を表し、大きいテーブルに対するインデックスの選択性が高い場合に、AKP を使用できます。AKP は、BKA および MRR と連携し、JOIN 句の評価時にセカンダリからプライマリへのインデックスのルックアップを行います。AKP は、JOIN 句の評価時にクエリの実行に必要な行を特定します。次に、バックグラウンドスレッドを使用して、クエリの実行前に、これらの行を含むページを非同期的にメモリ内にロードします。

AKP は、Aurora MySQL バージョン 2.10 以降、およびバージョン 3 でサポートされています。Aurora MySQL のバージョンの詳細については、「[Amazon Aurora MySQL のデータベースエンジンの更新Amazon Aurora MySQL の長期サポート (LTS) とベータリリース](AuroraMySQL.Updates.md)」を参照してください。

### Asynchronous Key Prefetch の有効化
<a name="Aurora.BestPractices.AKP.Enabling"></a>

AKP 機能を有効にするには、MySQL サーバー可変 `aurora_use_key_prefetch` を `on` に設定します。デフォルトではこの値は `on` に設定されます。ただし、BKA 結合アルゴリズムを有効にして、コストベースの MRR 機能を無効にするまでは、AKP を有効にすることはできません。そのためには、MySQL サーバー可変 `optimizer_switch` に以下の値を設定する必要があります。
+ `batched_key_access` を `on` に設定します。この値は BKA 結合アルゴリズムの使用を制御します。デフォルトではこの値は `off` に設定されます。
+ `mrr_cost_based` を `off` に設定します。この値は、コストベースの MRR 機能の使用を制御します。デフォルトではこの値は `on` に設定されます。

現在、これらの値はセッションレベルでのみ設定できます。次の例は、これらの値を設定し、SET ステートメントを実行して現在のセッションで AKP を有効にする方法を示しています。

```
mysql> set @@session.aurora_use_key_prefetch=on;
mysql> set @@session.optimizer_switch='batched_key_access=on,mrr_cost_based=off';
```

同様に、SET ステートメントを使用して AKP と BKA 結合アルゴリズムを無効にし、現在のセッションでコストベースの MRR 機能を再度有効にすることができます。次に例を示します。

```
mysql> set @@session.aurora_use_key_prefetch=off;
mysql> set @@session.optimizer_switch='batched_key_access=off,mrr_cost_based=on';
```

**batched\$1key\$1access** および **mrr\$1cost\$1based** オプティマイザスイッチの詳細については、MySQL ドキュメントの「[切り替え可能な最適化の制御](https://dev.mysql.com/doc/refman/5.6/en/switchable-optimizations.html)」を参照してください。

### Asynchronous Key Prefetch のクエリの最適化
<a name="Aurora.BestPractices.AKP.Optimizing"></a>

クエリで AKP 機能を利用できるかどうかを確認できます。そのためには、`EXPLAIN` ステートメントを使って、実行する前にクエリをプロファイリングします。`EXPLAIN` ステートメントは、指定されたクエリで使用する実行プランに関する情報を提供します。

`EXPLAIN` ステートメントの出力で、`Extra` 列は実行プランに含まれている追加情報を示します。AKP 機能の適用先がクエリで使用されているテーブルである場合、この列には次のいずれかの値が含まれます。
+ `Using Key Prefetching`
+ `Using join buffer (Batched Key Access with Key Prefetching)`

次の例では、`EXPLAIN` を使用することで、AKP を利用できるクエリの実行プランを表示しています。

```
mysql> explain select sql_no_cache
    ->     ps_partkey,
    ->     sum(ps_supplycost * ps_availqty) as value
    -> from
    ->     partsupp,
    ->     supplier,
    ->     nation
    -> where
    ->     ps_suppkey = s_suppkey
    ->     and s_nationkey = n_nationkey
    ->     and n_name = 'ETHIOPIA'
    -> group by
    ->     ps_partkey having
    ->         sum(ps_supplycost * ps_availqty) > (
    ->             select
    ->                 sum(ps_supplycost * ps_availqty) * 0.0000003333
    ->             from
    ->                 partsupp,
    ->                 supplier,
    ->                 nation
    ->             where
    ->                 ps_suppkey = s_suppkey
    ->                 and s_nationkey = n_nationkey
    ->                 and n_name = 'ETHIOPIA'
    ->         )
    -> order by
    ->     value desc;
+----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+
| id | select_type | table    | type | possible_keys         | key           | key_len | ref                              | rows | filtered | Extra                                                       |
+----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+
|  1 | PRIMARY     | nation   | ALL  | PRIMARY               | NULL          | NULL    | NULL                             |   25 |   100.00 | Using where; Using temporary; Using filesort                |
|  1 | PRIMARY     | supplier | ref  | PRIMARY,i_s_nationkey | i_s_nationkey | 5       | dbt3_scale_10.nation.n_nationkey | 2057 |   100.00 | Using index                                                 |
|  1 | PRIMARY     | partsupp | ref  | i_ps_suppkey          | i_ps_suppkey  | 4       | dbt3_scale_10.supplier.s_suppkey |   42 |   100.00 | Using join buffer (Batched Key Access with Key Prefetching) |
|  2 | SUBQUERY    | nation   | ALL  | PRIMARY               | NULL          | NULL    | NULL                             |   25 |   100.00 | Using where                                                 |
|  2 | SUBQUERY    | supplier | ref  | PRIMARY,i_s_nationkey | i_s_nationkey | 5       | dbt3_scale_10.nation.n_nationkey | 2057 |   100.00 | Using index                                                 |
|  2 | SUBQUERY    | partsupp | ref  | i_ps_suppkey          | i_ps_suppkey  | 4       | dbt3_scale_10.supplier.s_suppkey |   42 |   100.00 | Using join buffer (Batched Key Access with Key Prefetching) |
+----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+
6 rows in set, 1 warning (0.00 sec)
```

`EXPLAIN` 出力形式の詳細については、MySQL ドキュメントの「[拡張 EXPLAIN 出力形式](https://dev.mysql.com/doc/refman/8.0/en/explain-extended.html)」を参照してください。

## ハッシュ結合を使用した大規模な Aurora MySQL 結合クエリの最適化
<a name="Aurora.BestPractices.HashJoin"></a>

等価結合を使用して大量のデータを結合する必要がある場合は、ハッシュ結合によりクエリのパフォーマンスが向上することがあります。Aurora MySQL に対してハッシュ結合を有効にすることができます。

ハッシュ結合列には任意の複合表現を使用できます。ハッシュ結合列では、以下のようなデータ型間での比較が可能です。
+ `int`、`bigint`、`numeric`、`bit` などの厳密数値データ型のカテゴリ内で項目を比較できます。
+ `float`、`double` などの近似数値データ型のカテゴリ内で項目を比較できます。
+ 文字列型間で文字セットと照合が同じであれば、文字列型間で項目を比較できます。
+ 日付およびタイムスタンプデータ型間で、型が同じあれば、項目を比較できます。

**注記**  
異なるカテゴリのデータ型を比較することはできません。

Aurora MySQL のハッシュ結合には、以下の制限が適用されます。
+ 左右外部結合は、Aurora MySQL バージョン 2 ではサポートされていませんが、バージョン 3 ではサポートされています。
+ サブクエリが初期にマテリアライズされない限り、サブクエリなどの準結合はサポートされていません。
+ 複数テーブルの更新や削除はサポートされていません。
**注記**  
単一テーブルの更新や削除はサポートされていません。
+ BLOB および空間データ型の列をハッシュ結合の結合列にすることはできません。

### ハッシュ結合を有効にする
<a name="Aurora.BestPractices.HashJoin.Enabling"></a>

ハッシュ結合を有効にするには:
+ Aurora MySQL バージョン 2 - DB パラメータまたは DB クラスターパラメータ `aurora_disable_hash_join` を `0` に設定します。`aurora_disable_hash_join` をオフにすると、`optimizer_switch` の値が `hash_join=on` に設定されます。
+ Aurora MySQL バージョン 3 — MySQL サーバーパラメータ `optimizer_switch` を `block_nested_loop=on` に設定します。

ハッシュ結合は、Aurora MySQL バージョン 3 ではデフォルトで有効であり、Aurora MySQL バージョン 2 ではデフォルトで無効になっています。次の例は、Aurora MySQL バージョン 3 でハッシュ結合を有効にする方法を示しています。ステートメント `select @@optimizer_switch` をまず発行して、他にどのような設定が `SET` パラメータ文字列にあるか確認することができます。`optimizer_switch` パラメータの設定の一つを更新しても、他の設定は消去されたり修正されたりしません。

```
mysql> SET optimizer_switch='block_nested_loop=on';
```

**注記**  
Aurora MySQL バージョン 3 では、ハッシュ結合サービスはすべてのマイナーバージョンで利用可能で、デフォルトで有効になっています。  
Aurora MySQL バージョン 2 の場合、ハッシュ結合サポートはすべてのマイナーバージョンで利用可能です。Aurora MySQL バージョン 2 の場合、ハッシュ結合機能は常に `aurora_disable_hash_join` の値によって制御されます。

この設定では、オプティマイザーはコスト、クエリの特徴、リソースの可用性に基づいてハッシュ結合を選択します。コスト見積りが正しくない場合に、オプティマイザーにハッシュ結合を選択させることができます。そのためには、MySQL サーバー可変 `hash_join_cost_based` を `off` に設定します。以下の例に示しているのは、オプティマイザーにハッシュ結合を選択させる方法です。

```
mysql> SET optimizer_switch='hash_join_cost_based=off';
```

**注記**  
この設定は、コストベースのオプティマイザの決定を上書きします。この設定はテストや開発に役立ちますが、本番環境で使用することは推奨されません。

### ハッシュ結合のクエリの最適化
<a name="Aurora.BestPractices.HashJoin.Optimizing"></a>

クエリでハッシュ結合を利用できるかどうかを調べるには、初期に `EXPLAIN` ステートメントを使用してクエリのプロファイリングを行います。`EXPLAIN` ステートメントは、指定されたクエリで使用する実行プランに関する情報を提供します。

`EXPLAIN` ステートメントの出力で、`Extra` 列は実行プランに含まれている追加情報を示します。クエリで使用するテーブルにハッシュ結合が適用される場合、この列には以下のような値が含まれます。
+ `Using where; Using join buffer (Hash Join Outer table table1_name)`
+ `Using where; Using join buffer (Hash Join Inner table table2_name)`

以下の例に示しているのは、EXPLAIN を使用してハッシュ結合クエリの実行プランを表示する方法です。

```
mysql> explain SELECT sql_no_cache * FROM hj_small, hj_big, hj_big2
    ->     WHERE hj_small.col1 = hj_big.col1 and hj_big.col1=hj_big2.col1 ORDER BY 1;
+----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra                                                          |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+
|  1 | SIMPLE      | hj_small | ALL  | NULL          | NULL | NULL    | NULL |    6 | Using temporary; Using filesort                                |
|  1 | SIMPLE      | hj_big   | ALL  | NULL          | NULL | NULL    | NULL |   10 | Using where; Using join buffer (Hash Join Outer table hj_big)  |
|  1 | SIMPLE      | hj_big2  | ALL  | NULL          | NULL | NULL    | NULL |   15 | Using where; Using join buffer (Hash Join Inner table hj_big2) |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+
3 rows in set (0.04 sec)
```

出力では、`Hash Join Inner table` はハッシュテーブルの構築に使用されるテーブルであり、`Hash Join Outer table` はハッシュテーブルの検証に使用されるテーブルです。

拡張 `EXPLAIN` 出力形式の詳細については、MySQL 製品ドキュメントの「[Extended EXPLAIN Output Format](https://dev.mysql.com/doc/refman/8.0/en/explain-extended.html)」(拡張 EXPLAIN 出力形式)を参照してください。

 Aurora MySQL 2.08 以降では、SQL ヒントを使用して、クエリがハッシュ結合を使用するかどうか、および結合の構築側とプローブ側に使用するテーブルに影響を与えることができます。詳細については、「[Aurora MySQL のヒント](AuroraMySQL.Reference.Hints.md)」を参照してください。

## Amazon Aurora を使用した MySQL データベースの読み取りスケーリング
<a name="AuroraMySQL.BestPractices.ReadScaling"></a>

MySQL DB インスタンスで Amazon Aurora を使用することで、Amazon Aurora の読み取りスケーリング機能を活用して MySQL DB インスタンスの読み取りワークロードを拡張できます。Aurora を使用して MySQL DB インスタンスの読み取りを拡張するには、Aurora MySQL DB クラスターを作成し、MySQL DB インスタンスのリードレプリカに指定します。次に、Aurora MySQL クラスターに接続して読み取りクエリを処理します。出典データベースは、RDS for MySQL DB インスタンス、または Amazon RDS の外部で実行されている MySQL データベースです。詳細については、「[Amazon Aurora を使用した MySQL データベースの読み取りスケーリング](AuroraMySQL.Replication.ReadScaling.md)」を参照してください。

## タイムスタンプ操作の最適化
<a name="AuroraMySQL.BestPractices.Performance.TimeZone"></a>

システム変数 `time_zone` の値を `SYSTEM` に設定すると、タイムゾーン計算を必要とする各 MySQL 関数呼び出しは、システムライブラリ呼び出しを行います。このような `TIMESTAMP` 値を高い並行性で返したり変更したりする SQL ステートメントを実行すると、レイテンシー、ロック競合、および CPU 使用率が増加する可能性があります。詳細については、MySQL ドキュメントの「[time\$1zone](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_time_zone)」を参照してください。

この現象を回避するには、`time_zone` DB クラスターパラメータの値を `UTC` に変更することをお勧めします。詳細については、「[Amazon Aurora での DB クラスターパラメータグループのパラメータの変更](USER_WorkingWithParamGroups.ModifyingCluster.md)」を参照してください。

`time_zone` パラメータは動的 (データベースサーバーの再起動は不要) ですが、新しい値は新しい接続にのみ使用されます。すべての接続が新しい `time_zone` 値を使用するようにするには、DB クラスターパラメータを更新した後、アプリケーション接続をリサイクルすることをお勧めします。

## 仮想インデックス ID オーバーフローエラー
<a name="AuroraMySQL.BestPractices.Performance.VirtualIndexIDOverflow"></a>

Aurora MySQL では、仮想インデックス ID の値を 8 ビットに制限することで、MySQL の undo 形式によって発生する問題を防止します。インデックスが仮想インデックス ID 制限を超えると、クラスターが使用できなくなる可能性があります。インデックスが仮想インデックス ID 制限に近づいた場合、または仮想インデックス ID 制限を超えるインデックスを作成しようとした場合、エラーコード `63955` または警告コード `63955` が RDS によってスローされることがあります。仮想インデックス ID 制限エラーに対処するには、論理ダンプと復元を使用してデータベースを再作成することをお勧めします。

Amazon Aurora MySQL の論理ダンプと復元の詳細については、「[Migrate very large databases to Amazon Aurora MySQL using MyDumper and MyLoader](https://aws.amazon.com/blogs/database/migrate-very-large-databases-to-amazon-aurora-mysql-using-mydumper-and-myloader/)」を参照してください。Amazon Aurora でのエラーログへのアクセスの詳細については、「[Amazon Aurora ログファイルのモニタリング](USER_LogAccess.md)」を参照してください。

# Aurora MySQL の高可用性のベストプラクティス
<a name="AuroraMySQL.BestPractices.HA"></a>

次のベストプラクティスを適用して、Aurora MySQL クラスターの可用性を向上させることができます。

**Topics**
+ [Amazon Aurora を使用した MySQL データベースのディザスタリカバリ](#AuroraMySQL.BestPractices.DisasterRecovery)
+ [ダウンタイムを短縮して MySQL から Amazon Aurora MySQL に移行する](#AuroraMySQL.BestPractices.Migrating)
+ [Aurora MySQL DB インスタンスの低パフォーマンス、自動再起動、フェイルオーバーの回避](#AuroraMySQL.BestPractices.Avoiding)

## Amazon Aurora を使用した MySQL データベースのディザスタリカバリ
<a name="AuroraMySQL.BestPractices.DisasterRecovery"></a>

MySQL DB インスタンスで Amazon Aurora を使用することで、ディザスタリカバリ用のオフサイトバックアップを作成できます。MySQL DB インスタンスのディザスタリカバリに Aurora を使用するには、Amazon Aurora DB クラスターを作成し、MySQL DB インスタンスのリードレプリカに指定します。これは、RDS for MySQL DB インスタンス、または Amazon RDS の外部で実行されている MySQL データベースに適用されます。

**重要**  
MySQL DB インスタンスと Amazon Aurora MySQL DB クラスターの間でレプリケーションを設定する場合、レプリケーションをモニタリングして、レプリケーションが正常に動作していることを確認し、必要な場合は修復する必要があります。

Amazon Aurora MySQL DB クラスターを作成して MySQL DB インスタンスのリードレプリカに指定するには、「[Amazon Aurora を使用した MySQL データベースの読み取りスケーリング](AuroraMySQL.BestPractices.Performance.md#AuroraMySQL.BestPractices.ReadScaling)」の手順に従ってください。

災害対策モデルの詳細については、「[Amazon Aurora MySQL クラスターに最適な災害対策オプションを選択する方法](https://aws.amazon.com/blogs/database/how-to-choose-the-best-disaster-recovery-option-for-your-amazon-aurora-mysql-cluster/)」を参照してください。

## ダウンタイムを短縮して MySQL から Amazon Aurora MySQL に移行する
<a name="AuroraMySQL.BestPractices.Migrating"></a>

ライブアプリケーションをサポートする MySQL データベースから Amazon Aurora MySQL DB クラスターにデータをインポートするときは、移行中のサービス中断時間を短縮することが必要になる場合があります。これを行うには、「*Amazon Relational Database Service ユーザーガイド*」の「[Importing data to an Amazon RDS for MySQL DB instance with reduced downtime](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-importing-data-reduced-downtime.html)」で説明されている手順を使用できます。この手順は、巨大なデータベースを使用する場合に特に役立ちます。この手順を使用すると、ネットワーク経由で AWS に渡されるデータの量を最小限に抑えることで、インポートのコストを削減できます。

このステップでは、データベースのデータのコピーを Amazon EC2 インスタンスに送信し、そのデータを新しい RDS for MySQL DB インスタンスにインポートするステップを示します。Amazon Aurora は MySQL と互換性があるため、ターゲット Amazon RDS MySQL DB インスタンスの代わりに Amazon Aurora DB クラスターを使用することができます。

## Aurora MySQL DB インスタンスの低パフォーマンス、自動再起動、フェイルオーバーの回避
<a name="AuroraMySQL.BestPractices.Avoiding"></a>

負荷の高いワークロードや、DB インスタンスに割り当てられたリソースを超えて急増するワークロードを実行している場合、アプリケーションと Aurora データベースを実行しているリソースを使い果たしてしまう可能性があります。CPU 使用率、メモリ使用量、使用されているデータベース接続数など、データベースインスタンスに関するメトリクスを取得するには、Amazon CloudWatch、パフォーマンスインサイト、および拡張モニタリングが提供するメトリクスを参照できます。DB インスタンスのモニタリングについては、「[Amazon Aurora クラスターでのメトリクスのモニタリング](MonitoringAurora.md)」を参照してください。

ワークロードが使用しているリソースを使い果たした場合、DB インスタンスは遅くなったり、再起動したり、別の DB インスタンスにフェイルオーバーしたりする可能性があります。これを避けるには、リソースの使用状況を監視し、DB インスタンスで実行されているワークロードを調べ、必要に応じて最適化を行います。最適化を行ってもインスタンスのメトリクスが改善されず、リソースの枯渇も緩和されない場合は、上限に達する前に DB インスタンスをスケールアップすることを検討してください。利用可能な DB インスタンスクラスとその仕様の詳細については、「[Amazon Aurora DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。

# Aurora MySQL の MySQL 機能の推奨事項
<a name="AuroraMySQL.BestPractices.FeatureRecommendations"></a>

Aurora MySQL では、MySQL との互換性のために次の機能が利用可能です。ただし、Aurora 環境では、パフォーマンス、スケーラビリティ、安定性、または互換性の問題があります。したがって、これらの機能の使用については、特定のガイドラインに従うことをお勧めします。例えば、Aurora の本稼働デプロイには、特定の機能を使用しないことをお勧めします。

**Topics**
+ [Aurora MySQL でのマルチスレッドレプリケーションの使用](#AuroraMySQL.BestPractices.MTReplica)
+ [ネイティブ MySQL 関数を使用した AWS Lambda 関数の呼び出し](#AuroraMySQL.BestPractices.Lambda)
+ [Amazon Aurora MySQL での XA トランザクションの回避](#AuroraMySQL.BestPractices.XA)
+ [DML ステートメント中に外部キーを有効にしておく](#Aurora.BestPractices.ForeignKeys)
+ [ログバッファをフラッシュする頻度の設定](#AuroraMySQL.BestPractices.Flush)
+ [Aurora MySQL デッドロックの最小化とトラブルシューティング](#AuroraMySQL.BestPractices.deadlocks)

## Aurora MySQL でのマルチスレッドレプリケーションの使用
<a name="AuroraMySQL.BestPractices.MTReplica"></a>

マルチスレッドのバイナリログレプリケーションでは、SQL スレッドはリレーログからイベントを読み取り、SQL ワーカースレッドが適用されるようにキューに入れます。SQL ワーカースレッドは、コーディネータスレッドによって管理されます。バイナリログイベントは、可能な場合はパラレルに適用されます。

マルチスレッドレプリケーションは、Aurora MySQL バージョン 3 および Aurora MySQL バージョン 2.12.1 以降でサポートされています。

Aurora MySQL バージョン 3.04 以前では、Aurora MySQL DB クラスターがバイナリログレプリケーションのリードレプリカとして使用されている場合、Aurora はシングルスレッドレプリケーションをデフォルトで使用します。

Aurora MySQL バージョン 2 以前には、MySQL Community Edition から継承したマルチスレッドレプリケーションに関する不具合がいくつかあります。これらのバージョンでは、本番環境でのマルチスレッドレプリケーションの使用はお勧めしません。

マルチスレッドレプリケーションを使用する場合は、完全にテストした上で使用することをお勧めします。

Amazon Aurora におけるレプリケーションの使用の詳細については、「[Amazon Aurora でのレプリケーション](Aurora.Replication.md)」を参照してください。Aurora MySQL でのマルチスレッドレプリケーションの詳細については、「[マルチスレッドバイナリログレプリケーション](binlog-optimization.md#binlog-optimization-multithreading)」を参照してください。

## ネイティブ MySQL 関数を使用した AWS Lambda 関数の呼び出し
<a name="AuroraMySQL.BestPractices.Lambda"></a>

ネイティブ MySQL 関数 `lambda_sync` および `lambda_async` を使用して、Lambda 関数を呼び出すことをお勧めします。

非推奨の `mysql.lambda_async` プロシージャを使用している場合は、`mysql.lambda_async` プロシージャの呼び出しをストアドプロシージャにラップすることをお勧めします。このストアドプロシージャは、トリガーやクライアントコードなどさまざまな出典から呼び出すことができます。この方法により、インピーダンス不整合の問題を回避し、データベースプログラマーが Lambda 関数を簡単に呼び出せるようにすることができます。

Amazon Aurora からの Lambda 関数の呼び出しについて詳細については、「[Amazon Aurora MySQL DB クラスターからの Lambda 関数の呼び出し](AuroraMySQL.Integrating.Lambda.md)」を参照してください。

## Amazon Aurora MySQL での XA トランザクションの回避
<a name="AuroraMySQL.BestPractices.XA"></a>

Aurora MySQL では eXtended Architecture (XA) トランザクションは使用しないことをお勧めします。これは、XA が `PREPARED` 状態の場合、復旧時間が長くなる可能性があるためです。Aurora MySQL で XA トランザクションを使用する必要がある場合は、以下のベストプラクティスに従ってください。
+ XA トランザクションを `PREPARED` 状態で開いたままにしない。
+ XA トランザクションを可能な限り小さくする。

MySQL で XA トランザクションを使用する方法の詳細については、MySQL ドキュメントの「[XA トランザクション](https://dev.mysql.com/doc/refman/8.0/en/xa.html)」を参照してください。

## DML ステートメント中に外部キーを有効にしておく
<a name="Aurora.BestPractices.ForeignKeys"></a>

`foreign_key_checks` 可変が `0` (オフ) に設定されている場合は、データ定義言語 (DDL) ステートメントを実行しないことを強くお勧めします。

外部キーの制約に一時的に違反する行を挿入または更新する必要がある場合は、以下のステップに従います。

1. `foreign_key_checks` を `0` に設定します。

1. データ操作言語 (DML) に変更を加えます。

1. 完了した変更が外部キーの制約に違反していないことを確認します。

1. `foreign_key_checks` を `1` (オン) に設定します。

さらに、外部キーの制約に関する以下のベストプラクティスに従います。
+ クライアントアプリケーションが `foreign_key_checks` 可変の一部として `0` 可変を `init_connect` に設定しないことを確認します。
+ `mysqldump` などの論理的なバックアップからの復元が失敗するか、または不完全な場合は、同じセッションで他のオペレーションをスタートする前に、`foreign_key_checks` が `1` に設定されていることを確認します。論理的なバックアップのスタート時に `foreign_key_checks` が `0` に設定されています。

## ログバッファをフラッシュする頻度の設定
<a name="AuroraMySQL.BestPractices.Flush"></a>

MySQL Community Edition では、トランザクションを永続的にするには、InnoDB ログバッファを耐久性のあるストレージにフラッシュする必要があります。`innodb_flush_log_at_trx_commit` パラメータを使用して、ログバッファをディスクにフラッシュする頻度を設定します。

`innodb_flush_log_at_trx_commit` パラメータをデフォルト値の 1 に設定すると、トランザクションがコミットされるたびにログバッファがフラッシュされます。この設定は、データベースを [ACID](https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_acid) に準拠させるのに役立ちます。デフォルト設定の 1 を維持することをお勧めします。

`innodb_flush_log_at_trx_commit` をデフォルト以外の値に変更すると、データ操作言語 (DML) のレイテンシーを短縮できますが、ログレコードの耐久性は損なわれます。この耐久性の欠如により、データベースは ACID に準拠していません。サーバー再起動時にデータが損失するリスクを避けるため、データベースは ACID に準拠させることをお勧めします。このパラメータの詳細については、MySQL ドキュメントの「[innodb\$1flush\$1log\$1at\$1trx\$1commit](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit)」を参照してください。

Aurora MySQL では、REDO ログ処理はストレージレイヤーにオフロードされるため、DB インスタンスではログファイルへのフラッシュは発生しません。書き込みが発行されると、REDO ログはライター DB インスタンスから Aurora クラスターボリュームに直接送信されます。ネットワークを介して行われる唯一の書き込みは REDO ログレコードです。データベース層からページが書き込まれることはありません。

デフォルトでは、トランザクションをコミットする各スレッドは、Aurora クラスターボリュームからの確認を待ちます。この確認は、このレコードとそれ以前のすべての REDO ログレコードが書き込まれ、[クォーラム](https://aws.amazon.com/blogs/database/amazon-aurora-under-the-hood-quorum-and-correlated-failure/)に達したことを示しています。ログレコードを永続化してクォーラムを達成すると、オートコミットでも明示的コミットでも、トランザクションが永続的になります。Aurora ストレージアーキテクチャの詳細については、「[Amazon Aurora ストレージのわかりやすい解説](https://d1.awsstatic.com/events/reinvent/2020/Amazon_Aurora_storage_demystified_DAT401.pdf)」を参照してください。

Aurora MySQL は MySQL コミュニティエディションのようにログをデータファイルにフラッシュしません。ただし、`innodb_flush_log_at_trx_commit` パラメータを使用すると、REDO ログレコードを Aurora クラスターボリュームに書き込む際の耐久性の制約を緩和できます。

Aurora MySQL バージョン 2 の場合:
+ `innodb_flush_log_at_trx_commit` = 0 または 2 – データベースは REDO ログレコードが Aurora クラスターボリュームに書き込まれることを確認するまで待ちません。
+ `innodb_flush_log_at_trx_commit` = 1 – データベースは REDO ログレコードが Aurora クラスターボリュームに書き込まれることを確認するまで待ちます。

Aurora MySQL バージョン 3 の場合:
+ `innodb_flush_log_at_trx_commit` = 0 – データベースは REDO ログレコードが Aurora クラスターボリュームに書き込まれることを確認するまで待ちません。
+ `innodb_flush_log_at_trx_commit` = 1 または 2 – データベースは REDO ログレコードが Aurora クラスターボリュームに書き込まれることを確認するまで待ちます。

したがって、Aurora MySQL バージョン 2 で 0 または 2 に設定された値と同じデフォルト以外動作を Aurora MySQL バージョン 3 で取得するには、パラメータを 0 に設定します。

これらの設定はクライアントの DML レイテンシーを低減できますが、フェイルオーバーまたは再起動の際にデータが失われる可能性もあります。したがって、`innodb_flush_log_at_trx_commit` パラメータはデフォルト値の 1 を維持することをお勧めします。

MySQL Community Edition と Aurora MySQL の両方でデータ損失が発生する可能性がありますが、アーキテクチャが異なるため、動作はデータベースごとに異なります。このようなアーキテクチャの違いにより、さまざまな程度のデータ損失が発生する可能性があります。データベースが ACID に準拠していることを確認するには、必ず `innodb_flush_log_at_trx_commit` を 1 に設定してください。

**注記**  
Aurora MySQL バージョン 3 では、`innodb_flush_log_at_trx_commit` を 1 以外の値に変更する前に、まず `innodb_trx_commit_allow_data_loss` の値を 1 に変更する必要があります。これにより、データ損失のリスクを認識できます。

## Aurora MySQL デッドロックの最小化とトラブルシューティング
<a name="AuroraMySQL.BestPractices.deadlocks"></a>

同じデータページのレコードを同時に変更する場合、一意のセカンダリインデックスや外部キーに対する制約違反が定期的に発生するワークロードを実行していると、デッドロックやロック待機タイムアウトが増加する可能性があります。これらのデッドロックとタイムアウトは、MySQL Community Edition の[バグ修正](https://bugs.mysql.com/bug.php?id=98324)によるものです。

この修正は、MySQL Community Edition バージョン 5.7.26 以降に含まれており、Aurora MySQL バージョン 2.10.3 以降にバックポートされました。この修正は、InnoDB テーブルのレコードに加えられた変更に対して、これらのタイプのデータ操作言語 (DML) オペレーションに追加のロックを実装することで、*直列化可能性*を強制的に適用するために必要です。この問題は、以前の MySQL Community Edition の[バグ修正](https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-26.html)によって生じたデッドロック問題の調査の一環として発見されました。

この修正により、InnoDB ストレージエンジンでのタプル (行) 更新の*部分的なロールバック*の内部処理が変更されました。外部キーまたは一意のセカンダリインデックスに制約違反が発生するオペレーションを行うと、部分的にロールバックが発生します。これには、同時 `INSERT...ON DUPLICATE KEY UPDATE`、`REPLACE INTO,`、`INSERT IGNORE` ステートメント (*upserts*) が含まれますが、これらに限定されません。

ここでいう部分ロールバックとは、アプリケーションレベルのトランザクションのロールバックを指すのではなく、制約違反が発生した場合に、内部 InnoDB が変更をクラスター化されたインデックスにロールバックすることを指します。例えば、upsert オペレーション中に重複するキー値が見つかったとします。

通常の挿入オペレーションでは、InnoDB はインデックスごとに[クラスター化された](https://dev.mysql.com/doc/refman/5.7/en/innodb-index-types.html)インデックスエントリとセカンダリインデックスエントリをアトミックに作成します。InnoDB が upsert オペレーション中に一意のセカンダリインデックスで重複値を検出した場合、クラスター化されたインデックスに挿入されたエントリを元に戻し (部分ロールバック)、更新を既存の重複行に適用する必要があります。この内部部分ロールバックステップ中は、InnoDB はオペレーションの一部と見なされる各レコードをロックする必要があります。この修正により、部分ロールバック後に追加のロックを導入することにより、トランザクションの直列化可能性が保証されます。

### InnoDB デッドロックの最小化
<a name="AuroraMySQL.BestPractices.deadlocks-minimize"></a>

データベースインスタンスのデッドロックの発生頻度を減らすには、次の方法を使用できます。その他の例は、[MySQL のドキュメント](https://bugs.mysql.com/bug.php?id=98324)にあります。

1. デッドロックの可能性を削減するために、関連する一連の変更を行った直後にトランザクションをコミットしてください。これを行うには、大きなトランザクション (コミット間の複数行の更新) を小さなトランザクションに分割します。行をバッチ挿入する場合は、特に前述の upsert オペレーションを使用するときは、バッチ挿入のサイズを小さくします。

   部分的なロールバックの頻度を削減するために、次の複数の方法を試行できます。

   1. バッチ挿入オペレーションを、一度に 1 行ずつ挿入するオペレーションに置き換えます。これにより、競合が発生する可能性のあるトランザクションによって、ロックが保持される時間を削減できます。

   1. `REPLACE INTO` を使用する代わりに、SQL ステートメントを次のような複数ステートメントのトランザクションとして書き換えます。

      ```
      BEGIN;
      DELETE conflicting rows;
      INSERT new rows;
      COMMIT;
      ```

   1. `INSERT...ON DUPLICATE KEY UPDATE` を使用する代わりに、SQL ステートメントを次のような複数ステートメントのトランザクションとして書き換えます。

      ```
      BEGIN;
      SELECT rows that conflict on secondary indexes;
      UPDATE conflicting rows;
      INSERT new rows;
      COMMIT;
      ```

1. アクティブまたはアイドルで長時間稼働するトランザクションは、ロックを保持する可能性があるので避けてください。これには、コミットされていないトランザクションで、長期間開かれている可能性のあるインタラクティブな MySQL クライアントセッションが含まれます。トランザクションサイズまたはバッチサイズを最適化する場合、同時実行性、重複数、テーブル構造などのさまざまな要因で、影響が異なる可能性があります。どのような変更でも、ワークロードに基づいて実装し、テストする必要があります。

1. 状況によっては、2 つのトランザクションが 1 つまたは複数のテーブル内の同じデータセットに異なる順序でアクセスしようとすると、デッドロックが発生することがあります。これを防止するには、同じ順序でデータにアクセスするようにトランザクションを変更して、アクセスをシリアル化できます。例えば、完了するトランザクションのキューを作成します。このアプローチでは、複数のトランザクションが同時に発生する場合、デッドロックを回避するのに役立ちます。

1. インデックスを慎重に選択してテーブルに追加することで、選択性が向上し、行にアクセスする必要性が減り、ロックが減少します。

1. [ギャップロック](https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-gap-locks)が発生した場合は、セッションまたはトランザクションのトランザクション分離レベルを `READ COMMITTED` に変更することで、ギャップロックを防止できます。InnoDB 分離レベルとその動作の詳細については、MySQL ドキュメントの「[トランザクション分離レベル](https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html)」を参照してください。

**注記**  
デッドロックが発生する可能性を削減するための予防策を講じることはできますが、デッドロックはデータベースで想定される動作であり、発生する可能性はゼロにはなりません。アプリケーションには、デッドロックが発生した場合の対処に必要なロジックが必要です。例えば、アプリケーションに再試行とバックオフのロジックを実装します。問題の根本原因に対処するのが最善ですが、デッドロックが発生した場合、アプリケーションには待機後に再試行するオプションがあります。

### InnoDB デッドロックのモニタリング
<a name="AuroraMySQL.BestPractices.deadlocks-monitor"></a>

MySQL では、アプリケーションのトランザクションがテーブルレベルおよび行レベルのロックを取得しようすると循環待機になり、[デッドロック](https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_deadlock)が発生する可能性があります。InnoDB のデッドロックは、InnoDB ストレージエンジンによってすぐに状態を検出し、トランザクションの 1 つを自動的にロールバックするため、ときどき発生するデッドロックは必ずしも問題にはなりません。デッドロックが頻繁に発生する場合は、パフォーマンスの問題を軽減し、デッドロックを回避するために、アプリケーションを見直して修正することをお勧めします。[デッドロック検出](https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_deadlock_detection)がオン (デフォルト) の場合、InnoDB はトランザクションのデッドロックを自動的に検出し、1 つまたは複数のトランザクションをロールバックしてデッドロックを解消します。InnoDB は小さなトランザクションを選択してロールバックしようとします。トランザクションのサイズは、挿入、更新、削除された行の数によって決まります。
+ `SHOW ENGINE` ステートメント — `SHOW ENGINE INNODB STATUS \G` ステートメントには、前回の再起動以降にデータベースで発生した最新のデッドロックの[詳細](https://dev.mysql.com/doc/refman/5.7/en/show-engine.html)が含まれます。
+ MySQL エラーログ — `SHOW ENGINE` ステートメントの出力が不十分なデッドロックが頻繁に発生する場合は、[innodb\$1print\$1all\$1deadlocks](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_print_all_deadlocks) DB クラスターパラメータを有効にできます。

  このパラメータを有効にすると、InnoDB ユーザートランザクションのすべてのデッドロックに関する情報が Aurora MySQL [エラーログ](https://dev.mysql.com/doc/refman/8.0/en/error-log.html)に記録されます。
+ Amazon CloudWatch メトリクス — CloudWatch メトリクス `Deadlocks` を使用して、デッドロックを積極的にモニタリングすることもお勧めします。詳細については、「[Amazon Aurora のインスタンスレベルのメトリクス](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances)」を参照してください。
+ Amazon CloudWatch Logs — CloudWatch Logs を使用すると、メトリクスの表示、ログデータの分析、アラームのリアルタイム表示を行うことができます。詳細については、「[Monitor errors in Amazon Aurora MySQL and Amazon RDS for MySQL using Amazon CloudWatch and send notifications using Amazon SNS](https://aws.amazon.com/blogs/database/monitor-errors-in-amazon-aurora-mysql-and-amazon-rds-for-mysql-using-amazon-cloudwatch-and-send-notifications-using-amazon-sns/)」(Amazon CloudWatch を使用して Amazon Aurora MySQL と Amazon RDS for MySQL のエラーをモニタリングし、Amazon SNS を使用して通知を送信する) を参照してください。

  `innodb_print_all_deadlocks` を有効にした CloudWatch Logs を使用すると、デッドロックの回数が指定したしきい値を超えた場合に通知するようにアラームを設定できます。しきい値を定義するには、傾向を観察して、通常のワークロードに基づいた値を使用することをお勧めします。
+ Performance Insights — Performance Insights を使用すると、`innodb_deadlocks` および `innodb_lock_wait_timeout` メトリクスをモニタリングできます。これらのメトリクスの詳細については、「[Aurora MySQL の非ネイティブカウンター](USER_PerfInsights_Counters.md#USER_PerfInsights_Counters.Aurora_MySQL.NonNative)」を参照してください。

# Amazon CloudWatch メトリクスで Aurora MySQL インスタンスの使用量を評価する
<a name="AuroraMySQL.BestPractices.CW"></a>

CloudWatch メトリクスを使用して、DB インスタンスのスループットをモニタリングし、DB インスタンスクラスがアプリケーションに十分なリソースを供給しているかどうかを判断できます。DB インスタンスクラスの制限に関する詳細については、「[Aurora 用の DB インスタンスクラスのハードウェア仕様](Concepts.DBInstanceClass.Summary.md)」を参照してください。DB インスタンスクラスの仕様を検索して、ネットワークパフォーマンスを確認します。

DB インスタンスの使用量がインスタンスクラスの限界に近い場合、パフォーマンスが低下し始める可能性があります。CloudWatch メトリクスによってこの状況を確認できるので、より大きなインスタンスクラスへの手動スケールアップを計画できます。

以下の CloudWatch メトリクス値を組み合わせて、インスタンスクラスの限界に近づいているかどうかを確認します。
+ **NetworkThroughput** - Aurora DB クラスター内の各インスタンスについて、各クライアントによって送受信されたネットワークスループットの量。このスループット値には、DB クラスターとクラスターボリューム内のインスタンス間のネットワークトラフィックは含まれません。
+ **StorageNetworkThroughput** – Aurora DB クラスター内の各インスタンスによって Aurora ストレージサブシステムとの間で送受信されたネットワークスループットの量。

**NetworkThroughput** を **StorageNetworkThroughput** に加えると、Aurora DB クラスター内の各インスタンスによって Aurora ストレージサブシステムとの間で送受信されたネットワークスループットになります。インスタンスのインスタンスクラス限界は、この 2 つのメトリクスの合計よりも大きい必要があります。

 以下のメトリクスを使用して、送受信時のクライアントアプリケーションからのネットワークトラフィックの詳細を確認できます。
+ **NetworkReceiveThroughput** – Aurora MySQL DB クラスター内の各 DB インスタンスがクライアントから受信したネットワークスループットの量。 DB クラスターとクラスターボリューム内のインスタンス間のネットワークトラフィックは、このスループットに含まれません。
+ **NetworkTransmitThroughput** – Aurora DB クラスター内の各インスタンスが各クライアントに送信したネットワークスループットの量。 DB クラスターとクラスターボリューム内のインスタンス間のネットワークトラフィックは、このスループットに含まれません。
+ **StorageNetworkReceiveThroughput** – DB クラスター内の各インスタンスが Aurora ストレージサブシステムから受信したネットワークスループットの量。
+ **StorageNetworkTransmitThroughput** – DB クラスター内の各インスタンスが Aurora ストレージサブシステムに送信したネットワークスループットの量。

これらすべてのメトリクスを合計して、ネットワーク使用量と DB インスタンスクラスの制限との比較を評価します。インスタンスクラス限界は、これらのメトリクスの合計よりも大きい必要があります。

ストレージのネットワーク制限と CPU 使用率は直接関係しています。ネットワークのスループットが増加すると、CPU 使用率も増加します。CPU とネットワークの使用状況を監視すると、リソースがどのくらい枯渇しているのか、またなぜ枯渇しているのかについての情報が得られます。

ネットワークの使用量を最小限に抑えるには、次のことを検討してください。
+ より大きな DB インスタンスクラスを使用します。
+ 書き込みリクエストをバッチに分割して、トランザクション全体を減らします。
+ 読み取り専用ワークロードを読み取り専用インスタンスに転送します。
+ 未使用のインデックスをすべて削除します。

# Amazon Aurora MySQL データベースのパフォーマンスのトラブルシューティング
<a name="aurora-mysql-troubleshooting"></a>

このトピックでは、Aurora MySQL DB の一般的なパフォーマンス問題と、これらの問題を迅速に修正するためのトラブルシューティング方法または情報収集方法に焦点を当てます。データベースのパフォーマンスを次の 2 つのカテゴリに分類します。
+ サーバーパフォーマンス — データベースサーバー全体の動作が遅い。
+ クエリパフォーマンス — 1 つまたは複数のクエリの実行に時間がかかる。

## AWS モニタリングオプション
<a name="aurora-mysql-troubleshooting.monitoring"></a>

トラブルシューティングに役立てるため、次の AWS モニタリングオプションを使用することをお勧めします。
+ Amazon CloudWatch — Amazon CloudWatch は AWS で実行されている AWS リソースやアプリケーションをリアルタイムにモニタリングします。CloudWatch を使用してメトリクスを収集および追跡できます。メトリクスとは、リソースやアプリケーションについて測定できる変数です。詳細については、「[Amazon CloudWatch とは](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html)」を参照してください。

  DB インスタンスのすべてのシステムメトリクスとプロセス情報を AWS マネジメントコンソール に表示できます。Aurora MySQL DB クラスターを設定して、全般ログ、スローログ、監査ログおよびエラーログのデータを Amazon CloudWatch Logs のロググループに発行できます。これにより、傾向を確認したり、ホストが影響を受けた場合にログを維持したり、異常や変化を簡単に特定するための「通常の」パフォーマンスのベースラインを作成することができます。詳細については、「[Amazon CloudWatch Logs への Amazon Aurora MySQL ログの発行](AuroraMySQL.Integrating.CloudWatch.md)」を参照してください。
+ 拡張モニタリング — Aurora MySQL データベースに対して追加の Amazon CloudWatch メトリクスを有効にするには、拡張モニタリングを有効にします。Aurora DB クラスターを作成または変更するときは、**[拡張モニタリングを有効化**] を選択します。これにより、Aurora はパフォーマンスメトリクスを CloudWatch にパブリッシュできます。利用可能な主なメトリクスには、CPU 使用率、データベース接続、ストレージ使用量、クエリレイテンシーなどがあります。これらはパフォーマンスのボトルネックの特定に役立ちます。

  DB インスタンスに対して転送される情報量は、拡張モニタリング機能に対して定義された詳細度に正比例します。モニタリング間隔を短くすると、OS メトリクスのレポート回数が増え、モニタリングコストが高くなります。コストを管理するには、AWS アカウント 内のインスタンスごとに異なる詳細度を設定します。インスタンス作成時のデフォルトの精度は 60 秒です。詳細については、「[拡張モニタリングのコスト](USER_Monitoring.OS.md#USER_Monitoring.OS.cost)」を参照してください。
+ Performance Insights — すべてのデータベースコールメトリクスを表示できます。これには DB ロック、待機、処理された行数などがあり、これらはすべてトラブルシューティングに使用できます。Aurora DB クラスターを作成または変更するときは、**[Performance Insights を有効にする]** を選択します。デフォルトでは、Performance Insights のデータ保持期間は 7 日間ですが、長期的なパフォーマンスの傾向を分析するようにカスタマイズできます。7 日を超える保存期間については、有料プランにアップグレードする必要があります。詳細については、「[Performance Insights の料金](https://aws.amazon.com/rds/performance-insights/pricing/)」を参照してください。Aurora DB インスタンスごとにデータ保持期間を個別に設定できます。詳細については、「[Amazon Aurora での Performance Insights を使用したDB 負荷のモニタリング](USER_PerfInsights.md)」を参照してください。

## Aurora MySQL データベースのパフォーマンス問題の最も一般的な原因
<a name="aurora-mysql-troubleshooting-common"></a>

次の手順を使用して、Aurora MySQL データベースのパフォーマンス問題をトラブルシューティングできます。これらのステップは調査の論理的な順序で示していますが、直線的なものではありません。1 つの発見が複数のステップにまたがることもあり、それによって一連の調査パスが提供されます。

1. [ワークロード](aurora-mysql-troubleshooting-workload.md) — データベースのワークロードを理解します。

1. [ログ記録](aurora-mysql-troubleshooting-logging.md) — すべてのデータベースログを確認します。

1. [データベース接続 ](mysql-troubleshooting-dbconn.md) — アプリケーションとデータベース間の接続が信頼できることを確認します。

1. [クエリパフォーマンス](aurora-mysql-troubleshooting-query.md) — クエリ実行プランが変更されていないか確認します。コードを変更すると、プランが変更される可能性があります。

# Aurora MySQL データベースのワークロードに関する問題のトラブルシューティング
<a name="aurora-mysql-troubleshooting-workload"></a>

データベースワークロードは読み取りおよび書き込みとして見なすことができます。「通常の」データベースワークロードを理解していれば、需要の変化に合わせてクエリとデータベースサーバーを調整できます。パフォーマンスが変化する理由は多く存在するため、最初のステップは何が変わったのかを理解することです。
+ メジャーバージョンまたはマイナーバージョンのアップグレードは行われましたか?

  メジャーバージョンアップグレードには、エンジンコード、特にオプティマイザの変更が含まれ、それによってクエリ実行プランが変更される可能性があります。データベースバージョン、特にメジャーバージョンをアップグレードするときは、データベースのワークロードを分析し、それに応じて調整することが非常に重要です。調整には、テストの結果に応じて、クエリの最適化と書き換え、またはパラメータ設定の追加と更新が含まれる場合があります。何が影響を引き起こしているのかを理解することで、その特定の分野に集中できるようになります。

  詳細については、MySQL ドキュメントの「[MySQL 8.0 の新機能](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html)」と「[MySQL 8.0 で追加、廃止、または削除されたサーバー変数とステータス変数とオプション](https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html)」、および「[Aurora MySQL バージョン 2 と Aurora MySQL バージョン 3 の比較](AuroraMySQL.Compare-v2-v3.md)」を参照してください。
+ 処理中のデータ (行数) は増加しましたか?
+ 同時に実行されているクエリは他にもありますか?
+ スキーマやデータベースに変更はありますか?
+ コードに欠陥や修正はありましたか?

**Contents**
+ [インスタンスホストｘメトリクス](#ams-workload-instance)
  + [CPU の使用](#ams-workload-cpu)
  + [メモリ使用量](#ams-workload-instance-memory)
  + [ネットワークスループット](#ams-workload-network)
+ [データベースメトリクス](#ams-workload-db)
+ [Aurora MySQL データベースのメモリ使用量に関する問題のトラブルシューティング](ams-workload-memory.md)
  + [例 1: 連続的に高いメモリ使用量](ams-workload-memory.md#ams-workload-memory.example1)
  + [例 2: 一時的なメモリスパイク](ams-workload-memory.md#ams-workload-memory.example2)
  + [例 3: 解放可能なメモリが継続的に減少し、再利用されない](ams-workload-memory.md#ams-workload-memory.example3)
+ [Aurora MySQL データベースのメモリ不足の問題のトラブルシューティング](AuroraMySQLOOM.md)

## インスタンスホストｘメトリクス
<a name="ams-workload-instance"></a>

CPU、メモリ、ネットワークアクティビティなどのインスタンスホストのメトリクスをモニタリングして、ワークロードが変更されたかどうかを把握します。ワークロードの変化を理解するには、主に 2 つの概念があります。
+ 使用率 — CPU やディスクなどのデバイスの使用状況。時間ベースの場合とキャパシティベースの場合があります。
  + 時間ベース — 特定の観測期間にリソースがビジー状態である時間です。
  + キャパシティベース — システムまたはコンポーネントが提供できるスループットの量 (キャパシティに対する割合)。
+ 飽和度 — リソースで処理できる量よりも多くの作業が必要となる度合い。キャパシティベースの使用率が 100% に達すると、余分な作業は処理できなくなり、キューに入れる必要があります。

### CPU の使用
<a name="ams-workload-cpu"></a>

次のツールを使用して、CPU の使用状況と飽和度を識別できます。
+ CloudWatch が `CPUUtilization` メトリクスを提供します。この値が 100% に達すると、インスタンスは飽和状態になります。ただし、CloudWatch メトリクスは 1 分間で平均化され、詳細さに欠けています。

  CloudWatch のメトリクスの詳細については、「[Amazon Aurora のインスタンスレベルのメトリクス](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances)」を参照してください。
+ 拡張モニタリングは、オペレーティングシステム `top` コマンドによって返されるメトリクスを提供します。負荷平均と次の CPU 状態が 1 秒単位で表示されます。
  + `Idle (%)` = アイドル時間
  + `IRQ (%)` = ソフトウェア割り込み
  + `Nice (%)` = 優先順位が [niced](https://en.wikipedia.org/wiki/Nice_(Unix)) のプロセスの良好な時間。
  + `Steal (%)` = 他のテナントへのサービス提供に費やした時間 (仮想化関連)
  + `System (%)` = システム時刻
  + `User (%)` = ユーザー時間
  + `Wait (%)` = I/O 待機

  拡張モニタリングのメトリクスの詳細については、「[Aurora の OS メトリクス](USER_Monitoring-Available-OS-Metrics.md#USER_Monitoring-Available-OS-Metrics-RDS)」を参照してください。

### メモリ使用量
<a name="ams-workload-instance-memory"></a>

システムがメモリ不足に陥っていて、リソース消費が飽和状態に達しつつある場合は、ページスキャン、ページング、スワップ、メモリ不足などのエラーが頻繁に発生しているはずです。

次のツールを使用して、メモリの使用状況と飽和度を識別できます。

CloudWatch は、一部の OS キャッシュと現在の空きメモリをフラッシュすることで再利用できるメモリを示す `FreeableMemory` メトリクスを提供します。

CloudWatch のメトリクスの詳細については、「[Amazon Aurora のインスタンスレベルのメトリクス](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances)」を参照してください。

拡張モニタリングでは、メモリ使用量の問題を特定するのに役立つ以下のメトリクスが提供されます。
+ `Buffers (KB)` - ストレージデバイスへの書き込み前に I/O バッファリングリクエストに使用されたメモリの量 (キロバイト単位)。
+ `Cached (KB)` - ファイルシステムベースの I/O のキャッシュに使用されたメモリの量。
+ `Free (KB)` - 未割り当てのメモリの量 (キロバイト単位)。
+ `Swap` - キャッシュ、フリー、および合計。

例えば、DB インスタンスが `Swap` メモリを使用していることがわかった場合、ワークロードの合計メモリ量は、インスタンスで現在使用可能なメモリ量よりも多くなっています。DB インスタンスのサイズを増やすか、使用するメモリ量が少なくなるようにワークロードを調整することをお勧めします。

拡張モニタリングのメトリクスの詳細については、「[Aurora の OS メトリクス](USER_Monitoring-Available-OS-Metrics.md#USER_Monitoring-Available-OS-Metrics-RDS)」を参照してください。

パフォーマンススキーマと `sys` スキーマを使用して、どの接続やコンポーネントがメモリを使用しているかを見極める方法の詳細については、「[Aurora MySQL データベースのメモリ使用量に関する問題のトラブルシューティング](ams-workload-memory.md)」を参照してください。

### ネットワークスループット
<a name="ams-workload-network"></a>

CloudWatch は、ネットワークスループットの合計について、すべて 1 分間の平均値として次のメトリクスを提供します。
+ `NetworkReceiveThroughput` - Aurora DB クラスター内の各インスタンスが各クライアントから受信したネットワークスループットの量。
+ `NetworkTransmitThroughput` - Aurora DB クラスター内の各インスタンスが各クライアントに対して送信したネットワークスループットの量。
+ `NetworkThroughput` - Aurora DB クラスター内の各インスタンスが各クライアントで送受信したネットワークスループットの量。
+ `StorageNetworkReceiveThroughput` - DB クラスター内の各インスタンスが、Aurora のストレージサブシステムから受信した、ネットワークスループットの量。
+ `StorageNetworkTransmitThroughput` - Aurora DB クラスター内の各インスタンスが、Aurora のストレージサブシステムに送信した、ネットワークスループットの量。
+ `StorageNetworkThroughput` - Aurora DB クラスター内の各インスタンスが、Aurora のストレージサブシステムとの間で送受信した、ネットワークスループットの量。

CloudWatch のメトリクスの詳細については、「[Amazon Aurora のインスタンスレベルのメトリクス](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances)」を参照してください。

拡張モニタリングでは、`network` が受信した (**RX**) および送信した (**TX**) グラフが最大 1 秒の精度で表示されます。

拡張モニタリングのメトリクスの詳細については、「[Aurora の OS メトリクス](USER_Monitoring-Available-OS-Metrics.md#USER_Monitoring-Available-OS-Metrics-RDS)」を参照してください。

## データベースメトリクス
<a name="ams-workload-db"></a>

以下の CloudWatch メトリクスを調べて、ワークロードの変化を確認します。
+ `BlockedTransactions` - 1 秒あたりのブロックされたデータベース内のトランザクションの平均数。
+ `BufferCacheHitRatio` – バッファキャッシュから提供されたリクエストの割合 (パーセント)。
+ `CommitThroughput` - 1 秒あたりのコミット操作の平均回数。
+ `DatabaseConnections` - データベースインスタンスへのクライアントネットワーク接続の数。
+ `Deadlocks` - 1 秒あたりのデータベース内のデッドロックの平均回数。
+ `DMLThroughput` - 1 秒あたりの挿入、更新、削除の平均回数。
+ `ResultSetCacheHitRatio` - クエリキャッシュから提供されたリクエストの割合 (パーセント)。
+ `RollbackSegmentHistoryListLength` - コミットされたトランザクションが削除とマークされたレコードを記録する UNDO ログ。
+ `RowLockTime` - InnoDB テーブルのローロックの取得にかかった合計時間。
+ `SelectThroughput` - 1 秒あたりの選択クエリの平均回数。

CloudWatch のメトリクスの詳細については、「[Amazon Aurora のインスタンスレベルのメトリクス](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances)」を参照してください。

ワークロードを調べる際には、以下の点を考慮してください。

1. DB インスタンスクラスに最近変更があったか。例えば、インスタンスサイズを 8xlarge から 4xlarge に減らしたり、db.r5 から db.r6 に変更したりしたか？ 

1. クローンを作成して問題を再現できますか? それとも 1 つのインスタンスでのみ発生していますか?

1. サーバーリソースの消耗、CPU 使用率の上昇、またはメモリの消耗は発生していますか? 「はい」の場合は、ハードウェアの追加が必要な場合があります。

1. 1 つまたは複数のクエリに時間がかかりますか?

1. 変化の原因はアップグレード、特にメジャーバージョンアップグレードですか? 「はい」の場合は、アップグレード前とアップグレード後のメトリクスを比較してください。

1. リーダー DB インスタンスの数に変更はありますか?

1. 一般ロギング、監査ロギング、またはバイナリロギングを有効にしましたか? 詳細については、「[Aurora MySQL データベースのログ記録](aurora-mysql-troubleshooting-logging.md)」を参照してください。

1. バイナリログ (binlog) レプリケーションの使用を有効化、無効化、または変更しましたか?

1. 長時間実行されるトランザクションで、多数の行ロックが発生していませんか? InnoDB 履歴リストの長さ (HLL) を調べて、トランザクションが長時間実行されているかどうかを確認してください。

   詳細については、「[InnoDB 履歴リストの長さが大幅に増加しました](proactive-insights.history-list.md)」および「[Amazon Aurora MySQL DB クラスターで SELECT クエリの実行が遅いのはなぜですか?](https://repost.aws/knowledge-center/aurora-mysql-slow-select-query)」というブログ記事を参照してください。

   1. 書き込みトランザクションが原因で HLL が大きくなっている場合は、`UNDO` ログが蓄積されている (定期的にクリーンアップされていない) ことを意味します。書き込みトランザクションが多いと、この蓄積が急速に増加する可能性があります。MySQL では、`UNDO` は [SYSTEM テーブルスペース](https://dev.mysql.com/doc/refman/5.7/en/innodb-system-tablespace.html)に保存されます。`SYSTEM` テーブルスペースは圧縮できません。`UNDO` ログにより、`SYSTEM` テーブルスペースが数 GB、さらには TB にまで増えることもあります。削除後、データの論理バックアップ (ダンプ) を作成して割り当てられたスペースを解放し、そのダンプを新しい DB インスタンスにインポートします。

   1. 読み取りトランザクション (実行時間の長いクエリ) が原因で HLL が大きくなっている場合は、クエリが大量の一時スペースを使用している可能性があります。再起動して一時スペースを解放します。`Temp` セクションで Performance Insights の DB メトリクスに変更 (`created_tmp_tables` など) がないかを調べます。詳細については、「[Amazon Aurora での Performance Insights を使用したDB 負荷のモニタリング](USER_PerfInsights.md)」を参照してください。

1. 長時間実行されるトランザクションを、変更される行数が少ないより小さなトランザクションに分割できますか?

1. ブロックされたトランザクションの変化やデッドロックの増加はありませんか? `Locks` セクションで Performance Insights の DB メトリクスにステータス変数の変更 (`innodb_row_lock_time`、` innodb_row_lock_waits`、および ` innodb_dead_locks` など) がないかを調べます。1 分または 5 分間隔を使用します。

1. 増加した待機イベントがあるか？ Performance Insights の待機イベントと待機タイプを 1 分または 5 分間隔で調べます。上位の待機イベントを分析し、それらがワークロードの変化やデータベースの競合と相関関係があるかどうかを確認します。例えば、`buf_pool mutex` はバッファプールの競合を示しています。詳細については、「[待機イベントを使用した Aurora MySQL のチューニング](AuroraMySQL.Managing.Tuning.wait-events.md)」を参照してください。

# Aurora MySQL データベースのメモリ使用量に関する問題のトラブルシューティング
<a name="ams-workload-memory"></a>

CloudWatch、拡張モニタリング、Performance Insights は、オペレーティングシステムレベルでのメモリ使用量 (データベースプロセスによるメモリ使用量など) の概要を提供しますが、エンジン内の接続やコンポーネント別のメモリ使用量を詳しく知ることはできません。

このトラブルシューティングには、パフォーマンススキーマと `sys` スキーマを使用できます。Aurora MySQL バージョン 3 では、パフォーマンススキーマを有効にすると、追加の計測がデフォルトで有効になります。Aurora MySQL バージョン 2 では、パフォーマンススキーマのメモリ使用量の計測のみがデフォルトで有効になります。パフォーマンススキーマでメモリ使用量を追跡するために使用できるテーブルと、パフォーマンススキーマのメモリ計測の有効化の詳細については、MySQL ドキュメントの「[Memory summary tables](https://dev.mysql.com/doc/refman/8.3/en/performance-schema-memory-summary-tables.html)」を参照してください。パフォーマンススキーマと Performance Insights の詳細については、「[Aurora MySQL における Performance Insights のPerformance Schema の概要](USER_PerfInsights.EnableMySQL.md)」を参照してください。

パフォーマンススキーマでは、現在のメモリ使用量を追跡するための詳細情報を参照できます。一方、MySQL の [sys スキーマ](https://dev.mysql.com/doc/refman/8.0/en/sys-schema.html)では、パフォーマンススキーマテーブルの上部のビューで、どこでメモリが使用されているかをすばやく特定できます。

`sys` スキーマには、接続、コンポーネント、クエリ別にメモリ使用量を追跡できる以下のビューがあります。


| ビュー | 説明 | 
| --- | --- | 
|  [memory\$1by\$1host\$1by\$1current\$1bytes](https://dev.mysql.com/doc/refman/8.0/en/sys-memory-by-host-by-current-bytes.html)  |  ホスト別にエンジンメモリ使用量に関する情報を表示します。どのアプリケーションサーバーまたはクライアントホストがメモリを消費しているかを特定するのに役立ちます。  | 
|  [memory\$1by\$1thread\$1by\$1current\$1bytes](https://dev.mysql.com/doc/refman/8.0/en/sys-memory-by-thread-by-current-bytes.html)  |  スレッド ID 別にエンジンメモリ使用量に関する情報を表示します。MySQL のスレッド ID は、クライアント接続またはバックグラウンドスレッドである場合があります。[sys.processlist](https://dev.mysql.com/doc/refman/8.0/en/sys-processlist.html) ビューまたは [performance\$1schema.threads](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-threads-table.html) テーブルを使用して、スレッド ID を MySQL 接続 ID にマッピングできます。  | 
|  [memory\$1by\$1user\$1by\$1current\$1bytes](https://dev.mysql.com/doc/refman/8.0/en/sys-memory-by-user-by-current-bytes.html)  |  ユーザー別のエンジンメモリ使用量に関する情報を表示します。どのユーザーアカウントまたはクライアントがメモリを消費しているかを特定するのに役立ちます。  | 
|  [memory\$1global\$1by\$1current\$1bytes](https://dev.mysql.com/doc/refman/8.0/en/sys-memory-global-by-current-bytes.html)  |  エンジンコンポーネント別のエンジンメモリ使用量に関する情報を表示します。エンジンバッファまたはコンポーネント別にメモリ使用量をグローバルに特定するのに役立ちます。例えば、InnoDB バッファプールの `memory/innodb/buf_buf_pool` イベントやプリペアドステートメントの `memory/sql/Prepared_statement::main_mem_root` イベントが表示される場合があります。  | 
|  [memory\$1global\$1total](https://dev.mysql.com/doc/refman/8.0/en/sys-memory-global-total.html)  |  データベースエンジンで追跡している合計メモリ使用量の概要を表示します。  | 

Aurora MySQL バージョン 3.05 以降では、[パフォーマンススキーマのステートメント概要テーブル](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-statement-summary-tables.html)でステートメントダイジェスト別の最大メモリ使用量を追跡することもできます。ステートメント概要テーブルには、正規化されたステートメントダイジェストとその実行に関する集約統計が表示されます。`MAX_TOTAL_MEMORY` 列は、統計の最後のリセット後またはデータベースインスタンスの再起動後の最大メモリ使用量をクエリダイジェスト別に特定するのに利用できます。大量のメモリを消費している可能性がある特定のクエリを特定するのに役立ちます。

**注記**  
パフォーマンススキーマと `sys` スキーマには、サーバーの現在のメモリ使用量と、接続およびエンジンコンポーネント別のメモリ使用量のハイウォーターマークが表示されます。パフォーマンススキーマはメモリ内に保持されるため、DB インスタンスを再起動すると情報がリセットされます。履歴を長期にわたって保持するには、このデータの取得と保存をパフォーマンススキーマの外部に設定することをお勧めします。

**Topics**
+ [例 1: 連続的に高いメモリ使用量](#ams-workload-memory.example1)
+ [例 2: 一時的なメモリスパイク](#ams-workload-memory.example2)
+ [例 3: 解放可能なメモリが継続的に減少し、再利用されない](#ams-workload-memory.example3)

## 例 1: 連続的に高いメモリ使用量
<a name="ams-workload-memory.example1"></a>

CloudWatch の `FreeableMemory` を概観すると、2024-03-26 02:59 UTC にメモリ使用量の大幅増を確認できます。

![\[高いメモリ使用量を示す FreeableMemory グラフ。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/ams-freeable-memory.png)


このグラフでは、詳細がわかりません。どのコンポーネントのメモリ使用量が最も多いかを判断するには、データベースにログインして `sys.memory_global_by_current_bytes` を確認できます。このテーブルには、MySQL が追跡するメモリイベントのリストと、イベント別のメモリ割り当てに関する情報が表示されます。各メモリ追跡イベントは `memory/%` で始まり、その後にイベントに関連するエンジンコンポーネントや機能に関する他の情報が続きます。

例えば、`memory/performance_schema/%` はパフォーマンススキーマに関連するメモリイベントであり、`memory/innodb/%` は InnoDB に関連するイベントです。イベントの命名規則の詳細については、MySQL ドキュメントの「[Performance Schema instrument naming conventions](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-instrument-naming.html)」を参照してください。

次のクエリから、`current_alloc` に基づいて有力な原因を確認できますが、`memory/performance_schema/%` イベントも多数あることがわかります。

```
mysql> SELECT * FROM sys.memory_global_by_current_bytes LIMIT 10;

+-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| event_name                                                                  | current_count | current_alloc | current_avg_alloc | high_count | high_alloc | high_avg_alloc |
+-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| memory/sql/Prepared_statement::main_mem_root                                |        512817 | 4.91 GiB      | 10.04 KiB         |     512823 | 4.91 GiB   | 10.04 KiB      |
| memory/performance_schema/prepared_statements_instances                     |           252 | 488.25 MiB    | 1.94 MiB          |        252 | 488.25 MiB | 1.94 MiB       |
| memory/innodb/hash0hash                                                     |             4 | 79.07 MiB     | 19.77 MiB         |          4 | 79.07 MiB  | 19.77 MiB      |
| memory/performance_schema/events_errors_summary_by_thread_by_error          |          1028 | 52.27 MiB     | 52.06 KiB         |       1028 | 52.27 MiB  | 52.06 KiB      |
| memory/performance_schema/events_statements_summary_by_thread_by_event_name |             4 | 47.25 MiB     | 11.81 MiB         |          4 | 47.25 MiB  | 11.81 MiB      |
| memory/performance_schema/events_statements_summary_by_digest               |             1 | 40.28 MiB     | 40.28 MiB         |          1 | 40.28 MiB  | 40.28 MiB      |
| memory/performance_schema/memory_summary_by_thread_by_event_name            |             4 | 31.64 MiB     | 7.91 MiB          |          4 | 31.64 MiB  | 7.91 MiB       |
| memory/innodb/memory                                                        |         15227 | 27.44 MiB     | 1.85 KiB          |      20619 | 33.33 MiB  | 1.66 KiB       |
| memory/sql/String::value                                                    |         74411 | 21.85 MiB     |  307 bytes        |      76867 | 25.54 MiB  |  348 bytes     |
| memory/sql/TABLE                                                            |          8381 | 21.03 MiB     | 2.57 KiB          |       8381 | 21.03 MiB  | 2.57 KiB       |
+-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
10 rows in set (0.02 sec)
```

パフォーマンススキーマはメモリに保存されることを以前に説明しました。つまり、パフォーマンススキーマも `performance_schema` メモリ計測で追跡されます。

**注記**  
パフォーマンススキーマが大量のメモリを使用していることがわかった場合、そのメモリ使用量を制限するには、要件に応じてデータベースパラメータを調整できます。詳細については、MySQL ドキュメントの「[The Performance Schema memory-allocation model](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-memory-model.html)」を参照してください。

見やすくするために、パフォーマンススキーマイベントを除外して同じクエリを再実行できます。出力は、次のように表示されます。
+ メモリ使用量が多いのは `memory/sql/Prepared_statement::main_mem_root` です。
+ `current_alloc` 列を見ると、MySQL では、このイベントに現在 4.91 GiB が割り当てられていることがわかります。
+ `high_alloc column` によると、4.91 GiB は、統計の最後のリセット後またはサーバーの再起動後からの `current_alloc` のハイウォーターマークであることがわかります。つまり、`memory/sql/Prepared_statement::main_mem_root` は最高値になっています。

```
mysql> SELECT * FROM sys.memory_global_by_current_bytes WHERE event_name NOT LIKE 'memory/performance_schema/%' LIMIT 10;

+-----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| event_name                                    | current_count | current_alloc | current_avg_alloc | high_count | high_alloc | high_avg_alloc |
+-----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| memory/sql/Prepared_statement::main_mem_root  |        512817 | 4.91 GiB      | 10.04 KiB         |     512823 | 4.91 GiB   | 10.04 KiB      |
| memory/innodb/hash0hash                       |             4 | 79.07 MiB     | 19.77 MiB         |          4 | 79.07 MiB  | 19.77 MiB      |
| memory/innodb/memory                          |         17096 | 31.68 MiB     | 1.90 KiB          |      22498 | 37.60 MiB  | 1.71 KiB       |
| memory/sql/String::value                      |        122277 | 27.94 MiB     |  239 bytes        |     124699 | 29.47 MiB  |  247 bytes     |
| memory/sql/TABLE                              |          9927 | 24.67 MiB     | 2.55 KiB          |       9929 | 24.68 MiB  | 2.55 KiB       |
| memory/innodb/lock0lock                       |          8888 | 19.71 MiB     | 2.27 KiB          |       8888 | 19.71 MiB  | 2.27 KiB       |
| memory/sql/Prepared_statement::infrastructure |        257623 | 16.24 MiB     |   66 bytes        |     257631 | 16.24 MiB  |   66 bytes     |
| memory/mysys/KEY_CACHE                        |             3 | 16.00 MiB     | 5.33 MiB          |          3 | 16.00 MiB  | 5.33 MiB       |
| memory/innodb/sync0arr                        |             3 | 7.03 MiB      | 2.34 MiB          |          3 | 7.03 MiB   | 2.34 MiB       |
| memory/sql/THD::main_mem_root                 |           815 | 6.56 MiB      | 8.24 KiB          |        849 | 7.19 MiB   | 8.67 KiB       |
+-----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
10 rows in set (0.06 sec)
```

イベントの名前から、このメモリはプリペアドステートメントに使用されていることがわかります。このメモリを使用している接続を確認したい場合は、[memory\$1by\$1thread\$1by\$1current\$1bytes](https://dev.mysql.com/doc/refman/8.0/en/sys-memory-by-thread-by-current-bytes.html) を参照できます。

次の例では、各接続に約 7 MiB が割り当てられ、ハイウォーターマークは約 6.29 MiB (`current_max_alloc`) です。この例では、プリペアドステートメントで 80 のテーブルと 800 の接続に `sysbench` を使用しているため、これは当然と言えます。このシナリオでメモリ使用量を減らしたい場合は、アプリケーションによるプリペアドステートメントの使用を最適化してメモリ消費量を削減できます。

```
mysql> SELECT * FROM sys.memory_by_thread_by_current_bytes;

+-----------+-------------------------------------------+--------------------+-------------------+-------------------+-------------------+-----------------+
| thread_id | user                                      | current_count_used | current_allocated | current_avg_alloc | current_max_alloc | total_allocated |
+-----------+-------------------------------------------+--------------------+-------------------+-------------------+-------------------+-----------------+
|        46 | rdsadmin@localhost                        |                405 | 8.47 MiB          | 21.42 KiB         | 8.00 MiB          | 155.86 MiB      |
|        61 | reinvent@10.0.4.4                         |               1749 | 6.72 MiB          | 3.93 KiB          | 6.29 MiB          | 14.24 MiB       |
|       101 | reinvent@10.0.4.4                         |               1845 | 6.71 MiB          | 3.72 KiB          | 6.29 MiB          | 14.50 MiB       |
|        55 | reinvent@10.0.4.4                         |               1674 | 6.68 MiB          | 4.09 KiB          | 6.29 MiB          | 14.13 MiB       |
|        57 | reinvent@10.0.4.4                         |               1416 | 6.66 MiB          | 4.82 KiB          | 6.29 MiB          | 13.52 MiB       |
|       112 | reinvent@10.0.4.4                         |               1759 | 6.66 MiB          | 3.88 KiB          | 6.29 MiB          | 14.17 MiB       |
|        66 | reinvent@10.0.4.4                         |               1428 | 6.64 MiB          | 4.76 KiB          | 6.29 MiB          | 13.47 MiB       |
|        75 | reinvent@10.0.4.4                         |               1389 | 6.62 MiB          | 4.88 KiB          | 6.29 MiB          | 13.40 MiB       |
|       116 | reinvent@10.0.4.4                         |               1333 | 6.61 MiB          | 5.08 KiB          | 6.29 MiB          | 13.21 MiB       |
|        90 | reinvent@10.0.4.4                         |               1448 | 6.59 MiB          | 4.66 KiB          | 6.29 MiB          | 13.58 MiB       |
|        98 | reinvent@10.0.4.4                         |               1440 | 6.57 MiB          | 4.67 KiB          | 6.29 MiB          | 13.52 MiB       |
|        94 | reinvent@10.0.4.4                         |               1433 | 6.57 MiB          | 4.69 KiB          | 6.29 MiB          | 13.49 MiB       |
|        62 | reinvent@10.0.4.4                         |               1323 | 6.55 MiB          | 5.07 KiB          | 6.29 MiB          | 13.48 MiB       |
|        87 | reinvent@10.0.4.4                         |               1323 | 6.55 MiB          | 5.07 KiB          | 6.29 MiB          | 13.25 MiB       |
|        99 | reinvent@10.0.4.4                         |               1346 | 6.54 MiB          | 4.98 KiB          | 6.29 MiB          | 13.24 MiB       |
|       105 | reinvent@10.0.4.4                         |               1347 | 6.54 MiB          | 4.97 KiB          | 6.29 MiB          | 13.34 MiB       |
|        73 | reinvent@10.0.4.4                         |               1335 | 6.54 MiB          | 5.02 KiB          | 6.29 MiB          | 13.23 MiB       |
|        54 | reinvent@10.0.4.4                         |               1510 | 6.53 MiB          | 4.43 KiB          | 6.29 MiB          | 13.49 MiB       |
.                                                                                                                                                          .
.                                                                                                                                                          .
.                                                                                                                                                          .
|       812 | reinvent@10.0.4.4                         |               1259 | 6.38 MiB          | 5.19 KiB          | 6.29 MiB          | 13.05 MiB       |
|       214 | reinvent@10.0.4.4                         |               1279 | 6.38 MiB          | 5.10 KiB          | 6.29 MiB          | 12.90 MiB       |
|       325 | reinvent@10.0.4.4                         |               1254 | 6.38 MiB          | 5.21 KiB          | 6.29 MiB          | 12.99 MiB       |
|       705 | reinvent@10.0.4.4                         |               1273 | 6.37 MiB          | 5.13 KiB          | 6.29 MiB          | 13.03 MiB       |
|       530 | reinvent@10.0.4.4                         |               1268 | 6.37 MiB          | 5.15 KiB          | 6.29 MiB          | 12.92 MiB       |
|       307 | reinvent@10.0.4.4                         |               1263 | 6.37 MiB          | 5.17 KiB          | 6.29 MiB          | 12.87 MiB       |
|       738 | reinvent@10.0.4.4                         |               1260 | 6.37 MiB          | 5.18 KiB          | 6.29 MiB          | 13.00 MiB       |
|       819 | reinvent@10.0.4.4                         |               1252 | 6.37 MiB          | 5.21 KiB          | 6.29 MiB          | 13.01 MiB       |
|        31 | innodb/srv_purge_thread                   |              17810 | 3.14 MiB          |  184 bytes        | 2.40 MiB          | 205.69 MiB      |
|        38 | rdsadmin@localhost                        |                599 | 1.76 MiB          | 3.01 KiB          | 1.00 MiB          | 25.58 MiB       |
|         1 | sql/main                                  |               3756 | 1.32 MiB          |  367 bytes        | 355.78 KiB        | 6.19 MiB        |
|       854 | rdsadmin@localhost                        |                 46 | 1.08 MiB          | 23.98 KiB         | 1.00 MiB          | 5.10 MiB        |
|        30 | innodb/clone_gtid_thread                  |               1596 | 573.14 KiB        |  367 bytes        | 254.91 KiB        | 970.69 KiB      |
|        40 | rdsadmin@localhost                        |                235 | 245.19 KiB        | 1.04 KiB          | 128.88 KiB        | 808.64 KiB      |
|       853 | rdsadmin@localhost                        |                 96 | 94.63 KiB         | 1009 bytes        | 29.73 KiB         | 422.45 KiB      |
|        36 | rdsadmin@localhost                        |                 33 | 36.29 KiB         | 1.10 KiB          | 16.08 KiB         | 74.15 MiB       |
|        33 | sql/event_scheduler                       |                  3 | 16.27 KiB         | 5.42 KiB          | 16.04 KiB         | 16.27 KiB       |
|        35 | sql/compress_gtid_table                   |                  8 | 14.20 KiB         | 1.77 KiB          | 8.05 KiB          | 18.62 KiB       |
|        25 | innodb/fts_optimize_thread                |                 12 | 1.86 KiB          |  158 bytes        |  648 bytes        | 1.98 KiB        |
|        23 | innodb/srv_master_thread                  |                 11 | 1.23 KiB          |  114 bytes        |  361 bytes        | 24.40 KiB       |
|        24 | innodb/dict_stats_thread                  |                 11 | 1.23 KiB          |  114 bytes        |  361 bytes        | 1.35 KiB        |
|         5 | innodb/io_read_thread                     |                  1 |  144 bytes        |  144 bytes        |  144 bytes        |  144 bytes      |
|         6 | innodb/io_read_thread                     |                  1 |  144 bytes        |  144 bytes        |  144 bytes        |  144 bytes      |
|         2 | sql/aws_oscar_log_level_monitor           |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|         4 | innodb/io_ibuf_thread                     |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|         7 | innodb/io_write_thread                    |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|         8 | innodb/io_write_thread                    |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|         9 | innodb/io_write_thread                    |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|        10 | innodb/io_write_thread                    |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|        11 | innodb/srv_lra_thread                     |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|        12 | innodb/srv_akp_thread                     |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|        18 | innodb/srv_lock_timeout_thread            |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |  248 bytes      |
|        19 | innodb/srv_error_monitor_thread           |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|        20 | innodb/srv_monitor_thread                 |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|        21 | innodb/buf_resize_thread                  |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|        22 | innodb/btr_search_sys_toggle_thread       |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|        32 | innodb/dict_persist_metadata_table_thread |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
|        34 | sql/signal_handler                        |                  0 |    0 bytes        |    0 bytes        |    0 bytes        |    0 bytes      |
+-----------+-------------------------------------------+--------------------+-------------------+-------------------+-------------------+-----------------+
831 rows in set (2.48 sec)
```

前に述べたように、ここでスレッド ID (`thd_id`) 値は、サーバーのバックグラウンドスレッドまたはデータベース接続を参照できます。スレッド ID 値をデータベース接続 ID にマッピングする場合は、`performance_schema.threads` テーブルまたは `sys.processlist` ビューを使用できます。`conn_id` は接続 ID です。

```
mysql> SELECT thd_id,conn_id,user,db,command,state,time,last_wait FROM sys.processlist WHERE user='reinvent@10.0.4.4';

+--------+---------+-------------------+----------+---------+----------------+------+-------------------------------------------------+
| thd_id | conn_id | user              | db       | command | state          | time | last_wait                                       |
+--------+---------+-------------------+----------+---------+----------------+------+-------------------------------------------------+
|    590 |     562 | reinvent@10.0.4.4 | sysbench | Execute | closing tables |    0 | wait/io/redo_log_flush                          |
|    578 |     550 | reinvent@10.0.4.4 | sysbench | Sleep   | NULL           |    0 | idle                                            |
|    579 |     551 | reinvent@10.0.4.4 | sysbench | Execute | closing tables |    0 | wait/io/redo_log_flush                          |
|    580 |     552 | reinvent@10.0.4.4 | sysbench | Execute | updating       |    0 | wait/io/table/sql/handler                       |
|    581 |     553 | reinvent@10.0.4.4 | sysbench | Execute | updating       |    0 | wait/io/table/sql/handler                       |
|    582 |     554 | reinvent@10.0.4.4 | sysbench | Sleep   | NULL           |    0 | idle                                            |
|    583 |     555 | reinvent@10.0.4.4 | sysbench | Sleep   | NULL           |    0 | idle                                            |
|    584 |     556 | reinvent@10.0.4.4 | sysbench | Execute | updating       |    0 | wait/io/table/sql/handler                       |
|    585 |     557 | reinvent@10.0.4.4 | sysbench | Execute | closing tables |    0 | wait/io/redo_log_flush                          |
|    586 |     558 | reinvent@10.0.4.4 | sysbench | Execute | updating       |    0 | wait/io/table/sql/handler                       |
|    587 |     559 | reinvent@10.0.4.4 | sysbench | Execute | closing tables |    0 | wait/io/redo_log_flush                          |
.                                                                                                                                     .
.                                                                                                                                     .
.                                                                                                                                     .
|    323 |     295 | reinvent@10.0.4.4 | sysbench | Sleep   | NULL           |    0 | idle                                            |
|    324 |     296 | reinvent@10.0.4.4 | sysbench | Execute | updating       |    0 | wait/io/table/sql/handler                       |
|    325 |     297 | reinvent@10.0.4.4 | sysbench | Execute | closing tables |    0 | wait/io/redo_log_flush                          |
|    326 |     298 | reinvent@10.0.4.4 | sysbench | Execute | updating       |    0 | wait/io/table/sql/handler                       |
|    438 |     410 | reinvent@10.0.4.4 | sysbench | Execute | System lock    |    0 | wait/lock/table/sql/handler                     |
|    280 |     252 | reinvent@10.0.4.4 | sysbench | Sleep   | starting       |    0 | wait/io/socket/sql/client_connection            |
|     98 |      70 | reinvent@10.0.4.4 | sysbench | Query   | freeing items  |    0 | NULL                                            |
+--------+---------+-------------------+----------+---------+----------------+------+-------------------------------------------------+
804 rows in set (5.51 sec)
```

次に `sysbench` ワークロードを停止し、接続を終了してメモリを解放します。イベントをもう一度確認すると、メモリが解放されたことを確認できますが、`high_alloc` には以前としてハイウォーターマークが表示されています。`high_alloc` 列は、メモリ使用量の急増を特定するのに非常に役立ちます。`current_alloc` は、現在割り当てられているメモリのみを示すため、使用量の急増をすぐに特定できない場合があります。

```
mysql> SELECT * FROM sys.memory_global_by_current_bytes WHERE event_name='memory/sql/Prepared_statement::main_mem_root' LIMIT 10;

+----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| event_name                                   | current_count | current_alloc | current_avg_alloc | high_count | high_alloc | high_avg_alloc |
+----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| memory/sql/Prepared_statement::main_mem_root |            17 | 253.80 KiB    | 14.93 KiB         |     512823 | 4.91 GiB   | 10.04 KiB      |
+----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
1 row in set (0.00 sec)
```

`performance_schema` をリセットする場合は、`high_alloc` のメモリ概要テーブルを切り捨てることができますが、これに伴ってすべてのメモリ計測がリセットされます。詳細については、MySQL ドキュメントの「[Performance Schema general table characteristics](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-table-characteristics.html)」を参照してください。

次の例では、切り捨て後に `high_alloc` がリセットされていることがわかります。

```
mysql> TRUNCATE `performance_schema`.`memory_summary_global_by_event_name`;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM sys.memory_global_by_current_bytes WHERE event_name='memory/sql/Prepared_statement::main_mem_root' LIMIT 10;

+----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| event_name                                   | current_count | current_alloc | current_avg_alloc | high_count | high_alloc | high_avg_alloc |
+----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| memory/sql/Prepared_statement::main_mem_root |            17 | 253.80 KiB    | 14.93 KiB         |         17 | 253.80 KiB | 14.93 KiB      |
+----------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
1 row in set (0.00 sec)
```

## 例 2: 一時的なメモリスパイク
<a name="ams-workload-memory.example2"></a>

もう 1 つのよくある現象は、データベースサーバーでメモリ使用量が短時間に急増することです。これは空きメモリの定期的な低下を示している場合があります。メモリは解放済みであるため、`sys.memory_global_by_current_bytes` の `current_alloc` を使用したトラブルシューティングは困難です。

**注記**  
パフォーマンススキーマの統計をリセットしたり、データベースインスタンスを再起動したりすると、この情報は `sys` または p`erformance_schema` で使用できなくなります。この情報を保持するには、外部メトリクス収集を設定することをお勧めします。

次のグラフに示す拡張モニタリングの `os.memory.free` メトリクスでは、メモリ使用量が 7 秒間だけ急増したことがわかります。拡張モニタリングでは、1 秒という短い間隔で監視できるため、このような一時的なスパイクを検出するのに最適です。

![\[一時的なメモリ使用量の経時的な急増と、潜在的なメモリ管理の問題を示す周期的なパターンを示すグラフ。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/ams-free-memory-spikes.png)


ここでメモリ消費の原因を診断しやすくするために、`sys` メモリの概要ビューの `high_alloc` と、[パフォーマンススキーマのステートメント概要テーブル](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-statement-summary-tables.html)を組み合わせて使用し、問題のあるセッションや接続を特定できます。

予想どおり、現在のメモリ使用量は多くないため、`current_alloc` の `sys` スキーマビューでは大きな問題を確認できません。

```
mysql> SELECT * FROM sys.memory_global_by_current_bytes LIMIT 10;

+-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| event_name                                                                  | current_count | current_alloc | current_avg_alloc | high_count | high_alloc | high_avg_alloc |
+-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| memory/innodb/hash0hash                                                     |             4 | 79.07 MiB     | 19.77 MiB         |          4 | 79.07 MiB  | 19.77 MiB      |
| memory/innodb/os0event                                                      |        439372 | 60.34 MiB     |  144 bytes        |     439372 | 60.34 MiB  |  144 bytes     |
| memory/performance_schema/events_statements_summary_by_digest               |             1 | 40.28 MiB     | 40.28 MiB         |          1 | 40.28 MiB  | 40.28 MiB      |
| memory/mysys/KEY_CACHE                                                      |             3 | 16.00 MiB     | 5.33 MiB          |          3 | 16.00 MiB  | 5.33 MiB       |
| memory/performance_schema/events_statements_history_long                    |             1 | 14.34 MiB     | 14.34 MiB         |          1 | 14.34 MiB  | 14.34 MiB      |
| memory/performance_schema/events_errors_summary_by_thread_by_error          |           257 | 13.07 MiB     | 52.06 KiB         |        257 | 13.07 MiB  | 52.06 KiB      |
| memory/performance_schema/events_statements_summary_by_thread_by_event_name |             1 | 11.81 MiB     | 11.81 MiB         |          1 | 11.81 MiB  | 11.81 MiB      |
| memory/performance_schema/events_statements_summary_by_digest.digest_text   |             1 | 9.77 MiB      | 9.77 MiB          |          1 | 9.77 MiB   | 9.77 MiB       |
| memory/performance_schema/events_statements_history_long.digest_text        |             1 | 9.77 MiB      | 9.77 MiB          |          1 | 9.77 MiB   | 9.77 MiB       |
| memory/performance_schema/events_statements_history_long.sql_text           |             1 | 9.77 MiB      | 9.77 MiB          |          1 | 9.77 MiB   | 9.77 MiB       |
+-----------------------------------------------------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
10 rows in set (0.01 sec)
```

ビューを `high_alloc` の順に並べ替えると、`memory/temptable/physical_ram` コンポーネントにまさに問題があることがわかります。使用量の最高値が 515.00 MiB になっています。

その名前が示すように、`memory/temptable/physical_ram` は、MySQL 8.0 で MySQL に導入された `TEMP` ストレージエンジンのメモリ使用量を計測します。MySQL で一時テーブルを使用する方法の詳細については、MySQL ドキュメントの「[Internal temporary table use in MySQL](https://dev.mysql.com/doc/refman/8.0/en/internal-temporary-tables.html)」を参照してください。

**注記**  
この例では、`sys.x$memory_global_by_current_bytes` ビューを使用しています。

```
mysql> SELECT event_name, format_bytes(current_alloc) AS "currently allocated", sys.format_bytes(high_alloc) AS "high-water mark"  
FROM sys.x$memory_global_by_current_bytes ORDER BY high_alloc DESC LIMIT 10;

+-----------------------------------------------------------------------------+---------------------+-----------------+
| event_name                                                                  | currently allocated | high-water mark |
+-----------------------------------------------------------------------------+---------------------+-----------------+
| memory/temptable/physical_ram                                               | 4.00 MiB            | 515.00 MiB      |
| memory/innodb/hash0hash                                                     | 79.07 MiB           | 79.07 MiB       |
| memory/innodb/os0event                                                      | 63.95 MiB           | 63.95 MiB       |
| memory/performance_schema/events_statements_summary_by_digest               | 40.28 MiB           | 40.28 MiB       |
| memory/mysys/KEY_CACHE                                                      | 16.00 MiB           | 16.00 MiB       |
| memory/performance_schema/events_statements_history_long                    | 14.34 MiB           | 14.34 MiB       |
| memory/performance_schema/events_errors_summary_by_thread_by_error          | 13.07 MiB           | 13.07 MiB       |
| memory/performance_schema/events_statements_summary_by_thread_by_event_name | 11.81 MiB           | 11.81 MiB       |
| memory/performance_schema/events_statements_summary_by_digest.digest_text   | 9.77 MiB            | 9.77 MiB        |
| memory/performance_schema/events_statements_history_long.sql_text           | 9.77 MiB            | 9.77 MiB        |
+-----------------------------------------------------------------------------+---------------------+-----------------+
10 rows in set (0.00 sec)
```

[例 1: 連続的に高いメモリ使用量](#ams-workload-memory.example1) では、各接続の現在のメモリ使用量を調べて、どの接続が問題のメモリを使用しているかを判断しました。この例では、メモリは解放済みであるため、現在の接続のメモリ使用量を調べても役に立ちません。

より深く掘り下げて問題の原因であるステートメント、ユーザー、ホストを見つけるには、パフォーマンススキーマを使用します。パフォーマンススキーマには、イベント名、ステートメントダイジェスト、ホスト、スレッド、ユーザーなど、さまざまな次元で分類された複数のステートメント概要テーブルがあります。各ビューでは、特定のステートメントの実行場所や実行内容をより深く掘り下げることができます。このセクションでは、主に `MAX_TOTAL_MEMORY` について説明していますが、「[パフォーマンススキーマのステートメント概要テーブル](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-statement-summary-tables.html)」ですべての例に関する詳細を参照できます。

```
mysql> SHOW TABLES IN performance_schema LIKE 'events_statements_summary_%';

+------------------------------------------------------------+
| Tables_in_performance_schema (events_statements_summary_%) |
+------------------------------------------------------------+
| events_statements_summary_by_account_by_event_name         |
| events_statements_summary_by_digest                        |
| events_statements_summary_by_host_by_event_name            |
| events_statements_summary_by_program                       |
| events_statements_summary_by_thread_by_event_name          |
| events_statements_summary_by_user_by_event_name            |
| events_statements_summary_global_by_event_name             |
+------------------------------------------------------------+
7 rows in set (0.00 sec)
```

まず、`events_statements_summary_by_digest` を調べて `MAX_TOTAL_MEMORY` を確認します。

これにより、以下がわかります。
+ メモリ使用量が多い筆頭は、ダイジェスト `20676ce4a690592ff05debcffcbc26faeb76f22005e7628364d7a498769d0c4a` を使用するクエリのようです。`MAX_TOTAL_MEMORY` は 537450710 で、`sys.x$memory_global_by_current_bytes` の `memory/temptable/physical_ram` イベントで確認したハイウォーターマークと一致しています。
+ これまでに 4 回 (`COUNT_STAR`) 実行されており、最初は 2024-03-26 04:08:34.943256、最後は 2024-03-26 04:43:06.998310 です。

```
mysql> SELECT SCHEMA_NAME,DIGEST,COUNT_STAR,MAX_TOTAL_MEMORY,FIRST_SEEN,LAST_SEEN
FROM performance_schema.events_statements_summary_by_digest ORDER BY MAX_TOTAL_MEMORY DESC LIMIT 5;

+-------------+------------------------------------------------------------------+------------+------------------+----------------------------+----------------------------+
| SCHEMA_NAME | DIGEST                                                           | COUNT_STAR | MAX_TOTAL_MEMORY | FIRST_SEEN                 | LAST_SEEN                  |
+-------------+------------------------------------------------------------------+------------+------------------+----------------------------+----------------------------+
| sysbench    | 20676ce4a690592ff05debcffcbc26faeb76f22005e7628364d7a498769d0c4a |          4 |        537450710 | 2024-03-26 04:08:34.943256 | 2024-03-26 04:43:06.998310 |
| NULL        | f158282ea0313fefd0a4778f6e9b92fc7d1e839af59ebd8c5eea35e12732c45d |          4 |          3636413 | 2024-03-26 04:29:32.712348 | 2024-03-26 04:36:26.269329 |
| NULL        | 0046bc5f642c586b8a9afd6ce1ab70612dc5b1fd2408fa8677f370c1b0ca3213 |          2 |          3459965 | 2024-03-26 04:31:37.674008 | 2024-03-26 04:32:09.410718 |
| NULL        | 8924f01bba3c55324701716c7b50071a60b9ceaf17108c71fd064c20c4ab14db |          1 |          3290981 | 2024-03-26 04:31:49.751506 | 2024-03-26 04:31:49.751506 |
| NULL        | 90142bbcb50a744fcec03a1aa336b2169761597ea06d85c7f6ab03b5a4e1d841 |          1 |          3131729 | 2024-03-26 04:15:09.719557 | 2024-03-26 04:15:09.719557 |
+-------------+------------------------------------------------------------------+------------+------------------+----------------------------+----------------------------+
5 rows in set (0.00 sec)
```

問題があるダイジェストがわかったので、クエリテキスト、実行したユーザー、実行場所などの詳細を取得できます。返されたダイジェストテキストから、これは 4 つの一時テーブルを作成して 4 つのテーブルスキャンを実行する一般的なテーブル式 (CTE) であり、非常に効率の悪いものであることがわかります。

```
mysql> SELECT SCHEMA_NAME,DIGEST_TEXT,QUERY_SAMPLE_TEXT,MAX_TOTAL_MEMORY,SUM_ROWS_SENT,SUM_ROWS_EXAMINED,SUM_CREATED_TMP_TABLES,SUM_NO_INDEX_USED
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST='20676ce4a690592ff05debcffcbc26faeb76f22005e7628364d7a498769d0c4a'\G;

*************************** 1. row ***************************
           SCHEMA_NAME: sysbench
           DIGEST_TEXT: WITH RECURSIVE `cte` ( `n` ) AS ( SELECT ? FROM `sbtest1` UNION ALL SELECT `id` + ? FROM `sbtest1` ) SELECT * FROM `cte`
     QUERY_SAMPLE_TEXT: WITH RECURSIVE cte (n) AS (   SELECT 1  from sbtest1 UNION ALL   SELECT id + 1 FROM sbtest1) SELECT * FROM cte
      MAX_TOTAL_MEMORY: 537450710
         SUM_ROWS_SENT: 80000000
     SUM_ROWS_EXAMINED: 80000000
SUM_CREATED_TMP_TABLES: 4
     SUM_NO_INDEX_USED: 4
1 row in set (0.01 sec)
```

`events_statements_summary_by_digest` テーブルとその他のパフォーマンススキーマのステートメント概要テーブルの詳細については、MySQL ドキュメントの「[Statement summary tables](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-statement-summary-tables.html)」を参照してください。

[EXPLAIN](https://dev.mysql.com/doc/refman/8.0/en/explain.html) または [EXPLAIN ANALYZE](https://dev.mysql.com/doc/refman/8.0/en/explain.html#explain-analyze) ステートメントを実行して詳細を確認することもできます。

**注記**  
`EXPLAIN ANALYZE` は、`EXPLAIN` よりも多くの情報を提供できますが、クエリも実行するので注意する必要があります。

```
-- EXPLAIN
mysql> EXPLAIN WITH RECURSIVE cte (n) AS (SELECT 1  FROM sbtest1 UNION ALL SELECT id + 1 FROM sbtest1) SELECT * FROM cte;

+----+-------------+------------+------------+-------+---------------+------+---------+------+----------+----------+-------------+
| id | select_type | table      | partitions | type  | possible_keys | key  | key_len | ref  | rows     | filtered | Extra       |
+----+-------------+------------+------------+-------+---------------+------+---------+------+----------+----------+-------------+
|  1 | PRIMARY     | <derived2> | NULL       | ALL   | NULL          | NULL | NULL    | NULL | 19221520 |   100.00 | NULL        |
|  2 | DERIVED     | sbtest1    | NULL       | index | NULL          | k_1  | 4       | NULL |  9610760 |   100.00 | Using index |
|  3 | UNION       | sbtest1    | NULL       | index | NULL          | k_1  | 4       | NULL |  9610760 |   100.00 | Using index |
+----+-------------+------------+------------+-------+---------------+------+---------+------+----------+----------+-------------+
3 rows in set, 1 warning (0.00 sec)

-- EXPLAIN format=tree 
mysql> EXPLAIN format=tree WITH RECURSIVE cte (n) AS (SELECT 1 FROM sbtest1 UNION ALL SELECT id + 1 FROM sbtest1) SELECT * FROM cte\G;

*************************** 1. row ***************************
EXPLAIN: -> Table scan on cte  (cost=4.11e+6..4.35e+6 rows=19.2e+6)
    -> Materialize union CTE cte  (cost=4.11e+6..4.11e+6 rows=19.2e+6)
        -> Index scan on sbtest1 using k_1  (cost=1.09e+6 rows=9.61e+6)
        -> Index scan on sbtest1 using k_1  (cost=1.09e+6 rows=9.61e+6)
1 row in set (0.00 sec)

-- EXPLAIN ANALYZE 
mysql> EXPLAIN ANALYZE WITH RECURSIVE cte (n) AS (SELECT 1 from sbtest1 UNION ALL SELECT id + 1 FROM sbtest1) SELECT * FROM cte\G;

*************************** 1. row ***************************
EXPLAIN: -> Table scan on cte  (cost=4.11e+6..4.35e+6 rows=19.2e+6) (actual time=6666..9201 rows=20e+6 loops=1)
    -> Materialize union CTE cte  (cost=4.11e+6..4.11e+6 rows=19.2e+6) (actual time=6666..6666 rows=20e+6 loops=1)
        -> Covering index scan on sbtest1 using k_1  (cost=1.09e+6 rows=9.61e+6) (actual time=0.0365..2006 rows=10e+6 loops=1)
        -> Covering index scan on sbtest1 using k_1  (cost=1.09e+6 rows=9.61e+6) (actual time=0.0311..2494 rows=10e+6 loops=1)
1 row in set (10.53 sec)
```

ここで、クエリを実行したユーザーがわかるでしょうか。パフォーマンススキーマを見ると、`destructive_operator` ユーザーの `MAX_TOTAL_MEMORY` が 537450710 になっており、前の結果と一致しています。

**注記**  
パフォーマンススキーマはメモリに保存されるため、監査の唯一のソースとして依存すべきではありません。実行したステートメントやユーザーの履歴を保持する必要がある場合は、[[Aurora の高度な監査]](AuroraMySQL.Auditing.md) を有効にすることをお勧めします。メモリ使用量に関する情報も保持する必要がある場合は、これらの値をエクスポートして保存するようにモニタリングを設定することをお勧めします。

```
mysql> SELECT USER,EVENT_NAME,COUNT_STAR,MAX_TOTAL_MEMORY FROM performance_schema.events_statements_summary_by_user_by_event_name
ORDER BY MAX_CONTROLLED_MEMORY DESC LIMIT 5;

+----------------------+---------------------------+------------+------------------+
| USER                 | EVENT_NAME                | COUNT_STAR | MAX_TOTAL_MEMORY |
+----------------------+---------------------------+------------+------------------+
| destructive_operator | statement/sql/select      |          4 |        537450710 |
| rdsadmin             | statement/sql/select      |       4172 |          3290981 |
| rdsadmin             | statement/sql/show_tables |          2 |          3615821 |
| rdsadmin             | statement/sql/show_fields |          2 |          3459965 |
| rdsadmin             | statement/sql/show_status |         75 |          1914976 |
+----------------------+---------------------------+------------+------------------+
5 rows in set (0.00 sec)

mysql> SELECT HOST,EVENT_NAME,COUNT_STAR,MAX_TOTAL_MEMORY FROM performance_schema.events_statements_summary_by_host_by_event_name
WHERE HOST != 'localhost' AND COUNT_STAR>0 ORDER BY MAX_CONTROLLED_MEMORY DESC LIMIT 5;

+------------+----------------------+------------+------------------+
| HOST       | EVENT_NAME           | COUNT_STAR | MAX_TOTAL_MEMORY |
+------------+----------------------+------------+------------------+
| 10.0.8.231 | statement/sql/select |          4 |        537450710 |
+------------+----------------------+------------+------------------+
1 row in set (0.00 sec)
```

## 例 3: 解放可能なメモリが継続的に減少し、再利用されない
<a name="ams-workload-memory.example3"></a>

InnoDB データベースエンジンは、異なるコンポーネントに対してさまざまな特殊なメモリ追跡イベントを使用します。これらの特定のイベントにより、主要な InnoDB サブシステムのメモリ使用量を詳細に追跡できます。次に例を示します。
+ `memory/innodb/buf0buf` – InnoDB バッファプールのメモリ割り当てのモニタリング専用。
+ `memory/innodb/ibuf0ibuf` – 特に、InnoDB 変更バッファに関連するメモリの変化を追跡します。

メモリの上位コンシューマーを特定するには、`sys.memory_global_by_current_bytes` をクエリします。

```
mysql> SELECT event_name,current_alloc FROM sys.memory_global_by_current_bytes LIMIT 10;

+-----------------------------------------------------------------+---------------+
| event_name                                                      | current_alloc |
+-----------------------------------------------------------------+---------------+
| memory/innodb/memory                                            | 5.28 GiB      |
| memory/performance_schema/table_io_waits_summary_by_index_usage | 495.00 MiB    |
| memory/performance_schema/table_shares                          | 488.00 MiB    |
| memory/sql/TABLE_SHARE::mem_root                                | 388.95 MiB    |
| memory/innodb/std                                               | 226.88 MiB    |
| memory/innodb/fil0fil                                           | 198.49 MiB    |
| memory/sql/binlog_io_cache                                      | 128.00 MiB    |
| memory/innodb/mem0mem                                           | 96.82 MiB     |
| memory/innodb/dict0dict                                         | 96.76 MiB     |
| memory/performance_schema/rwlock_instances                      | 88.00 MiB     |
+-----------------------------------------------------------------+---------------+
10 rows in set (0.00 sec)
```

結果は、`memory/innodb/memory` が上位コンシューマーであり、現在割り当てられているメモリの 5.28 GiB を使用していることを示しています。このイベントは、前述の `memory/innodb/buf0buf` のように、より具体的な待機イベントに関連付けられていない、さまざまな InnoDB コンポーネント全体でのメモリ割り当てのカテゴリとして機能します。

InnoDB コンポーネントがメモリの主要コンシューマーであることが確認できたので、次の MySQL コマンドを使用して、詳細を掘り下げて調べることができます。

```
SHOW ENGINE INNODB STATUS \G;
```

[SHOW ENGINE INNODB STATUS](https://dev.mysql.com/doc/refman/8.4/en/show-engine.html) コマンドは、さまざまな InnoDB コンポーネントの詳細なメモリ使用量統計など、InnoDB ストレージエンジンの包括的なステータスレポートを提供します。このレポートを基に、どの特定の InnoDB 構造またはオペレーションが最もメモリを消費しているかを確認できます。詳細については、MySQL ドキュメントの「[InnoDB in-memory structures](https://dev.mysql.com/doc/refman/8.0/en/innodb-in-memory-structures.html)」を参照してください。

InnoDB ステータスレポートの `BUFFER POOL AND MEMORY` セクションを分析すると、5,051,647,748 バイト (4.7 GiB) が[ディクショナリオブジェクトキャッシュ](https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-object-cache.html)に割り当てられ、`memory/innodb/memory` が追跡するメモリの 89% を占めていることがわかります。

```
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 0
Dictionary memory allocated 5051647748
Buffer pool size 170512
Free buffers 142568
Database pages 27944
Old database pages 10354
Modified db pages 6
Pending reads 0
```

ディクショナリオブジェクトキャッシュは、以前アクセスしたデータディクショナリオブジェクトをメモリに保存し、オブジェクトの再利用を可能にしてパフォーマンスを向上させる、共有グローバルキャッシュです。ディクショナリオブジェクトキャッシュへの高いメモリ割り当ては、データディクショナリキャッシュ内のデータベースオブジェクトが多いことを示唆しています。

これで、データディクショナリキャッシュが主要コンシューマーであることがわかりました。次に、データディクショナリキャッシュで開いているテーブルを調べます。テーブル定義キャッシュ内のテーブル数を確認するには、グローバルステータス変数 [open\$1table\$1definitions](https://dev.mysql.com/doc/refman/8.4/en/server-status-variables.html#statvar_Open_table_definitions) をクエリします。

```
mysql> show global status like 'open_table_definitions';

+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Open_table_definitions | 20000 |
+------------------------+-------+
1 row in set (0.00 sec)
```

詳細については、MySQL ドキュメントの「[MySQL でのテーブルのオープンとクローズの方法](https://dev.mysql.com/doc/refman/8.0/en/table-cache.html)」を参照してください。

DB クラスターまたは DB インスタンスパラメータグループの `table_definition_cache` パラメータを制限することで、データディクショナリキャッシュ内のテーブル定義の数を制限できます。Aurora MySQL の場合、この値はテーブル定義キャッシュ内のテーブル数のソフト制限として機能します。デフォルト値はインスタンスクラスに依存し、次のように設定されています。

```
LEAST({DBInstanceClassMemory/393040}, 20000)
```

テーブルの数が `table_definition_cache` 制限を超えると、LRU (least recently used) メカニズムはキャッシュからテーブルをエビクションして削除します。ただし、外部キー関係に関連するテーブルは LRU リストに配置されないため、削除されません。

現在のシナリオでは、[FLUSH TABLES](https://dev.mysql.com/doc/refman/8.4/en/flush.html) を実行してテーブル定義キャッシュをクリアします。このアクションにより、次に示すように、[Open\$1table\$1definitions](https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html#statvar_Open_table_definitions) グローバルステータス変数が 20,000 から 12 に大幅に減少します。

```
mysql> show global status like 'open_table_definitions';

+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Open_table_definitions | 12    |
+------------------------+-------+
1 row in set (0.00 sec)
```

この減少にもかかわらず、`memory/innodb/memory` のメモリ割り当ては 5.18 GiB と高いままであり、割り当てられたディクショナリメモリにも変化がないことがわかります。これは、次のクエリ結果から明らかです。

```
mysql> SELECT event_name,current_alloc FROM sys.memory_global_by_current_bytes LIMIT 10;

+-----------------------------------------------------------------+---------------+
| event_name                                                      | current_alloc |
+-----------------------------------------------------------------+---------------+
| memory/innodb/memory                                            | 5.18 GiB      |
| memory/performance_schema/table_io_waits_summary_by_index_usage | 495.00 MiB    |
| memory/performance_schema/table_shares                          | 488.00 MiB    |
| memory/sql/TABLE_SHARE::mem_root                                | 388.95 MiB    |
| memory/innodb/std                                               | 226.88 MiB    |
| memory/innodb/fil0fil                                           | 198.49 MiB    |
| memory/sql/binlog_io_cache                                      | 128.00 MiB    |
| memory/innodb/mem0mem                                           | 96.82 MiB     |
| memory/innodb/dict0dict                                         | 96.76 MiB     |
| memory/performance_schema/rwlock_instances                      | 88.00 MiB     |
+-----------------------------------------------------------------+---------------+
10 rows in set (0.00 sec)
```

```
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 0
Dictionary memory allocated 5001599639
Buffer pool size 170512
Free buffers 142568
Database pages 27944
Old database pages 10354
Modified db pages 6
Pending reads 0
```

この持続的に高いメモリ使用量は、外部キー関係に関連するテーブルに起因する可能性があります。これらのテーブルは、削除のために LRU リストに配置されません。これは、テーブル定義キャッシュをフラッシュした後もメモリ割り当てが高いままである理由の説明となります。

この問題に対応するには:

1. データベーススキーマ、特に外部キー関係を確認して最適化します。

1. ディクショナリオブジェクトに対応するため、より多くのメモリを持つより大きな DB インスタンスクラスへの移行を検討してください。

これらのステップに従い、メモリ割り当てパターンを理解することで、Aurora MySQL DB インスタンスのメモリ使用量をより適切に管理し、メモリ負荷による潜在的なパフォーマンスの問題を防ぐことができます。

# Aurora MySQL データベースのメモリ不足の問題のトラブルシューティング
<a name="AuroraMySQLOOM"></a>

Aurora MySQL `aurora_oom_response` インスタンスレベルパラメータは、DB インスタンスによって、システムメモリをモニタリングしてさまざまなステートメントおよび接続で消費されるメモリを推測できるようにします。システムでメモリ不足が発生した場合、メモリを解放するためのアクションリストを実行できます。これは、メモリ不足 (OOM) を原因とするデータベースの再起動を避ける目的で実行されます。このインスタンスレベルのパラメータでは、メモリが少ない場合に DB インスタンスが実行すべきアクションを、カンマ区切りの文字列で指定できます。この `aurora_oom_response` パラメータは、Aurora MySQL バージョン 2 および 3 でサポートされています。

`aurora_oom_response` パラメータには、以下の値とそれらの組み合わせを使用できます。空の文字列はアクションが実行されないことを意味し、実質的にこの機能はオフになります。そのため、データベースは OOM の再起動が発生しやすくなります。
+ `decline` – DB インスタンスのメモリが少なくなった場合、新しいクエリを拒否します。
+ `kill_connect` – 大量のメモリを消費しているデータベース接続を閉じ、現在のトランザクションとデータ定義言語 (DDL) ステートメントを終了します。この応答は、Aurora MySQL バージョン 2 ではサポートされていません。

  詳細については、MySQL ドキュメントの「[KILL ステートメント](https://dev.mysql.com/doc/refman/8.0/en/kill.html)」を参照してください。
+ `kill_query` – インスタンスのメモリが低しきい値を超えるまで、メモリ使用量の高い順にクエリを終了します。DDL ステートメントは終了されません。

  詳細については、MySQL ドキュメントの「[KILL ステートメント](https://dev.mysql.com/doc/refman/8.0/en/kill.html)」を参照してください。
+ `print` – 大量のメモリを使用するクエリのみを出力します。
+ `tune` - 内部テーブルキャッシュを調整して、メモリをシステムに戻します。Aurora MySQL は、メモリが少ない状態では `table_open_cache` や `table_definition_cache` などのキャッシュに使用されるメモリを低減します。最終的に、Aurora MySQL は、システムのメモリ不足がなくなると、メモリ使用量を通常に戻します。

  詳細については、MySQL ドキュメントの「[table\$1open\$1cache](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_table_open_cache)」と「[table\$1definition\$1cache](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_table_definition_cache)」を参照してください。
+ `tune_buffer_pool` – バッファプールのサイズを小さくしてメモリを解放し、データベースサーバーが接続を処理できるようにします。この応答は、Aurora MySQL バージョン 3.06 以降でサポートされています。

  `tune_buffer_pool` を `kill_query` または `aurora_oom_response` パラメータ値の `kill_connect` とペアにする必要があります。そうしない場合、パラメータ値に `tune_buffer_pool` を含めても、バッファプールのサイズ変更は行われません。

3.06 以前のバージョンの Aurora MySQL の場合は、メモリが 4 GiB 以下の DB インスタンスクラスでメモリプレッシャーがかかっているときのデフォルトアクションに `print`、`tune`、`decline`、`kill_query` があります。4 GiB を超えるメモリがある DB インスタンスクラスでは、このパラメータ値はデフォルトで空 (無効) になっています。

Aurora MySQL バージョン 3.06 以降では、メモリが 4 GiB 以下の DB インスタンスクラスの場合、Aurora MySQL は最もメモリ消費量の多い接続 (`kill_connect`) も閉じます。4 GiB を超えるメモリがある DB インスタンスクラスでは、このパラメータ値はデフォルトで `print` になっています。

Aurora MySQL バージョン 3.09 以降では、4 GiB を超えるメモリがある DB インスタンスクラスの場合、デフォルトのパラメータ値は `print,decline,kill_connect` です。

メモリ不足の問題が頻繁に発生する場合は、`performance_schema` が有効になっていれば[メモリのサマリーテーブル](https://dev.mysql.com/doc/refman/8.3/en/performance-schema-memory-summary-tables.html)を使用してメモリ使用量をモニタリングできます。

OOM に関連する Amazon CloudWatch メトリクスについては、「[Amazon Aurora のインスタンスレベルのメトリクス](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances)」を参照してください。OOM に関連するグローバルステータス変数については、「[Aurora MySQL グローバルステータス変数](AuroraMySQL.Reference.GlobalStatusVars.md)」を参照してください。

# Aurora MySQL データベースのログ記録
<a name="aurora-mysql-troubleshooting-logging"></a>

Aurora MySQL ログは、データベースのアクティビティとエラーに関する重要な情報を提供します。これらのログを有効にすることで、問題の特定とトラブルシューティング、データベースパフォーマンスの把握、データベースアクティビティの監査が可能になります。データベースのパフォーマンスと可用性を最適化するために、すべての Aurora MySQL DB インスタンスでこれらのログを有効にすることをお勧めします。次のタイプのログを有効にできます。各ログには、データベース処理への影響を明らかにするのに役立つ特定の情報が含まれています。
+ エラー - Aurora MySQL ではスタートアップ時、シャットダウン時、およびエラー検出時にのみ、エラーログへの書き込みが行われます。DB インスタンスでは、新しいエントリがエラーログに書き込まれないまま、数時間または数日が経過することがあります。最近のエントリがない場合、それは、サーバーにログエントリになり得るエラーが発生しなかったためです。エラーロギングはデフォルトで有効になっています。詳細については、「[Aurora MySQL エラーログ](USER_LogAccess.MySQL.LogFileSize.md#USER_LogAccess.MySQL.Errorlog)」を参照してください。
+ 一般 — 一般ログには、データベースエンジンによって実行されたすべての SQL ステートメントを含む、データベースアクティビティに関する詳細情報が含まれます。一般的なロギングの有効化とロギングパラメータの設定の詳細については、「[Aurora MySQL のスロークエリと一般ログ](USER_LogAccess.MySQL.LogFileSize.md#USER_LogAccess.MySQL.Generallog)」、および MySQL ドキュメントの「[一般クエリログ](https://dev.mysql.com/doc/refman/8.0/en/query-log.html)」を参照してください。
**注記**  
一般ログは非常に大きくなり、ストレージを消費する可能性があります。詳細については、「[Aurora MySQL のログのローテーションと保持](USER_LogAccess.MySQL.LogFileSize.md#USER_LogAccess.AMS.LogFileSize.retention)」を参照してください。
+ スロークエリ — スロークエリログは、実行に [long\$1query\$1time](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_long_query_time)​ 秒を超える時間がかかり、検証に [min\$1examined\$1row\$1limit](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_min_examined_row_limit) 行以上を要した SQL ステートメントで構成されています。スロークエリログを使用すると、実行に時間がかかるため最適化の対象となるクエリを見つけることができます。

  `long_query_time` のデフォルト値は 10 (秒) です。高い値から始めて最も遅いクエリを特定し、その後微調整することをおすすめします。

  `log_slow_admin_statements` や `log_queries_not_using_indexes` などの関連パラメータを使用することもできます。`rows_examined` と `rows_returned` を比較します。`rows_examined` が `rows_returned` よりはるかに大きい場合は、それらのクエリがブロックする可能性があります。

  Aurora MySQL バージョン 3 では、`log_slow_extra` を有効にしてより詳細な情報を取得することができます。詳細については、MySQL ドキュメントの「[スロークエリログの内容](https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html#slow-query-log-contents)」を参照してください。クエリ実行をインタラクティブにデバッグするようにセッションレベルで `long_query_time` を変更することもできます。これは `log_slow_extra` がグローバルに有効になっている場合に特に便利です。

  スロークエリロギングの有効化とロギングパラメータの設定の詳細については、「[Aurora MySQL のスロークエリと一般ログ](USER_LogAccess.MySQL.LogFileSize.md#USER_LogAccess.MySQL.Generallog)」、および MySQL ドキュメントの「[スロークエリログ](https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html)」を参照してください。
+ 監査 — 監査ログはデータベースのアクティビティをモニタリングして記録します。Aurora MySQL の監査ログは、高度な監査と呼ばれます。高度な監査を有効にするには、特定の DB クラスターパラメータを設定します。詳細については、「[Amazon Aurora MySQL DB クラスターでのアドバンストな監査の使用](AuroraMySQL.Auditing.md)」を参照してください。
+ バイナリ — バイナリログ (binlog) には、テーブル作成操作やテーブルデータへの変更など、データベースの変更を説明するイベントが含まれます。また、行ベースのロギングが使用されていない限り、変更を加えた可能性のあるステートメント (行と一致しない [DELETE](https://dev.mysql.com/doc/refman/8.0/en/delete.html) など) のイベントも含まれます。バイナリログには、各ステートメントがデータの更新にかかった時間に関する情報も含まれています。

  バイナリロギングを有効にしてサーバーを実行させると、パフォーマンスがわずかに低下します。ただし、一般に、レプリケーションや復元操作を設定できるバイナリログの利点は、このわずかなパフォーマンスの低下よりも上回ります。
**注記**  
Aurora MySQL では、復元操作にバイナリロギングは必要ありません。

  バイナリロギングの有効化とバイナリログ形式の設定の詳細については、「[シングル AZ データベースの Aurora MySQL バイナリログの設定](USER_LogAccess.MySQL.BinaryFormat.md)」、MySQL ドキュメントの「[バイナリログ](https://dev.mysql.com/doc/refman/8.0/en/binary-log.html)」を参照してください。

エラーログ、一般ログ、スローログ、クエリログ、監査ログを Amazon CloudWatch Logs にパブリッシュできます。詳細については、「[Amazon CloudWatch Logs へのデータベースログの発行](USER_LogAccess.Procedural.UploadtoCloudWatch.md)」を参照してください。

スローログ、一般ログ、バイナリログファイルを要約するもう 1 つの便利なツールは [pt-query-digest](https://docs.percona.com/percona-toolkit/pt-query-digest.html) です。

# Aurora MySQL データベースの接続問題のトラブルシューティング
<a name="mysql-troubleshooting-dbconn"></a>

アプリケーションと RDS DB インスタンスの間で信頼性の高い接続を確保することは、ワークロードのスムーズな運用に不可欠です。ただし、ネットワーク設定、認証の問題、リソースの制約など、さまざまな要因によって接続の問題が発生する場合があります。このガイドでは、Aurora MySQL の接続問題のトラブルシューティングに役立つ包括的なアプローチを提供します。

**Contents**
+ [Aurora MySQL のデータベース接続問題の特定](#mysql-dbconn-identify)
+ [Aurora MySQL の接続問題に関するデータの収集](#mysql-dbconn-gather)
+ [Aurora MySQL のデータベース接続のモニタリング](#mysql-dbconn-monitor)
  + [Aurora MySQL の追加モニタリング](#mysql-dbconn-monitor-ams)
+ [Aurora MySQL の接続エラーコード](#mysql-dbconn-errors)
+ [Aurora MySQL のパラメータチューニングの推奨事項](#mysql-dbconn-params)
+ [Aurora MySQL のデータベース接続問題のトラブルシューティングの例](#mysql-dbconn-examples)
  + [例 1: 失敗した接続試行のトラブルシューティング](#mysql-dbconn-example1)
  + [例 2: 異常なクライアント切断のトラブルシューティング](#mysql-dbconn-example2)
  + [例 3: IAM 接続試行失敗のトラブルシューティング](#mysql-dbconn-example3)

## Aurora MySQL のデータベース接続問題の特定
<a name="mysql-dbconn-identify"></a>

接続問題のカテゴリを特定することは、潜在的な原因を絞り込み、トラブルシューティングプロセスを進めるのに役立ちます。カテゴリごとに、診断や解決のアプローチと手法は異なる場合があります。データベース接続の問題は、以下のカテゴリに大別できます。

**接続エラーと例外**  
接続エラーと例外は、接続文字列の誤り、認証の失敗、ネットワークの中断、データベースサーバーの問題など、さまざまな原因で発生する場合があります。原因には、接続パラメータの設定ミス、無効な認証情報、ネットワーク停止、データベースサーバーのクラッシュや再起動が含まれます。セキュリティグループ、仮想プライベートクラウド (VPC) 設定、ネットワークアクセスコントロールリスト (ACL)、サブネットに関連付けられたルートテーブルの設定ミスも、接続問題につながる可能性があります。

**接続制限の到達**  
この問題は、データベースサーバーへの同時接続数が最大許容数を超えた場合に発生します。データベースサーバーには、通常、クラスターとインスタンスパラメータグループのパラメータ max\$1connections で定義される設定可能な最大接続制限があります。データベースサーバーは、接続制限を課すことで、既存の接続を効率的に処理して許容可能なパフォーマンスを提供するための十分なリソース (メモリ、CPU、ファイルハンドルなど) を確保します。原因としては、アプリケーションの接続リーク、非効率的な接続プール、接続リクエストの予期しない急増などが考えられます。

**接続タイムアウト**  
接続タイムアウトは、クライアントアプリケーションが指定のタイムアウト時間内にデータベースサーバーとの接続を確立できない場合に発生します。一般的な原因には、ネットワークの問題、サーバーの過負荷、ファイアウォールルール、接続設定の構成ミスなどがあります。

**アイドル接続のタイムアウト**  
アイドル接続が長時間非アクティブのままになっていると、リソースを節約するために、データベースサーバーによって自動的に閉じられる場合があります。このタイムアウトは通常、`wait_timeout` と `interactive_timeout parameters` を使用して設定可能であり、アプリケーションの接続の使用パターンに基づいて調整する必要があります。原因としては、接続を長期間アイドル状態にするアプリケーションロジックや、不適切な接続管理などがあります。

**既存の接続の断続的な切断**  
このクラスのエラーは、クライアントアプリケーションとデータベースの間に確立した接続が、アクティブかつ使用中であっても、予期せず終了したり、不規則な間隔で断続したりする場合に発生します。これらの切断は断続的に発生します。つまり、不規則な間隔で発生し、一貫していません。以下のような原因が挙げられます。  
+ 再起動やフェイルオーバーなどのデータベースサーバーの問題
+ アプリケーション接続の不適切な処理
+ 負荷分散とプロキシの問題
+ ネットワークの不安定性
+ 接続パスに関連したサードパーティのコンポーネントやミドルウェアの問題
+ クエリ実行タイムアウト
+ サーバー側またはクライアント側のリソース制約
包括的なモニタリング、ログ記録、分析を通じて根本原因を特定することが重要であるとともに、適切なエラー処理、接続プール、再試行メカニズムを実装することで、これらの断続的な切断がアプリケーションの機能とユーザーエクスペリエンスにもたらす影響を軽減できます。

## Aurora MySQL の接続問題に関するデータの収集
<a name="mysql-dbconn-gather"></a>

アプリケーション、データベース、ネットワーク、インフラストラクチャコンポーネントに関する包括的なデータを収集することが、アプリケーションと Aurora MySQL データベースの間の接続問題の効果的なトラブルシューティングに不可欠です。関連するログ、設定、診断情報を収集することで、接続問題の根本原因の特定と、適切な解決策に役立つ貴重なインサイトが得られます。

セキュリティグループルール、VPC 設定、ルートテーブルなどのネットワークログと設定は、アプリケーションとデータベースとの正常な接続の確立を妨げる可能性があるネットワーク関連のボトルネックや設定ミスを特定するうえで不可欠です。これらのネットワークコンポーネントを分析することで、必要なポートが開いていること、IP アドレスが許可されていること、ルーティング設定が正しくセットアップされていることを確認できます。

**タイムスタンプ**  
接続問題が発生したときの正確なタイムスタンプを記録します。これは、パターンを特定したり、問題を他のイベントやアクティビティと関連付けたりするのに役立ちます。

**DB エンジンログ**  
一般的なデータベースログに加えて、データベースエンジンログ (MySQL エラーログやスロークエリログなど) を通じて、断続的な接続問題に関連していると思われる情報やエラーを確認します。詳細については、「[Aurora MySQL データベースのログ記録](aurora-mysql-troubleshooting-logging.md)」を参照してください。

**クライアントアプリケーションログ**  
データベースに接続するクライアントアプリケーションから詳細なログを収集します。アプリケーションログは、接続試行、エラー、関連情報をアプリケーションの視点から可視化します。これにより、接続文字列、認証情報、またはアプリケーションレベルの接続処理に関連する問題が明らかになる場合があります。  
一方、データベースログは、データベース側のエラー、スロークエリ、または接続問題の原因の可能性があるイベントに関するインサイトを提供します。詳細については、「[Aurora MySQL データベースのログ記録](aurora-mysql-troubleshooting-logging.md)」を参照してください。

**クライアント環境変数**  
プロキシ設定、SSL/TLS 設定、その他の関連変数など、クライアント側の環境変数や構成設定がデータベース接続に影響を与えていないかどうかを確認します。

**クライアントライブラリのバージョン**  
クライアントがデータベース接続に最新バージョンのデータベースドライバー、ライブラリ、またはフレームワークを使用していることを確認します。古いバージョンには、既知の問題や互換性の問題が含まれている可能性があります。

**クライアントネットワークキャプチャ**  
接続の問題の発生時に Wireshark や `tcpdump` などのツールを使用してクライアント側でネットワークキャプチャを実行します。これにより、クライアント側でネットワーク関連の問題や異常を特定できます。

**クライアントネットワークトポロジ**  
クライアントのネットワークトポロジを構成するファイアウォール、ロードバランサー、その他のコンポーネント (クライアントがデータベースに直接接続せずに、RDS Proxy や Proxy SQL を介して接続する場合など) を理解します。

**クライアントオペレーティングシステムの設定**  
ファイアウォールルール、ネットワークアダプター設定、その他の関連設定など、ネットワーク接続に影響を与える可能性があるクライアントのオペレーティングシステムの設定を確認します。

**接続プール設定**  
アプリケーションで接続プールメカニズムを使用している場合は、構成設定を確認し、プールメトリクス (アクティブな接続、アイドル接続、接続タイムアウトなど) をモニタリングして、プールが正しく機能していることを確認します。また、最大プールサイズ、最小プールサイズ、接続検証設定などのプール設定を参照し、正しく設定されていることを確認します。

**接続文字列**  
接続文字列には、通常、ホスト名やエンドポイント、ポート番号、データベース名、認証情報などのパラメータが含まれます。接続文字列を分析すると、接続問題を引き起こす可能性がある設定ミスや不正な設定を特定するのに役立ちます。例えば、ホスト名やポート番号が間違っていると、クライアントがデータベースインスタンスにアクセスできない場合があります。また、認証情報が無効であると、認証エラーや接続拒否になる可能性があります。さらに、接続文字列から、接続プール、タイムアウト、その他接続問題を起こす可能性がある接続固有の設定に関連する問題が明らかになる場合があります。クライアントアプリケーションで使用する完全な接続文字列を提供することは、クライアントの設定ミスを正確に特定するのに役立ちます。

**データベースメトリクス**  
接続の問題が発生したときに、CPU 使用率、メモリ使用率、ディスク I/O などのデータベースメトリクスをモニタリングします。これらのメトリクスは、DB インスタンスでリソースの競合やパフォーマンスの問題が発生していないかどうかを確認するのに役立ちます。

**DB エンジンバージョン**  
Aurora MySQL DB エンジンのバージョンに注意してください。AWS は、既知の問題やセキュリティの脆弱性に対処し、パフォーマンスの強化をもたらす更新を定期的にリリースしています。したがって、利用可能な最新バージョンにアップグレードすることを強くお勧めします。これらの更新には、接続、パフォーマンス、安定性に特に関連するバグ修正や機能強化が含まれることが多いためです。データベースのバージョン情報やその他の詳細を収集して提供することは、サポートが接続問題を効果的に診断して解決するのに役立ちます。

**ネットワークメトリクス**  
接続の問題が発生したときに、レイテンシー、パケット損失、スループットなどのネットワークメトリクスを収集します。`ping`、`traceroute`、ネットワークモニタリングツールなどのツールは、このようなデータの収集に役立ちます。

**ソースとクライアントの詳細**  
データベース接続を開始するアプリケーションサーバー、ロードバランサー、その他のコンポーネントの IP アドレスを確認します。これは、単一の IP アドレスであるか、IP アドレスの範囲 (CIDR 表記) である場合があります。ソースが Amazon EC2 インスタンスの場合、インスタンスタイプ、アベイラビリティーゾーン、サブネット ID、インスタンスに関連付けられたセキュリティグループ、プライベート IP アドレスやパブリック IP アドレスなどのネットワークインターフェイスの詳細を確認することも役立ちます。

収集したデータを徹底的に分析することで、設定ミス、リソースの制約、ネットワークの中断、その他断続的または永続的な接続問題の原因となっている根本的な問題を特定できます。この情報により、設定の調整、ネットワーク問題の解決、アプリケーションレベルの接続処理への対応など、ターゲットを絞ったアクションを実行できます。

## Aurora MySQL のデータベース接続のモニタリング
<a name="mysql-dbconn-monitor"></a>

接続問題のモニタリングおよびトラブルシューティングを行うには、以下のメトリクスと機能を使用できます。

**CloudWatch メトリクス**  
+ `CPUUtilization` – DB インスタンスの CPU 使用率が高いと、クエリの実行が遅くなり、接続のタイムアウトや拒否が発生する可能性があります。
+ `DatabaseConnections` – DB インスタンスへのアクティブな接続数をモニタリングします。接続数が多く、設定された最大許容数に近いと、接続の問題や接続プールの枯渇につながる可能性を示している場合があります。
+ `FreeableMemory` – 使用可能なメモリが少ないと、リソースの制約により、パフォーマンスの問題や接続の問題が発生する可能性があります。
+ `NetworkReceiveThroughput` および `NetworkTransmitThroughput` – ネットワークスループットの異常な急増や低下は、接続の問題やネットワークのボトルネックを示している可能性があります。

**Performance Insights メトリクス**  
Performance Insights を使用して Aurora MySQL の接続問題のトラブルシューティングを行うには、以下のようなデータベースメトリクスを分析します。  
+ Aborted\$1clients
+ Aborted\$1connects
+ Connections
+ max\$1connections
+ Threads\$1connected
+ Threads\$1created
+ Threads\$1running
これらのメトリクスは、接続のボトルネックの特定、ネットワークまたは認証の問題の検出、接続プールの最適化、効率的なスレッド管理の確保に役立ちます。詳細については、「[Aurora MySQL の Performance Insights のカウンター](USER_PerfInsights_Counters.md#USER_PerfInsights_Counters.Aurora_MySQL)」を参照してください。

**Performance Insights の機能**  
+ **データベース負荷** – データベース負荷を時間の経過とともに視覚化し、接続の問題やパフォーマンスの低下と関連付けます。
+ **SQL 統計** – SQL 統計を分析して、接続問題の原因の可能性がある非効率的なクエリやデータベースオペレーションを特定します。
+ **上位のクエリ** – リソース集約度の最も高いクエリを特定して分析します。これにより、接続問題を引き起こしている可能性があるパフォーマンスのボトルネックや長時間実行されているクエリを特定できます。

これらのメトリクスをモニタリングして Performance Insights を活用することで、データベースインスタンスのパフォーマンス、リソースの使用状況、接続問題を引き起こしている可能性があるボトルネックを可視化できます。以下に例を示します。
+ `DatabaseConnections` が最大許容数に近い場合は、接続プールの枯渇や不適切な接続処理を示しており、接続問題につながる可能性があります。
+ `CPUUtilization` が高いか、`FreeableMemory` が低い場合は、リソースの制約を示していることがあり、クエリの実行が遅くなり、接続のタイムアウトや拒否が発生する可能性があります。
+ **上位のクエリ**や **SQL 統計**を分析すると、接続問題の原因となっている可能性がある非効率的なクエリやリソース集約度の高いクエリを特定するのに役立ちます。

さらに、CloudWatch Logs をモニタリングしてアラームを設定することは、接続問題が深刻化する前に未然に特定して対応するのに役立ちます。

以上のメトリクスやツールは貴重なインサイトを提供できますが、他のトラブルシューティングステップと組み合わせて使用する必要があることに注意してください。ネットワーク設定、セキュリティグループのルール、アプリケーションレベルの接続処理も確認することで、Aurora MySQL DB インスタンスの接続問題を包括的に診断して解決できます。

### Aurora MySQL の追加モニタリング
<a name="mysql-dbconn-monitor-ams"></a>

**CloudWatch メトリクス**  
+ `AbortedClients` – 適切に閉じられていないクライアント接続の数を追跡します。
+ `AuroraSlowConnectionHandleCount` – 接続問題やパフォーマンスのボトルネックの可能性を示す、接続処理の遅延回数を追跡します。
+ `AuroraSlowHandshakeCount` – 接続問題の可能性を示している場合もある、低速ハンドシェイクオペレーションの数を測定します。
+ `ConnectionAttempts` – Aurora MySQL DB インスタンスへの接続試行回数を測定します。

**グローバルステータス変数**  
`Aurora_external_connection_count` – DB インスタンスへのデータベース接続の数を示します。ただし、データベースのヘルスチェックに使用した RDS サービス接続は除きます。

これらのメトリクスとグローバルステータス変数をモニタリングすることで、Amazon Aurora MySQL インスタンスで接続問題を引き起こしている可能性がある接続パターン、エラー、潜在的なボトルネックを可視化できます。

例えば、`AbortedClients` または `AuroraSlowConnectionHandleCount` の数が多い場合は、接続問題を示している可能性があります。

さらに、CloudWatch アラームと通知を設定すると、接続問題が深刻化してアプリケーションのパフォーマンスに影響を与える前に未然に特定して対応できます。

## Aurora MySQL の接続エラーコード
<a name="mysql-dbconn-errors"></a>

Aurora MySQL データベースの一般的な接続エラーおよびエラーコードと説明を以下に示します。

**エラーコード 1040: 接続数が多すぎる**  
このエラーは、データベースサーバーが許可する最大数を超えてクライアントが接続を確立しようとすると発生します。次の原因が考えられます。  
+ 接続プールの設定ミス – 接続プールメカニズムを使用している場合は、最大プールサイズの設定が高すぎないこと、および接続が適切にプールに戻されていることを確認します。
+ データベースインスタンス設定 – データベースインスタンスの最大許容接続数の設定を確認し、必要に応じて `max_connections` パラメータを設定して調整します。
+ 高い同時実行数 – 複数のクライアントやアプリケーションがデータベースに同時に接続している場合、最大許容接続数の制限に達している可能性があります。

**エラーコード 1045: ユーザー '...'@'...' に対するアクセス拒否 (パスワードの使用: YES/NO）**  
このエラーは、データベースに接続しようとして認証に失敗したことを示します。次の原因が考えられます。  
+ 認証プラグインの互換性 – クライアントが使用している認証プラグインがデータベースサーバーの認証メカニズムと互換性があるかどうかを確認します。
+ ユーザー名またはパスワードが正しくない – 接続文字列または認証メカニズムで正しいユーザー名とパスワードを使用していることを確認します。
+ ユーザーアクセス許可 – 指定したホストまたはネットワークからデータベースインスタンスに接続するために必要なアクセス許可をユーザーが持っていることを確認します。

**エラーコード 1049: 不明なデータベース '...'**  
このエラーは、クライアントがサーバーに存在しないデータベースに接続しようとしていることを示します。次の原因が考えられます。  
+ データベースが作成されていない – 指定したデータベースがデータベースサーバーに作成されていることを確認します。
+ データベース名が正しくない — 接続文字列またはクエリで使用しているデータベース名が正しいことを再確認します。
+ ユーザーアクセス許可 – 指定したデータベースにアクセスするために必要なアクセス許可をユーザーが持っていることを確認します。

**エラーコード 1153: 'max\$1allowed\$1packet' バイトを超えるパケットを取得した**  
このエラーは、データベースサーバーが許可する最大パケットサイズを超えるデータをクライアントが送受信しようとすると発生します。次の原因が考えられます。  
+ 大量のクエリまたは結果セット – 大量のデータを含むクエリを実行する場合、パケットサイズ制限を超える可能性があります。
+ パケットサイズの設定ミス – データベースサーバーの `max_allowed_packet` 設定を確認し、必要に応じて調整します。
+ ネットワーク設定の問題 – 必要なパケットサイズがネットワーク設定 (MTU サイズなど) で許可されていることを確認します。

**エラーコード 1226: ユーザー '...' が 'max\$1user\$1connections' リソースを超えた (現在の値: ...)**  
このエラーは、データベースサーバーが許可する同時接続の最大数をユーザーが超えたことを示します。次の原因が考えられます。  
+ 接続プールの設定ミス – 接続プールメカニズムを使用している場合は、ユーザーの接続制限に対してプールの最大サイズを高すぎないように設定します。
+ データベースインスタンスの設定 — データベースインスタンス `max_user_connections` 設定を確認し、必要に応じて調整します。
+ 高い同時実行数 – 複数のクライアントやアプリケーションが同じユーザーを使用してデータベースに同時に接続している場合、ユーザー別の接続制限に達している可能性があります。

**エラーコード 2003: '...' で MySQL サーバーに接続できない (10061)**  
このエラーは通常、クライアントがデータベースサーバーとの TCP/IP 接続を確立できない場合に発生します。以下のような、さまざまな問題が原因である可能性があります。  
+ データベースインスタンスのステータス – データベースインスタンスが `available` 状態であり、メンテナンスやバックアップオペレーション中でないことを確認します。
+ ファイアウォールルール – ファイアウォール (オペレーティングシステム、ネットワーク、またはセキュリティグループ) が、指定したポート (MySQL の場合は通常 3306) で接続をブロックしていないかどうかを確認します。
+ ホスト名またはエンドポイントが正しくない — 接続文字列で使用しているホスト名またはエンドポイントが正しいこと、およびデータベースインスタンスと一致していることを確認します。
+ ネットワーク接続の問題 – クライアントマシンがネットワーク経由でデータベースインスタンスにアクセスできることを確認します。ネットワークの停止、ルーティングの問題、VPC またはサブネットの設定ミスがないことを確認します。

**エラーコード 2005: 不明な MySQL サーバーホスト '...' (11001)**  
このエラーは、クライアントがデータベースサーバーのホスト名またはエンドポイントを IP アドレスに解決できない場合に発生します。次の原因が考えられます。  
+ DNS 解決の問題 – クライアントマシンが DNS を使用してホスト名を正しく解決できることを確認します。DNS 設定、DNS キャッシュを確認し、ホスト名の代わりに IP アドレスを使用してみます。
+ ホスト名またはエンドポイントが正しくない — 接続文字列で使用しているホスト名またはエンドポイントが正しいことを再確認します。
+ ネットワーク設定の問題 – クライアントのネットワーク設定 (VPC、サブネット、ルートテーブルなど) で、DNS 解決とデータベースインスタンスへの接続が許可されていることを確認します。

**エラーコード 2026: SSL 接続エラー**  
このエラーは、接続の試行中に SSL/TLS 設定または証明書の検証に問題がある場合に発生します。次の原因が考えられます。  
+ 証明書の有効期限 – サーバーで使用している SSL/TLS 証明書が期限切れで更新する必要があるかどうかを確認します。
+ 証明書の検証の問題 – クライアントがサーバーの SSL/TLS 証明書を正しく検証できること、および証明書が信頼できることを確認します。
+ ネットワーク設定の問題 – ネットワーク設定で SSL/TLS 接続が許可されており、SSL/TLS ハンドシェイクプロセスがブロックまたは干渉されていないことを確認します。
+ SSL/TLS 設定の不一致 – クライアントとサーバーの SSL/TLS 設定 (暗号スイートやプロトコルバージョンなど) に互換性があることを確認します。

各エラーコードの詳細な説明と潜在的な原因を理解することで、Aurora MySQL データベースを使用する際の接続問題をより適切にトラブルシューティングして解決できます。

## Aurora MySQL のパラメータチューニングの推奨事項
<a name="mysql-dbconn-params"></a>

**最大接続数**  
これらのパラメータを調整すると、最大許容接続数に達したために発生する接続問題を防止できます。これらの値がアプリケーションの同時実行の要件とリソースの制約に基づいて適切に設定されていることを確認します。  
+ `max_connections` – このパラメータは、DB インスタンスに許可される同時接続の最大数を指定します。
+ `max_user_connections` – このパラメータは、ユーザーの作成時や変更時に指定でき、特定のユーザーアカウントに許可される同時接続の最大数を設定します。

**ネットワークバッファサイズ**  
これらの値を増やすと、特に大規模なデータ転送や結果セットを伴うワークロードの場合、ネットワークパフォーマンスを向上させることができます。ただし、バッファサイズが大きいほどメモリ消費量も増える可能性があるので、注意してください。  
+ `net_buffer_length` – このパラメータは、クライアント接続と結果バッファの初期サイズを設定し、メモリ使用量とクエリパフォーマンスのバランスを取ります。
+ `max_allowed_packet` – このパラメータは、DB インスタンスが送受信できる単一のネットワークパケットの最大サイズを指定します。

**ネットワーク圧縮 (クライアント側）**  
ネットワーク圧縮を有効にすると、ネットワーク帯域幅の使用量を減らすことができますが、クライアント側とサーバー側の両方で CPU オーバーヘッドが増加する可能性があります。  
+ `compress` – このパラメータは、クライアント/サーバー通信のネットワーク圧縮を有効または無効にします。
+ `compress_protocol` – このパラメータは、ネットワーク通信に使用する圧縮プロトコルを指定します。

**ネットワークパフォーマンスのチューニング**  
これらのタイムアウトを調整すると、アイドル状態の接続を管理し、リソースの枯渇を防ぐのに役立ちますが、値が低いと接続が早期に終了する可能性があるため、注意が必要です。  
+ `interactive_timeout` – このパラメータは、サーバーがインタラクティブ接続でアクティビティを待機し始めてから接続を閉じるまでの秒数を指定します。
+ `wait_timeout` – このパラメータは、サーバーが非インタラクティブ接続でアクティビティを待機し始めてから接続を閉じるまでの秒数を決定します。

**ネットワークタイムアウト設定**  
これらのタイムアウトを調整すると、接続の遅延や応答不良に関連する問題に対処できます。ただし、設定を短くしすぎると、接続が早期に失敗する可能性があるため、注意してください。  
+ `net_read_timeout` – このパラメータは、読み取りオペレーションを終了するまでに、接続からの追加データを待機する秒数を指定します。
+ `net_write_timeout` – このパラメータは、書き込みオペレーションを終了するまでに、ブロックが接続に書き込まれるのを待機する秒数を決定します。

## Aurora MySQL のデータベース接続問題のトラブルシューティングの例
<a name="mysql-dbconn-examples"></a>

以下の例は、Aurora MySQL のデータベース接続問題を特定してトラブルシューティングを行う方法を示しています。

### 例 1: 失敗した接続試行のトラブルシューティング
<a name="mysql-dbconn-example1"></a>

接続の試行は、認証の失敗、SSL/TLS ハンドシェイクの失敗、`max_connections` 制限の到達、DB インスタンスでのリソース制約など、いくつかの理由で失敗する可能性があります。

失敗した接続の数は、Performance Insights または次のコマンドを使用して追跡できます。

```
mysql> show global status like 'aborted_connects';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| Aborted_connects | 7     |
+------------------+-------+
1 row in set (0.00 sec)
```

`Aborted_connects` の数が時間とともに増える場合、アプリケーションに断続的な接続の問題があることが考えられます。

[Aurora の高度な監査機能](AuroraMySQL.Auditing.md)を使用して、クライアント接続の接続数と切断数をログ記録できます。これを行うには、DB クラスターパラメータグループで以下のパラメータを設定します。
+ `server_audit_logging` = `1`
+ `server_audit_events` = `CONNECT`

 次に示すのは、失敗したログインの監査ログからの抜粋です。

```
1728498527380921,auora-mysql-node1,user_1,172.31.49.222,147189,0,FAILED_CONNECT,,,1045
1728498527380940,auora-mysql-node1,user_1,172.31.49.222,147189,0,DISCONNECT,,,0
```

コードの説明は以下のとおりです。
+ `1728498527380921` — ログイン失敗が発生したときのエポックタイムスタンプ
+ `aurora-mysql-node1` – 接続が失敗した Aurora MySQL クラスターのノードのインスタンス識別子
+ `user_1` — ログインが失敗したデータベースユーザーの名前
+ `172.31.49.222` – 接続を確立したクライアントのプライベート IP アドレス
+ `147189` – 失敗したログインの接続 ID
+ `FAILED_CONNECT` – 接続が失敗したことを示します。
+ `1045` – リターンコード。ゼロ以外の値はエラーを示します。この場合、`1045` はアクセス拒否に対応します。

詳細については、MySQL ドキュメントの「[サーバーエラーコード](https://dev.mysql.com/doc/mysql-errors/5.7/en/server-error-reference.html)」と「[クライアントエラーコード](https://dev.mysql.com/doc/mysql-errors/5.7/en/client-error-reference.html)」を参照してください。

 また、Aurora MySQL エラーログを調べて、次のような関連するエラーメッセージを確認することもできます。

```
2024-10-09T19:26:59.310443Z 220 [Note] [MY-010926] [Server] Access denied for user 'user_1'@'172.31.49.222' (using password: YES) (sql_authentication.cc:1502)
```

### 例 2: 異常なクライアント切断のトラブルシューティング
<a name="mysql-dbconn-example2"></a>

Performance Insights または次のコマンドを使用して、異常なクライアント切断の数を追跡できます。

```
mysql> show global status like 'aborted_clients';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| Aborted_clients | 9     |
+-----------------+-------+
1 row in set (0.01 sec)
```

`Aborted_clients` の数が時間とともに増える場合、アプリケーションはデータベースへの接続を正しく閉じていません。接続が適切に閉じられていないと、リソースのリークやパフォーマンスの問題が発生する可能性があります。接続を不必要に開いたままにすると、メモリやファイル記述子などのシステムリソースが消費され、最終的にはアプリケーションやサーバーが応答しなくなるか再起動する可能性があります。

次のクエリを使用して、接続を適切に閉じていないアカウントを特定できます。このクエリは、ユーザーアカウント名、ユーザーの接続元のホスト、閉じていない接続の数、閉じていない接続の割合を取得します。

```
SELECT
    ess.user,
    ess.host,
    (a.total_connections - a.current_connections) - ess.count_star AS not_closed,
    (((a.total_connections - a.current_connections) - ess.count_star) * 100) / (a.total_connections - a.current_connections) AS pct_not_closed
FROM
    performance_schema.events_statements_summary_by_account_by_event_name AS ess
    JOIN performance_schema.accounts AS a ON (ess.user = a.user AND ess.host = a.host)
WHERE
    ess.event_name = 'statement/com/quit'
    AND (a.total_connections - a.current_connections) > ess.count_star;

+----------+---------------+------------+----------------+
| user     | host          | not_closed | pct_not_closed |
+----------+---------------+------------+----------------+
| user1    | 172.31.49.222 |          1 |        33.3333 |
| user1    | 172.31.93.250 |       1024 |        12.1021 |
| user2    | 172.31.93.250 |         10 |        12.8551 |
+----------+---------------+------------+----------------+
3 rows in set (0.00 sec)
```

接続を閉じていないユーザーアカウントとホストを特定したら、接続を正常に閉じていないコードのチェックに進むことができます。

例えば、Python の MySQL コネクタでは、接続オブジェクトの `close()` メソッドを使用して接続を閉じます。データベースへの接続を確立して、クエリを実行し、接続を閉じる関数の例を次に示します。

```
import mysql.connector

def execute_query(query):
    # Establish a connection to the database
    connection = mysql.connector.connect(
        host="your_host",
        user="your_username",
        password="your_password",
        database="your_database"
    )

    try:
        # Create a cursor object
        cursor = connection.cursor()

        # Execute the query
        cursor.execute(query)

        # Fetch and process the results
        results = cursor.fetchall()
        for row in results:
            print(row)

    finally:
        # Close the cursor and connection
        cursor.close()
        connection.close()
```

この例では、例外が発生するかどうかにかかわらず、`connection.close()` メソッドを `finally` ブロックで呼び出して接続が閉じられていることを確認しています。

### 例 3: IAM 接続試行失敗のトラブルシューティング
<a name="mysql-dbconn-example3"></a>

AWS Identity and Access Management (IAM) ユーザーとの接続は、次のようないくつかの理由で失敗する可能性があります。
+ IAM ポリシー設定が正しくない
+ 期限切れのセキュリティ認証情報
+ ネットワーク接続の問題
+ データベースのアクセス許可の不一致

これらの認証エラーをトラブルシューティングするには、Amazon Relational Database Service (RDS) または Aurora データベースで `iam-db-auth-error` ログエクスポート機能を有効にします。これにより、Amazon RDS または Amazon Aurora クラスターの CloudWatch Log グループで詳細な認証エラーメッセージを表示できます。

有効にすると、これらのログを確認して、IAM 認証失敗の具体的な原因を特定して解決できます。

例えば、次のようになります。

```
2025-09-22T12:02:30,806 [ERROR] Failed to authorize the connection request for user 'user_1' due to an internal IAM DB Auth error. (Status Code: 500, Error Code: InternalError)
```

and

```
2025-09-22T12:02:51,954 [ERROR] Failed to authenticate the connection request for user 'user_2' because the provided token is malformed or otherwise invalid. (Status Code: 400, Error Code: InvalidToken)
```

トラブルシューティングのガイダンスについては、IAM DB 認証の [Aurora](UsingWithRDS.IAMDBAuth.Troubleshooting.md) トラブルシューティングガイドを参照してください。

# Aurora MySQL データベースのクエリパフォーマンスのトラブルシューティング
<a name="aurora-mysql-troubleshooting-query"></a>

MySQL は、クエリプランの評価方法に影響するシステム変数、切り替え可能な最適化、オプティマイザとインデックスのヒント、オプティマイザのコストモデルを通じて[クエリオプティマイザの制御](https://dev.mysql.com/doc/refman/8.0/en/controlling-optimizer.html)を提供します。これらのデータポイントは、さまざまな MySQL 環境を比較するときだけでなく、以前のクエリ実行プランを現在の実行プランと比較したり、任意の時点の MySQL クエリの全体的な実行状況を把握したりするのに役立ちます。

クエリのパフォーマンスは、実行プラン、テーブルスキーマとサイズ、統計、リソース、インデックス、パラメータ設定など、さまざまな要因に左右されます。クエリの調整には、ボトルネックの特定と実行パスの最適化が必要です。
+ クエリの実行プランを見つけ、クエリが適切なインデックスを使用しているかどうかを確認します。`EXPLAIN` を使用し、各プランの詳細を確認することで、クエリを最適化できます。
+ Aurora MySQL バージョン 3 (MySQL 8.0 コミュニティエディションと互換性あり) は `EXPLAIN ANALYZE` ステートメントを使用します。`EXPLAIN ANALYZE` ステートメントは、MySQL がクエリのどこで時間を費やしているのか、またその理由を示すプロファイリングツールです。`EXPLAIN ANALYZE` を使用すると、Aurora MySQL はクエリを計画、準備、実行しつつ、行をカウントし、実行プランのさまざまなポイントで費やされた時間を測定します。クエリが完了すると、`EXPLAIN ANALYZE` は、クエリ結果の代わりにプランとその測定値を印刷します。
+ `ANALYZE` ステートメントを使用してスキーマの統計情報を最新の状態に維持してください。クエリオプティマイザは、統計が古いと不適切な実行プランを選択することがあります。これにより、テーブルとインデックスの両方のカーディナリティの推定が不正確になり、クエリのパフォーマンスが低下する可能性があります。[innodb\$1table\$1stats](https://dev.mysql.com/doc/refman/8.0/en/innodb-persistent-stats.html#innodb-persistent-stats-tables) テーブルの `last_update` 列には、スキーマ統計が最後に更新された時刻が表示されます。これは「古くなっている」ことを示す良い指標です。
+ データの分布の歪みなど、テーブルのカーディナリティに考慮されていないその他の問題が発生することもあります。詳細については、MySQL ドキュメントの「[InnoDB テーブルの ANALYZE TABLE の複雑度の推定](https://dev.mysql.com/doc/refman/8.0/en/innodb-analyze-table-complexity.html)」と「[MySQL のヒストグラム統計](https://dev.mysql.com/blog-archive/histogram-statistics-in-mysql/)」を参照してください。

## クエリにかかった時間の確認
<a name="ams-query-time"></a>

クエリにかかった時間を決定する方法は次のとおりです。
+ [プロファイリング](https://dev.mysql.com/doc/refman/8.0/en/show-profile.html)
+ [パフォーマンススキーマ](https://dev.mysql.com/doc/refman/8.0/en/performance-schema.html)
+ [クエリオプティマイザ](https://dev.mysql.com/doc/refman/8.0/en/controlling-optimizer.html)

**プロファイリング**  
デフォルトでは、プロファイリングは無効です。プロファイリングを有効にし、スロークエリを実行してプロファイルを確認します。  

```
SET profiling = 1;
Run your query.
SHOW PROFILE;
```

1. 最も多くの時間が費やされているステージを特定します。MySQL ドキュメントの「[一般的なスレッド状態](https://dev.mysql.com/doc/refman/8.0/en/general-thread-states.html)」によると、`SELECT` ステートメントの行の読み取りと処理は、多くの場合、特定のクエリの存続期間中で最も長い実行状態です。`EXPLAIN` ステートメントを使用すると、MySQL がこのクエリを実行する方法を理解できます。

1. スロークエリログを確認して `rows_examined` と `rows_sent` を評価し、各環境でワークロードが類似していることを確認します。詳細については、「[Aurora MySQL データベースのログ記録](aurora-mysql-troubleshooting-logging.md)」を参照してください。

1. 特定されたクエリの一部であるテーブルに対して、以下のコマンドを実行します。

   ```
   SHOW TABLE STATUS\G;
   ```

1. 各環境でクエリを実行する前と後に、次の出力をキャプチャします。

   ```
   SHOW GLOBAL STATUS;
   ```

1. 各環境で以下のコマンドを実行して、このサンプルクエリのパフォーマンスに影響する他のクエリ/セッションがないかどうかを確認します。

   ```
   SHOW FULL PROCESSLIST;
   
   SHOW ENGINE INNODB STATUS\G;
   ```

   サーバー上のリソースがビジー状態になると、クエリを含むサーバー上の他のすべての操作に影響することがあります。また、クエリの実行時に定期的に情報をキャプチャしたり、有用な間隔で情報をキャプチャする `cron` ジョブを設定することもできます。

**Performance Schema**  
パフォーマンススキーマは、パフォーマンスへの影響を最小限に抑えながら、サーバーのランタイムパフォーマンスに関する有用な情報を提供します。これは DB インスタンスに関するスキーマ情報を提供する `information_schema` とは異なります。詳細については、「[Aurora MySQL における Performance Insights のPerformance Schema の概要](USER_PerfInsights.EnableMySQL.md)」を参照してください。

**クエリオプティマイザトレース**  
特定の[クエリプランが実行対象として選択された](https://dev.mysql.com/doc/refman/8.0/en/execution-plan-information.html)理由を理解するために、MySQL クエリオプティマイザにアクセスするように `optimizer_trace` をセットアップできます。  
オプティマイザトレースを実行すると、オプティマイザが使用できるすべてのパスとその選択に関する詳細な情報が表示されます。  

```
SET SESSION OPTIMIZER_TRACE="enabled=on"; 
SET optimizer_trace_offset=-5, optimizer_trace_limit=5;

-- Run your query.
SELECT * FROM table WHERE x = 1 AND y = 'A';

-- After the query completes:
SELECT * FROM information_schema.OPTIMIZER_TRACE;
SET SESSION OPTIMIZER_TRACE="enabled=off";
```

## クエリオプティマイザ設定の確認
<a name="ams-query-parameters"></a>

Aurora MySQL バージョン 3 (MySQL 8.0 コミュニティエディションと互換性あり) には、Aurora MySQL バージョン 2 (MySQL 5.7 コミュニティエディションと互換性あり) と比較して、オプティマイザ関連の多くの変更があります。`optimizer_switch` にカスタム値がある場合は、デフォルトの違いを確認して、ワークロードに最適な `optimizer_switch` 値を設定することをお勧めします。また、Aurora MySQL バージョン 3 で使用できるオプションをテストして、クエリがどのように実行されるかを調べることをお勧めします。

**注記**  
Aurora MySQL バージョン 3 では、[innodb\$1stats\$1persistent\$1sample\$1pages](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_stats_persistent_sample_pages) パラメータのコミュニティデフォルト値である 20 を使用しています。

`optimizer_switch` 値を表示するには、次のコマンドを使用できます。

```
SELECT @@optimizer_switch\G;
```

次の表は、Aurora MySQL バージョン 2 および 3 のデフォルトの `optimizer_switch` 値を示しています。


| 設定 | Aurora MySQL バージョン 2 | Aurora MySQL バージョン 3 | 
| --- | --- | --- | 
| batched\$1key\$1access | 化 | 化 | 
| block\$1nested\$1loop | オン | オン | 
| condition\$1fanout\$1filter | オン | オン | 
| derived\$1condition\$1pushdown | – | オン | 
| derived\$1merge | オン | オン | 
| duplicateweedout | オン | オン | 
| engine\$1condition\$1pushdown | オン | オン | 
| firstmatch | オン | オン | 
| hash\$1join | 化 | オン | 
| hash\$1join\$1cost\$1based | オン | – | 
| hypergraph\$1optimizer | – | 化 | 
| index\$1condition\$1pushdown | オン | オン | 
| index\$1merge | オン | オン | 
| index\$1merge\$1intersection | オン | オン | 
| index\$1merge\$1sort\$1union | オン | オン | 
| index\$1merge\$1union | オン | オン | 
| loosescan | オン | オン | 
| materialization | オン | オン | 
| mrr | オン | オン | 
| mrr\$1cost\$1based | オン | オン | 
| prefer\$1ordering\$1index | オン | オン | 
| semijoin | オン | オン | 
| skip\$1scan | – | オン | 
| subquery\$1materialization\$1cost\$1based | オン | オン | 
| subquery\$1to\$1derived | – | 化 | 
| use\$1index\$1extensions | オン | オン | 
| use\$1invisible\$1indexes | – | 化 | 

詳細については、MySQL ドキュメントの「[切り替え可能な最適化 (MySQL 5.7)](https://dev.mysql.com/doc/refman/5.7/en/switchable-optimizations.html)」と「[切り替え可能な最適化 (MySQL 8.0)](https://dev.mysql.com/doc/refman/8.0/en/switchable-optimizations.html)」を参照してください。

# Amazon Aurora MySQL のリファレンス
<a name="AuroraMySQL.Reference"></a><a name="mysqlref"></a>

このリファレンスには、Aurora MySQL パラメータ、ステータス可変、一般的な SQL 拡張に関する情報や、コミュニティ MySQL データベースエンジンとの相違点が含まれます。

**Topics**
+ [Aurora MySQL 設定パラメータ](AuroraMySQL.Reference.ParameterGroups.md)
+ [Aurora MySQL グローバルステータス変数](AuroraMySQL.Reference.GlobalStatusVars.md)
+ [Aurora MySQL の待機イベント](AuroraMySQL.Reference.Waitevents.md)
+ [Aurora MySQL スレッド状態](AuroraMySQL.Reference.thread-states.md)
+ [Aurora MySQL の分離レベル](AuroraMySQL.Reference.IsolationLevels.md)
+ [Aurora MySQL のヒント](AuroraMySQL.Reference.Hints.md)
+ [Aurora MySQL ストアドプロシージャリファレンス](AuroraMySQL.Reference.StoredProcs.md)
+ [Aurora MySQL — 固有の information\$1schema テーブル](AuroraMySQL.Reference.ISTables.md)

# Aurora MySQL 設定パラメータ
<a name="AuroraMySQL.Reference.ParameterGroups"></a><a name="param_groups"></a>

Amazon Aurora MySQL DB クラスターの管理には、他の Amazon RDS DB インスタンスを管理するのと同じ方法 DB パラメータグループのパラメータを使用して管理します。Amazon Aurora は、複数の DB インスタンスを含む DB クラスターを使用する点が、他の DB エンジンとは異なります。そのため、Aurora MySQL DB クラスターの管理に使用するパラメータの中には、クラスター全体に適用されるものがあります。それ以外のパラメータは、DB クラスターの特定の DB インスタンスにのみ適用されます。

クラスターレベルのパラメータを管理するには、DB クラスターのパラメータグループを使用します。インスタンスレベルのパラメータを管理するには、DB パラメータグループを使用します。Aurora MySQL DB クラスターの各 DB インスタンスは、MySQL データベースエンジンと互換性があります。ただし、クラスターレベルでは MySQL データベースエンジンのパラメータの一部を適用します。これらのパラメータは、DB クラスターのパラメータグループを使用して管理します。Aurora DB クラスター内のインスタンスの DB パラメータグループにクラスターレベルのパラメータでは見つけられません。クラスターレベルのパラメータの一覧は、このトピックの後半で紹介します。

クラスターレベルとインスタンスレベルのパラメータは、いずれも AWS マネジメントコンソール、AWS CLI、または Amazon RDS API を使用して管理できます。クラスターレベルのパラメータとインスタンスレベルのパラメータの管理には、別々のコマンドを使用します。例えば、DB クラスターパラメータグループのクラスターレベルのパラメータを管理するには、CLI の [DB クラスターパラメータグループを変更する](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster-parameter-group.html) コマンドを使用します。DB クラスターの DB インスタンスの DB パラメータグループのインスタンスレベルのパラメータを管理するには、CLI の [modify-db-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) コマンドを使用します。

クラスターレベルのパラメータとインスタンスレベルのパラメータはいずれも、コンソール、CLI、または RDS API を使用して表示できます。例えば、DB クラスターパラメータグループのクラスターレベルのパラメータを表示するには、AWS CLI の [describe-db-cluster-parameters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-cluster-parameters.html) コマンドを使用します。DB クラスターの DB インスタンスの DB パラメータグループのインスタンスレベルのパラメータを表示するには、CLI の [describe-db-parameters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-parameters.html) コマンドを使用します。

**注記**  
各[デフォルトのパラメータグループ](USER_WorkingWithParamGroups.md)には、パラメータグループ内のすべてのパラメータのデフォルト値が含まれます。パラメータのこの値に「エンジンのデフォルト」がある場合は、実際のデフォルト値については、バージョン固有の MySQL または PostgreSQL のドキュメントを参照してください。  
特に明記されていない限り、次の表に記載されているパラメータは Aurora MySQL バージョン 2 および 3 で有効です。

DB パラメータグループの詳細については、「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。Aurora Serverless v1 クラスターのルールおよび制限については、「[Aurora Serverless v1 のパラメータグループ](aurora-serverless-v1.how-it-works.md#aurora-serverless.parameter-groups)」を参照してください。

**Topics**
+ [クラスターレベルのパラメータ](#AuroraMySQL.Reference.Parameters.Cluster)
+ [インスタンスレベルのパラメータ](#AuroraMySQL.Reference.Parameters.Instance)
+ [Aurora MySQL に適用されない MySQL パラメータ](#AuroraMySQL.Reference.Parameters.Inapplicable)

## クラスターレベルのパラメータ
<a name="AuroraMySQL.Reference.Parameters.Cluster"></a><a name="cluster_params"></a><a name="params"></a>

次の表は、Aurora MySQL DB クラスター全体に適用されるすべてのパラメータを示しています。


| パラメータ名 | 変更可能 | コメント | 
| --- | --- | --- | 
|  `aurora_binlog_read_buffer_size`  |  はい  |  バイナリログ (binlog) レプリケーションを使用するクラスターにのみ影響します。バイナリログのレプリケーションの詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。Aurora MySQL バージョン 3 から削除されました。  | 
|  `aurora_binlog_replication_max_yield_seconds`  |  あり  |  バイナリログ (binlog) レプリケーションを使用するクラスターにのみ影響します。バイナリログのレプリケーションの詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。  | 
|  `aurora_binlog_replication_sec_index_parallel_workers`  |  あり  |  複数のセカンダリインデックスを持つ大きなテーブルのトランザクションを複製するときに、セカンダリインデックスの変更を適用できる並列スレッドの合計数を設定します。パラメータは、デフォルトで `0` (無効) に設定されています。 このパラメータは、Aurora MySQL バージョン 306 以降で使用できます。詳細については、「[Aurora MySQL でのバイナリログのレプリケーションの最適化](binlog-optimization.md)」を参照してください。  | 
|  `aurora_binlog_use_large_read_buffer`  |  あり  |  バイナリログ (binlog) レプリケーションを使用するクラスターにのみ影響します。バイナリログのレプリケーションの詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。Aurora MySQL バージョン 3 から削除されました。  | 
|  `aurora_disable_hash_join`   |  あり  |  Aurora MySQL バージョン 2.09 以降でハッシュ結合最適化を無効にするには、このパラメータを `ON` に設定します。バージョン 3 ではサポートされていません。詳細については、「[Amazon Aurora MySQL の並列クエリ](aurora-mysql-parallel-query.md)」を参照してください。  | 
|   `aurora_enable_replica_log_compression`   |   はい   |   詳細については、「[Amazon Aurora MySQL レプリケーションのパフォーマンスに関する考慮事項](AuroraMySQL.Replication.md#AuroraMySQL.Replication.Performance)」を参照してください。Aurora Global Database の一部であるクラスターには適用されません。Aurora MySQL バージョン 3 から削除されました。  | 
|   `aurora_enable_repl_bin_log_filtering`   |   あり   |   詳細については、「[Amazon Aurora MySQL レプリケーションのパフォーマンスに関する考慮事項](AuroraMySQL.Replication.md#AuroraMySQL.Replication.Performance)」を参照してください。Aurora Global Database の一部であるクラスターには適用されません。Aurora MySQL バージョン 3 から削除されました。  | 
|  `aurora_enable_staggered_replica_restart`  |  あり  | この設定は、Aurora MySQL バージョン 3 で使用できますが、使用されていません。 | 
|   `aurora_enable_zdr`   |   あり   |   Aurora MySQL 2.10 以降では、この設定はデフォルトでオンになっています。詳細については、「[ダウンタイムのない再起動 (ZDR) (Amazon Aurora MySQL 用)](AuroraMySQL.Replication.Availability.md)」を参照してください。  | 
|   `aurora_enhanced_binlog`   |   あり   |   このパラメータの値を 1 に設定すると、Aurora MySQL バージョン 3.03.1 以降で拡張バイナリログがオンになります。詳細については、「[Aurora MySQL の拡張バイナリログの設定](AuroraMySQL.Enhanced.binlog.md)」を参照してください。  | 
|  `aurora_jemalloc_background_thread`  |  あり  |  このパラメータを使用して、バックグラウンドスレッドがメモリメンテナンスオペレーションを実行できるようにします。指定できる値は `0` (無効) と `1` (有効) です。デフォルト値は `0` です。 このパラメータは、Aurora MySQL バージョン 3.05 以降に適用されます。  | 
|  `aurora_jemalloc_dirty_decay_ms`  |  あり  |  このパラメータを使用して、解放されたメモリを一定時間 (ミリ秒単位) 保持します。メモリを保持すると、より迅速に再利用できます。指定できる値は `0`～`18446744073709551615` です。デフォルト値 (`0`) は、すべてのメモリを解放可能なメモリとしてオペレーティングシステムに返します。 このパラメータは、Aurora MySQL バージョン 3.05 以降に適用されます。  | 
|  `aurora_jemalloc_tcache_enabled`  |  あり  |  このパラメータを使用して、スレッドローカルキャッシュ内の小さなメモリリクエスト (最大 32 KiB) を処理し、メモリアリーナをバイパスします。指定できる値は `0` (無効) と `1` (有効) です。デフォルト値は `1` です。 このパラメータは、Aurora MySQL バージョン 3.05 以降に適用されます。  | 
|   `aurora_load_from_s3_role`   |   あり   |   詳細については、「[Amazon S3 バケットのテキストファイルから Amazon Aurora MySQL DB クラスターへのデータのロード](AuroraMySQL.Integrating.LoadFromS3.md)」を参照してください。現在、Aurora MySQL バージョン 3 では使用できません。`aws_default_s3_role` を使用します。  | 
|  `aurora_mask_password_hashes_type`  |  あり  |  Aurora MySQL 2.11 以降では、この設定はデフォルトでオンになっています。 この設定を使用して、スロークエリログ、監査ログで Aurora MySQL パスワードハッシュをマスクします。許容されている値は `0` と `1` (デフォルト) です。`1` に設定されている場合、パスワードは `<secret>` として記録されます。`0` に設定されている場合、パスワードはハッシュ (`#`) 値として記録されます。  | 
|   `aurora_select_into_s3_role`   |   あり   |   詳細については、「[Amazon Aurora MySQL DB クラスターから Amazon S3 バケット内のテキストファイルへのデータの保存](AuroraMySQL.Integrating.SaveIntoS3.md)」を参照してください。現在、Aurora MySQL バージョン 3 では使用できません。`aws_default_s3_role` を使用します。  | 
|  `authentication_kerberos_caseins_cmp`  |  あり  |  `authentication_kerberos` プラグインの大文字と小文字を区別しないユーザー名の比較を制御します。大文字と小文字を区別せずに比較するには、`true` に設定します。デフォルトでは、大文字と小文字を区別した比較が使用されます (`false`)。詳細については、「[Aurora MySQL での Kerberos 認証の使用](aurora-mysql-kerberos.md)」を参照してください。 このパラメータは、Aurora MySQL バージョン 3.03 以降で使用できます。  | 
|   `auto_increment_increment`   |   はい   |    | 
|   `auto_increment_offset`   |   はい   |    | 
|   `aws_default_lambda_role`   |   はい   |   詳細については、「[Amazon Aurora MySQL DB クラスターからの Lambda 関数の呼び出し](AuroraMySQL.Integrating.Lambda.md)」を参照してください。  | 
|  `aws_default_s3_role`  | あり |  DB クラスターから `LOAD DATA FROM S3` ステートメント、`LOAD XML FROM S3` ステートメント、または `SELECT INTO OUTFILE S3` ステートメントを呼び出すときに使用します。 Aurora MySQL バージョン 2 では、該当するステートメントの `aurora_load_from_s3_role` または `aurora_select_into_s3_role` に IAM ロールが指定されていない場合、このパラメータで指定された IAM ロールが使用されます。 Aurora MySQL バージョン 3 では、このパラメータに指定した IAM ロールが常に使用されます。 詳細については、「[IAM ロールと Amazon Aurora MySQL DB クラスターの関連付け](AuroraMySQL.Integrating.Authorizing.IAM.AddRoleToDBCluster.md)」を参照してください。  | 
|   `binlog_backup`   |   あり   |   このパラメータの値を 0 に設定すると、Aurora MySQL バージョン 3.03.1 以降で拡張バイナリログがオンになります。このパラメータは、拡張バイナリログを使用する場合にのみオフにできます。詳細については、「[Aurora MySQL の拡張バイナリログの設定](AuroraMySQL.Enhanced.binlog.md)」を参照してください。  | 
|   `binlog_checksum`   |   あり   |  このパラメータが設定されていない場合、AWS CLI および RDS API は `None` の値をレポートします。この場合、Aurora MySQL はエンジンのデフォルト値である `CRC32` を使用します。これは、チェックサムを無効化する明示的な `NONE` の設定とは異なります。  | 
|   `binlog-do-db`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `binlog_format`   |   あり   |   詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。  | 
|   `binlog_group_commit_sync_delay`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `binlog_group_commit_sync_no_delay_count`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `binlog-ignore-db`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `binlog_replication_globaldb`   |   あり   |   このパラメータの値を 0 に設定すると、Aurora MySQL バージョン 3.03.1 以降で拡張バイナリログがオンになります。このパラメータは、拡張バイナリログを使用する場合にのみオフにできます。詳細については、「[Aurora MySQL の拡張バイナリログの設定](AuroraMySQL.Enhanced.binlog.md)」を参照してください。  | 
|   `binlog_row_image`   |   いいえ   |    | 
|   `binlog_row_metadata`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `binlog_row_value_options`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `binlog_rows_query_log_events`   |   はい   |    | 
|   `binlog_transaction_compression`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `binlog_transaction_compression_level_zstd`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `binlog_transaction_dependency_history_size`  |  あり  |  このパラメータは、メモリに保持され、特定の行を最後に変更したトランザクションを検索するために使用される行ハッシュ数の上限を設定します。このハッシュ数に達すると、履歴はパージされます。 このパラメータは、Aurora MySQL バージョン 2.12 とバージョン 3 に適用されます。  | 
|   `binlog_transaction_dependency_tracking`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `character-set-client-handshake`   |   はい   |    | 
|   `character_set_client`   |   はい   |    | 
|   `character_set_connection`   |   はい   |    | 
|   `character_set_database`   |   はい   |    | 
|   `character_set_filesystem`   |   はい   |    | 
|   `character_set_results`   |   はい   |    | 
|   `character_set_server`   |   はい   |    | 
|   `collation_connection`   |   はい   |    | 
|   `collation_server`   |   はい   |    | 
|   `completion_type`   |   はい   |    | 
|   `default_storage_engine`   |   いいえ   |   Aurora MySQL クラスターは、すべてのデータに対して InnoDB ストレージエンジンを使用します。  | 
|   `enforce_gtid_consistency`   |   ときどき   |  Aurora MySQL バージョン 2 以降で変更可能です。  | 
|  `event_scheduler`  |  あり  |  イベントスケジューラのステータスを示します。 Aurora MySQL バージョン 3 では、クラスターレベルでのみ変更できます。  | 
|   `gtid-mode`   |   ときどき   |  Aurora MySQL バージョン 2 以降で変更可能です。  | 
|  `information_schema_stats_expiry`  |  あり  |  MySQL データベースサーバーがストレージエンジンからデータを取得し、キャッシュ内のデータを置き換えるまでの秒数。指定できる値は `0`～`31536000` です。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `init_connect`   |   あり   |  接続するクライアントごとにサーバーによって実行されるコマンド。設定では、接続障害を回避するため、二重引用符 ("") を使用します。次に例を示します。 <pre>SET optimizer_switch="hash_join=off"</pre> Aurora MySQL バージョン 3 では、`CONNECTION_ADMIN` 権限を持つユーザーにこのパラメータは適用されません。これには Aurora マスターユーザーが含まれます。詳細については、「[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model)」を参照してください。  | 
|  `innodb_adaptive_hash_index`  |  あり  |  このパラメータは、Aurora MySQL バージョン 2 および Aurora MySQL バージョン 3 の DB クラスターレベルで修正できます。 Adaptive Hash インデックスは Reader DB インスタンスではサポートされていません。  | 
|  `innodb_aurora_instant_alter_column_allowed`  | あり |  `INSTANT` アルゴリズムをグローバルレベルでの `ALTER COLUMN` オペレーションに使用できるかどうかを制御します。許容値は以下のとおりです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Reference.ParameterGroups.html) 詳細については、MySQL ドキュメントの「[列オペレーション](https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-column-operations)」を参照してください。 このパラメータは、Aurora MySQL バージョン 3.05 以降に適用されます。  | 
|   `innodb_autoinc_lock_mode`   |   あり   |    | 
|   `innodb_checksums`   |   なし   | Aurora MySQL バージョン 3 から削除されました。 | 
|   `innodb_cmp_per_index_enabled`   |   はい   |    | 
|   `innodb_commit_concurrency`   |   はい   |    | 
|   `innodb_data_home_dir`   |   なし   |   Aurora MySQL は、直接ファイルシステムにアクセスしないマネージドインスタンスを使用します。  | 
|   `innodb_deadlock_detect`   |  あり  |  このオプションは、Aurora MySQL バージョン 2.11 以降とバージョン 3 でデッドロック検出を無効化するために使用されます。 高並行性システムでは、多数のスレッドが同じロックを待機すると、デッドロック検出によって速度が低下する可能性があります。MySQL パラメータの詳細については、MySQL のドキュメントを参照してください。  | 
|  `innodb_default_row_format`  | あり |  このパラメータは、InnoDB テーブル (ユーザー作成 InnoDB 一時テーブルを含む) のデフォルトの行形式を定義します。Aurora MySQL バージョン 2 と 3 に適用されます。 値は `DYNAMIC`、`COMPACT`、または `REDUNDANT.` になります。  | 
|   `innodb_file_per_table`   |   あり   |  このパラメータは、テーブルストレージの編成方法に影響します。詳細については、「[ストレージのスケーリング](Aurora.Managing.Performance.md#Aurora.Managing.Performance.StorageScaling)」を参照してください。  | 
|  `innodb_flush_log_at_trx_commit`  |  あり  |  デフォルト値の `1` を使用することを強くお勧めします。 Aurora MySQL バージョン 3 では、このパラメータを `1` 以外の値に設定する前に、`innodb_trx_commit_allow_data_loss` の値を `1` に設定する必要があります。 詳細については、「[ログバッファをフラッシュする頻度の設定](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.Flush)」を参照してください。  | 
|   `innodb_ft_max_token_size`   |   はい   |    | 
|   `innodb_ft_min_token_size`   |   はい   |    | 
|   `innodb_ft_num_word_optimize`   |   はい   |    | 
|   `innodb_ft_sort_pll_degree`   |   はい   |    | 
|   `innodb_online_alter_log_max_size`   |   はい   |    | 
|   `innodb_optimize_fulltext_only`   |   はい   |    | 
|   `innodb_page_size`   |   いいえ   |    | 
|   `innodb_print_all_deadlocks`   |   あり   |  有効にすると、すべての InnoDB のデッドロックに関する情報が Aurora MySQL エラーログに記録されます。詳細については、「[Aurora MySQL デッドロックの最小化とトラブルシューティング](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.deadlocks)」を参照してください。  | 
|   `innodb_purge_batch_size`   |   はい   |    | 
|   `innodb_purge_threads`   |   はい   |    | 
|   `innodb_rollback_on_timeout`   |   はい   |    | 
|   `innodb_rollback_segments`   |   はい   |    | 
|   `innodb_spin_wait_delay`   |   はい   |    | 
|   `innodb_strict_mode`   |   はい   |    | 
|   `innodb_support_xa`   |   あり   | Aurora MySQL バージョン 3 から削除されました。 | 
|   `innodb_sync_array_size`   |   はい   |    | 
|   `innodb_sync_spin_loops`   |   はい   |    | 
|  `innodb_stats_include_delete_marked`  |  あり  |  このパラメータが有効なとき、InnoDB はパーシステントオプティマイザ統計の計算時に削除マーク付きのレコードを含めます。 このパラメータは、Aurora MySQL バージョン 2.12 とバージョン 3 に適用されます。  | 
|   `innodb_table_locks`   |   はい   |    | 
|  `innodb_trx_commit_allow_data_loss`  |  あり  |  Aurora MySQL バージョン 3 では、`innodb_flush_log_at_trx_commit` の値を変更できるように、このパラメータの値を `1` に設定します。 `innodb_trx_commit_allow_data_loss` の初期値は `0` です。 詳細については、「[ログバッファをフラッシュする頻度の設定](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.Flush)」を参照してください。  | 
|   `innodb_undo_directory`   |   なし   |   Aurora MySQL は、直接ファイルシステムにアクセスしないマネージドインスタンスを使用します。  | 
|  `internal_tmp_disk_storage_engine`  | あり |  どのインメモリストレージエンジンを内部一時テーブルに使用するかを制御します。指定できる値は `INNODB` と `MYISAM` です。 このパラメータは、Aurora MySQL バージョン 2 に適用されます。  | 
|  `internal_tmp_mem_storage_engine`  |   あり   |  どのインメモリストレージエンジンを内部一時テーブルに使用するかを制御します。指定できる値は `MEMORY` と `TempTable` です。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `key_buffer_size`  |   あり   |  MyISAM テーブルのキーキャッシュ。詳しい情報については、「[keycache->cache\$1lock ミューテックス](AuroraMySQL.Reference.Waitevents.md#key-cache.cache-lock)」を参照してください。  | 
|   `lc_time_names`   |   はい   |    | 
|  `log_error_suppression_list`  |  あり  |  MySQL エラーログに記録されていないエラーコードのリストを指定します。これにより、重大でない特定のエラー条件を無視することで、エラーログをクリーンな状態に保つことができます。詳細については、MySQL ドキュメントの「[log\$1error\$1suppression\$1list](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_log_error_suppression_list)」を参照してください。 このパラメータは、Aurora MySQL バージョン 3.03 以降に適用されます。  | 
|  `low_priority_updates`  |  あり  |  `INSERT`、`UPDATE`、`DELETE`、`LOCK TABLE WRITE` オペレーションは、保留中の `SELECT` オペレーションがなくなるまで待機します。このパラメータは、テーブルレベルのロック (MyISAM、MEMORY、MERGE) のみを使用するストレージエンジンにのみ影響します。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `lower_case_table_names`  |  はい (Aurora MySQL バージョン 2) クラスター作成時のみ (Aurora MySQL バージョン 3)  |  Aurora MySQL バージョン 2.10 以降では、この設定を変更し、ライターインスタンスを再起動した後、すべてのリーダーインスタンスを再起動してください。詳細については、「[読み取り可用性機能のある Aurora クラスターの再起動](aurora-mysql-survivable-replicas.md)」を参照してください。 Aurora MySQL バージョン 3 では、 このパラメータ値はクラスターの作成時に永続的に設定されます。このオプションにデフォルト以外の値を使用する場合は、アップグレードする前に Aurora MySQL バージョン 3 カスタムパラメータグループを設定し、バージョン 3 クラスターを作成するスナップショットの復元操作中にパラメータグループを指定します。 Aurora MySQL に基づく Aurora グローバルデータベースでは、`lower_case_table_names` パラメータがオンの場合、Aurora MySQL バージョン 2 からバージョン 3 へのインプレースアップグレードを実行できません。使用できる方法の詳細については、「[メジャーバージョンのアップグレード](aurora-global-database-upgrade.md#aurora-global-database-upgrade.major)」を参照してください。  | 
|   `master-info-repository`   |   あり   |  Aurora MySQL バージョン 3 から削除されました。  | 
|   `master_verify_checksum`   |   あり   |  Aurora MySQL バージョン 2。`source_verify_checksum` を Aurora MySQL バージョン 3 で使用する。  | 
|  `max_delayed_threads`  | あり |  `INSERT DELAYED` ステートメントを処理するスレッドの最大数を設定します。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `max_error_count`  | あり |  表示用に保存するエラーメッセージ、警告メッセージ、およびメモメッセージの最大数。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `max_execution_time`  | あり |  実行中の `SELECT` ステートメントのタイムアウトをミリ秒単位で表します。値は `0`～`18446744073709551615` の範囲で指定できます。`0` に設定すると、タイムアウトは発生しません。 詳細については、MySQL ドキュメントの「[max\$1execution\$1time](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_execution_time)」を参照してください。  | 
|  `min_examined_row_limit`  | あり |  このパラメータを使用すると、指定した行数よりも少ない行数を調べるクエリがログに記録されないようにします。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `partial_revokes`   |   なし   |  このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `preload_buffer_size`  | あり |  インデックスをプリロードするときに割り当てられるバッファのサイズ。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `query_cache_type`  |  あり  |  Aurora MySQL バージョン 3 から削除されました。  | 
|   `read_only`   |   あり   |  このパラメータがオンにされると、サーバーはレプリカスレッドによって実行される更新以外の更新を許可しません。 Aurora MySQL バージョン 2 の有効な値は以下のとおりです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Reference.ParameterGroups.html) Aurora MySQL バージョン 3 の有効な値は以下のとおりです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Reference.ParameterGroups.html) Aurora MySQL バージョン 3 では、`CONNECTION_ADMIN` 権限を持つユーザーにこのパラメータは適用されません。これには Aurora マスターユーザーが含まれます。詳細については、「[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model)」を参照してください。  | 
|   `relay-log-space-limit`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `replica_parallel_type`  | あり |  このパラメータを使用すると、整合性を損なうことなく、すでに準備段階にあるコミットされていないすべてのスレッドのレプリカを並行して実行できます。Aurora MySQL バージョン 3 に適用されます。 Aurora MySQL バージョン 3.03.\$1 以前では、デフォルト値は DATABASE です。Aurora MySQL バージョン 3.04 以降では、デフォルト値は LOGICAL\$1CLOCK です。  | 
|   `replica_preserve_commit_order`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `replica_transaction_retries`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `replica_type_conversions`  |  あり  |  このパラメータは、レプリカで使用されるタイプ変換を決定します。指定できる値は、`ALL_LOSSY`、`ALL_NON_LOSSY`、`ALL_SIGNED`、および `ALL_UNSIGNED`です。詳細については、MySQL ドキュメントの「[ソースとレプリカのテーブル定義が異なるレプリケーション](https://dev.mysql.com/doc/refman/8.0/en/replication-features-differing-tables.html)」を参照してください。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `replicate-do-db`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `replicate-do-table`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `replicate-ignore-db`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `replicate-ignore-table`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `replicate-wild-do-table`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `replicate-wild-ignore-table`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `require_secure_transport`   |   あり   |   このパラメータは、Aurora MySQL バージョン 2 および 3 に適用されます。詳細については、「[Aurora MySQL DB クラスターへの接続](AuroraMySQL.Security.md#AuroraMySQL.Security.SSL)」を参照してください。  | 
|   `rpl_read_size`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `server_audit_cw_upload`  |   なし   |  Aurora MySQL でこのパラメータは廃止されました。`server_audit_logs_upload` を使用します。 詳細については、「[Amazon CloudWatch Logs への Amazon Aurora MySQL ログの発行](AuroraMySQL.Integrating.CloudWatch.md)」を参照してください。  | 
|   `server_audit_events`   |   はい   |  詳細については、「[Amazon Aurora MySQL DB クラスターでのアドバンストな監査の使用](AuroraMySQL.Auditing.md)」を参照してください。  | 
|   `server_audit_excl_users`   |   はい   |  詳細については、「[Amazon Aurora MySQL DB クラスターでのアドバンストな監査の使用](AuroraMySQL.Auditing.md)」を参照してください。  | 
|   `server_audit_incl_users`   |   はい   |  詳細については、「[Amazon Aurora MySQL DB クラスターでのアドバンストな監査の使用](AuroraMySQL.Auditing.md)」を参照してください。  | 
|   `server_audit_logging`   |   あり   |   Amazon CloudWatch Logs へのログのアップロードの手順については、[Amazon CloudWatch Logs への Amazon Aurora MySQL ログの発行](AuroraMySQL.Integrating.CloudWatch.md) を参照してください。  | 
|  `server_audit_logs_upload`  |  あり  |  [高度な監査] を有効にし、このパラメータを `1` に設定することで、監査ログを CloudWatch Logs にパブリッシュできます。`server_audit_logs_upload` パラメータのデフォルト値は `0` です。 詳細については、「[Amazon CloudWatch Logs への Amazon Aurora MySQL ログの発行](AuroraMySQL.Integrating.CloudWatch.md)」を参照してください。  | 
|   `server_id`   |   いいえ   |    | 
|   `skip-character-set-client-handshake`   |   はい   |    | 
|   `skip_name_resolve`   |   いいえ   |    | 
|   `slave-skip-errors`   |   はい   |  MySQL 5.7 の互換性を備えた Aurora MySQL バージョン 2 クラスターにのみ適用されます。  | 
|   `source_verify_checksum`   |   あり   |  このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `sync_frm`  |  あり  |  Aurora MySQL バージョン 3 から削除されました。  | 
|  `thread_cache_size`  | あり | キャッシュされるスレッドの数。このパラメータは、Aurora MySQL バージョン 2 および 3 に適用されます。 | 
|   `time_zone`   |   あり   |  デフォルトでは、Aurora DB クラスターのタイムゾーンは協定世界時 (UTC) です。代わりに、DB クラスターのインスタンスのタイムゾーンをアプリケーションのローカルタイムゾーンに設定できます。詳細については、「[Amazon Aurora DB クラスターのローカルタイムゾーン](Concepts.RegionsAndAvailabilityZones.md#Aurora.Overview.LocalTimeZone)」を参照してください。  | 
|   `tls_version`   |   はい   |   詳細については、「[Aurora MySQL の TLS バージョン](AuroraMySQL.Security.md#AuroraMySQL.Security.SSL.TLS_Version)」を参照してください。  | 

## インスタンスレベルのパラメータ
<a name="AuroraMySQL.Reference.Parameters.Instance"></a><a name="instance_params"></a><a name="db_params"></a>

 次の表は、Aurora MySQL DB クラスターの特定の DB インスタンスに適用されるパラメータの一覧です。


|  パラメータ名  |  変更可能  |  コメント  | 
| --- | --- | --- | 
|   `activate_all_roles_on_login`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `allow-suspicious-udfs`   |   なし   |    | 
|  `aurora_disable_hash_join`   |  あり  |  Aurora MySQL バージョン 2.09 以降でハッシュ結合最適化を無効にするには、このパラメータを `ON` に設定します。バージョン 3 ではサポートされていません。詳細については、「[Amazon Aurora MySQL の並列クエリ](aurora-mysql-parallel-query.md)」を参照してください。  | 
|   `aurora_lab_mode`   |   はい   |   詳細については、「[Amazon Aurora MySQL ラボモード](AuroraMySQL.Updates.LabMode.md)」を参照してください。Aurora MySQL バージョン 3 から削除されました。  | 
|   `aurora_oom_response`   |   あり   |  このパラメータは、Aurora MySQL バージョン 2 および 3 でサポートされています。詳細については、「[Aurora MySQL データベースのメモリ不足の問題のトラブルシューティング](AuroraMySQLOOM.md)」を参照してください。  | 
|   `aurora_parallel_query`   |   あり   |  Aurora MySQL バージョン 2.09 以降では、`ON` に設定してパラレルクエリを有効にします。これらのバージョンでは、古い `aurora_pq` パラメータは使用されません。詳細については、「[Amazon Aurora MySQL の並列クエリ](aurora-mysql-parallel-query.md)」を参照してください。  | 
|   `aurora_pq`   |   あり   |  Aurora MySQL バージョン 2.09 より前の特定の DB インスタンスでは、パラレルクエリをオフにするには、`OFF` に設定します。バージョン 2.09 以降では、代わりに `aurora_parallel_query` を使用してパラレルクエリのオンとオフを切り替えます。詳細については、「[Amazon Aurora MySQL の並列クエリ](aurora-mysql-parallel-query.md)」を参照してください。  | 
|  `aurora_read_replica_read_committed`  |  あり  |   Aurora レプリカの `READ COMMITTED` 分離レベルを有効化し、長時間実行クエリ中のパージラグを削減するように分離動作を変更します。動作の変更点および変更によるクエリ結果への影響を理解している場合にのみ、この設定を有効にしてください。たとえば、この設定では MySQL のデフォルトよりも厳密でない分離を使用します。Aurora はクエリ実行中にテーブルを再編成するため、これが有効なとき、長時間実行クエリには同じ行の複数のコピーが表示されることがあります。詳細については、「[Aurora MySQL の分離レベル](AuroraMySQL.Reference.IsolationLevels.md)」を参照してください。  | 
|  `aurora_tmptable_enable_per_table_limit`  |  あり  |  Aurora MySQL バージョン 3.04 以降で、`TempTable` ストレージエンジンによって作成されるメモリ内一時テーブルの最大サイズを `tmp_table_size` パラメータが制御するかどうかを決定します。 詳細については、「[内部メモリ内一時テーブルのサイズを制限する](ams3-temptable-behavior.md#ams3-temptable-behavior-limit)」を参照してください。  | 
|  `aurora_use_vector_instructions`  |  あり  |  このパラメータが有効なとき、Aurora MySQL は最新の CPU が提供する最適化されたベクトル処理命令を使用して、I/O 集約型ワークロードのパフォーマンスを向上させます。 Aurora MySQL version 3.05 以降では、この設定はデフォルトで有効になっています。  | 
|   `autocommit`   |   はい   |    | 
|   `automatic_sp_privileges`   |   はい   |    | 
|   `back_log`   |   はい   |    | 
|   `basedir`   |   なし   |   Aurora MySQL は、直接ファイルシステムにアクセスしないマネージドインスタンスを使用します。  | 
|   `binlog_cache_size`   |   はい   |    | 
|   `binlog_max_flush_queue_time`   |   はい   |    | 
|   `binlog_order_commits`   |   はい   |    | 
|   `binlog_stmt_cache_size`   |   はい   |    | 
|   `binlog_transaction_compression`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `binlog_transaction_compression_level_zstd`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `bulk_insert_buffer_size`   |   はい   |    | 
|   `concurrent_insert`   |   はい   |    | 
|   `connect_timeout`   |   はい   |    | 
|   `core-file`   |   なし   |   Aurora MySQL は、直接ファイルシステムにアクセスしないマネージドインスタンスを使用します。  | 
|   `datadir`   |   なし   |   Aurora MySQL は、直接ファイルシステムにアクセスしないマネージドインスタンスを使用します。  | 
|   `default_authentication_plugin`   |   なし   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `default_time_zone`   |   なし   |    | 
|   `default_tmp_storage_engine`   |   あり   |  一時テーブルのデフォルトのストレージエンジン。  | 
|   `default_week_format`   |   はい   |    | 
|   `delay_key_write`   |   はい   |    | 
|   `delayed_insert_limit`   |   はい   |    | 
|   `delayed_insert_timeout`   |   はい   |    | 
|   `delayed_queue_size`   |   はい   |    | 
|   `div_precision_increment`   |   はい   |    | 
|   `end_markers_in_json`   |   はい   |    | 
|   `eq_range_index_dive_limit`   |   はい   |    | 
|   `event_scheduler`   |  ときどき  |  イベントスケジューラのステータスを示します。 Aurora MySQL バージョン 3 では、クラスターレベルでのみ変更できます。  | 
|   `explicit_defaults_for_timestamp`   |   あり   |    | 
|   `flush`   |   いいえ   |    | 
|   `flush_time`   |   はい   |    | 
|   `ft_boolean_syntax`   |   いいえ   |    | 
|   `ft_max_word_len`   |   はい   |    | 
|   `ft_min_word_len`   |   はい   |    | 
|   `ft_query_expansion_limit`   |   はい   |    | 
|   `ft_stopword_file`   |   はい   |    | 
|   `general_log`   |   はい   |   CloudWatch Logs へのログのアップロードの手順については、[Amazon CloudWatch Logs への Amazon Aurora MySQL ログの発行](AuroraMySQL.Integrating.CloudWatch.md) を参照してください。  | 
|   `general_log_file`   |   なし   |   Aurora MySQL は、直接ファイルシステムにアクセスしないマネージドインスタンスを使用します。  | 
|   `group_concat_max_len`   |   はい   |    | 
|   `host_cache_size`   |   はい   |    | 
|   `init_connect`   |   あり   |  接続するクライアントごとにサーバーによって実行されるコマンド。設定では、接続障害を回避するため、二重引用符 ("") を使用します。次に例を示します。 <pre>SET optimizer_switch="hash_join=off"</pre> Aurora MySQL バージョン 3 では、Aurora マスターユーザーなど、`CONNECTION_ADMIN` 権限を持つユーザーには、このパラメータは適用されません。詳細については、「[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model)」を参照してください。  | 
|  `innodb_adaptive_hash_index`  |  あり  |  このパラメータは、Aurora MySQL バージョン 2 の DB インスタンスレベルに適用されます。Aurora MySQL バージョン 3 では、DB クラスターレベルでのみ変更できます。 Adaptive Hash インデックスは Reader DB インスタンスではサポートされていません。  | 
|   `innodb_adaptive_max_sleep_delay`   |   あり   |   Aurora では、`innodb_thread_concurrency` は常に 0 であるため、このパラメータを変更しても影響はありません。  | 
|  `innodb_aurora_max_partitions_for_range`  | あり |  永続的な統計情報が得られない場合は、このパラメータを使用してパーティション分割テーブルの行数計算のパフォーマンスを向上させることができます。 この値は 0 ～ 8192 に設定できます。この値によって、行数の計算時にチェックするパーティションの数が決まります。デフォルト値は 0 で、MySQL のデフォルト動作と同じく、すべてのパーティションを使用していると推定されます。 このパラメータは、Aurora MySQL バージョン 3.03.1 以降で使用できます。  | 
|   `innodb_autoextend_increment`   |   あり   |    | 
|   `innodb_buffer_pool_dump_at_shutdown`   |   いいえ   |    | 
|   `innodb_buffer_pool_dump_now`   |   いいえ   |    | 
|   `innodb_buffer_pool_filename`   |   いいえ   |    | 
|   `innodb_buffer_pool_load_abort`   |   いいえ   |    | 
|   `innodb_buffer_pool_load_at_startup`   |   いいえ   |    | 
|   `innodb_buffer_pool_load_now`   |   いいえ   |    | 
|   `innodb_buffer_pool_size`   |   あり   |  デフォルト値は式により表されます。式内で `DBInstanceClassMemory` 値がどのように計算されるかにいては、「[DB パラメータ式の変数](USER_ParamValuesRef.md#USER_FormulaVariables)」を参照してください。  | 
|   `innodb_change_buffer_max_size`   |   なし   |   Aurora MySQL は、は InnoDB 変更バッファをまったく使用しません。  | 
|   `innodb_compression_failure_threshold_pct`   |   はい   |    | 
|   `innodb_compression_level`   |   はい   |    | 
|   `innodb_compression_pad_pct_max`   |   はい   |    | 
|   `innodb_concurrency_tickets`   |   はい   |   Aurora では `innodb_thread_concurrency` が常に 0 であるため、このパラメータを変更しても影響はありません。  | 
|   `innodb_deadlock_detect`   |  あり  |  このオプションは、Aurora MySQL バージョン 2.11 以降とバージョン 3 でデッドロック検出を無効化するために使用されます。 高並行性システムでは、多数のスレッドが同じロックを待機すると、デッドロック検出によって速度が低下する可能性があります。MySQL パラメータの詳細については、MySQL のドキュメントを参照してください。  | 
|   `innodb_file_format`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `innodb_flushing_avg_loops`   |   なし   |    | 
|   `innodb_force_load_corrupted`   |   いいえ   |    | 
|   `innodb_ft_aux_table`   |   はい   |    | 
|   `innodb_ft_cache_size`   |   はい   |    | 
|   `innodb_ft_enable_stopword`   |   はい   |    | 
|   `innodb_ft_server_stopword_table`   |   はい   |    | 
|   `innodb_ft_user_stopword_table`   |   はい   |    | 
|   `innodb_large_prefix`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `innodb_lock_wait_timeout`   |   あり   |    | 
|   `innodb_log_compressed_pages`   |   いいえ   |    | 
|   `innodb_lru_scan_depth`   |   はい   |    | 
|   `innodb_max_purge_lag`   |   はい   |    | 
|   `innodb_max_purge_lag_delay`   |   はい   |    | 
|   `innodb_monitor_disable`   |   はい   |    | 
|   `innodb_monitor_enable`   |   はい   |    | 
|   `innodb_monitor_reset`   |   はい   |    | 
|   `innodb_monitor_reset_all`   |   はい   |    | 
|   `innodb_old_blocks_pct`   |   はい   |    | 
|   `innodb_old_blocks_time`   |   はい   |    | 
|   `innodb_open_files`   |   はい   |    | 
|   `innodb_print_all_deadlocks`   |   あり   |  有効にすると、すべての InnoDB のデッドロックに関する情報が Aurora MySQL エラーログに記録されます。詳細については、「[Aurora MySQL デッドロックの最小化とトラブルシューティング](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.deadlocks)」を参照してください。  | 
|   `innodb_random_read_ahead`   |   はい   |    | 
|   `innodb_read_ahead_threshold`   |   はい   |    | 
|   `innodb_read_io_threads`   |   いいえ   |    | 
|   `innodb_read_only`   |   いいえ   |   Aurora MySQL は、クラスターの種類に基づき、DB インスタンスの読み取り専用と読み書きの状態を管理します。例えば、プロビジョンされたクラスターに読み書きの DB インスタンス (*プライマリインスタンス*) が 1 つあり、クラスターのそれ以外のインスタンスは読み取り専用 (Aurora レプリカ) です。  | 
|   `innodb_replication_delay`   |   はい   |    | 
|   `innodb_sort_buffer_size`   |   はい   |    | 
|   `innodb_stats_auto_recalc`   |   はい   |    | 
|   `innodb_stats_method`   |   はい   |    | 
|   `innodb_stats_on_metadata`   |   はい   |    | 
|   `innodb_stats_persistent`   |   はい   |    | 
|   `innodb_stats_persistent_sample_pages`   |   はい   |    | 
|   `innodb_stats_transient_sample_pages`   |   はい   |    | 
|   `innodb_thread_concurrency`   |   いいえ   |    | 
|   `innodb_thread_sleep_delay`   |   あり   |   Aurora では、`innodb_thread_concurrency` は常に 0 であるため、このパラメータを変更しても影響はありません。  | 
|   `interactive_timeout`   |   あり   |   Aurora は `interactive_timeout` と `wait_timeout` の最小値を評価します。次に、その最小値をタイムアウトとして使用して、対話型と非対話型の両方のアイドル状態のセッションをすべて終了します。  | 
|  `internal_tmp_disk_storage_engine`  | あり |  どのインメモリストレージエンジンを内部一時テーブルに使用するかを制御します。指定できる値は `INNODB` と `MYISAM` です。 このパラメータは、Aurora MySQL バージョン 2 に適用されます。  | 
|  `internal_tmp_mem_storage_engine`  |  あり  |  どのインメモリストレージエンジンを内部一時テーブルに使用するかを制御します。指定できる値は `MEMORY` と `TempTable` です。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `join_buffer_size`   |   はい   |    | 
|   `keep_files_on_create`   |   はい   |    | 
|  `key_buffer_size`  |   あり   |  MyISAM テーブルのキーキャッシュ。詳しい情報については、「[keycache->cache\$1lock ミューテックス](AuroraMySQL.Reference.Waitevents.md#key-cache.cache-lock)」を参照してください。  | 
|   `key_cache_age_threshold`   |   はい   |    | 
|   `key_cache_block_size`   |   はい   |    | 
|   `key_cache_division_limit`   |   はい   |    | 
|   `local_infile`   |   はい   |    | 
|   `lock_wait_timeout`   |   はい   |    | 
|   `log-bin`   |   いいえ   |   `binlog_format` を `STATEMENT`、`MIXED`、または `ROW` に設定すると、`log-bin` は自動的に `ON` に設定されます。`binlog_format` を `OFF` に設定すると、`log-bin` は自動的に `OFF` に設定されます。詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。  | 
|   `log_bin_trust_function_creators`   |   はい   |    | 
|   `log_bin_use_v1_row_events`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `log_error`   |   なし   |    | 
|  `log_error_suppression_list`  |  あり  |  MySQL エラーログに記録されていないエラーコードのリストを指定します。これにより、重大でない特定のエラー条件を無視することで、エラーログをクリーンな状態に保つことができます。詳細については、MySQL ドキュメントの「[log\$1error\$1suppression\$1list](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_log_error_suppression_list)」を参照してください。 このパラメータは、Aurora MySQL バージョン 3.03 以降に適用されます。  | 
|   `log_output`   |   はい   |    | 
|   `log_queries_not_using_indexes`   |   はい   |    | 
|   `log_slave_updates`   |   なし   |   Aurora MySQL バージョン 2。`log_replica_updates` を Aurora MySQL バージョン 3 で使用する。  | 
|   `log_replica_updates`   |   なし   |   Aurora MySQL バージョン 3   | 
|   `log_throttle_queries_not_using_indexes`   |   はい   |    | 
|   `log_warnings`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `long_query_time`   |   はい   |    | 
|   `low_priority_updates`   |   あり   |  `INSERT`、`UPDATE`、`DELETE`、`LOCK TABLE WRITE` オペレーションは、保留中の `SELECT` オペレーションがなくなるまで待機します。このパラメータは、テーブルレベルのロック (MyISAM、MEMORY、MERGE) のみを使用するストレージエンジンにのみ影響します。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `max_allowed_packet`   |   はい   |    | 
|   `max_binlog_cache_size`   |   はい   |    | 
|   `max_binlog_size`   |   いいえ   |    | 
|   `max_binlog_stmt_cache_size`   |   はい   |    | 
|   `max_connect_errors`   |   はい   |    | 
|   `max_connections`   |   あり   |  デフォルト値は式により表されます。式内で `DBInstanceClassMemory` 値がどのように計算されるかにいては、「[DB パラメータ式の変数](USER_ParamValuesRef.md#USER_FormulaVariables)」を参照してください。インスタンスクラスに応じたデフォルト値については、「[Aurora MySQL DB インスタンスへの最大接続数](AuroraMySQL.Managing.Performance.md#AuroraMySQL.Managing.MaxConnections)」を参照してください。  | 
|   `max_delayed_threads`   |   あり   |  `INSERT DELAYED` ステートメントを処理するスレッドの最大数を設定します。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `max_error_count`   |   あり   |  表示用に保存するエラーメッセージ、警告メッセージ、およびメモメッセージの最大数。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|  `max_execution_time`  | あり |  実行中の `SELECT` ステートメントのタイムアウトをミリ秒単位で表します。値は `0`～`18446744073709551615` の範囲で指定できます。`0` に設定すると、タイムアウトは発生しません。 詳細については、MySQL ドキュメントの「[max\$1execution\$1time](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_execution_time)」を参照してください。  | 
|   `max_heap_table_size`   |   はい   |    | 
|   `max_insert_delayed_threads`   |   はい   |    | 
|   `max_join_size`   |   はい   |    | 
|   `max_length_for_sort_data`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `max_prepared_stmt_count`   |   はい   |    | 
|   `max_seeks_for_key`   |   はい   |    | 
|   `max_sort_length`   |   はい   |    | 
|   `max_sp_recursion_depth`   |   はい   |    | 
|   `max_tmp_tables`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `max_user_connections`   |   はい   |    | 
|   `max_write_lock_count`   |   はい   |    | 
|   `metadata_locks_cache_size`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `min_examined_row_limit`   |   あり   |  このパラメータを使用すると、指定した行数よりも少ない行数を調べるクエリがログに記録されないようにします。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `myisam_data_pointer_size`   |   はい   |    | 
|   `myisam_max_sort_file_size`   |   はい   |    | 
|   `myisam_mmap_size`   |   はい   |    | 
|   `myisam_sort_buffer_size`   |   はい   |    | 
|   `myisam_stats_method`   |   はい   |    | 
|   `myisam_use_mmap`   |   はい   |    | 
|   `net_buffer_length`   |   はい   |    | 
|   `net_read_timeout`   |   はい   |    | 
|   `net_retry_count`   |   はい   |    | 
|   `net_write_timeout`   |   はい   |    | 
|   `old-style-user-limits`   |   はい   |    | 
|   `old_passwords`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `optimizer_prune_level`   |   はい   |    | 
|   `optimizer_search_depth`   |   はい   |    | 
|   `optimizer_switch`   |   はい   |   このスイッチを使用する Aurora MySQL 機能の詳細については、「[Amazon Aurora MySQL を使用する際のベストプラクティス](AuroraMySQL.BestPractices.md)」を参照してください。  | 
|   `optimizer_trace`   |   はい   |    | 
|   `optimizer_trace_features`   |   はい   |    | 
|   `optimizer_trace_limit`   |   はい   |    | 
|   `optimizer_trace_max_mem_size`   |   はい   |    | 
|   `optimizer_trace_offset`   |   はい   |    | 
|   `performance-schema-consumer-events-waits-current`   |   はい   |    | 
|   `performance-schema-instrument`   |   はい   |    | 
|   `performance_schema`   |   はい   |    | 
|   `performance_schema_accounts_size`   |   はい   |    | 
|   `performance_schema_consumer_global_instrumentation`   |   はい   |    | 
|   `performance_schema_consumer_thread_instrumentation`   |   はい   |    | 
|   `performance_schema_consumer_events_stages_current`   |   はい   |    | 
|   `performance_schema_consumer_events_stages_history`   |   はい   |    | 
|   `performance_schema_consumer_events_stages_history_long`   |   はい   |    | 
|   `performance_schema_consumer_events_statements_current`   |   はい   |    | 
|   `performance_schema_consumer_events_statements_history`   |   はい   |    | 
|   `performance_schema_consumer_events_statements_history_long`   |   はい   |    | 
|   `performance_schema_consumer_events_waits_history`   |   はい   |    | 
|   `performance_schema_consumer_events_waits_history_long`   |   はい   |    | 
|   `performance_schema_consumer_statements_digest`   |   はい   |    | 
|   `performance_schema_digests_size`   |   はい   |    | 
|   `performance_schema_events_stages_history_long_size`   |   はい   |    | 
|   `performance_schema_events_stages_history_size`   |   はい   |    | 
|   `performance_schema_events_statements_history_long_size`   |   はい   |    | 
|   `performance_schema_events_statements_history_size`   |   はい   |    | 
|   `performance_schema_events_transactions_history_long_size`   |  はい  |    | 
|   `performance_schema_events_transactions_history_size`   |  はい  |    | 
|   `performance_schema_events_waits_history_long_size`   |   はい   |    | 
|   `performance_schema_events_waits_history_size`   |   はい   |    | 
|   `performance_schema_hosts_size`   |   はい   |    | 
|   `performance_schema_max_cond_classes`   |   はい   |    | 
|   `performance_schema_max_cond_instances`   |   はい   |    | 
|   `performance_schema_max_digest_length`   |   はい   |    | 
|   `performance_schema_max_file_classes`   |   はい   |    | 
|   `performance_schema_max_file_handles`   |   はい   |    | 
|   `performance_schema_max_file_instances`   |   はい   |    | 
|  `performance_schema_max_index_stat`  |  はい  |    | 
|   `performance_schema_max_memory_classes`   |   はい   |    | 
|   `performance_schema_max_metadata_locks`   |   はい   |    | 
|   `performance_schema_max_mutex_classes`   |   はい   |    | 
|   `performance_schema_max_mutex_instances`   |   はい   |    | 
|   `performance_schema_max_prepared_statements_instances`   |   はい   |    | 
|   `performance_schema_max_program_instances`   |   はい   |    | 
|   `performance_schema_max_rwlock_classes`   |   はい   |    | 
|   `performance_schema_max_rwlock_instances`   |   はい   |    | 
|   `performance_schema_max_socket_classes`   |   はい   |    | 
|   `performance_schema_max_socket_instances`   |   はい   |    | 
|   `performance_schema_max_sql_text_length`   |   はい   |    | 
|   `performance_schema_max_stage_classes`   |   はい   |    | 
|   `performance_schema_max_statement_classes`   |   はい   |    | 
|   `performance_schema_max_statement_stack`   |   はい   |    | 
|   `performance_schema_max_table_handles`   |   はい   |    | 
|   `performance_schema_max_table_instances`   |   はい   |    | 
|   `performance_schema_max_table_lock_stat`   |   はい   |    | 
|   `performance_schema_max_thread_classes`   |   はい   |    | 
|   `performance_schema_max_thread_instances`   |   はい   |    | 
|   `performance_schema_session_connect_attrs_size`   |   はい   |    | 
|   `performance_schema_setup_actors_size`   |   はい   |    | 
|   `performance_schema_setup_objects_size`   |   はい   |    | 
|  `performance_schema_show_processlist`  |  あり  | このパラメータは、使用する SHOW PROCESSLIST 実装を決定します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Reference.ParameterGroups.html)このパラメータは、Aurora MySQL バージョン 2.12 とバージョン 3 に適用されます。 | 
|   `performance_schema_users_size`   |   あり   |    | 
|   `pid_file`   |   いいえ   |    | 
|   `plugin_dir`   |   なし   |   Aurora MySQL は、直接ファイルシステムにアクセスしないマネージドインスタンスを使用します。  | 
|   `port`   |   なし   |   Aurora MySQL は接続プロパティを管理し、クラスター内のすべての DB インスタンスに対して一貫した設定を適用します。  | 
|   `preload_buffer_size`   |   あり   |  インデックスをプリロードするときに割り当てられるバッファのサイズ。 このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `profiling_history_size`   |   はい   |    | 
|   `query_alloc_block_size`   |   はい   |    | 
|   `query_cache_limit`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `query_cache_min_res_unit`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `query_cache_size`   |   あり   |  デフォルト値は式により表されます。式内で `DBInstanceClassMemory` 値がどのように計算されるかにいては、「[DB パラメータ式の変数](USER_ParamValuesRef.md#USER_FormulaVariables)」を参照してください。  Aurora MySQL バージョン 3 から削除されました。  | 
|  `query_cache_type`  |  あり  |  Aurora MySQL バージョン 3 から削除されました。  | 
|   `query_cache_wlock_invalidate`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `query_prealloc_size`   |   はい   |    | 
|   `range_alloc_block_size`   |   はい   |    | 
|   `read_buffer_size`   |   はい   |    | 
|   `read_only`   |   あり   |  このパラメータがオンにされると、サーバーはレプリカスレッドによって実行される更新以外の更新を許可しません。 Aurora MySQL バージョン 2 の有効な値は以下のとおりです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Reference.ParameterGroups.html) Aurora MySQL バージョン 2 の DB クラスターパラメータグループを使用して、フェイルオーバー時に `read_only` パラメータが新しいライターインスタンスに適用されていることを確認することをお勧めします。  Aurora MySQL はすべてのリーダーで `innodb_read_only` を `1` に設定しているため、リーダーインスタンスは常に読み取り専用です。したがって、`read_only` はリーダーインスタンスでは冗長になります。  Aurora MySQL バージョン 3 からインスタンスレベルで削除されました。  | 
|   `read_rnd_buffer_size`   |   あり   |    | 
|   `relay-log`   |   いいえ   |    | 
|   `relay_log_info_repository`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `relay_log_recovery`  |   なし   |    | 
|  `replica_checkpoint_group`  |   あり   |   Aurora MySQL バージョン 3   | 
|  `replica_checkpoint_period`  |   あり   |  Aurora MySQL バージョン 3   | 
|  `replica_parallel_workers`  |   あり   |  Aurora MySQL バージョン 3   | 
|  `replica_pending_jobs_size_max`  |   あり   |  Aurora MySQL バージョン 3   | 
|  `replica_skip_errors`  |   あり   |  Aurora MySQL バージョン 3   | 
|  `replica_sql_verify_checksum`  |   あり   |  Aurora MySQL バージョン 3   | 
|   `safe-user-create`   |   はい   |    | 
|   `secure_auth`   |   あり   |  Aurora MySQL バージョン 2 では、このパラメータは常にオンになっています。オフにしようとするとエラーが発生します。 Aurora MySQL バージョン 3 から削除されました。  | 
|   `secure_file_priv`   |   なし   |   Aurora MySQL は、直接ファイルシステムにアクセスしないマネージドインスタンスを使用します。  | 
|  `show_create_table_verbosity`  |  あり  |  この変数を有効にすると、[SHOW\$1CREATE\$1TABLE](https://dev.mysql.com/doc/refman/5.7/en/show-create-table.html) は、デフォルトの形式であるかどうかに関係なく、`ROW_FORMAT` を表示します。 このパラメータは、Aurora MySQL バージョン 2.12 とバージョン 3 に適用されます。  | 
|   `skip-slave-start`   |   なし   |    | 
|   `skip_external_locking`   |   いいえ   |    | 
|   `skip_show_database`   |   はい   |    | 
|   `slave_checkpoint_group`   |   あり   |   Aurora MySQL バージョン 2。`replica_checkpoint_group` を Aurora MySQL バージョン 3 で使用する。  | 
|   `slave_checkpoint_period`   |   あり   |   Aurora MySQL バージョン 2。`replica_checkpoint_period` を Aurora MySQL バージョン 3 で使用する。  | 
|   `slave_parallel_workers`   |   あり   |   Aurora MySQL バージョン 2。`replica_parallel_workers` を Aurora MySQL バージョン 3 で使用する。  | 
|   `slave_pending_jobs_size_max`   |   あり   |   Aurora MySQL バージョン 2。`replica_pending_jobs_size_max` を Aurora MySQL バージョン 3 で使用する。  | 
|   `slave_sql_verify_checksum`   |   あり   |   Aurora MySQL バージョン 2。`replica_sql_verify_checksum` を Aurora MySQL バージョン 3 で使用する。  | 
|   `slow_launch_time`   |   はい   |    | 
|   `slow_query_log`   |   はい   |   CloudWatch Logs へのログのアップロードの手順については、[Amazon CloudWatch Logs への Amazon Aurora MySQL ログの発行](AuroraMySQL.Integrating.CloudWatch.md) を参照してください。  | 
|   `slow_query_log_file`   |   なし   |   Aurora MySQL は、直接ファイルシステムにアクセスしないマネージドインスタンスを使用します。  | 
|   `socket`   |   なし   |    | 
|   `sort_buffer_size`   |   はい   |    | 
|   `sql_mode`   |   はい   |    | 
|   `sql_select_limit`   |   はい   |    | 
|   `stored_program_cache`   |   はい   |    | 
|   `sync_binlog`   |   いいえ   |    | 
|   `sync_master_info`   |   はい   |    | 
|   `sync_source_info`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。  | 
|   `sync_relay_log`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `sync_relay_log_info`   |   はい   |    | 
|   `sysdate-is-now`   |   はい   |    | 
|   `table_cache_element_entry_ttl`   |   いいえ   |    | 
|   `table_definition_cache`   |   あり   |  デフォルト値は式により表されます。式内で `DBInstanceClassMemory` 値がどのように計算されるかにいては、「[DB パラメータ式の変数](USER_ParamValuesRef.md#USER_FormulaVariables)」を参照してください。  | 
|   `table_open_cache`   |   あり   |  デフォルト値は式により表されます。式内で `DBInstanceClassMemory` 値がどのように計算されるかにいては、「[DB パラメータ式の変数](USER_ParamValuesRef.md#USER_FormulaVariables)」を参照してください。  | 
|   `table_open_cache_instances`   |   はい   |    | 
|   `temp-pool`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。  | 
|   `temptable_max_mmap`   |   あり   |  このパラメータは、Aurora MySQL バージョン 3 に適用されます。詳細については、「[Aurora MySQL バージョン 3 での新しい一時テーブルの動作](ams3-temptable-behavior.md)」を参照してください。  | 
|  `temptable_max_ram`  |  あり  |  このパラメータは、Aurora MySQL バージョン 3 に適用されます。詳細については、「[Aurora MySQL バージョン 3 での新しい一時テーブルの動作](ams3-temptable-behavior.md)」を参照してください。  | 
|  `temptable_use_mmap`  |  あり  |  このパラメータは、Aurora MySQL バージョン 3 に適用されます。詳細については、「[Aurora MySQL バージョン 3 での新しい一時テーブルの動作](ams3-temptable-behavior.md)」を参照してください。  | 
|  `thread_cache_size`  | あり | キャッシュされるスレッドの数。このパラメータは、Aurora MySQL バージョン 2 および 3 に適用されます。 | 
|  `thread_handling`  |  なし  |    | 
|   `thread_stack`   |  はい  |    | 
|   `timed_mutexes`   |  はい  |    | 
|  `tmp_table_size`  |  あり  |  Aurora MySQL バージョン 3 の `MEMORY` ストレージエンジンによって作成される内部メモリ内一時テーブルの最大サイズを定義します。 Aurora MySQL バージョン 3.04 以降で、`aurora_tmptable_enable_per_table_limit` が `ON` のときに `TempTable` ストレージエンジンによって作成される内部メモリ内一時テーブルの最大サイズを定義します。 詳細については、「[内部メモリ内一時テーブルのサイズを制限する](ams3-temptable-behavior.md#ams3-temptable-behavior-limit)」を参照してください。  | 
|   `tmpdir`   |  なし  |   Aurora MySQL は、直接ファイルシステムにアクセスしないマネージドインスタンスを使用します。  | 
|   `transaction_alloc_block_size`   |   はい   |    | 
|   `transaction_isolation`   |   あり   |   このパラメータは、Aurora MySQL バージョン 3 に適用されます。`tx_isolation` はこれに置き換えられます。  | 
|   `transaction_prealloc_size`   |   はい   |    | 
|   `tx_isolation`   |   あり   |   Aurora MySQL バージョン 3 から削除されました。これは `transaction_isolation` に置き換えられます。  | 
|   `updatable_views_with_limit`   |   あり   |    | 
|   `validate-password`   |   いいえ   |    | 
|   `validate_password_dictionary_file`   |   いいえ   |    | 
|   `validate_password_length`   |   いいえ   |    | 
|   `validate_password_mixed_case_count`   |   いいえ   |    | 
|   `validate_password_number_count`   |   いいえ   |    | 
|   `validate_password_policy`   |   いいえ   |    | 
|   `validate_password_special_char_count`   |   いいえ   |    | 
|   `wait_timeout`   |   あり   |  Aurora は `interactive_timeout` と `wait_timeout` の最小値を評価します。次に、その最小値をタイムアウトとして使い、対話型と非対話型の両方のアイドル状態のセッションをすべて終了します。  | 

## Aurora MySQL に適用されない MySQL パラメータ
<a name="AuroraMySQL.Reference.Parameters.Inapplicable"></a>

 Aurora MySQL と MySQL ではアーキテクチャに違いがあるため、一部の MySQL パラメータは Aurora MySQL に適用されません。

次の MySQL パラメータは Aurora MySQL には適用されません。これはすべてを網羅したリストではありません。
+ `activate_all_roles_on_login` – このパラメータは、Aurora MySQL バージョン 2 には適用されません。Aurora MySQL バージョン 3 で利用可能です。
+ `big_tables`
+ `bind_address`
+ `character_sets_dir`
+ `innodb_adaptive_flushing`
+ `innodb_adaptive_flushing_lwm`
+ `innodb_buffer_pool_chunk_size`
+ `innodb_buffer_pool_instances`
+ `innodb_change_buffering`
+ `innodb_checksum_algorithm`
+ `innodb_data_file_path`
+ `innodb_dedicated_server`
+ `innodb_doublewrite`
+ `innodb_flush_log_at_timeout` – このパラメータは Aurora MySQL には適用されません。詳細については、「[ログバッファをフラッシュする頻度の設定](AuroraMySQL.BestPractices.FeatureRecommendations.md#AuroraMySQL.BestPractices.Flush)」を参照してください。
+ `innodb_flush_method`
+ `innodb_flush_neighbors`
+ `innodb_io_capacity`
+ `innodb_io_capacity_max`
+ `innodb_log_buffer_size`
+ `innodb_log_file_size`
+ `innodb_log_files_in_group`
+ `innodb_log_spin_cpu_abs_lwm`
+ `innodb_log_spin_cpu_pct_hwm`
+ `innodb_log_writer_threads`
+ `innodb_max_dirty_pages_pct`
+ `innodb_numa_interleave`
+ `innodb_page_size`
+ `innodb_redo_log_capacity`
+ `innodb_redo_log_encrypt`
+ `innodb_undo_log_encrypt`
+ `innodb_undo_log_truncate`
+ `innodb_undo_logs`
+ `innodb_undo_tablespaces`
+ `innodb_use_native_aio`
+ `innodb_write_io_threads`

# Aurora MySQL グローバルステータス変数
<a name="AuroraMySQL.Reference.GlobalStatusVars"></a>

 Aurora MySQL には、コミュニティ MySQL のステータス変数と、Aurora に固有の変数が含まれます。これらの変数を調べて、データベースエンジン内で何が起こっているかを知ることができます。コミュニティ MySQL のステータス変数の詳細については、コミュニティ MySQL 8.0 ドキュメントの「[Server Status Variables](https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html)」を参照してください。

Aurora MySQL グローバルステータス変数の現在の値は、次のようなステートメントを使用して確認できます。

```
show global status like '%aurora%';
```

**注記**  
グローバルステータス変数は、DB エンジンの再起動時にクリアされます。

次の表では、Aurora MySQL が使用するグローバルステータス変数について説明します。


| 名前 | 説明 | 
| --- | --- | 
|  `AuroraDb_commits`  |  前回の再起動以降のコミットの総数。  | 
|  `AuroraDb_commit_latency`  |  前回の再起動以降のコミットレイテンシーの合計。  | 
|  `AuroraDb_ddl_stmt_duration`  |  前回の再起動以降の DDL レイテンシーの合計。  | 
|  `AuroraDb_select_stmt_duration`  |  前回の再起動以降の `SELECT` ステートメントレイテンシーの合計。  | 
|  `AuroraDb_insert_stmt_duration`  |  前回の再起動以降の `INSERT` ステートメントレイテンシーの合計。  | 
|  `AuroraDb_update_stmt_duration`  |  前回の再起動以降の `UPDATE` ステートメントレイテンシーの合計。  | 
|  `AuroraDb_delete_stmt_duration`  |  前回の再起動以降の `DELETE` ステートメントレイテンシーの合計。  | 
|  `Aurora_binlog_io_cache_allocated`  | バイナリログ I/O キャッシュに割り当てられたバイト数。 | 
|  `Aurora_binlog_io_cache_read_requests`  |  バイナリログ I/O キャッシュに対して行われた読み取りリクエスト数。  | 
|  `Aurora_binlog_io_cache_reads`  |  バイナリログ I/O キャッシュから処理された読み込みリクエスト数。  | 
|  `Aurora_enhanced_binlog`  |  この DB インスタンスの拡張バイナリログが有効か無効かを示します。詳細については、「[Aurora MySQL の拡張バイナリログの設定](AuroraMySQL.Enhanced.binlog.md)」を参照してください。  | 
|  `Aurora_external_connection_count`  |  DB インスタンスへのデータベース接続の数。ただし、データベースヘルスチェックに使用される RDS サービス接続は除きます。  | 
|  `Aurora_fast_insert_cache_hits`  |  キャッシュされたカーソルが正常に取得され検証されたときに増加するカウンター。高速挿入キャッシュの詳細については、「[Amazon Aurora MySQL パフォーマンスの拡張](Aurora.AuroraMySQL.Overview.md#Aurora.AuroraMySQL.Performance)」を参照してください。  | 
|  `Aurora_fast_insert_cache_misses`  |  キャッシュされたカーソルが有効でなくなり、Aurora が通常のインデックストラバーサルを実行したときに増加するカウンター。高速挿入キャッシュの詳細については、「[Amazon Aurora MySQL パフォーマンスの拡張](Aurora.AuroraMySQL.Overview.md#Aurora.AuroraMySQL.Performance)」を参照してください。  | 
|  `Aurora_fts_cache_memory_used`  |  InnoDB 全文検索システムが使用しているメモリの量 (バイト数)。この変数は、Aurora MySQL バージョン 3.07 以上に適用されます。  | 
|  `Aurora_fwd_master_dml_stmt_count`  |  このライター DB インスタンスに転送された DML ステートメントの合計数。この変数は、Aurora MySQL バージョン 2 に適用されます。  | 
|  `Aurora_fwd_master_dml_stmt_duration`  |  このライター DB インスタンスに転送された DML ステートメントの合計期間。この変数は、Aurora MySQL バージョン 2 に適用されます。  | 
|  `Aurora_fwd_master_errors_rpc_timeout`  |  転送された接続がライター上で確立されなかった回数。  | 
|  `Aurora_fwd_master_errors_session_limit`  |  ライターで `session full` の理由で拒否された転送されたクエリの数。  | 
|  `Aurora_fwd_master_errors_session_timeout`  |  ライターでのタイムアウトにより転送セッションが終了した回数。  | 
|  `Aurora_fwd_master_open_sessions`  |  ライター DB インスタンスで転送されたセッションの数。この変数は、Aurora MySQL バージョン 2 に適用されます。  | 
|  `Aurora_fwd_master_select_stmt_count`  |  このライター DB インスタンスに転送された `SELECT` ステートメントの総数。この変数は、Aurora MySQL バージョン 2 に適用されます。  | 
|  `Aurora_fwd_master_select_stmt_duration`  |  このライター DB インスタンスに転送された `SELECT` ステートメントの合計期間。この変数は、Aurora MySQL バージョン 2 に適用されます。  | 
|  `Aurora_fwd_writer_dml_stmt_count`  |  このライター DB インスタンスに転送された DML ステートメントの合計数。この変数は、Aurora MySQL バージョン 3 に適用されます。  | 
|  `Aurora_fwd_writer_dml_stmt_duration`  |  このライター DB インスタンスに転送された DML ステートメントの合計期間。この変数は、Aurora MySQL バージョン 3 に適用されます。  | 
|  `Aurora_fwd_writer_errors_rpc_timeout`  |  転送された接続がライター上で確立されなかった回数。  | 
|  `Aurora_fwd_writer_errors_session_limit`  |  ライターで `session full` の理由で拒否された転送されたクエリの数。  | 
|  `Aurora_fwd_writer_errors_session_timeout`  |  ライターでのタイムアウトにより転送セッションが終了した回数。  | 
|  `Aurora_fwd_writer_open_sessions`  |  ライター DB インスタンスで転送されたセッションの数。この変数は、Aurora MySQL バージョン 3 に適用されます。  | 
|  `Aurora_fwd_writer_select_stmt_count`  |  このライター DB インスタンスに転送された `SELECT` ステートメントの総数。この変数は、Aurora MySQL バージョン 3 に適用されます。  | 
|  `Aurora_fwd_writer_select_stmt_duration`  |  このライター DB インスタンスに転送された `SELECT` ステートメントの合計期間。この変数は、Aurora MySQL バージョン 3 に適用されます。  | 
|  `Aurora_lockmgr_buffer_pool_memory_used`  |  Aurora MySQL ロックマネージャーが使用しているバッファプールメモリの量 (バイト単位)。  | 
|  `Aurora_lockmgr_memory_used`  |  Aurora MySQL ロックマネージャーが使用しているメモリの量 (バイト単位)。  | 
|  `Aurora_ml_actual_request_cnt`  |  DB インスタンスのユーザーによって実行されたすべてのクエリで、Aurora MySQL が Aurora 機械学習サービスに対して行ったリクエストの集計カウント。詳細については、「[Aurora MySQL で Amazon Aurora 機械学習を使用する](mysql-ml.md)」を参照してください。  | 
|  `Aurora_ml_actual_response_cnt`  |  DB インスタンスのユーザーが実行するすべてのクエリで、Aurora MySQL が Aurora 機械学習サービスから受け取るレスポンスの集計カウント。詳細については、「[Aurora MySQL で Amazon Aurora 機械学習を使用する](mysql-ml.md)」を参照してください。  | 
|  `Aurora_ml_cache_hit_cnt`  |  DB インスタンスのユーザーが実行したすべてのクエリで、Aurora MySQL が Aurora 機械学習サービスから受け取る内部キャッシュヒットの集計カウント。詳細については、「[Aurora MySQL で Amazon Aurora 機械学習を使用する](mysql-ml.md)」を参照してください。  | 
|  `Aurora_ml_logical_request_cnt`  |  前回のステータスリセット以降、DB インスタンスが Aurora 機械学習サービスに送信されると評価した論理リクエストの数。バッチ処理が使用されているかどうかによっては、この値が `Aurora_ml_actual_request_cnt` より高くなることがあります。詳細については、「[Aurora MySQL で Amazon Aurora 機械学習を使用する](mysql-ml.md)」を参照してください。  | 
|  `Aurora_ml_logical_response_cnt`  |  DB インスタンスのユーザーが実行するすべてのクエリで、Aurora MySQL が Aurora 機械学習サービスから受け取るレスポンスの集計カウント。詳細については、「[Aurora MySQL で Amazon Aurora 機械学習を使用する](mysql-ml.md)」を参照してください。  | 
|  `Aurora_ml_retry_request_cnt`  |  前回のステータスリセット以降、DB インスタンスが Aurora 機械学習サービスに送信されると評価した再試行リクエストの数。詳細については、「[Aurora MySQL で Amazon Aurora 機械学習を使用する](mysql-ml.md)」を参照してください。  | 
|  `Aurora_ml_single_request_cnt`  |  DB インスタンスのユーザーが実行するすべてのクエリで、非バッチモードで評価される Aurora 機械学習の関数の集計カウント。詳細については、「[Aurora MySQL で Amazon Aurora 機械学習を使用する](mysql-ml.md)」を参照してください。  | 
|  `aurora_oom_avoidance_recovery_state`  |  Aurora のメモリ不足 (OOM) 回避リカバリが、この DB インスタンスの `ACTIVE` または `INACTIVE` 状態であるかどうかを示します。 この変数は、Aurora MySQL バージョン 3.06.0 以上に適用されます。  | 
|  `aurora_oom_reserved_mem_enter_kb`  |  Aurora の OOM 処理メカニズムで `RESERVED` 状態に入るためのしきい値を表します。 サーバーで使用可能なメモリがこのしきい値を下回ると、`aurora_oom_status` は `RESERVED` に変わり、サーバーがクリティカルレベルのメモリ使用量に近づいていることを示します。 この変数は、Aurora MySQL バージョン 3.06.0 以上に適用されます。  | 
|  `aurora_oom_reserved_mem_exit_kb`  |  Aurora の OOM 処理メカニズムで `RESERVED` 状態を出るためのしきい値を表します。 サーバーで使用可能なメモリがこのしきい値を超えて増加すると、`aurora_oom_status` は `NORMAL` に戻り、サーバーが十分なメモリリソースを持つ、より安定した状態に戻ったことを示します。 この変数は、Aurora MySQL バージョン 3.06.0 以上に適用されます。  | 
|  `aurora_oom_status`  |  この DB インスタンスの現在の OOM ステータスを表します。値が `NORMAL` のときには、十分なメモリリソースがあることを示します。 値が `RESERVED` に変わった場合は、サーバーで使用可能なメモリが少ないことを示します。アクションは `aurora_oom_response` パラメータ設定に基づいて実行されます。 詳細については、「[Aurora MySQL データベースのメモリ不足の問題のトラブルシューティング](AuroraMySQLOOM.md)」を参照してください。 この変数は、Aurora MySQL バージョン 3.06.0 以上に適用されます。  | 
|  `Aurora_pq_bytes_returned`  |  パラレルクエリ中にヘッドノードに送信されたタプルデータ構造のバイト数。`Aurora_pq_pages_pushed_down` と比較するために 16,384 で割ります。  | 
|  `Aurora_pq_max_concurrent_requests`  |  この Aurora DB インスタンスで同時に実行できるパラレルクエリセッションの最大数。これは、AWS の DB インスタンスクラスによって異なる固定の数です。  | 
|  `Aurora_pq_pages_pushed_down`  |  パラレルクエリがヘッドノードへのネットワーク送信を回避したデータページ数 (それぞれ 16 KiB の固定サイズ)。  | 
|  `Aurora_pq_request_attempted`  |  リクエストされたパラレルクエリセッションの数。この値は、サブクエリや結合などの SQL 構成に応じて、クエリごとに複数のセッションを表す場合があります。  | 
|  `Aurora_pq_request_executed`  |  パラレルクエリセッションの数は正常に実行されます。  | 
|  `Aurora_pq_request_failed`  |  クライアントにエラーを戻したパラレルクエリセッションの数。場合によっては、例えば、ストレージレイヤーの問題のために、パラレルクエリのリクエストが失敗することがあります。このような場合、失敗したクエリ部分は、非パラレルクエリメカニズムを使用して再試行されます。再試行されたクエリも失敗すると、エラーがクライアントに返され、このカウンターが増分されます。  | 
|  `Aurora_pq_request_in_progress`  |  現在進行中のパラレルクエリセッションの数。この数は、Aurora DB クラスター全体ではなく、接続している特定の Aurora DB インスタンスのものが適用されます。DB インスタンスが同時実行の制限に近いかどうかを調べるには、この値を `Aurora_pq_max_concurrent_requests` と比較します。  | 
|  `Aurora_pq_request_not_chosen`  |  クエリを満たすためにパラレルクエリが選択されなかった回数。この値は、他のいくつかのより細かいカウンターの合計です。`EXPLAIN` ステートメントでは、クエリが実際に実行されていない場合でもこのカウンターは増加します。  | 
|  `Aurora_pq_request_not_chosen_below_min_rows`  |  テーブル内の行数のためにパラレルクエリが選択されなかった回数。`EXPLAIN` ステートメントでは、クエリが実際に実行されていない場合でもこのカウンターは増加します。  | 
|  `Aurora_pq_request_not_chosen_column_bit`  |  射影された列の中にサポートされていないデータ型があるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_column_geometry`  |  テーブルに `GEOMETRY` データ型の列があるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。この制限を解除する Aurora MySQL のバージョンについては、[Aurora MySQL バージョン 3 への パラレルクエリクラスターのアップグレード](aurora-mysql-parallel-query-optimizing.md#aurora-mysql-parallel-query-upgrade-pqv2) を参照してください。  | 
|  `Aurora_pq_request_not_chosen_column_lob`  |  `LOB` データタイプ、または宣言された長さのため外部に保存された `VARCHAR` カラムをテーブルが持っていることが原因で、非パラレルクエリの処理パスを使用したパラレルクエリのリクエスト数。この制限を解除する Aurora MySQL のバージョンについては、[Aurora MySQL バージョン 3 への パラレルクエリクラスターのアップグレード](aurora-mysql-parallel-query-optimizing.md#aurora-mysql-parallel-query-upgrade-pqv2) を参照してください。  | 
|  `Aurora_pq_request_not_chosen_column_virtual`  |  テーブルに仮想列があるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_custom_charset`  |  テーブルにカスタム文字セットの列があるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_fast_ddl`  |  テーブルが高速 DDL の `ALTER` ステートメントによって変更中であるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_few_pages_outside_buffer_pool`  |  パラレルクエリを価値のあるものにするためのバッファされていないテーブルデータが十分ないため、テーブルデータの 95 パーセント未満がバッファプールにあったにもかかわらず、パラレルクエリの回数は選択されませんでした。  | 
|  `Aurora_pq_request_not_chosen_full_text_index`  |  テーブルに全文インデックスがあるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_high_buffer_pool_pct`  |  テーブルデータの高パーセンテージ (現在は 95 パーセント以上) が既にバッファプールに入っていたため、パラレルクエリが選択されなかった回数。このような場合、オプティマイザは、バッファプールからのデータの読取りがより効率的であると判断します。`EXPLAIN` ステートメントでは、クエリが実際に実行されていない場合でもこのカウンターは増加します。  | 
|  `Aurora_pq_request_not_chosen_index_hint`  |  クエリにインデックスヒントが含まれているために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_innodb_table_format`  |  テーブルが、サポートされていない InnoDB の行形式を使用しているために、パラレルクエリ以外の処理方法が適用されるパラレルクエリのリクエスト数。Aurora のパラレルクエリは、`COMPACT`、`REDUNDANT`,および `DYNAMIC` の行形式にのみ適用されます。  | 
|  `Aurora_pq_request_not_chosen_long_trx`  |  長時間実行トランザクション内でクエリがスタートされているために、非パラレルクエリ処理パスを使用したパラレルクエリリクエストの数。`EXPLAIN` ステートメントでは、クエリが実際に実行されていない場合でもこのカウンターは増加します。  | 
|  `Aurora_pq_request_not_chosen_no_where_clause`  |  クエリに `WHERE` 句がないために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_range_scan`  |  インデックスの範囲スキャンを使用しているために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_row_length_too_long`  |  すべての列の合計長が長すぎるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_small_table`  |  行数および平均行長によって決定される、テーブルの全体的なサイズのためにパラレルクエリが選択されなかった回数。`EXPLAIN` ステートメントでは、クエリが実際に実行されていない場合でもこのカウンターは増加します。  | 
|  `Aurora_pq_request_not_chosen_temporary_table`  |  クエリでサポートされていない `MyISAM` また `memory` テーブルタイプを使用しているテンポラリテーブルを参照しているために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_tx_isolation`  |  クエリでサポートされていないトランザクション分離レベルを使用しているために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。リーダー DB インスタンスでは、パラレルクエリは `REPEATABLE READ` および `READ COMMITTED` 分離レベルにのみ適用されます。  | 
|  `Aurora_pq_request_not_chosen_update_delete_stmts`  |  クエリが `UPDATE` または `DELETE` ステートメントの一部であるために、パラレルクエリ以外の処理方法が使用されるパラレルクエリのリクエスト数。  | 
|  `Aurora_pq_request_not_chosen_unsupported_access`  |  `WHERE` 句がパラレルクエリの基準を満たしていないために、非パラレルクエリ処理パスを使用するパラレルクエリリクエストの数。この結果は、クエリがデータ集約型スキャンを必要としない場合、またはクエリが `DELETE` または `UPDATE` ステートメントである場合に発生します。  | 
|  `Aurora_pq_request_not_chosen_unsupported_storage_type`  |  Aurora MySQL DB クラスターがサポートされている Aurora クラスターストレージ設定を使用していないために非並列クエリ処理パスを使用する並列クエリリクエストの数。詳細については、「[制限](aurora-mysql-parallel-query.md#aurora-mysql-parallel-query-limitations)」を参照してください。 このパラメータは、Aurora MySQL バージョン 3.04 以降に適用されます。  | 
|  `Aurora_pq_request_throttled`  |  特定の Aurora DB インスタンスで既に実行されている同時パラレルクエリの最大数のために、パラレルクエリが選択されなかった回数。  | 
|  `Aurora_repl_bytes_received`  |  前回再起動してから Aurora MySQL リーダーデータベースインスタンスに複製されたバイト数。詳細については、「[Amazon Aurora MySQL でのレプリケーション](AuroraMySQL.Replication.md)」を参照してください。  | 
|  `Aurora_reserved_mem_exceeded_incidents`  |  前回の再起動以降、エンジンが予約メモリの制限を超えた回数。`aurora_oom_response` が設定されている場合、このしきい値は、メモリ不足 (OOM) 回避アクティビティがトリガーされるタイミングを定義します。Aurora MySQL OOM レスポンスの詳細については、「[Aurora MySQL データベースのメモリ不足の問題のトラブルシューティング](AuroraMySQLOOM.md)」を参照してください。  | 
|  `aurora_temptable_max_ram_allocation`  |  前回の再起動以降に、内部一時テーブルが任意の時点で使用した最大メモリ容量をバイト単位で表します。  | 
|  `aurora_temptable_ram_allocation`  |  内部一時テーブルが使用している現在のメモリ容量をバイト単位で表します。  | 
|  `Aurora_in_memory_relaylog_status`  |  インメモリリレーログ機能の現在のステータス。値は ENABLED または DISABLED となります。  | 
|  `Aurora_in_memory_relaylog_disabled_reason`  |  インメモリリレーログ機能が現在のステータスである理由を表示します。この機能が無効になっている場合は、機能が無効になっている理由を説明するメッセージを表示します。  | 
|  `Aurora_in_memory_relaylog_fallback_count`  |  インメモリリレーログ機能から永続リレーログモード (レガシー) へのフォールバックの合計数を表示します。フォールバックは、単一のイベントがキャッシュサイズ (現在は 128 MB) を超えるか、トランザクションの再試行数がレプリカトランザクションの再試行数の上限 (replica\$1transaction\$1retries) を超えた場合に発生する可能性があります。  | 
|  `Aurora_in_memory_relaylog_recovery_count`  |  インメモリリレーログの復旧が自動的に実行された合計数を表示します。この数には、フォールバックの合計数と、一時的なフォールバック後にインメモリリレーログモードに自動的に切り替えられた回数が含まれます。  | 
|  `Aurora_thread_pool_thread_count`  |  Aurora スレッドプール内の現在のスレッド数。Aurora MySQL OOM レスポンスの詳細については、「[スレッドプール](AuroraMySQL.Managing.Tuning.concepts.md#AuroraMySQL.Managing.Tuning.concepts.processes.pool)」を参照してください。  | 
|  `Aurora_tmz_version`  |  DB クラスターで使用されているタイムゾーン情報の現在のバージョンを示します。値は IANA (Internet Assigned Numbers Authority) 形式 `YYYYsuffix` に従います。例えば、`2022a` および `2023c` です。 このパラメータは、Aurora MySQL バージョン 2.12 以降とバージョン 3.04 以降に適用されます。  | 
|  `Aurora_zdr_oom_threshold`  |  Aurora DB インスタンスがゼロダウンタイム再起動 (ZDR) を開始して、潜在的なメモリ関連の問題から回復するためのメモリしきい値をキロバイト (KB) 単位で表します。  | 
|  `server_aurora_das_running`  |  この DB インスタンスでデータベースアクティビティストリーム (DAS) が有効か無効かを示します。詳細については、「[データベースアクティビティストリームを使用した Amazon Aurora のモニタリング](DBActivityStreams.md)」を参照してください。  | 

## Aurora MySQL に適応されない MySQL ステータス可変
<a name="AuroraMySQL.Reference.StatusVars.Inapplicable"></a><a name="status_vars"></a>

 Aurora MySQL と MySQL ではアーキテクチャに違いがあるため、一部の MySQL パラメータのステータス可変は Aurora MySQL に適用されません。

 以下の MySQL ステータス可変は Aurora MySQL には適用されません。これはすべてを網羅したリストではありません。
+  `innodb_buffer_pool_bytes_dirty` 
+  `innodb_buffer_pool_pages_dirty` 
+  `innodb_buffer_pool_pages_flushed` 

Aurora MySQL バージョン 3 は、Aurora MySQL バージョン 2 にあった次のステータス可変を削除します。
+  `AuroraDb_lockmgr_bitmaps0_in_use` 
+  `AuroraDb_lockmgr_bitmaps1_in_use` 
+  `AuroraDb_lockmgr_bitmaps_mem_used` 
+  `AuroraDb_thread_deadlocks` 
+  `available_alter_table_log_entries` 
+  `Aurora_lockmgr_memory_used` 
+  `Aurora_missing_history_on_replica_incidents` 
+  `Aurora_new_lock_manager_lock_release_cnt` 
+  `Aurora_new_lock_manager_lock_release_total_duration_micro` 
+  `Aurora_new_lock_manager_lock_timeout_cnt` 
+  `Aurora_total_op_memory` 
+  `Aurora_total_op_temp_space` 
+  `Aurora_used_alter_table_log_entries` 
+  `Aurora_using_new_lock_manager` 
+  `Aurora_volume_bytes_allocated` 
+  `Aurora_volume_bytes_left_extent` 
+  `Aurora_volume_bytes_left_total` 
+  `Com_alter_db_upgrade` 
+  `Compression` 
+  `External_threads_connected` 
+  `Innodb_available_undo_logs` 
+  `Last_query_cost` 
+  `Last_query_partial_plans` 
+  `Slave_heartbeat_period` 
+  `Slave_last_heartbeat` 
+  `Slave_received_heartbeats` 
+  `Slave_retried_transactions` 
+  `Slave_running` 
+  `Time_since_zero_connections` 

これらの MySQL ステータス変数は、Aurora MySQL バージョン 2 で使用できますが、Aurora MySQL バージョン 3 では使用できません。
+  `Innodb_redo_log_enabled` 
+  `Innodb_undo_tablespaces_total` 
+  `Innodb_undo_tablespaces_implicit` 
+  `Innodb_undo_tablespaces_explicit` 
+  `Innodb_undo_tablespaces_active` 

# Aurora MySQL の待機イベント
<a name="AuroraMySQL.Reference.Waitevents"></a>

以下は、Aurora MySQL の代表的な待機イベントです。

**注記**  
待機イベントを使用して Aurora MySQL のパフォーマンスを調整する方法については、「[待機イベントを使用した Aurora MySQL のチューニング](AuroraMySQL.Managing.Tuning.wait-events.md)」を参照してください。  
MySQL の待機イベントで使用される命名規則については、MySQL ドキュメントの「[Performance Schema インストゥルメント命名規則](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-instrument-naming.html)」を参照してください。

**cpu**  
実行可能なアクティブな接続の数が vCPUs 数よりも一貫して多くなります。詳細については、「[cpu](ams-waits.cpu.md)」を参照してください。

**io/aurora\$1redo\$1log\$1flush**  
セッションは Aurora ストレージにデータを保持しています。通常、この待機イベントは Aurora MySQL の書き込み I/O オペレーション用です。詳細については、「[io/aurora\$1redo\$1log\$1flush](ams-waits.io-auredologflush.md)」を参照してください。

**io/aurora\$1respond\$1to\$1client**  
Aurora MySQL バージョン 2.10.2 以降の 2.10 バージョン、2.09.3 以降の 2.09 バージョン、2.07.7 以降の 2.07 バージョンの場合、クエリ処理が完了すると、結果がアプリケーションクライアントに返されます。DB インスタンスクラスのネットワーク帯域幅と、返される結果セットのサイズを比較します。また、クライアント側の応答時間もチェックしてください。クライアントが応答せず、TCP パケットを処理できない場合、パケットドロップと TCP 再送信が発生する可能性があります。この状況は、ネットワーク帯域幅に悪影響を及ぼします。2.10.2、2.09.3、2.09.3、および 2.07.7 より前のバージョンでは、待機イベントにアイドル時間が誤って含まれます。この待機が目立つときにデータベースをチューニングする方法については、[io/aurora\$1respond\$1to\$1client](ams-waits.respond-to-client.md) を参照してください。

**io/file/csv/data**  
スレッドは Comma Separated Value (CSV) 形式でテーブルに書き込みます。CSV テーブルの使用状況を確認してください。通常、このイベントはテーブルでの `log_output` の設定に伴って発生します。

**io/file/sql/binlog**  
スレッドは、ディスクに書き込まれるバイナリログ (binlog) ファイルを待っています。

**io/redo\$1log\$1flush**  
セッションは Aurora ストレージにデータを保持しています。通常、この待機イベントは Aurora MySQL の書き込み I/O オペレーション用です。詳細については、「[io/redo\$1log\$1flush](ams-waits.io-redologflush.md)」を参照してください。

**io/socket/sql/client\$1connection**  
`mysqld` プログラムは受信する新規クライアント接続を処理するためのスレッド作成でビジー状態です。詳細については、「[io/socket/sql/client\$1connection](ams-waits.client-connection.md)」を参照してください。

**io/table/sql/handler**  
エンジンは、テーブルへのアクセスを待っています。このイベントは、データがバッファプールにキャッシュされているか、ディスク上でアクセスされているかにかかわらず、発生します。詳細については、「[io/table/sql/handler](ams-waits.waitio.md)」を参照してください。

**lock/table/sql/handler**  
この待機イベントは、テーブルロック待機イベントハンドラです。Performance Schema の原始的イベントと分子的イベントの詳細については、MySQL ドキュメントの [Performance Schema の原子的および分子的イベント](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-atom-molecule-events.html)を参照してください。

**synch/cond/innodb/row\$1lock\$1wait**  
複数のデータ操作言語 (DML) ステートメントが同じデータベース行に同時にアクセスしようとしています。詳細については、「[synch/cond/innodb/row\$1lock\$1wait](ams-waits.row-lock-wait.md)」を参照してください。

**synch/cond/innodb/row\$1lock\$1wait\$1cond**  
複数の DML ステートメントが同じデータベース行に同時にアクセスしようとしています。詳細については、「[synch/cond/innodb/row\$1lock\$1wait\$1cond](ams-waits.row-lock-wait-cond.md)」を参照してください。

**synch/cond/sql/MDL\$1context::COND\$1wait\$1status**  
スレッドは、テーブルのメタデータロックを待っています。エンジンは、このタイプのロックを使用して、データベーススキーマへの同時アクセスを管理し、データの整合性を確保します。詳細については、MySQL ドキュメントの「[ロック操作の最適化](https://dev.mysql.com/doc/refman/8.0/en/locking-issues.html)」を参照してください。この待機が目立つときにデータベースをチューニングする方法については、[synch/cond/sql/MDL\$1context::COND\$1wait\$1status](ams-waits.cond-wait-status.md) を参照してください。

**synch/cond/sql/MYSQL\$1BIN\$1LOG::COND\$1done**  
バイナリログを有効にしている。高いコミットスループット、多数のトランザクションがコミットされている、またはバイナリログを読み取るレプリカがある可能性があります。複数行ステートメントを使用するか、ステートメントを 1 つのトランザクションにバンドルすることを検討してください。Aurora では、バイナリログレプリケーションや `aurora_binlog_*` パラメータの代わりにグローバルデータベースを使用します。

**synch/mutex/innodb/aurora\$1lock\$1thread\$1slot\$1futex**  
複数の DML ステートメントが同じデータベース行に同時にアクセスしようとしています。詳細については、「[synch/mutex/innodb/aurora\$1lock\$1thread\$1slot\$1futex](ams-waits.waitsynch.md)」を参照してください。

**synch/mutex/innodb/buf\$1pool\$1mutex**  
バッファプールが、ワーキング データ セットを保持するのに十分な大きさではありません。または、ワークロードが特定のテーブルからページにアクセスし、バッファプール内で競合が発生します。詳細については、「[synch/mutex/innodb/buf\$1pool\$1mutex](ams-waits.bufpoolmutex.md)」を参照してください。

**synch/mutex/innodb/fil\$1system\$1mutex**  
プロセスは、テーブルスペースのメモリキャッシュへのアクセスを待っています。詳細については、「[synch/mutex/innodb/fil\$1system\$1mutex](ams-waits.innodb-fil-system-mutex.md)」を参照してください。

**synch/mutex/innodb/trx\$1sys\$1mutex**  
オペレーションは、一貫した、または制御された方法で InnoDB 内のトランザクション ID をチェック、更新、削除、または追加しています。これらの操作は `trx_sys` mutex 呼び出しを必要とします。これはパフォーマンススキーマインストルメンテーションによって追跡されます。操作には、データベースの起動時またはシャットダウン時のトランザクションシステムの管理、ロールバック、クリーンアップの取り消し、行の読み取りアクセス、およびバッファプールのロードが含まれます。トランザクション数が多い高データベース ロードは、この待機イベントの頻繁な発生につながります。詳細については、「[synch/mutex/innodb/trx\$1sys\$1mutex](ams-waits.trxsysmutex.md)」を参照してください。

**synch/mutex/mysys/key\$1cache:: cache\$1lock**  <a name="key-cache.cache-lock"></a>
`keycache->cache_lock` mutex は MyISAM テーブルのキーキャッシュへのアクセスを制御します。Aurora MySQL では MyISAM テーブルを使用して永続データを保存することはできませんが、内部一時テーブルの保存に使用されます。状況によっては、一時テーブルがメモリに収まらなくなるとディスクに書き込まれることがあるため、`created_tmp_tables` または `created_tmp_disk_tables` ステータスカウンターを確認することを検討してください。

**synch/mutex/sql/file\$1as\$1table:: LOCK\$1offsets**  
エンジンは、テーブルメタデータファイルを開いたり作成したりするときに、このミューテックスを取得します。この待機イベントが過剰な頻度で発生すると、作成またはオープンされているテーブルの数が急増しています。

**synch/mutex/sql/FILE\$1AS\$1TABLE::LOCK\$1shim\$1lists**  
エンジンは、`reset_size`、`detach_contents`、または `add_contents` のようなオペレーションを、オープンテーブルを追跡する内部構造上で実行しながら、このミューテックスを取得します。ミューテックスは、リストの内容へのアクセスを同期します。この待機イベントが高頻度で発生すると、以前にアクセスされたテーブルのセットが突然変化したことを示します。エンジンは、新しいテーブルにアクセスするか、以前にアクセスしたテーブルに関連するコンテキストを解放する必要があります。

**synch/mutex/sql/LOCK\$1open**  
セッションが開いているテーブルの数が、テーブル定義キャッシュまたはテーブルオープンキャッシュのサイズを超えています。これらのキャッシュのサイズを増やします。詳細については、「[MySQL でのテーブルのオープンとクローズの方法](https://dev.mysql.com/doc/refman/8.0/en/table-cache.html)」を参照してください。

**synch/mutex/sql/LOCK\$1table\$1cache**  
セッションが開いているテーブルの数が、テーブル定義キャッシュまたはテーブルオープンキャッシュのサイズを超えています。これらのキャッシュのサイズを増やします。詳細については、「[MySQL でのテーブルのオープンとクローズの方法](https://dev.mysql.com/doc/refman/8.0/en/table-cache.html)」を参照してください。

**synch/mutex/sql/LOG**  
この待機イベントの場合、ログロックの待機中のスレッドがあります。例えば、スレッドは、スロークエリログファイルに書き込むためにロックを待っている場合があります。

**synch/mutex/sql/MYSQL\$1BIN\$1LOG::LOCK\$1commit**  
この待機イベントの場合、バイナリログにコミットする目的でロック取得を待機中のスレッドがあります。変化率が非常に高いデータベースではバイナリログ記録の競合が発生する場合がありえます。使用している MySQL のバージョンによっては、バイナリログの整合性と耐久性の高さを保護するために使用される特定のロックがあります。RDS for MySQL の場合、バイナリログはレプリケーションと自動バックアッププロセスに使用されます。Aurora MySQL の場合、バイナリログはネイティブのレプリケーションやバックアップに必要ありません。バイナリログはデフォルトで無効になっていますが、これを有効にして外部のレプリケーションや変更データのキャプチャに使用できます。詳細については、MySQL ドキュメントの「[バイナリログ](https://dev.mysql.com/doc/refman/8.0/en/binary-log.html)」を参照してください。

**sync/mutex/sql/MYSQL\$1BIN\$1LOG:: LOCK\$1dump\$1thread\$1metrics\$1collection**  
バイナリログ記録がオンの場合、エンジンはアクティブなダンプスレッドのメトリクスをエンジンエラーログと内部オペレーションマップに出力する際、このミューテックスを取得します。

**sync/mutex/sql/MYSQL\$1BIN\$1LOG:: LOCK\$1inactive\$1binlogs\$1map**  
バイナリログ記録がオンの場合、エンジンは最新のバイナリログファイルのリストに追加したり、そこから削除したり、検索したりする際に、このミューテックスを取得します。

**sync/mutex/sql/MYSQL\$1BIN\$1LOG:: LOCK\$1io\$1cache**  
バイナリログがオンの場合、エンジンは Aurora binlog IO キャッシュ操作(割り当て、サイズ変更、解放、書き込み、読み取り、パージ、およびキャッシュ情報へのアクセス) 中にこのミューテックスを取得します。このイベントが頻繁に発生する場合、エンジンは binlog イベントが格納されているキャッシュにアクセスしています。待機時間を短縮するには、コミットを減らします。複数のステートメントを 1 つのトランザクションにグループ化してみてください。

**synch/mutex/sql/MYSQL\$1BIN\$1LOG::LOCK\$1log**  
バイナリログを有効にしている。高いコミットスループット、多数のコミットしているトランザクション、またはバイナリログを読み取るレプリカがある可能性があります。複数行ステートメントを使用するか、ステートメントを 1 つのトランザクションにバンドルすることを検討してください。Aurora では、バイナリログ レプリケーションや `aurora_binlog_*` パラメータの代わりにグローバルデータベースを使用します。

**synch/mutex/sql/server\$1thread:: LOCK\$1sync**  
ミューテックス `SERVER_THREAD::LOCK_sync` はファイル書き込みスレッドのスケジューリング、処理、または起動中に取得されます。この待機イベントが過剰に発生すると、データベース内の書き込みアクティビティが増加していることを示します。

**synch/mutex/sql/TABLESPACES:lock**  
エンジンは、作成、削除、トランケート、および拡張のテーブルスペース オペレーション中に `TABLESPACES:lock` ミューテックスを取得します。この待機イベントが過剰に発生すると、テーブルスペース操作の頻度が高いことを示します。例として、大量のデータをデータベースにロードしています。

**synch/rwlock/innodb/dict**  
この待機イベントの場合、InnoDB データディクショナリに保持されている rwlock を待機中のスレッドがあります。

**synch/rwlock/innodb/dict\$1operation\$1lock**  
この待機イベントの場合、InnoDB データディクショナリのオペレーションのロックを保持しているスレッドがあります。

**synch/rwlock/innodb/dict sys RW lock**  
データ定義言語コード (DDLs) 内の多数の同時データ制御言語ステートメント (DCLs) が同時にトリガーされます。通常のアプリケーションアクティビティ中に、アプリケーションの DDL への依存度を下げます。

**synch/rwlock/innodb/index\$1tree\$1rw\$1lock**  
複数の類似したデータ操作言語 (DML) ステートメントが同じデータベースオブジェクトに同時にアクセスしようとしています。複数行ステートメントを使用してみてください。また異なるデータベースオブジェクトにワークロードを分散します。例えば、パーティショニングを実装します。

**synch/sxlock/innodb/dict\$1operation\$1lock**  
データ定義言語コード (DDL) 内の多数の同時データ制御言語ステートメント (DCL) が同時にトリガーされます。通常のアプリケーションアクティビティ中に、アプリケーションの DDLs への依存度を下げます。

**synch/sxlock/innodb/dict\$1sys\$1lock**  
データ定義言語コード (DDL) 内の多数の同時データ制御言語ステートメント (DCL) が同時にトリガーされます。通常のアプリケーションアクティビティ中に、アプリケーションの DDLs への依存度を下げます。

**synch/sxlock/innodb/hash\$1table\$1locks**  
セッションは、バッファプール内のページを見つけることができませんでした。エンジンは、ファイルを読み取るか、バッファプールの最も長い時間使われていない (LRU) リストを変更する必要があります。バッファキャッシュのサイズを増やし、関連するクエリのアクセスパスを改善することを検討してください。

**synch/sxlock/innodb/index\$1tree\$1rw\$1lock**  
複数の類似したデータ操作言語 (DML) ステートメントが同じデータベースオブジェクトに同時にアクセスしようとしています。複数行ステートメントを使用してみてください。また異なるデータベースオブジェクトにワークロードを分散します。例えば、パーティショニングを実装します。

**synch/mutex/innodb/temp\$1pool\$1manager\$1mutex**  
この待機イベントは、セッションがセッション一時テーブルスペースのプールを管理するためのミューテックスの取得を待機しているときに発生します。

同期待機イベントのトラブルシューティングの詳細は、「[Performance Insights で SYNCH 待機イベントを待機しているアクティブセッションの数が多いことが MySQL DB インスタンスに表示されているのはなぜですか?](https://aws.amazon.com/premiumsupport/knowledge-center/aurora-mysql-synch-wait-events/)」を参照してください。

# Aurora MySQL スレッド状態
<a name="AuroraMySQL.Reference.thread-states"></a>

以下は、Aurora MySQL の代表的な待機イベントです。

**許可の確認**  
スレッドは、サーバーがステートメントを実行するために必要な権限を持っているかどうかをチェックしています。

**クエリキャッシュのクエリのチェック**  
サーバーは、現在のクエリがクエリキャッシュに存在するかどうかをチェックしています。

**クリーンアップ**  
これは、作業は完了しているがクライアントによってまだ閉じられていない接続の最終状態です。最善の解決策は、コード内の接続を明示的に閉じることです。または、パラメータグループの `wait_timeout` に、より低い値を設定することもできます。

**テーブルを閉じる**  
スレッドは、変更されたテーブルデータをディスクにフラッシュし、使用されているテーブルを閉じています。高速操作ではない場合は、インスタンスクラスのネットワーク帯域幅に対するネットワーク帯域幅消費メトリックを確認します。また `table_open_cache` と `table_definition_cache` パラメータのパラメータ値が、十分なテーブルを同時に開ける状態かをチェックし、エンジンが頻繁にテーブルを開いたり閉じたりする必要がないようにします。これらのパラメータは、インスタンスのメモリ消費量に影響します。

**HEAP を MyISAM に変換する**  
クエリは、一時テーブルをインメモリからディスク上に変換しています。この変換は、クエリ処理の中間ステップで MySQL によって作成された一時テーブルがメモリに対して大きすぎるため、必要になります。`tmp_table_size` と `max_heap_table_size` の値をチェックします。それ以降のバージョンでは、このスレッド状態名は `converting HEAP to ondisk` です。

**HEAP をオンディスクに変換する**  
スレッドは、内部一時テーブルをインメモリテーブルからディスク上のテーブルに変換しています。

**tmp テーブルにコピーする**  
スレッドが `ALTER TABLE` ステートメントを処理中です。この状態は、新しい構造を持つテーブルが作成された後、ローがそのテーブルにコピーされる前に発生します。この状態のスレッドの場合、パフォーマンススキーマを使用して、コピー操作の進行状況に関する情報を取得できます。

**ソートインデックスの作成**  
Aurora MySQL は、既存のインデックスを使用して クエリの `ORDER BY` および `GROUP BY` 句を満たすことができないため、ソートを実行しています。詳細については、「[ソートインデックスの作成](ams-states.sort-index.md)」を参照してください。

**テーブルの作成**  
スレッドは、永続テーブルまたは一時テーブルを作成しています。

**遅延コミット ok 完了**  
Aurora MySQL の非同期コミットが承認を受け取り、完了しました。

**遅延コミット ok スタートしました**  
Aurora MySQL スレッドは非同期コミットプロセスをスタートしましたが、確認を待っています。これは通常、トランザクションの本物のコミット時間です。

**遅延送信 ok 完了**  
接続に関連付けられている Aurora MySQL ワーカースレッドは、応答がクライアントに送信されている間に解放できます。スレッドは他の作業をスタートできます。ステータス `delayed send ok`は クライアントへの非同期確認が完了したことを示します。

**遅延送信 「ok」 をスタートしました**  
Aurora MySQL ワーカースレッドがクライアントに非同期で応答を送信し、他の接続で自由に作業できるようになりました。トランザクションは、まだ確認されていない非同期コミットプロセスをスタートしました。

**実行中**  
スレッドはステートメントの実行をスタートしました。

**アイテムを解放する**  
スレッドがコマンドを実行しました。この状態中に行われた項目の解放には、クエリキャッシュが含まれます。この状態は通常、クリーンアップが続きます。

**初期化**  
この状態は、`ALTER TABLE`、`DELETE`、`INSERT`、`SELECT`、または `UPDATE` ステートメントの初期化前に発生します。この状態のアクションには、バイナリログまたは InnoDB ログのフラッシュ、クエリキャッシュのクリーンアップが含まれます。

**ソースはすべてのバイナリログをレプリカに送信し、さらに更新を待っています**  
プライマリノードはレプリケーションの一部を終了しました。スレッドは、バイナリログ (binlog) に書き込むことができるように、より多くのクエリが実行されるのを待っています。

**テーブルを開く**  
スレッドがテーブルを開こうとしている。`ALTER TABLE` または `LOCK TABLE` ステートメントを終了する必要がある場合や、 `table_open_cache` の値を超える場合を除いて、このオペレーションは早いです。

**最適化**  
サーバーはクエリの初期最適化を実行しています。

**準備**  
この状態は、クエリの最適化中に発生します。

**クエリ終了**  
この状態は、クエリの処理後、アイテム解放状態の前に発生します。

**重複を除去する**  
Aurora MySQL は クエリの初期段階で`DISTINCT` オペレーションを最適化できませんでした。Aurora MySQL は、結果をクライアントに送信する前に、重複した行をすべて削除する必要があります。

**更新の行の検索**  
スレッドは更新する前に一致する行をすべて検索しています。この段階は、エンジンが行の検索に使用するインデックスを `UPDATE` が変更している時に必要です。

**バイナリログイベントをスレーブに送信する**  
スレッドはバイナリログからイベントを読み取り、それをレプリカに送信しています。

**キャッシュされた結果をクライアントに送信する**  
サーバーは、クエリキャッシュからクエリの結果を取得し、それをクライアントに送信しています。

**データの送信**  
スレッドは、`SELECT` ステートメントの行を読み取り、処理していますが、クライアントへのデータの送信はまだスタートされていません。このプロセスでは、クエリを満たすために必要な結果が含まれているページを特定します。詳細については、「[データの送信](ams-states.sending-data.md)」を参照してください。

**クライアントに送信する**  
サーバーはクライアントにパケットを書き込んでいます。以前のバージョンの MySQL では、この待機イベントは `writing to net` としてラベル付けされていました。

**スタート中**  
これは、ステートメントの実行スタートの初期の段階です。

**統計**  
サーバーは統計を計算して、クエリ実行プランを開発しています。スレッドが長時間この状態にある場合、サーバーは他の作業の実行中にディスクバインドされている可能性があります。

**クエリキャッシュに結果を格納する**  
サーバーは、クエリの結果をクエリキャッシュに格納しています。

**システムロック**  
スレッドは `mysql_lock_tables` を呼び出しましたが、呼び出し以降、スレッドの状態は更新されていません。この一般的な状態は多くの理由で発生します。

**更新**  
スレッドはテーブルの更新をスタートする準備をしています。

**更新中**  
スレッドは行を検索し、更新中です。

**ユーザーロック**  
スレッドは `GET_LOCK` を発行しました。スレッドがアドバイザリロックを要求して待っているか、リクエストを計画しています。

**さらに更新を待っている**  
プライマリノードはレプリケーションの一部を終了しました。スレッドは、バイナリログ (binlog) に書き込むことができるように、より多くのクエリが実行されるのを待っています。

**スキーマメタデータのロックを待っています**  
これは、メタデータのロックを待ちます。

**ストアド関数のメタデータのロックを待っています**  
これは、メタデータのロックを待ちます。

**ストアドプロシージャのメタデータのロックを待っています。**  
これは、メタデータのロックを待ちます。

**テーブルフラッシュを待っています。**  
スレッドが実行中です`FLUSH TABLES`そして、すべてのスレッドがテーブルを閉じるのを待っています。または、スレッドは、テーブルの基になる構造が変更されたという通知を受信したため、新しい構造を取得するにはテーブルを再度開く必要があります。テーブルを再度開くには、スレッドは他のすべてのスレッドがテーブルを閉じるまで待機する必要があります。この通知は、別のスレッドがテーブルで次のいずれかのステートメントを使用している場合に発生します。`FLUSH TABLES`、`ALTER TABLE`、`RENAME TABLE`、`REPAIR TABLE`、`ANALYZE TABLE`、 または`OPTIMIZE TABLE`。

**テーブルレベルのロックを待っています。**  
あるセッションがテーブルのロックを保持し、別のセッションが同じテーブルで同じロックを取得しようとします。

**テーブルメタデータのロックを待っています。**  
Aurora MySQL は、メタデータロックを使用して、データベースオブジェクトへの同時アクセスを管理し、データの整合性を確保します。この待機イベントでは、あるセッションがテーブルのメタデータロックを保持し、別のセッションが同じテーブルで同じロックを取得しようとします。パフォーマンススキーマが有効になっている場合、このスレッドの状態は待機イベント `synch/cond/sql/MDL_context::COND_wait_status` として報告されます。

**ネットへの書き込み**  
サーバーはネットワークにパケットを書き込んでいます。それ以降のバージョンの MySQL では、この待機イベントには `Sending to client` というラベルが付けられます。

# Aurora MySQL の分離レベル
<a name="AuroraMySQL.Reference.IsolationLevels"></a>

Aurora MySQL クラスターの DB インスタンスが分離のデータベースプロパティを実装する方法について説明します。このトピックでは、Aurora MySQL のデフォルトの動作で厳密な一貫性と高いパフォーマンスのバランスがどのように取られるかを説明します。この情報を使用して、ワークロードの特性に基づいて、デフォルト設定を変更するタイミングを判断することができます。

## ライターインスタンスで使用可能な分離レベル
<a name="AuroraMySQL.Reference.IsolationLevels.writer"></a>

Aurora MySQL DB クラスターのプライマリインスタンスでは、分離レベル `REPEATABLE READ`、`READ COMMITTED`、`READ UNCOMMITTED`、および `SERIALIZABLE` を使用できます。これらの分離レベルは、Aurora MySQL と RDS for MySQL で同じように機能します。

## リーダーインスタンスでの REPEATABLE READ の分離レベル
<a name="AuroraMySQL.Reference.IsolationLevels.reader"></a>

デフォルトでは、読み取り専用の Aurora レプリカとして設定された Aurora MySQL DB インスタンスは、常に `REPEATABLE READ` 分離レベルを使用します。これらの DB インスタンスは、`SET TRANSACTION ISOLATION LEVEL` ステートメントを無視し、引き続き `REPEATABLE READ` 分離レベルを使用します。

## リーダーインスタンスでの READ COMMITTED の分離レベル
<a name="AuroraMySQL.Reference.IsolationLevels.relaxed"></a>

アプリケーションのプライマリインスタンスに書き込み集中型のワークロードが含まれ、Aurora レプリカに長時間実行されるクエリが含まれている場合、かなりのパージラグが発生する可能性があります。*パージラグ*は、長時間実行されるクエリによって内部ガベージコレクションがブロックされた場合に発生します。確認できる症状は、`SHOW ENGINE INNODB STATUS` コマンドからの出力で `history list length` の値が高いことです。この値をモニタリングするには、CloudWatch の `RollbackSegmentHistoryListLength` メトリクスを使用します。大幅なパージラグが発生すると、セカンダリインデックスの有効性が低下し、全体的なクエリパフォーマンスの低下とストレージ領域の浪費が起きる可能性があります。

このような問題が発生した場合は、Aurora レプリカで `READ COMMITTED` 分離レベルを使用するように、Aurora MySQL セッションレベルの構成設定 `aurora_read_replica_read_committed` を設定します。この設定を適用すると、テーブルを変更するトランザクションと同時に長時間実行されるクエリを実行した場合に発生する可能性のある、速度低下と領域の浪費を軽減できます。

この設定を使用するには、Aurora MySQL の `READ COMMITTED` 分離に固有の動作を理解しておくことをお勧めします。Aurora レプリカでの `READ COMMITTED` の動作は、ANSI SQL スタンダードに準拠しています。ただし、分離は一般的な MySQL の `READ COMMITTED` の存知の動作ほど厳密ではありません。そのため、Aurora MySQL のリードレプリカでの `READ COMMITTED` は、Aurora MySQL のプライマリインスタンスや RDS for MySQL での `READ COMMITTED` の同じクエリとは異なるクエリ結果になる場合があります。非常に大規模なデータベースをスキャンする包括的なレポートなどの場合には、`aurora_read_replica_read_committed` 設定の使用を検討してください。逆に、精度と再現性が重要な、結果セットが小さいショートクエリでは、回避した方がよい場合があります。

`READ COMMITTED` 独立性レベルは、書き込み転送機能を使用する Aurora Global Database 内のセカンダリクラスター内のセッションでは使用できません。書き込み転送の詳細については、「[Amazon Aurora Global Database の書き込み転送を使用する](aurora-global-database-write-forwarding.md)」を参照してください。

### リーダーでの READ COMMITTED の使用
<a name="AuroraMySQL.Reference.IsolationLevels.relaxed.enabling"></a>

Aurora レプリカで `READ COMMITTED` 分離レベルを使用するには、`aurora_read_replica_read_committed` 構成設定を `ON` に設定します。特定の Aurora レプリカに接続しているときに、セッションレベルでこの設定を使用します。有効にするには、以下の SQL コマンドを実行します。

```
set session aurora_read_replica_read_committed = ON;
set session transaction isolation level read committed;
```

この構成設定を一時的に有効にして、インタラクティブなアドホック (1 回限りの) クエリを実行することもできます。また、`READ COMMITTED` 分離レベルのメリットを活かせるレポートまたはデータ分析アプリケーションを実行して、他のアプリケーションについては、デフォルト設定のままにしておくこともできます。

`aurora_read_replica_read_committed` 設定が有効になっているときに、`SET TRANSACTION ISOLATION LEVEL` コマンドを使用して、該当するトランザクションの分離レベルを指定します。

```
set transaction isolation level read committed;
```

### Aurora レプリカでの READ COMMITTED の動作の違い
<a name="AuroraMySQL.Reference.IsolationLevels.relaxed.behavior"></a>

`aurora_read_replica_read_committed` 設定は、Aurora レプリカで `READ COMMITTED` 分離レベルを使用可能にし、長時間実行されるトランザクション用に最適化された一貫性動作を実現します。Aurora レプリカでの `READ COMMITTED` 分離レベルの厳密性は、Aurora プライマリインスタンスでの厳密性より劣ります。そのため、クエリが特定のタイプの一貫性のない結果を受け入れられることがわかっている Aurora レプリカでのみ、この設定を有効にしてください。

`aurora_read_replica_read_committed` 設定がオンのときに、クエリで特定の種類の読み取り異常が発生する可能性があります。アプリケーションコードについて理解して処理するためには、2 種類の異常が特に重要です。クエリの実行中に別のトランザクションがコミットすると、*繰り返し不可のリード*が発生します。長時間実行されるクエリでは、クエリのスタート時に、終了時に表示されるデータとは異なるデータが表示されることがあります。*ファントムリード*は、クエリの実行中に他のトランザクションによって既存の行が再編成され、1 つ以上の行がクエリによって 2 回読み取られると発生します。

ファントムリードの結果として、クエリで一貫性のない行カウントが実行される場合があります。繰り返し不可のリードが原因で、クエリから不完全または一貫性のない結果が返されることもあります。例えば、結合操作が SQL ステートメント (`INSERT`、`DELETE` など) によって同時に変更されるテーブルを参照するとします。この場合、結合クエリは、あるテーブルの行を読み取りますが、別のテーブルの対応する行は読み取らない可能性があります。

ANSI SQL スタンダードでは、`READ COMMITTED` 分離レベルでこれらの両方の動作が許可されます。ただしこれらの動作は、`READ COMMITTED` の一般的な MySQL 実装とは異なります。そのため、`aurora_read_replica_read_committed` 設定を有効にする前に、既存の SQL コードを調べて、よりあいまいな整合性モデルで期待どおりに動作するかどうかを確認します。

この設定が有効になっている場合、`READ COMMITTED` 分離レベルでは、行カウントとその他の結果の一貫性があまりない場合があります。したがって通常は、大量のデータを集計し、絶対的な精度を必要としない分析クエリを実行しているときにのみ、設定を有効にします。これらの種類の長時間実行クエリを、書き込み集中型のワークロードと組み合わせて使用しない場合、`aurora_read_replica_read_committed` 設定は不要である可能性があります。長時間実行されるクエリと書き込み集中型のワークロードの組み合わせがなければ、履歴リストの長さに問題が発生することはほとんどありません。

**Example Aurora レプリカでの READ COMMITTED の分離動作を示すクエリ**  
次の例は、トランザクションが関連するテーブルを同時に変更した場合に、Aurora レプリカで実行された `READ COMMITTED` クエリが繰り返し不可能な結果を返す方法を示しています。テーブル `BIG_TABLE` には、クエリスタートの前に 100 万行が含まれています。他のデータ操作言語 (DML) ステートメントは、実行中に行を追加、削除、または変更します。  
Aurora プライマリインスタンスにおける `READ COMMITTED` 分離レベルでのクエリは、予測可能な結果を生成します。ただし、長時間実行されるすべてのクエリのライフタイムにわたって一貫した読み取りビューを維持するオーバーヘッドにより、後で高コストのガベージコレクションが発生する可能性があります。  
Aurora レプリカにおける `READ COMMITTED` 分離レベルでのクエリは、このガベージコレクションのオーバーヘッドを最小限に抑えるように最適化されます。トレードオフとして、クエリの実行中にコミットされるトランザクションによって追加、削除、または再編成された行をクエリが取得するかどうかによって結果が異なる場合があります。クエリではこれらの行を考慮することができますが、必須ではありません。デモンストレーションの目的で、クエリは `COUNT(*)` 関数を使用してテーブル内の行数のみをチェックします。  


| 時間 | Aurora プライマリインスタンスでの DML ステートメント | Aurora プライマリインスタンスでの READ COMMITTED を使用したクエリ | Aurora レプリカでの READ COMMITTED を使用したクエリ | 
| --- | --- | --- | --- | 
|  T1  |  INSERT INTO big\$1table SELECT \$1 FROM other\$1table LIMIT 1000000; COMMIT;   |  |  | 
|  T2  |  |  Q1: SELECT COUNT(\$1) FROM big\$1table;  |  Q2: SELECT COUNT(\$1) FROM big\$1table;  | 
|  T3  |  INSERT INTO big\$1table (c1, c2) VALUES (1, 'one more row'); COMMIT;   |  |  | 
|  T4  |  |  Q1 が終了すると、結果は 1,000,000 になります。 |  Q2 が終了すると、結果は 1,000,000 または 1,000,001 になります。 | 
|  T5  |  DELETE FROM big\$1table LIMIT 2; COMMIT;   |  |  | 
|  T6  |  |  Q1 が終了すると、結果は 1,000,000 になります。 |  Q2 が終了すると、結果は 1,000,000、1,000,001、999,999、999,998 のいずれかになります。 | 
|  T7  |  UPDATE big\$1table SET c2 = CONCAT(c2,c2,c2); COMMIT;   |  |  | 
|  T8  |  |  Q1 が終了すると、結果は 1,000,000 になります。 |  Q2 が終了すると、結果は 1,000,000、1,000,001、999,999、またはそれより大きい値になります。 | 
|  T9  |  |  Q3: SELECT COUNT(\$1) FROM big\$1table;  |  Q4: SELECT COUNT(\$1) FROM big\$1table;  | 
|  T10  |  |  Q3 が終了すると、結果は 999,999 になります。 |  Q4 が終了すると、結果は 999,999 になります。 | 
|  T11  |  |  Q5: SELECT COUNT(\$1) FROM parent\$1table p JOIN child\$1table c ON (p.id = c.id) WHERE p.id = 1000;  |  Q6: SELECT COUNT(\$1) FROM parent\$1table p JOIN child\$1table c ON (p.id = c.id) WHERE p.id = 1000;  | 
|  T12  |   INSERT INTO parent\$1table (id, s) VALUES (1000, 'hello'); INSERT INTO child\$1table (id, s) VALUES (1000, 'world'); COMMIT;   |  |  | 
|  T13  |  |  Q5 が終了すると、結果は 0 になります。 |  Q6 終了すると、結果は 0 または 1 になります。 | 
他のトランザクションが DML ステートメントを実行してコミットする前にクエリが迅速に終了する場合、結果は予測可能であり、プライマリインスタンスでも Aurora レプリカでも同じ結果になります。最初のクエリから始めて、動作の違いを詳しく調べてみましょう。  
プライマリインスタンスでの `READ COMMITTED` は `REPEATABLE READ` 分離レベルと同様の強力な整合性モデルを使用するため、Q1 の結果の予測可能性が非常に高くなります。  
Q2 の結果は、クエリの実行中にコミットされるトランザクションに応じて異なる場合があります。例えば、他のトランザクションが DML ステートメントを実行し、クエリの実行中にコミットするとします。この場合、Aurora レプリカでの `READ COMMITTED` 分離レベルを使用したクエリでは、変更が考慮される場合と考慮されない場合があります。行数は、`REPEATABLE READ` 分離レベルの場合と同じ方法では予測できません。さらに、プライマリインスタンスまたは RDS for MySQL インスタンスにおいて `READ COMMITTED` 分離レベルで実行されるクエリほど予測可能ではありません。  
T7 の `UPDATE` ステートメントは、実際にはテーブル内の行数を変更しません。ただし、可変長列の長さを変更すると、このステートメントによって行が内部的に再編成される可能性があります。長時間実行される `READ COMMITTED` トランザクションでは、古いバージョンの行が表示され、同じクエリ内で後から同じ行の新しいバージョンが表示される場合があります。クエリでは、行の古いバージョンと新しいバージョンの両方をスキップすることもできます。そのため、行カウントが予想と異なる場合があります。  
Q5 と Q6 の結果は、同じである場合と、わずかに異なる場合があります。Aurora レプリカにおける `READ COMMITTED` でのクエリ Q6 は、クエリの実行中にコミットされた新しい行を表示できますが、表示する必要はありません。また、一方のテーブルの行は表示され、もう一方のテーブルの行は表示されないこともあります。結合クエリは、両方のテーブルで一致する行を見つけられない場合、ゼロのカウントを返します。クエリは、`PARENT_TABLE` と `CHILD_TABLE` の両方で新しい行を検出した場合、カウント 1 を返します。長時間実行されるクエリでは、結合されたテーブルからの検索が行われる時間に大きな分離が生じる可能性があります。  
これらの動作の違いは、トランザクションがコミットされるタイミングと、基になるテーブル行をクエリが処理するタイミングによって異なります。したがって、このような違いが見られる可能性が最も高くなるのは、数分または数時間かかるレポートクエリ、および OLTP トランザクションを同時に処理する Aurora クラスターで実行されるレポートクエリです。これらは、Aurora レプリカでの `READ COMMITTED` 分離レベルのメリットを最も享受する種類の混合ワークロードです。

# Aurora MySQL のヒント
<a name="AuroraMySQL.Reference.Hints"></a><a name="hints"></a>

Aurora MySQL クエリで SQL ヒントを使用して、パフォーマンスを微調整できます。ヒントを使用して、重要なクエリの実行計画が予測不可能な条件のために変更されないようにすることもできます。

**ヒント**  
ヒントがクエリに与える影響を確認するには、`EXPLAIN` ステートメントによって生成されるクエリプランを調べます。ヒントの有無にかかわらず、クエリプランを比較します。

Aurora MySQL バージョン 3 では、MySQL Community Edition 8.0 で利用可能なすべてのヒントを使用できます。これらのヒントの詳細については、*MySQL リファレンスマニュアル*の「[オプティマイザヒント](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html)」を参照してください。

これらのヒントは、Aurora MySQL バージョン 2 で使用可能です。これらのヒントは、Aurora MySQL バージョン 2 のハッシュ結合特徴を使用するクエリ、特にパラレルクエリ最適化を使用するクエリに適用されます。

**PQ、NO\$1PQ**  
オプティマイザが、テーブル単位またはクエリ単位、どちらのパラレルクエリを使用するかを指定します。  
`PQ` は、指定されたテーブルまたはクエリ全体 (ブロック) に対して、オプティマイザがパラレルクエリを使用するよう強制します。`NO_PQ` は、指定されたテーブルまたはクエリ全体 (ブロック) に対して、オプティマイザがパラレルクエリを使用しないようにします。  
このヒントは、Aurora MySQL バージョン 2.11 以降で使用可能です。以下の例では、このヒントの使用方法を示します。  
テーブル名を指定した場合、オプティマイザは選択したテーブルにのみ `PQ/NO_PQ` ヒントを適用するようになります。テーブル名を指定しない場合、クエリブロックの影響を受けるすべてのテーブルに `PQ/NO_PQ` ヒントが強制されます。

```
EXPLAIN SELECT /*+ PQ() */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ PQ(t1) */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ PQ(t1,t2) */ f1, f2
    FROM num1 t1, num1 t2 WHERE t1.f1 = t2.f21;

EXPLAIN SELECT /*+ NO_PQ() */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ NO_PQ(t1) */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ NO_PQ(t1,t2) */ f1, f2
    FROM num1 t1, num1 t2 WHERE t1.f1 = t2.f21;
```

**HASH\$1JOIN、NO\$1HASH\$1JOIN**  
クエリにハッシュ結合最適化メソッドを使用するかどうかを選択するパラレルクエリオプティマイザの機能をオンまたはオフにします。`HASH_JOIN` は、そのメカニズムがより効率的である場合、オプティマイザがハッシュ結合を使用できるようにします。`NO_HASH_JOIN` は、オプティマイザがクエリにハッシュ結合を使用できないようにします。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。Aurora MySQL バージョン 3 では効果がありません。  
以下の例では、このヒントの使用方法を示します。  

```
EXPLAIN SELECT/*+ HASH_JOIN(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

EXPLAIN SELECT /*+ NO_HASH_JOIN(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;
```

**HASH\$1JOIN\$1PROBING、NO\$1HASH\$1JOIN\$1PROBING**  
ハッシュ結合クエリで、結合のプローブ側に指定されたテーブルを使用するかどうかを指定します。クエリは、プローブテーブルの内容全体を読み取る代わりに、構築テーブルの列値がプローブテーブルに存在するかどうかをテストします。`HASH_JOIN_PROBING` および `HASH_JOIN_BUILDING` を使用して、クエリテキスト内のテーブルを並べ替えることなく、ハッシュ結合クエリの処理方法を指定できます。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。Aurora MySQL バージョン 3 では効果がありません。  
以下の例では、このヒントの使用方法を示します。テーブル `HASH_JOIN_PROBING` の `T2` ヒントを指定することは、テーブル `NO_HASH_JOIN_PROBING` に `T1` を指定するのと同じ効果があります。  

```
EXPLAIN SELECT /*+ HASH_JOIN(t2) HASH_JOIN_PROBING(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

EXPLAIN SELECT /*+ HASH_JOIN(t2) NO_HASH_JOIN_PROBING(t1) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;
```

**HASH\$1JOIN\$1BUILDING、NO\$1HASH\$1JOIN\$1BUILDING**  
ハッシュ結合クエリで、結合の構築側に指定されたテーブルを使用するかどうかを指定します。クエリは、このテーブルのすべての行を処理し、他のテーブルと相互参照する列値のリストを作成します。`HASH_JOIN_PROBING` および `HASH_JOIN_BUILDING` を使用して、クエリテキスト内のテーブルを並べ替えることなく、ハッシュ結合クエリの処理方法を指定できます。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。Aurora MySQL バージョン 3 では効果がありません。  
以下の例では、このヒントの使用方法を示します。テーブル `HASH_JOIN_BUILDING` の `T2` ヒントを指定することは、テーブル `NO_HASH_JOIN_BUILDING` に `T1` を指定するのと同じ効果があります。  

```
EXPLAIN SELECT /*+ HASH_JOIN(t2) HASH_JOIN_BUILDING(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

EXPLAIN SELECT /*+ HASH_JOIN(t2) NO_HASH_JOIN_BUILDING(t1) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;
```

**JOIN\$1FIXED\$1ORDER**  
クエリ内のテーブルが、クエリにリストされている順序に基づいて結合されるように指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。これは、MySQL `STRAIGHT_JOIN` の代替となることを目的とし、MySQL [JOIN\$1FIXED\$1ORDER](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) ヒントに相当します。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。  
以下の例では、このヒントの使用方法を示します。  

```
EXPLAIN SELECT /*+ JOIN_FIXED_ORDER() */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

**JOIN\$1ORDER**  
クエリ内のテーブルの結合順序を指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。MySQL [JOIN\$1ORDER](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) ヒントに相当します。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。  
以下の例では、このヒントの使用方法を示します。  

```
EXPLAIN SELECT /*+ JOIN_ORDER (t4, t2, t1, t3) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

**JOIN\$1PREFIX**  
結合順序の先頭に配置するテーブルを指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。MySQL [JOIN\$1PREFIX](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) ヒントに相当します。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。  
以下の例では、このヒントの使用方法を示します。  

```
EXPLAIN SELECT /*+ JOIN_PREFIX (t4, t2) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

**JOIN\$1SUFFIX**  
結合順で最後に配置するテーブルを指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。MySQL [JOIN\$1SUFFIX](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) ヒントに相当します。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。  
以下の例では、このヒントの使用方法を示します。  

```
EXPLAIN SELECT /*+ JOIN_SUFFIX (t1) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

ハッシュ結合クエリの使用方法については、「[ハッシュ結合を使用した大規模な Aurora MySQL 結合クエリの最適化](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.HashJoin)」を参照してください。

# Aurora MySQL ストアドプロシージャリファレンス
<a name="AuroraMySQL.Reference.StoredProcs"></a>

Aurora MySQL DB クラスターを管理するには、組み込みストアドプロシージャを呼び出します。

**Topics**
+ [グローバルステータス履歴の収集と維持](mysql-stored-proc-gsh.md)
+ [バイナリログレプリケーションの設定、開始、停止](mysql-stored-proc-replicating.md)
+ [セッションやクエリの終了](mysql-stored-proc-ending.md)
+ [GTID を使用したトランザクションのレプリケーション](mysql-stored-proc-gtid.md)
+ [クエリログのローテーション](mysql-stored-proc-logging.md)
+ [バイナリログ構成の設定と表示](mysql-stored-proc-configuring.md)

# グローバルステータス履歴の収集と維持
<a name="mysql-stored-proc-gsh"></a>

Amazon RDS は、ステータス変数の値のスナップショットを掲示的に取得し、前回のスナップショット後の変化とともにテーブルに書き込む一連のプロシージャを提供します。このインフラストラクチャは Global Status History (GoSH) と呼ばれます。詳細については、「[Managing the Global Status History](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.MySQL.CommonDBATasks.html#Appendix.MySQL.CommonDBATasks.GoSH)」(Global Status History の管理) を参照してください。

以下のストアドプロシージャは、Global Status History (GoSH) の収集方法と保守方法を管理します。

**Topics**
+ [mysql.rds\$1collect\$1global\$1status\$1history](#mysql_rds_collect_global_status_history)
+ [mysql.rds\$1disable\$1gsh\$1collector](#mysql_rds_disable_gsh_collector)
+ [mysql.rds\$1disable\$1gsh\$1rotation](#mysql_rds_disable_gsh_rotation)
+ [mysql.rds\$1enable\$1gsh\$1collector](#mysql_rds_enable_gsh_collector)
+ [mysql.rds\$1enable\$1gsh\$1rotation](#mysql_rds_enable_gsh_rotation)
+ [mysql.rds\$1rotate\$1global\$1status\$1history](#mysql_rds_rotate_global_status_history)
+ [mysql.rds\$1set\$1gsh\$1collector](#mysql_rds_set_gsh_collector)
+ [mysql.rds\$1set\$1gsh\$1rotation](#mysql_rds_set_gsh_rotation)

## mysql.rds\$1collect\$1global\$1status\$1history
<a name="mysql_rds_collect_global_status_history"></a>

Global Status History (GoSH) のスナップショットをオンデマンドで作成します。

### 構文
<a name="rds_collect_global_status_history-syntax"></a>

 

```
CALL mysql.rds_collect_global_status_history;
```

## mysql.rds\$1disable\$1gsh\$1collector
<a name="mysql_rds_disable_gsh_collector"></a>

Global Status History (GoSH) によって作成されたスナップショットを無効にします。

### 構文
<a name="mysql_rds_disable_gsh_collector-syntax"></a>

 

```
CALL mysql.rds_disable_gsh_collector;
```

## mysql.rds\$1disable\$1gsh\$1rotation
<a name="mysql_rds_disable_gsh_rotation"></a>

`mysql.global_status_history` テーブルのローテーションをオフにします。

### 構文
<a name="mysql_rds_disable_gsh_rotation-syntax"></a>

 

```
CALL mysql.rds_disable_gsh_rotation;
```

## mysql.rds\$1enable\$1gsh\$1collector
<a name="mysql_rds_enable_gsh_collector"></a>

Global Status History (GoSH) をオンにして、`rds_set_gsh_collector` で指定された間隔でデフォルトのスナップショットを作成します。

### 構文
<a name="mysql_rds_enable_gsh_collector-syntax"></a>

 

```
CALL mysql.rds_enable_gsh_collector;
```

## mysql.rds\$1enable\$1gsh\$1rotation
<a name="mysql_rds_enable_gsh_rotation"></a>

`rds_set_gsh_rotation` で指定された間隔での `mysql.global_status_history` テーブルのコンテンツの `mysql.global_status_history_old` へのローテーションをオンにします。

### 構文
<a name="mysql_rds_enable_gsh_rotation-syntax"></a>

 

```
CALL mysql.rds_enable_gsh_rotation;
```

## mysql.rds\$1rotate\$1global\$1status\$1history
<a name="mysql_rds_rotate_global_status_history"></a>

`mysql.global_status_history` テーブルのコンテンツを `mysql.global_status_history_old` にオンデマンドでローテーションします。

### 構文
<a name="mysql_rds_rotate_global_status_history-syntax"></a>

 

```
CALL mysql.rds_rotate_global_status_history;
```

## mysql.rds\$1set\$1gsh\$1collector
<a name="mysql_rds_set_gsh_collector"></a>

Global Status History (GoSH) によって作成されたスナップショットの間隔を分単位で指定します。

### 構文
<a name="mysql_rds_set_gsh_collector-syntax"></a>

 

```
CALL mysql.rds_set_gsh_collector(intervalPeriod);
```

### パラメータ
<a name="mysql_rds_set_gsh_collector-parameters"></a>

 *intervalPeriod*   
スナップショット作成の間隔 (分単位)。デフォルト値は `5` です。

## mysql.rds\$1set\$1gsh\$1rotation
<a name="mysql_rds_set_gsh_rotation"></a>

`mysql.global_status_history` テーブルのローテーション間隔を日単位で指定します。

### 構文
<a name="mysql_rds_set_gsh_rotation-syntax"></a>

 

```
CALL mysql.rds_set_gsh_rotation(intervalPeriod);
```

### パラメータ
<a name="mysql_rds_set_gsh_rotation-parameters"></a>

 *intervalPeriod*   
テーブルのローテーション間隔 (日単位)。デフォルト値は `7` です。

# バイナリログレプリケーションの設定、開始、停止
<a name="mysql-stored-proc-replicating"></a>

Aurora MySQL クラスターのプライマリインスタンスに接続している間に、次のストアドプロシージャを呼び出すことができます。これらのプロシージャでは、トランザクションが外部データベースから Aurora MySQL、または Aurora MySQL から外部データベースに複製される方法を管理します。

**Topics**
+ [mysql.rds\$1disable\$1session\$1binlog (Aurora MySQL バージョン 2)](#mysql_rds_disable_session_binlog)
+ [mysql.rds\$1enable\$1session\$1binlog (Aurora MySQL バージョン 2)](#mysql_rds_enable_session_binlog)
+ [mysql.rds\$1import\$1binlog\$1ssl\$1material](#mysql_rds_import_binlog_ssl_material)
+ [mysql.rds\$1next\$1master\$1log (Aurora MySQL バージョン 2)](#mysql_rds_next_master_log)
+ [mysql.rds\$1next\$1source\$1log (Aurora MySQL バージョン 3)](#mysql_rds_next_source_log)
+ [mysql.rds\$1remove\$1binlog\$1ssl\$1material](#mysql_rds_remove_binlog_ssl_material)
+ [mysql.rds\$1reset\$1external\$1master (Aurora MySQL バージョン 2)](#mysql_rds_reset_external_master)
+ [mysql.rds\$1reset\$1external\$1source (Aurora MySQL バージョン 3)](#mysql_rds_reset_external_source)
+ [mysql.rds\$1set\$1binlog\$1source\$1ssl (Aurora MySQL バージョン 3)](#mysql_rds_set_binlog_source_ssl)
+ [mysql.rds\$1set\$1external\$1master (Aurora MySQL バージョン 2)](#mysql_rds_set_external_master)
+ [mysql.rds\$1set\$1external\$1source (Aurora MySQL バージョン 3)](#mysql_rds_set_external_source)
+ [mysql.rds\$1set\$1external\$1master\$1with\$1auto\$1position (Aurora MySQL バージョン 2)](#mysql_rds_set_external_master_with_auto_position)
+ [mysql.rds\$1set\$1external\$1source\$1with\$1auto\$1position (Aurora MySQL バージョン 3)](#mysql_rds_set_external_source_with_auto_position)
+ [mysql.rds\$1set\$1master\$1auto\$1position (Aurora MySQL バージョン 2)](#mysql_rds_set_master_auto_position)
+ [mysql.rds\$1set\$1read\$1only (Aurora MySQL バージョン 3)](#mysql_rds_set_read_only)
+ [mysql.rds\$1set\$1session\$1binlog\$1format (Aurora MySQL バージョン 2)](#mysql_rds_set_session_binlog_format)
+ [mysql.rds\$1set\$1source\$1auto\$1position (Aurora MySQL バージョン 3)](#mysql_rds_set_source_auto_position)
+ [mysql.rds\$1skip\$1repl\$1error](#mysql_rds_skip_repl_error)
+ [mysql.rds\$1start\$1replication](#mysql_rds_start_replication)
+ [mysql.rds\$1start\$1replication\$1until(Aurora MySQL バージョン 3)](#mysql_rds_start_replication_until)
+ [mysql.rds\$1stop\$1replication](#mysql_rds_stop_replication)

## mysql.rds\$1disable\$1session\$1binlog (Aurora MySQL バージョン 2)
<a name="mysql_rds_disable_session_binlog"></a>

`sql_log_bin` 変数を `OFF` に設定することにより、現在のセッションのバイナリログをオフにします。

### 構文
<a name="mysql_rds_disable_session_binlog-syntax"></a>

```
CALL mysql.rds_disable_session_binlog;
```

### パラメータ
<a name="mysql_rds_disable_session_binlog-parameters"></a>

なし

### 使用に関する注意事項
<a name="mysql_rds_disable_session_binlog-usage"></a>

Aurora MySQL DB クラスターでは、プライマリインスタンスに接続されている間に、このストアドプロシージャを呼び出します。

Aurora では、このプロシージャは Aurora MySQL バージョン 2.12 以降の MySQL 5.7 互換バージョンでサポートされています。

**注記**  
Aurora MySQL バージョン 3 では、`SESSION_VARIABLES_ADMIN` 権限を持っている場合、次のコマンドを使用して現在のセッションのバイナリログ記録を無効にできます。  

```
SET SESSION sql_log_bin = OFF;
```

## mysql.rds\$1enable\$1session\$1binlog (Aurora MySQL バージョン 2)
<a name="mysql_rds_enable_session_binlog"></a>

`sql_log_bin` 変数を `ON` に設定することにより、現在のセッションのバイナリログをオンにします。

### 構文
<a name="mysql_rds_enable_session_binlog-syntax"></a>

```
CALL mysql.rds_enable_session_binlog;
```

### パラメータ
<a name="mysql_rds_enable_session_binlog-parameters"></a>

なし

### 使用に関する注意事項
<a name="mysql_rds_enable_session_binlog-usage"></a>

Aurora MySQL DB クラスターでは、プライマリインスタンスに接続されている間に、このストアドプロシージャを呼び出します。

Aurora では、このプロシージャは Aurora MySQL バージョン 2.12 以降の MySQL 5.7 互換バージョンでサポートされています。

**注記**  
Aurora MySQL バージョン 3 では、`SESSION_VARIABLES_ADMIN` 権限を持っている場合、次のコマンドを使用して現在のセッションのバイナリログ記録を有効にできます。  

```
SET SESSION sql_log_bin = ON;
```

## mysql.rds\$1import\$1binlog\$1ssl\$1material
<a name="mysql_rds_import_binlog_ssl_material"></a>

認証局証明書、クライアント証明書、およびクライアントキーを Aurora MySQL DB クラスターにインポートします。この情報は SSL 通信および暗号化レプリケーションに必要です。

**注記**  
現在、この手順は、Aurora MySQL バージョン 2 (2.09.2、2.10.0、2.10.1、2.11.0) とバージョン 3 (3.01.1 以降) でサポートされています。

### 構文
<a name="mysql_rds_import_binlog_ssl_material-syntax"></a>

 

```
CALL mysql.rds_import_binlog_ssl_material (
  ssl_material
);
```

### パラメータ
<a name="mysql_rds_import_binlog_ssl_material-parameters"></a>

 *ssl\$1material*   
MySQL クライアント用の以下の .pem 形式のコンテンツを含む JSON ペイロード。  
+ "ssl\$1ca":"*認証局証明書*"
+ "ssl\$1cert":"*クライアント証明書*"
+ "ssl\$1key":"*クライアントキー*"

### 使用に関する注意事項
<a name="mysql_rds_import_binlog_ssl_material-usage-notes"></a>

この手順を実行する前に、暗号化レプリケーションを準備します。
+ 外部の MySQL 出典データベースインスタンスで有効になった SSL がなく、またクライアントキーおよびクライアント証明書が準備されていない場合、MySQL データベースサーバーで SSL を有効にし、必要なクライアントキーおよびクライアントの証明書を生成します。
+ SSL が外部出典データベースインスタンスで有効になっている場合は、Aurora MySQL DB クラスターにクライアントキーおよび証明書を提供します。これらがない場合は、Aurora MySQL DB クラスター用に新しいキーと証明書を生成します。クライアント証明書に署名するには、外部の MySQL 出典データベースインスタンスで SSL の設定に使用した認証局キーが必要です。

詳細については、MySQL ドキュメントの「[Creating SSL Certificates and Keys Using openssl](https://dev.mysql.com/doc/refman/8.0/en/creating-ssl-files-using-openssl.html)」を参照してください。

**重要**  
暗号化レプリケーションをじゅんびしたら、SSL 接続を使用してこの手順を実行します。クライアントのキーは、安全ではない接続で転送するべきではありません。

この手順では、外部の MySQL データベースから SSL 情報を Aurora MySQL DB クラスターにインポートします。SSL 情報は、Aurora MySQL DB クラスター用の SSL 情報が含まれる .pem 形式のファイルにあります。暗号化のレプリケーション中、Aurora MySQL DB クラスターはクライアントとして MySQL データベースサーバーに動作します。Aurora MySQL 用の証明書およびキーは、.pem 形式のファイルにあります。

上記のファイルからこの情報を正しい JSON ペイロードで `ssl_material` パラメータにコピーできます。暗号化レプリケーションをサポートするために、この SSL 情報を Aurora MySQL DB クラスターにインポートします。

JSON ペイロードは、次のようになります。

```
'{"ssl_ca":"-----BEGIN CERTIFICATE-----
ssl_ca_pem_body_code
-----END CERTIFICATE-----\n","ssl_cert":"-----BEGIN CERTIFICATE-----
ssl_cert_pem_body_code
-----END CERTIFICATE-----\n","ssl_key":"-----BEGIN RSA PRIVATE KEY-----
ssl_key_pem_body_code
-----END RSA PRIVATE KEY-----\n"}'
```

### 例
<a name="mysql_rds_import_binlog_ssl_material-examples"></a>

次の例では、SSL 情報を Aurora MySQL にインポートします。.pem 形式ファイルでは、通常の場合、コード本文に例に示されるコード本文より長くなっています。

```
call mysql.rds_import_binlog_ssl_material(
'{"ssl_ca":"-----BEGIN CERTIFICATE-----
AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V
hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr
lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ
qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb
BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE
-----END CERTIFICATE-----\n","ssl_cert":"-----BEGIN CERTIFICATE-----
AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V
hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr
lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ
qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb
BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE
-----END CERTIFICATE-----\n","ssl_key":"-----BEGIN RSA PRIVATE KEY-----
AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V
hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr
lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ
qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb
BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE
-----END RSA PRIVATE KEY-----\n"}');
```

## mysql.rds\$1next\$1master\$1log (Aurora MySQL バージョン 2)
<a name="mysql_rds_next_master_log"></a>

出典データベースインスタンスのログの位置を、出典データベースインスタンスの次のバイナリログの先頭に変更します。このプロシージャは、リードレプリカでレプリケーション I/O エラー 1236 が発生した場合にのみ使用してください。

### 構文
<a name="mysql_rds_next_master_log-syntax"></a>

 

```
CALL mysql.rds_next_master_log(
curr_master_log
);
```

### パラメータ
<a name="mysql_rds_next_master_log-parameters"></a>

 *curr\$1master\$1log*   
現在のマスターログファイルのインデックス。例えば、現在のファイルが `mysql-bin-changelog.012345` という名前の場合は、インデックスは 12345 になります。現在のマスターログファイルの名前を調べるには、`SHOW REPLICA STATUS` コマンドを実行し、`Master_Log_File` フィールドを確認します。

### 使用に関する注意事項
<a name="mysql_rds_next_master_log-usage-notes"></a>

マスターユーザーが `mysql.rds_next_master_log` を実行する必要があります。

**警告**  
`mysql.rds_next_master_log` は、レプリケーション出典であるマルチ AZ DB インスタンスのフェイルオーバーの後でレプリケーションが失敗し、`Last_IO_Errno` の `SHOW REPLICA STATUS` フィールドが I/O エラー 1236 を示している場合にのみ呼び出してください。  
`mysql.rds_next_master_log` を呼び出すと、フェイルオーバーイベントが発生する前にソースインスタンスのトランザクションがディスク上のバイナリログに書き込まれなかった場合、リードレプリカのデータが失われる可能性があります。

### 例
<a name="mysql_rds_next_master_log-examples"></a>

Aurora MySQL リードレプリカでレプリケーションが失敗すると仮定します。リードレプリカで `SHOW REPLICA STATUS\G` を実行すると、次の結果が返されます。

```
*************************** 1. row ***************************
             Replica_IO_State:
                  Source_Host: myhost.XXXXXXXXXXXXXXX.rr-rrrr-1.rds.amazonaws.com
                  Source_User: MasterUser
                  Source_Port: 3306
                Connect_Retry: 10
              Source_Log_File: mysql-bin-changelog.012345
          Read_Source_Log_Pos: 1219393
               Relay_Log_File: relaylog.012340
                Relay_Log_Pos: 30223388
        Relay_Source_Log_File: mysql-bin-changelog.012345
           Replica_IO_Running: No
          Replica_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Source_Log_Pos: 30223232
              Relay_Log_Space: 5248928866
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Source_SSL_Allowed: No
           Source_SSL_CA_File:
           Source_SSL_CA_Path:
              Source_SSL_Cert:
            Source_SSL_Cipher:
               Source_SSL_Key:
        Seconds_Behind_Master: NULL
Source_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 1236
                Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position; the first event 'mysql-bin-changelog.013406' at 1219393, the last event read from '/rdsdbdata/log/binlog/mysql-bin-changelog.012345' at 4, the last byte read from '/rdsdbdata/log/binlog/mysql-bin-changelog.012345' at 4.'
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Source_Server_Id: 67285976
```

`Last_IO_Errno` フィールドはインスタンスが I/O エラー 1236 を受け取ったことを示します。`Master_Log_File` フィールドは、ファイル名が `mysql-bin-changelog.012345` であることを示しています。これは、ログファイルのインデックスが `12345` であることを表しています。エラーを解決するには、次のパラメータを使用して `mysql.rds_next_master_log` を呼び出すことができます。

```
CALL mysql.rds_next_master_log(12345);
```

## mysql.rds\$1next\$1source\$1log (Aurora MySQL バージョン 3)
<a name="mysql_rds_next_source_log"></a>

出典データベースインスタンスのログの位置を、出典データベースインスタンスの次のバイナリログの先頭に変更します。このプロシージャは、リードレプリカでレプリケーション I/O エラー 1236 が発生した場合にのみ使用してください。

### 構文
<a name="mysql_rds_next_source_log-syntax"></a>

 

```
CALL mysql.rds_next_source_log(
curr_source_log
);
```

### パラメータ
<a name="mysql_rds_next_source_log-parameters"></a>

 *curr\$1source\$1log*   
現在のソースログファイルのインデックス。例えば、現在のファイルが `mysql-bin-changelog.012345` という名前の場合は、インデックスは 12345 になります。現在のソースログファイルの名前を調べるには、`SHOW REPLICA STATUS` コマンドを実行し、`Source_Log_File` フィールドを確認します。

### 使用に関する注意事項
<a name="mysql_rds_next_source_log-usage-notes"></a>

管理ユーザーは、`mysql.rds_next_source_log`プロシージャを実行すべきです。

**警告**  
`mysql.rds_next_source_log` は、レプリケーション出典であるマルチ AZ DB インスタンスのフェイルオーバーの後でレプリケーションが失敗し、`Last_IO_Errno` の `SHOW REPLICA STATUS` フィールドが I/O エラー 1236 を示している場合にのみ呼び出してください。  
`mysql.rds_next_source_log` を呼び出すと、フェイルオーバーイベントが発生する前にソースインスタンスのトランザクションがディスク上のバイナリログに書き込まれなかった場合、リードレプリカのデータが失われる可能性があります。ソースインスタンスのパラメータ `sync_binlog` および `innodb_support_xa` を `1` に設定することで、このような問題が発生する可能性を軽減できますが、パフォーマンスが低下する恐れがあります。詳細については、

### 例
<a name="mysql_rds_next_source_log-examples"></a>

Aurora MySQL リードレプリカでレプリケーションが失敗すると仮定します。リードレプリカで `SHOW REPLICA STATUS\G` を実行すると、次の結果が返されます。

```
*************************** 1. row ***************************
             Replica_IO_State:
                  Source_Host: myhost.XXXXXXXXXXXXXXX.rr-rrrr-1.rds.amazonaws.com
                  Source_User: MasterUser
                  Source_Port: 3306
                Connect_Retry: 10
              Source_Log_File: mysql-bin-changelog.012345
          Read_Source_Log_Pos: 1219393
               Relay_Log_File: relaylog.012340
                Relay_Log_Pos: 30223388
        Relay_Source_Log_File: mysql-bin-changelog.012345
           Replica_IO_Running: No
          Replica_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Source_Log_Pos: 30223232
              Relay_Log_Space: 5248928866
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Source_SSL_Allowed: No
           Source_SSL_CA_File:
           Source_SSL_CA_Path:
              Source_SSL_Cert:
            Source_SSL_Cipher:
               Source_SSL_Key:
        Seconds_Behind_Source: NULL
Source_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 1236
                Last_IO_Error: Got fatal error 1236 from source when reading data from binary log: 'Client requested source to start replication from impossible position; the first event 'mysql-bin-changelog.013406' at 1219393, the last event read from '/rdsdbdata/log/binlog/mysql-bin-changelog.012345' at 4, the last byte read from '/rdsdbdata/log/binlog/mysql-bin-changelog.012345' at 4.'
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Source_Server_Id: 67285976
```

`Last_IO_Errno` フィールドはインスタンスが I/O エラー 1236 を受け取ったことを示します。`Source_Log_File` フィールドは、ファイル名が `mysql-bin-changelog.012345` であることを示しています。これは、ログファイルのインデックスが `12345` であることを表しています。エラーを解決するには、次のパラメータを使用して `mysql.rds_next_source_log` を呼び出すことができます。

```
CALL mysql.rds_next_source_log(12345);
```

## mysql.rds\$1remove\$1binlog\$1ssl\$1material
<a name="mysql_rds_remove_binlog_ssl_material"></a>

SSL 通信と暗号化レプリケーション用の認証局証明書、クライアント証明書およびクライアントキーを削除します。[mysql.rds\$1import\$1binlog\$1ssl\$1material](#mysql_rds_import_binlog_ssl_material) を使用してこの情報をインポートします。

### 構文
<a name="mysql_rds_remove_binlog_ssl_material-syntax"></a>

 

```
CALL mysql.rds_remove_binlog_ssl_material;
```

## mysql.rds\$1reset\$1external\$1master (Aurora MySQL バージョン 2)
<a name="mysql_rds_reset_external_master"></a>

Aurora MySQL DB インスタンスを、Amazon RDS の外部で実行している MySQL インスタンスのリードレプリカとして使用しないように再設定します。

**重要**  
この手順を実行するには、`autocommit` を有効にする必要があります。これを有効にするには、`autocommit` パラメータを `1` に設定します。パラメータの変更については、「[Amazon Aurora の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。

### 構文
<a name="mysql_rds_reset_external_master-syntax"></a>

 

```
CALL mysql.rds_reset_external_master;
```

### 使用に関する注意事項
<a name="mysql_rds_reset_external_master-usage-notes"></a>

マスターユーザーが `mysql.rds_reset_external_master` を実行する必要があります。このプロシージャは、Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとしての設定が解除される MySQL DB インスタンス上で実行する必要があります。

**注記**  
これらのストアドプロシージャは、主に Amazon RDS 外部で実行されている MySQL インスタンスのレプリケーションの有効化のために提供されています。可能な場合は、Aurora MySQL DB クラスター内のレプリケーションを管理するために、Aurora レプリカを使用することをお勧めします。Aurora MySQL DB クラスターでのレプリカの管理については、「[Aurora レプリカの使用](AuroraMySQL.Replication.md#AuroraMySQL.Replication.Replicas)」を参照してください。

レプリケーションを使用して、Aurora MySQL の外部で実行している MySQL インスタンスからデータをインポートする方法の詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。

## mysql.rds\$1reset\$1external\$1source (Aurora MySQL バージョン 3)
<a name="mysql_rds_reset_external_source"></a>

Aurora MySQL DB インスタンスを、Amazon RDS の外部で実行している MySQL インスタンスのリードレプリカとして使用しないように再設定します。

**重要**  
この手順を実行するには、`autocommit` を有効にする必要があります。これを有効にするには、`autocommit` パラメータを `1` に設定します。パラメータの変更については、「[Amazon Aurora の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。

### 構文
<a name="mysql_rds_reset_external_source-syntax"></a>

 

```
CALL mysql.rds_reset_external_source;
```

### 使用に関する注意事項
<a name="mysql_rds_reset_external_source-usage-notes"></a>

管理ユーザーは、`mysql.rds_reset_external_source`プロシージャを実行すべきです。このプロシージャは、Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとしての設定が解除される MySQL DB インスタンス上で実行する必要があります。

**注記**  
これらのストアドプロシージャは、主に Amazon RDS 外部で実行されている MySQL インスタンスのレプリケーションの有効化のために提供されています。可能な場合は、Aurora MySQL DB クラスター内のレプリケーションを管理するために、Aurora レプリカを使用することをお勧めします。Aurora MySQL DB クラスターでのレプリカの管理については、「[Aurora レプリカの使用](AuroraMySQL.Replication.md#AuroraMySQL.Replication.Replicas)」を参照してください。

## mysql.rds\$1set\$1binlog\$1source\$1ssl (Aurora MySQL バージョン 3)
<a name="mysql_rds_set_binlog_source_ssl"></a>

バイナリログレプリケーションの `SOURCE_SSL` 暗号化を有効にします。詳細については、MySQL ドキュメントの「[CHANGE REPLICATION SOURCE TO ステートメント](https://dev.mysql.com/doc/refman/8.0/en/change-replication-source-to.html)」を参照してください。

### 構文
<a name="mysql_rds_set_binlog_source_ssl-syntax"></a>

```
CALL mysql.rds_set_binlog_source_ssl(mode);
```

### パラメータ
<a name="mysql_rds_set_binlog_source_ssl-parameters"></a>

*モード*  
`SOURCE_SSL` 暗号化が有効になっているかを示す次の値:  
+ `0` – `SOURCE_SSL` 暗号化は無効になっています。デフォルトは `0` です。
+ `1` – `SOURCE_SSL` 暗号化は有効にされています。SSL または TLS を使用して暗号化を設定できます。

### 使用に関する注意事項
<a name="mysql_rds_set_binlog_source_ssl-usage"></a>

このプロシージャは、Aurora MySQL バージョン 3.06 以降でサポートされています。

## mysql.rds\$1set\$1external\$1master (Aurora MySQL バージョン 2)
<a name="mysql_rds_set_external_master"></a>

Aurora MySQL DB インスタンスを、Amazon RDS の外部で実行している MySQL インスタンスのリードレプリカとして使用するように設定します。

`mysql.rds_set_external_master` プロシージャは廃止されており、将来のリリースでは削除されます。代わりに `mysql.rds\$1set\$1external\$1source` を使用します。

**重要**  
この手順を実行するには、`autocommit` を有効にする必要があります。これを有効にするには、`autocommit` パラメータを `1` に設定します。パラメータの変更については、「[Amazon Aurora の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。

### 構文
<a name="mysql_rds_set_external_master-syntax"></a>

 

```
CALL mysql.rds_set_external_master (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , mysql_binary_log_file_name
  , mysql_binary_log_file_location
  , ssl_encryption
);
```

### パラメータ
<a name="mysql_rds_set_external_master-parameters"></a>

 *host\$1name*   
出典データベースインスタンスとなる、Amazon RDS の外部で動作する MySQL インスタンスのホスト名または IP アドレス。

 *host\$1port*   
Amazon RDS の外部で動作する MySQL インスタンス (出典データベースインスタンス) で使用されるポート。ポート番号を変換する Secure Shell (SSH) ポートのレプリケーションがネットワーク設定に含まれる場合、SSH によって発行されるポート番号を指定します。

 *replication\$1user\$1name*   
Amazon RDS の外部で実行される MySQL インスタンスの `REPLICATION CLIENT` および `REPLICATION SLAVE` のアクセス許可を持つユーザーの ID。外部インスタンスのレプリケーション専用のアカウントを使用することをお勧めします。

 *replication\$1user\$1password*   
`replication_user_name` で指定されたユーザー ID のパスワード。

 *mysql\$1binary\$1log\$1file\$1name*   
レプリケーション情報を含む出典データベースインスタンス上のバイナリログの名前。

 *mysql\$1binary\$1log\$1file\$1location*   
`mysql_binary_log_file_name` バイナリログ内の場所。レプリケーションでは、この場所からレプリケーション情報の読み取りをスタートします。  
binlog ファイルの名前と場所は、`SHOW MASTER STATUS`出典データベースインスタンス上で実行することによって決定できます。

 *ssl\$1encryption*   
レプリケーション接続で Secure Socket Layer (SSL) 暗号化を使用するかどうかを指定する値。1 は SSL 暗号化を使用することを指定し、0 は暗号化を使用しないことを指定します。デフォルトは 0 です。  
`MASTER_SSL_VERIFY_SERVER_CERT` オプションはサポートされていません。このオプションは 0 に設定されます。つまり、接続は暗号化されますが、証明書は検証されません。

### 使用に関する注意事項
<a name="mysql_rds_set_external_master-usage-notes"></a>

マスターユーザーが `mysql.rds_set_external_master` を実行する必要があります。このプロシージャは、Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとして設定される MySQL DB インスタンス上で実行する必要があります。

`mysql.rds_set_external_master` を実行する前に、Amazon RDS の外部で動作する MySQL インスタンスを出典データベースインスタンスとして必ず設定してください。Amazon RDS の外部で動作する MySQL インスタンスに接続するには、MySQL の外部インスタンスの `replication_user_name` および `replication_user_password` アクセス権限を持つレプリケーションユーザーを示す `REPLICATION CLIENT` および `REPLICATION SLAVE` の値を指定する必要があります。

**MySQL の外部インスタンスを出典データベースインスタンスとして設定するには**

1. 選択した MySQL クライアントを使用して、MySQL の外部インスタンスに接続し、レプリケーションに使用されるユーザーアカウントを作成します。以下に例を示します。

   **MySQL 5.7**

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';
   ```

   **MySQL 8.0**

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED WITH mysql_native_password BY 'password';
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

1. MySQL の外部インスタンスで、`REPLICATION CLIENT` と `REPLICATION SLAVE` の権限をレプリケーションユーザーに付与します。次の例では、ドメインの 「repl\$1user」ユーザーに、すべてのデータベースの `REPLICATION CLIENT` および `REPLICATION SLAVE` 権限を付与します。

   **MySQL 5.7**

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';
   ```

   **MySQL 8.0**

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com';
   ```

暗号化されたレプリケーションを使用するには、SSL 接続を使用するようにソースデータベースインスタンスを設定します。また、[mysql.rds\$1import\$1binlog\$1ssl\$1material](#mysql_rds_import_binlog_ssl_material) 手順を使用して、DB インスタンスあるいは DB クラスターに認証局証明書、クライアント証明書およびクライアントキーをインポートします。

**注記**  
これらのストアドプロシージャは、主に Amazon RDS 外部で実行されている MySQL インスタンスのレプリケーションの有効化のために提供されています。可能な場合は、Aurora MySQL DB クラスター内のレプリケーションを管理するために、Aurora レプリカを使用することをお勧めします。Aurora MySQL DB クラスターでのレプリカの管理については、「[Aurora レプリカの使用](AuroraMySQL.Replication.md#AuroraMySQL.Replication.Replicas)」を参照してください。

`mysql.rds_set_external_master` を呼び出して Amazon RDS DB インスタンスをリードレプリカとして設定した後で、このリードレプリカで [mysql.rds\$1start\$1replication](#mysql_rds_start_replication) を呼び出してレプリケーションプロセスをスタートできます。[mysql.rds\$1reset\$1external\$1master (Aurora MySQL バージョン 2)](#mysql_rds_reset_external_master) を呼び出して、リードレプリカの設定を削除することもできます。

`mysql.rds_set_external_master` が呼び出されると、Amazon RDS では、時刻、ユーザー、`set master` アクションが `mysql.rds_history` テーブルと `mysql.rds_replication_status` テーブルに記録されます。

### 例
<a name="mysql_rds_set_external_master-examples"></a>

MySQL DB インスタンス上で実行すると、DB インスタンスが Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとして設定されます。次に例を示します。

```
call mysql.rds_set_external_master(
  'Externaldb.some.com',
  3306,
  'repl_user',
  'password',
  'mysql-bin-changelog.0777',
  120,
  1);
```

## mysql.rds\$1set\$1external\$1source (Aurora MySQL バージョン 3)
<a name="mysql_rds_set_external_source"></a>

Aurora MySQL DB インスタンスを、Amazon RDS の外部で実行している MySQL インスタンスのリードレプリカとして使用するように設定します。

**重要**  
この手順を実行するには、`autocommit` を有効にする必要があります。これを有効にするには、`autocommit` パラメータを `1` に設定します。パラメータの変更については、「[Amazon Aurora の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。

### 構文
<a name="mysql_rds_set_external_source-syntax"></a>

 

```
CALL mysql.rds_set_external_source (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , mysql_binary_log_file_name
  , mysql_binary_log_file_location
  , ssl_encryption
);
```

### パラメータ
<a name="mysql_rds_set_external_source-parameters"></a>

 *host\$1name*   
出典データベースインスタンスとなる、Amazon RDS の外部で動作する MySQL インスタンスのホスト名または IP アドレス。

 *host\$1port*   
Amazon RDS の外部で動作する MySQL インスタンス (出典データベースインスタンス) で使用されるポート。ポート番号を変換する Secure Shell (SSH) ポートのレプリケーションがネットワーク設定に含まれる場合、SSH によって発行されるポート番号を指定します。

 *replication\$1user\$1name*   
Amazon RDS の外部で実行される MySQL インスタンスの `REPLICATION CLIENT` および `REPLICATION SLAVE` のアクセス許可を持つユーザーの ID。外部インスタンスのレプリケーション専用のアカウントを使用することをお勧めします。

 *replication\$1user\$1password*   
`replication_user_name` で指定されたユーザー ID のパスワード。

 *mysql\$1binary\$1log\$1file\$1name*   
レプリケーション情報を含む出典データベースインスタンス上のバイナリログの名前。

 *mysql\$1binary\$1log\$1file\$1location*   
`mysql_binary_log_file_name` バイナリログ内の場所。レプリケーションでは、この場所からレプリケーション情報の読み取りをスタートします。  
binlog ファイルの名前と場所は、`SHOW MASTER STATUS`出典データベースインスタンス上で実行することによって決定できます。

 *ssl\$1encryption*   
レプリケーション接続で Secure Socket Layer (SSL) 暗号化を使用するかどうかを指定する値。1 は SSL 暗号化を使用することを指定し、0 は暗号化を使用しないことを指定します。デフォルトは 0 です。  
このオプションを有効にするには、[mysql.rds\$1import\$1binlog\$1ssl\$1material](#mysql_rds_import_binlog_ssl_material) を使用してカスタム SSL 証明書をインポートしておく必要があります。カスタム SSL 証明書をインポートしていない場合は、このパラメータを 0 に設定し、[mysql.rds\$1set\$1binlog\$1source\$1ssl (Aurora MySQL バージョン 3)](#mysql_rds_set_binlog_source_ssl) を使用してバイナリログレプリケーション用の SSL を有効にします。  
`SOURCE_SSL_VERIFY_SERVER_CERT` オプションはサポートされていません。このオプションは 0 に設定されます。つまり、接続は暗号化されますが、証明書は検証されません。

### 使用に関する注意事項
<a name="mysql_rds_set_external_source-usage-notes"></a>

管理ユーザーは、`mysql.rds_set_external_source`プロシージャを実行すべきです。このプロシージャは、Amazon RDS の外部で実行している MySQL インスタンスのリードレプリカとして設定される Aurora MySQL DB インスタンス上で実行する必要があります。

 `mysql.rds_set_external_source` を実行する前に、Amazon RDS の外部で動作する MySQL インスタンスを出典データベースインスタンスとして必ず設定してください。Amazon RDS の外部で動作する MySQL インスタンスに接続するには、MySQL の外部インスタンスの `replication_user_name` および `replication_user_password` アクセス権限を持つレプリケーションユーザーを示す `REPLICATION CLIENT` および `REPLICATION SLAVE` の値を指定する必要があります。

**MySQL の外部インスタンスを出典データベースインスタンスとして設定するには**

1. 選択した MySQL クライアントを使用して、MySQL の外部インスタンスに接続し、レプリケーションに使用されるユーザーアカウントを作成します。以下に例を示します。

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

1. MySQL の外部インスタンスで、`REPLICATION CLIENT` と `REPLICATION SLAVE` の権限をレプリケーションユーザーに付与します。次の例では、ドメインの 「repl\$1user」ユーザーに、すべてのデータベースの `REPLICATION CLIENT` および `REPLICATION SLAVE` 特権を付与します。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com';
   ```

暗号化されたレプリケーションを使用するには、SSL 接続を使用するように出典データベースインスタンスを設定します。また、[mysql.rds\$1import\$1binlog\$1ssl\$1material](url-rds-user;mysql_rds_import_binlog_ssl_material.html) プロシージャを使用して、DB インスタンスまたは DB クラスターに認証局証明書、クライアント証明書、およびクライアントキーをインポートします。

**注記**  
これらのストアドプロシージャは、主に Amazon RDS 外部で実行されている MySQL インスタンスのレプリケーションの有効化のために提供されています。可能な場合は、Aurora MySQL DB クラスター内のレプリケーションを管理するために、Aurora レプリカを使用することをお勧めします。Aurora MySQL DB クラスターでのレプリカの管理については、「[Aurora レプリカの使用](AuroraMySQL.Replication.md#AuroraMySQL.Replication.Replicas)」を参照してください。

`mysql.rds_set_external_source` を呼び出して Aurora MySQL DB インスタンスをリードレプリカとして設定したら、このリードレプリカで [mysql.rds\$1start\$1replication](#mysql_rds_start_replication) を呼び出してレプリケーションプロセスを開始できます。[mysql.rds\$1reset\$1external\$1source (Aurora MySQL バージョン 3)](#mysql_rds_reset_external_source) を呼び出して、リードレプリカの設定を削除することもできます。

`mysql.rds_set_external_source` が呼び出されると、Amazon RDS では、時刻、ユーザー、`set master` アクションが `mysql.rds_history` テーブルと `mysql.rds_replication_status` テーブルに記録されます。

### 例
<a name="mysql_rds_set_external_source-examples"></a>

Aurora MySQL DB インスタンスで実行すると、次の例に示されているように、DB インスタンスが Amazon RDS の外部で実行されている MySQL インスタンスのリードレプリカとして設定されます。

```
call mysql.rds_set_external_source(
  'Externaldb.some.com',
  3306,
  'repl_user',
  'password',
  'mysql-bin-changelog.0777',
  120,
  1);
```

## mysql.rds\$1set\$1external\$1master\$1with\$1auto\$1position (Aurora MySQL バージョン 2)
<a name="mysql_rds_set_external_master_with_auto_position"></a>

外部の MySQL インスタンスからの受信レプリケーションを受け入れるように Aurora MySQL プライマリインスタンスを設定します。このプロシージャでも、グローバルトランザクション識別子 (GTIDs) に基づき、レプリケーションが設定されます。

Aurora MySQL は遅延レプリケーションをサポートしていないため、この手順では遅延レプリケーションは設定されません。

### 構文
<a name="mysql_rds_set_external_master_with_auto_position-syntax"></a>

```
CALL mysql.rds_set_external_master_with_auto_position (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , ssl_encryption
);
```

### パラメータ
<a name="mysql_rds_set_external_master_with_auto_position-parameters"></a>

*host\$1name*  
 レプリケーションソースとなる、Aurora の外部で動作する MySQL インスタンスのホスト名または IP アドレス。

*host\$1port*  
 Aurora の外部で動作する MySQL インスタンス (レプリケーションソース) で使用されるポート。ポート番号を変換する Secure Shell (SSH) ポートのレプリケーションがネットワーク設定に含まれる場合、SSH によって発行されるポート番号を指定します。

*replication\$1user\$1name*  
 Aurora の外部で実行される MySQL インスタンスの `REPLICATION CLIENT` および `REPLICATION SLAVE` のアクセス許可を持つユーザーの ID。外部インスタンスのレプリケーション専用のアカウントを使用することをお勧めします。

*replication\$1user\$1password*  
`replication_user_name` で指定されたユーザー ID のパスワード。

*ssl\$1encryption*  
このオプションは、現在実装されていません。デフォルトは 0 です。

### 使用に関する注意事項
<a name="mysql_rds_set_external_master_with_auto_position-usage-notes"></a>

Aurora MySQL DB クラスターでは、プライマリインスタンスに接続されている間に、このストアドプロシージャを呼び出します。

マスターユーザーが `mysql.rds_set_external_master_with_auto_position` を実行する必要があります。マスターユーザーは、レプリケーションターゲットとして機能する Aurora MySQL DB クラスターのプライマリインスタンスでこのプロシージャを実行します。例えば、外部の MySQL DB インスタンスまたは Aurora MySQL DB クラスターのレプリケーションターゲットになります。

この手順は Aurora MySQL バージョン 2 でサポートされています。Aurora MySQL バージョン 3 の場合は、[mysql.rds\$1set\$1external\$1source\$1with\$1auto\$1position (Aurora MySQL バージョン 3)](#mysql_rds_set_external_source_with_auto_position)代わりにプロシージャを使用します。

`mysql.rds_set_external_master_with_auto_position` を実行する前に、外部の MySQL DB インスタンスがレプリケーションソースになるように設定します。外部の MySQL インスタンスに接続するには、`replication_user_name` および `replication_user_password` の値を指定します。これらの値を使用して、MySQL の外部インスタンスで `REPLICATION CLIENT` および `REPLICATION SLAVE` アクセス許可を持つレプリケーションユーザーを示す必要があります。

**外部の MySQL インスタンスをレプリケーションソースとして設定するには**

1. 選択した MySQL クライアントを使用して、外部の MySQL インスタンスに接続し、レプリケーションに使用されるユーザーアカウントを作成します。次に例を示します。

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
   ```

1. 外部の MySQL インスタンスで、`REPLICATION CLIENT` と `REPLICATION SLAVE` の特権をレプリケーションユーザーに付与します。次の例では、ドメインの `REPLICATION CLIENT` ユーザーに、すべてのデータベースの `REPLICATION SLAVE` および `'repl_user'` 権限を付与します。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com'
   IDENTIFIED BY 'SomePassW0rd'
   ```

`mysql.rds_set_external_master_with_auto_position` を呼び出すと、Amazon RDS によって特定の情報が記録されます。この情報には、時刻、ユーザー、`"set master"` の `mysql.rds_history` テーブルの `mysql.rds_replication_status` のアクションがあります。

問題の原因となることが知られている特定の GTID ベースの処理をスキップするには、[mysql.rds\$1skip\$1transaction\$1with\$1gtid (Aurora MySQL バージョン 2 および 3)](mysql-stored-proc-gtid.md#mysql_rds_skip_transaction_with_gtid) ストアドプロシージャを使用します。GTID ベースのレプリケーションの使用に関する詳細については、「[GTID ベースレプリケーションを使用する](mysql-replication-gtid.md)」を参照してください。

### 例
<a name="mysql_rds_set_external_master_with_auto_position-examples"></a>

 Aurora プライマリインスタンス上で実行すると、以下の例では、Aurora の外部で動作する MySQL のインスタンスのリードレプリカとして動作するように Aurora クラスターを設定します。

```
call mysql.rds_set_external_master_with_auto_position(
  'Externaldb.some.com',
  3306,
  'repl_user'@'mydomain.com',
  'SomePassW0rd');
```

## mysql.rds\$1set\$1external\$1source\$1with\$1auto\$1position (Aurora MySQL バージョン 3)
<a name="mysql_rds_set_external_source_with_auto_position"></a>

外部の MySQL インスタンスからの受信レプリケーションを受け入れるように Aurora MySQL プライマリインスタンスを設定します。このプロシージャでも、グローバルトランザクション識別子 (GTIDs) に基づき、レプリケーションが設定されます。

### 構文
<a name="mysql_rds_set_external_source_with_auto_position-syntax"></a>

```
CALL mysql.rds_set_external_source_with_auto_position (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , ssl_encryption
);
```

### パラメータ
<a name="mysql_rds_set_external_source_with_auto_position-parameters"></a>

*host\$1name*  
 レプリケーションソースとなる、Aurora の外部で動作する MySQL インスタンスのホスト名または IP アドレス。

*host\$1port*  
 Aurora の外部で動作する MySQL インスタンス (レプリケーションソース) で使用されるポート。ポート番号を変換する Secure Shell (SSH) ポートのレプリケーションがネットワーク設定に含まれる場合、SSH によって発行されるポート番号を指定します。

*replication\$1user\$1name*  
 Aurora の外部で実行される MySQL インスタンスの `REPLICATION CLIENT` および `REPLICATION SLAVE` のアクセス許可を持つユーザーの ID。外部インスタンスのレプリケーション専用のアカウントを使用することをお勧めします。

*replication\$1user\$1password*  
 `replication_user_name` で指定されたユーザー ID のパスワード。

*ssl\$1encryption*  
このオプションは、現在実装されていません。デフォルトは 0 です。  
[mysql.rds\$1set\$1binlog\$1source\$1ssl (Aurora MySQL バージョン 3)](#mysql_rds_set_binlog_source_ssl) を使用して、バイナリログレプリケーション用の SSL を有効にします。

### 使用に関する注意事項
<a name="mysql_rds_set_external_source_with_auto_position-usage-notes"></a>

 Aurora MySQL DB クラスターでは、プライマリインスタンスに接続されている間に、このストアドプロシージャを呼び出します。

 管理ユーザーは、`mysql.rds_set_external_source_with_auto_position`プロシージャを実行しなければなりません。管理ユーザーは、レプリケーションターゲットとして機能する Aurora MySQL DB クラスターのプライマリインスタンスでこのプロシージャを実行します。例えば、外部の MySQL DB インスタンスまたは Aurora MySQL DB クラスターのレプリケーションターゲットになります。

このプロシージャは Aurora MySQL バージョン 3 でサポートされています。Aurora MySQL は遅延レプリケーションをサポートしていないため、この手順では遅延レプリケーションは設定されません。

 `mysql.rds_set_external_source_with_auto_position` を実行する前に、外部の MySQL DB インスタンスがレプリケーションソースになるように設定します。外部の MySQL インスタンスに接続するには、`replication_user_name` および `replication_user_password` の値を指定します。これらの値を使用して、MySQL の外部インスタンスで `REPLICATION CLIENT` および `REPLICATION SLAVE` アクセス許可を持つレプリケーションユーザーを示す必要があります。

**外部の MySQL インスタンスをレプリケーションソースとして設定するには**

1.  選択した MySQL クライアントを使用して、外部の MySQL インスタンスに接続し、レプリケーションに使用されるユーザーアカウントを作成します。次に例を示します。

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
   ```

1.  外部の MySQL インスタンスで、`REPLICATION CLIENT` と `REPLICATION SLAVE` の特権をレプリケーションユーザーに付与します。次の例では、ドメインの `REPLICATION CLIENT` ユーザーに、すべてのデータベースの `REPLICATION SLAVE` および `'repl_user'` 権限を付与します。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com'
   IDENTIFIED BY 'SomePassW0rd'
   ```

 `mysql.rds_set_external_source_with_auto_position` を呼び出すと、Amazon RDS によって特定の情報が記録されます。この情報には、時刻、ユーザー、`"set master"` の `mysql.rds_history` テーブルの `mysql.rds_replication_status` のアクションがあります。

 問題の原因となることが知られている特定の GTID ベースの処理をスキップするには、[mysql.rds\$1skip\$1transaction\$1with\$1gtid (Aurora MySQL バージョン 2 および 3)](mysql-stored-proc-gtid.md#mysql_rds_skip_transaction_with_gtid) ストアドプロシージャを使用します。GTID ベースのレプリケーションの使用に関する詳細については、「[GTID ベースレプリケーションを使用する](mysql-replication-gtid.md)」を参照してください。

### 例
<a name="mysql_rds_set_external_source_with_auto_position-examples"></a>

 Aurora プライマリインスタンス上で実行すると、以下の例では、Aurora の外部で動作する MySQL のインスタンスのリードレプリカとして動作するように Aurora クラスターを設定します。

```
call mysql.rds_set_external_source_with_auto_position(
  'Externaldb.some.com',
  3306,
  'repl_user'@'mydomain.com',
  'SomePassW0rd');
```

## mysql.rds\$1set\$1master\$1auto\$1position (Aurora MySQL バージョン 2)
<a name="mysql_rds_set_master_auto_position"></a>

バイナリログファイルの位置、または、グローバルトランザクション識別子 (GTID) ベースのレプリケーションモードを設定します。

### 構文
<a name="mysql_rds_set_master_auto_position-syntax"></a>

 

```
CALL mysql.rds_set_master_auto_position (
auto_position_mode
);
```

### パラメータ
<a name="mysql_rds_set_master_auto_position-parameters"></a>

 *auto\$1position\$1mode*   
ファイルの位置に基づくレプリケーション、または GTID ベースのレプリケーションかどうかを示す値:  
+ `0` - バイナリログファイルの位置に基づくレプリケーション方法を使用します。デフォルトは `0` です。
+ `1` - GTID ベースのレプリケーション方法を使用します。

### 使用に関する注意事項
<a name="mysql_rds_set_master_auto_position-usage-notes"></a>

マスターユーザーが `mysql.rds_set_master_auto_position` を実行する必要があります。

この手順は Aurora MySQL バージョン 2 でサポートされています。

## mysql.rds\$1set\$1read\$1only (Aurora MySQL バージョン 3)
<a name="mysql_rds_set_read_only"></a>

DB インスタンスの `read_only` モードをグローバルにオンまたはオフにします。

### 構文
<a name="mysql_rds_set_read_only-syntax"></a>

```
CALL mysql.rds_set_read_only(mode);
```

### パラメータ
<a name="mysql_rds_set_read_only-parameters"></a>

*モード*  
DB インスタンスの `read_only` モードがグローバルにオンまたはオフになっているかを示す値。  
+ `0` – `OFF`。デフォルトは `0` です。
+ `1` – `ON`

### 使用に関する注意事項
<a name="mysql_rds_set_read_only-usage"></a>

`mysql.rds_set_read_only` ストアドプロシージャは `read_only` パラメータのみを変更します。`innodb_read_only` パラメータはリーダー DB インスタンスでは変更できません。

`read_only` パラメータの変更は再起動しても持続しません。`read_only` に永続的な変更を加えるには、`read_only` DB クラスターパラメータを使用する必要があります。

このプロシージャは、Aurora MySQL バージョン 3.06 以降でサポートされています。

## mysql.rds\$1set\$1session\$1binlog\$1format (Aurora MySQL バージョン 2)
<a name="mysql_rds_set_session_binlog_format"></a>

現在のセッションのバイナリログ形式を設定します。

### 構文
<a name="mysql_rds_set_session_binlog_format-syntax"></a>

```
CALL mysql.rds_set_session_binlog_format(format);
```

### パラメータ
<a name="mysql_rds_set_session_binlog_format-parameters"></a>

*format*  
現在のセッションのバイナリログ形式を示す値:  
+ `STATEMENT` — レプリケーションソースは、SQL ステートメントに基づいてバイナリログにイベントを書き込みます。
+ `ROW` — レプリケーションソースは、個々のテーブル行の変更を示すイベントをバイナリログに書き込みます。
+ `MIXED` — ロギングは通常、SQL ステートメントに基づきますが、特定の条件下では行に切り替わります。詳細については、MySQL ドキュメントの「[混合バイナリログ形式](https://dev.mysql.com/doc/refman/8.0/en/binary-log-mixed.html)」を参照してください。

### 使用に関する注意事項
<a name="mysql_rds_set_session_binlog_format-usage"></a>

Aurora MySQL DB クラスターでは、プライマリインスタンスに接続されている間に、このストアドプロシージャを呼び出します。

このストアドプロシージャを使用するには、現在のセッションに対してバイナリログが設定されている必要があります。

Aurora では、このプロシージャは Aurora MySQL バージョン 2.12 以降の MySQL 5.7 互換バージョンでサポートされています。

## mysql.rds\$1set\$1source\$1auto\$1position (Aurora MySQL バージョン 3)
<a name="mysql_rds_set_source_auto_position"></a>

バイナリログファイルの位置、または、グローバルトランザクション識別子 (GTIDs) ベースのレプリケーションモードを設定します。

### 構文
<a name="mysql_rds_set_source_auto_position-syntax"></a>

```
CALL mysql.rds_set_source_auto_position (auto_position_mode);
```

### パラメータ
<a name="mysql_rds_set_source_auto_position-parameters"></a>

*auto\$1position\$1mode*  
ファイルの位置に基づくレプリケーション、または GTID ベースのレプリケーションかどうかを示す値:  
+  `0` - バイナリログファイルの位置に基づくレプリケーション方法を使用します。デフォルトは `0` です。
+  `1` - GTID ベースのレプリケーション方法を使用します。

### 使用に関する注意事項
<a name="mysql_rds_set_source_auto_position-usage-notes"></a>

Aurora MySQL DB クラスターでは、プライマリインスタンスに接続されている間に、このストアドプロシージャを呼び出します。

管理ユーザーは、`mysql.rds_set_source_auto_position`プロシージャを実行すべきです。

## mysql.rds\$1skip\$1repl\$1error
<a name="mysql_rds_skip_repl_error"></a>

MySQL DB リードレプリカのレプリケーションエラーをスキップして、削除します。

### 構文
<a name="mysql_rds_skip_repl_error-syntax"></a>

 

```
CALL mysql.rds_skip_repl_error;
```

### 使用に関する注意事項
<a name="mysql_rds_skip_repl_error-usage-notes"></a>

マスターユーザーはリードレプリカに対して `mysql.rds_skip_repl_error` プロシージャを実行する必要があります。この手順の詳細については、「[Skipping the current replication error](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.MySQL.CommonDBATasks.html#Appendix.MySQL.CommonDBATasks.SkipError)」(現在のレプリケーションエラーをスキップする) を参照してください。

MySQL の `SHOW REPLICA STATUS\G` コマンドを実行して、エラーがあるかどうかを判断します。レプリケーションエラーが重要ではない場合、`mysql.rds_skip_repl_error` を実行して、エラーをスキップすることができます。複数のエラーがある場合、`mysql.rds_skip_repl_error` では、初期のエラーを削除してから、他のエラーが存在することを警告します。その後で `SHOW REPLICA STATUS\G` を使用して、次のエラーに対処するための適切な対応方法を判断することができます。戻り値の詳細については、MySQL ドキュメントの「[SHOW REPLICA STATUS statement](https://dev.mysql.com/doc/refman/8.0/en/show-replica-status.html)」を参照してください。

Aurora MySQL でのレプリケーションエラーの対処方法の詳細については、「[MySQL のリードレプリケーションのエラーの診断と解決](CHAP_Troubleshooting.md#CHAP_Troubleshooting.MySQL.RR)」を参照してください。

#### レプリケーション停止エラー
<a name="skip_repl_error.stopped-error"></a>

`mysql.rds_skip_repl_error` プロシージャを呼び出すと、レプリカがダウンしているか無効であることを示すエラーメッセージが表示されることがあります。

このエラーメッセージは、リードレプリカではなくプライマリインスタンスでプロシージャを実行した場合に表示されます。このプロシージャを機能させるには、リードレプリカに対してこのプロシージャを実行する必要があります。

このエラーメッセージは、リードレプリカに対してプロシージャを実行したが、レプリケーションを正常に再開できない場合にも表示されることがあります。

多数のエラーをスキップする必要がある場合は、レプリケーションの遅延により、バイナリログ (binlog) ファイルがデフォルトの保持期間を超えて増大する場合があります。この場合、binlog ファイルがリードレプリカで再生される前に破棄されるため、致命的なエラーが発生することがあります。この破棄によりレプリケーションが停止し、`mysql.rds_skip_repl_error` コマンドを呼び出してレプリケーションエラーをスキップすることができなくなります。

この問題は、出典データベースインスタンスでバイナリログファイルの保持時間を増加させることで軽減できます。バイナリログ保持時間を長くすると、レプリケーションを再開し、必要に応じて `mysql.rds_skip_repl_error` コマンドを使用できるようになります。

バイナリログの保持期間を設定するには、「[mysql.rds\$1set\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_set_configuration)」の手順を使用して、DB クラスターのバイナリログファイルの保持期間に合わせて、`'binlog retention hours'` の設定パラメータを指定します。以下の例では、バイナリログファイルの保持期間を 48 時間に設定しています。

```
CALL mysql.rds_set_configuration('binlog retention hours', 48);
```

## mysql.rds\$1start\$1replication
<a name="mysql_rds_start_replication"></a>

Aurora MySQL DB クラスターからのレプリケーションを開始します。

**注記**  
[mysql.rds\$1start\$1replication\$1until(Aurora MySQL バージョン 3)](#mysql_rds_start_replication_until) または [mysql.rds\$1start\$1replication\$1until\$1gtid(Aurora MySQL バージョン 3)](mysql-stored-proc-gtid.md#mysql_rds_start_replication_until_gtid) ストアドプロシージャを使用して、Aurora MySQL DB インスタンスからのレプリケーションを開始し、指定したバイナリログファイルの場所でレプリケーションを停止できます。

### 構文
<a name="mysql_rds_start_replication-syntax"></a>

 

```
CALL mysql.rds_start_replication;
```

### 使用に関する注意事項
<a name="mysql_rds_start_replication-usage-notes"></a>

マスターユーザーが `mysql.rds_start_replication` を実行する必要があります。

Amazon RDS の外部の MySQL インスタンスからデータをインポートするには、[mysql.rds\$1set\$1external\$1master (Aurora MySQL バージョン 2)](#mysql_rds_set_external_master) または [mysql.rds\$1set\$1external\$1source (Aurora MySQL バージョン 3)](#mysql_rds_set_external_source) を呼び出してレプリケーション設定を構築した後、リードレプリカに対して `mysql.rds_start_replication` を呼び出して、レプリケーションプロセスを開始します。詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。

Amazon RDS の外部の MySQL インスタンスにデータをエクスポートするには、リードレプリカに対して `mysql.rds_start_replication` と `mysql.rds_stop_replication` を呼び出して、バイナリログの消去などのレプリケーションアクションを制御します。詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。

リードレプリカで `mysql.rds_start_replication` を呼び出すことで、`mysql.rds_stop_replication` の呼び出しによって前に停止したレプリケーションプロセスを再開することもできます。詳細については、「[レプリケーション停止エラー](CHAP_Troubleshooting.md#CHAP_Troubleshooting.MySQL.ReplicationStopped)」を参照してください。

## mysql.rds\$1start\$1replication\$1until(Aurora MySQL バージョン 3)
<a name="mysql_rds_start_replication_until"></a>

Aurora MySQL DB クラスターからレプリケーションを開始し、指定したバイナリログファイルの場所でレプリケーションを停止します。

### 構文
<a name="mysql_rds_start_replication_until-syntax"></a>

 

```
CALL mysql.rds_start_replication_until (
replication_log_file
  , replication_stop_point
);
```

### パラメータ
<a name="mysql_rds_start_replication_until-parameters"></a>

 *replication\$1log\$1file*   
レプリケーション情報を含む出典データベースインスタンス上のバイナリログの名前。

 *replication\$1stop\$1point *   
`replication_log_file` バイナリログ内でレプリケーションが停止する場所。

### 使用に関する注意事項
<a name="mysql_rds_start_replication_until-usage-notes"></a>

マスターユーザーが `mysql.rds_start_replication_until` を実行する必要があります。

この手順は Aurora MySQL バージョン 3.04 以降でサポートされています。

`mysql.rds_start_replication_until` ストアドプロシージャは、以下を含むマネージドレプリケーションではサポートされていません。
+ [AWS リージョン 間での Amazon Aurora MySQL DB クラスターのレプリケーション](AuroraMySQL.Replication.CrossRegion.md)
+ [Aurora リードレプリカを使用した、RDS for MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターへのデータの移行](AuroraMySQL.Migrating.RDSMySQL.Replica.md)

`replication_log_file` パラメータに指定するファイル名は、出典データベースインスタンスの binlog ファイル名と一致する必要があります。

`replication_stop_point`パラメータで指定した停止場所が過去の時点である場合、レプリケーションは即座に停止します。

### 例
<a name="mysql_rds_start_replication_until-examples"></a>

次の例では、レプリケーションをスタートし、`120` バイナリログファイルの場所 `mysql-bin-changelog.000777` に達するまで変更をレプリケートします。

```
call mysql.rds_start_replication_until(
  'mysql-bin-changelog.000777',
  120);
```

## mysql.rds\$1stop\$1replication
<a name="mysql_rds_stop_replication"></a>

MySQL DB インスタンスからのレプリケーションを停止します。

### 構文
<a name="mysql_rds_stop_replication-syntax"></a>

 

```
CALL mysql.rds_stop_replication;
```

### 使用に関する注意事項
<a name="mysql_rds_stop_replication-usage-notes"></a>

マスターユーザーが `mysql.rds_stop_replication` を実行する必要があります。

Amazon RDS の外部で動作する MySQL インスタンスからデータをインポートするようにレプリケーションを設定している場合は、リードレプリカで `mysql.rds_stop_replication` を呼び出して、インポートが完了した後でレプリケーションプロセスを停止することができます。詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。

Amazon RDS の外部にある MySQL インスタンスにデータをエクスポートするようにレプリケーションを設定している場合は、リードレプリカで `mysql.rds_start_replication` と `mysql.rds_stop_replication` を呼び出して、バイナリログの消去などのレプリケーションアクションを制御できます。詳細については、「[Aurora と MySQL との間、または Aurora と別の Aurora DB クラスターとの間のレプリケーション (バイナリログレプリケーション)](AuroraMySQL.Replication.MySQL.md)」を参照してください。

`mysql.rds_stop_replication` ストアドプロシージャは、以下を含むマネージドレプリケーションではサポートされていません。
+ [AWS リージョン 間での Amazon Aurora MySQL DB クラスターのレプリケーション](AuroraMySQL.Replication.CrossRegion.md)
+ [Aurora リードレプリカを使用した、RDS for MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターへのデータの移行](AuroraMySQL.Migrating.RDSMySQL.Replica.md)

# セッションやクエリの終了
<a name="mysql-stored-proc-ending"></a>

次のストアドプロシージャは、セッションまたはクエリを終了します。

**Topics**
+ [mysql.rds\$1kill](#mysql_rds_kill)
+ [mysql.rds\$1kill\$1query](#mysql_rds_kill_query)

## mysql.rds\$1kill
<a name="mysql_rds_kill"></a>

MySQL サーバーへの接続を終了します。

### 構文
<a name="mysql_rds_kill-syntax"></a>

```
CALL mysql.rds_kill(processID);
```

### パラメータ
<a name="mysql_rds_kill-parameters"></a>

 *processID*   
終了する接続スレッドの識別子。

### 使用に関する注意事項
<a name="mysql_rds_kill-usage-notes"></a>

MySQL サーバーへの個々の接続は別々のスレッドで実行されます。接続を終了するには、`mysql.rds_kill` プロシージャを使用して、その接続のスレッド ID を渡します。スレッド ID を取得するには、MySQL の [PROCESSLIST](https://dev.mysql.com/doc/refman/8.0/en/show-processlist.html) コマンドを使用します。

### 例
<a name="mysql_rds_kill-examples"></a>

次の例では、4243 のスレッド ID を持つ接続を終了します。

```
CALL mysql.rds_kill(4243);
```

## mysql.rds\$1kill\$1query
<a name="mysql_rds_kill_query"></a>

MySQL サーバーに対して実行中のクエリを終了します。

### 構文
<a name="mysql_rds_kill_query-syntax"></a>

```
CALL mysql.rds_kill_query(processID);
```

### パラメータ
<a name="mysql_rds_kill_query-parameters"></a>

 *processID*   
終了するクエリを実行しているプロセスまたはスレッドの ID。

### 使用に関する注意事項
<a name="mysql_rds_kill_query-usage-notes"></a>

MySQL サーバーに対して実行しているクエリを終了するには、`mysql_rds_kill_query` プロシージャを使用して、クエリを実行しているスレッドの接続 ID を渡します。これにより、プロシージャは接続を終了します。

ID を取得するには、MySQL [INFORMATION\$1SCHEMA PROCESSLIST テーブル](https://dev.mysql.com/doc/refman/8.0/en/information-schema-processlist-table.html)または MySQL [SHOW PROCESSLIST](https://dev.mysql.com/doc/refman/8.0/en/show-processlist.html) コマンドを使用します。`SHOW PROCESSLIST` または `SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST` の ID 列の値は *processID* です。

### 例
<a name="mysql_rds_kill_query-examples"></a>

次の例では、クエリスレッド ID が 230040 のクエリを停止します。

```
CALL mysql.rds_kill_query(230040);
```

# GTID を使用したトランザクションのレプリケーション
<a name="mysql-stored-proc-gtid"></a>

以下のストアドプロシージャは、Aurora MySQL でグローバルトランザクション識別子 (GTID) を使用してトランザクションをレプリケートする方法を制御します。Aurora MySQL を使用して、GTID に基づきレプリケーションを使用する方法については、「[GTID ベースレプリケーションを使用する](mysql-replication-gtid.md)」を参照してください。

**Topics**
+ [mysql.rds\$1assign\$1gtids\$1to\$1anonymous\$1transactions (Aurora MySQL バージョン 3)](#mysql_assign_gtids_to_anonymous_transactions)
+ [mysql.rds\$1gtid\$1purged (Aurora MySQL バージョン 3)](#mysql_rds_gtid_purged)
+ [mysql.rds\$1skip\$1transaction\$1with\$1gtid (Aurora MySQL バージョン 2 および 3)](#mysql_rds_skip_transaction_with_gtid)
+ [mysql.rds\$1start\$1replication\$1until\$1gtid(Aurora MySQL バージョン 3)](#mysql_rds_start_replication_until_gtid)

## mysql.rds\$1assign\$1gtids\$1to\$1anonymous\$1transactions (Aurora MySQL バージョン 3)
<a name="mysql_assign_gtids_to_anonymous_transactions"></a>

を設定します。`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`のオプション`CHANGE REPLICATION SOURCE TO`表示されます。これにより、レプリケーションチャネルが GTID を持たないレプリケートされたトランザクションに割り当てられます。このように、GTID ベースのレプリケーションを使用しないソースから、使用するレプリカに対してバイナリログレプリケーションを実行できます。詳細については、「[CHANGE REPLICATION SOURCE TO Statement」を参照してください。](https://dev.mysql.com/doc/refman/8.0/en/change-replication-source-to.html)そして[GTIDs のないソースから GTIDs を使用したレプリカへのレプリケーション](https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-assign-anon.html)の*MySQL リファレンスマニュアル*を参照してください。

### 構文
<a name="mysql_assign_gtids_to_anonymous_transactions-syntax"></a>

```
CALL mysql.rds_assign_gtids_to_anonymous_transactions(gtid_option);
```

### パラメータ
<a name="mysql_assign_gtids_to_anonymous_transactions-parameters"></a>

 *gtid\$1option*  
文字列値。指定できる値は次のとおりです。`OFF`,`LOCAL`、または指定された UUID。

### 使用に関する注意事項
<a name="mysql_assign_gtids_to_anonymous_transactions-usage-notes"></a>

このプロシージャは、コミュニティMySQLでステートメントの発行と同じ効果があります`CHANGE REPLICATION SOURCE TO ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS = gtid_option`。

 GTID を`ON`に変える必要があります*にとってgtid\$1option*または設定される`LOCAL`または特定の UUIDに設定されます。

デフォルトは `OFF` であり、この機能が使用されないことを意味します。

`LOCAL`レプリカ独自の UUID を含む GTID を割り当てます (`server_uuid`設定)。

UUID であるパラメータを渡すと、指定された UUID を含む GTID が割り当てられます。`server_uuid`レプリケーションソースサーバーの設定。

### 例
<a name="mysql_assign_gtids_to_anonymous_transactions-examples"></a>

この特徴をオフにするには、次の手順を実行します:

```
mysql> call mysql.rds_assign_gtids_to_anonymous_transactions('OFF');
+-------------------------------------------------------------+
| Message  |
+-------------------------------------------------------------+
| ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS has been set to: OFF |
+-------------------------------------------------------------+
1 row in set (0.07 sec)
```

レプリカ独自の UUID を使用するには、次の手順を実行します:

```
mysql> call mysql.rds_assign_gtids_to_anonymous_transactions('LOCAL');
+---------------------------------------------------------------+
| Message  |
+---------------------------------------------------------------+
| ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS has been set to: LOCAL |
+---------------------------------------------------------------+
1 row in set (0.07 sec)
```

指定した UUID を使用するには、次の手順を実行します:

```
mysql> call mysql.rds_assign_gtids_to_anonymous_transactions('317a4760-f3dd-3b74-8e45-0615ed29de0e');
+----------------------------------------------------------------------------------------------+
| Message |
+----------------------------------------------------------------------------------------------+
| ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS has been set to: 317a4760-f3dd-3b74-8e45-0615ed29de0e |
+----------------------------------------------------------------------------------------------+
1 row in set (0.07 sec)
```

## mysql.rds\$1gtid\$1purged (Aurora MySQL バージョン 3)
<a name="mysql_rds_gtid_purged"></a>



システム変数 `gtid_purged` のグローバル値を特定のグローバルトランザクション識別子 (GTID) セットに設定します。`gtid_purged` システム変数は、サーバー上でコミットされたが、サーバー上のどのバイナリログファイルにも存在しないすべてのトランザクションの GTID で構成される GTID セットです。

MySQL 8.0 との互換性を保つため、`gtid_purged` の値を設定する方法が 2 つあります。
+ `gtid_purged` の値を、指定した GTID セットに置き換えます。
+ 指定した GTID セットを `gtid_purged` が既に含んでいる GTID セットに追加します。

### 構文
<a name="mysql_rds_gtid_purged-syntax"></a>

`gtid_purged` の値を、指定した GTID セットに置き換えるには

```
CALL mysql.rds_gtid_purged (gtid_set);
```

`gtid_purged` の値を、指定した GTID セットに追加するには

```
CALL mysql.rds_gtid_purged (+gtid_set);
```

### パラメータ
<a name="mysql_rds_gtid_purged-parameters"></a>

*gtid\$1set*  
*gtid\$1set* の値は、`gtid_purged` の現在値のスーパーセットでなければならず、`gtid_subtract(gtid_executed,gtid_purged)` と交差することはできません。つまり、新しい GTID セットには、`gtid_purged` に既に存在していた GTID がすべて含まれている必要がありますが、まだパージされていなかった `gtid_executed` 内の GTID を含むことはできません。また、*gtid\$1set* パラメータは、グローバル `gtid_owned` セットにある GTID、サーバー上で現在処理中のトランザクションの GTID を含むことはできません。

### 使用に関する注意事項
<a name="mysql_rds_gtid_purged-usage-notes"></a>

マスターユーザーが `mysql.rds_gtid_purged` を実行する必要があります。

この手順は Aurora MySQL バージョン 3.04 以降でサポートされています。

### 例
<a name="mysql_rds_gtid_purged-examples"></a>

次の例では、GTID `3E11FA47-71CA-11E1-9E33-C80AA9429562:23` を `gtid_purged` グローバル変数に代入します。

```
CALL mysql.rds_gtid_purged('3E11FA47-71CA-11E1-9E33-C80AA9429562:23');
```

## mysql.rds\$1skip\$1transaction\$1with\$1gtid (Aurora MySQL バージョン 2 および 3)
<a name="mysql_rds_skip_transaction_with_gtid"></a>

Aurora プライマリインスタンスで、指定されたグローバルトランザクション識別子 (GTID) のあるトランザクションのレプリケーションをスキップします。

特定の GTID トランザクションが問題の原因となることが知られている場合、障害復旧のためにこのプロシージャを使用できます。このストアドプロシージャを使用して、問題となるトランザクションをスキップします。問題のあるトランザクションの例には、レプリケーションを無効にしたり、重要なデータを削除したり、DB インスタンスを利用不可にするトランザクションが含まれます。

### 構文
<a name="mysql_rds_skip_transaction_with_gtid-syntax"></a>

 

```
CALL mysql.rds_skip_transaction_with_gtid (
gtid_to_skip
);
```

### パラメータ
<a name="mysql_rds_skip_transaction_with_gtid-parameters"></a>

 *gtid\$1to\$1skip*   
スキップするレプリケーショントランザクションの GTID。

### 使用に関する注意事項
<a name="mysql_rds_skip_transaction_with_gtid-usage-notes"></a>

マスターユーザーが `mysql.rds_skip_transaction_with_gtid` を実行する必要があります。

この手順は Aurora MySQL バージョン 2 および 3 でサポートされています。

### 例
<a name="mysql_rds_skip_transaction_with_gtid-examples"></a>

次の例では、GTID `3E11FA47-71CA-11E1-9E33-C80AA9429562:23` を使用したトランザクションのレプリケーションをスキップします。

```
CALL mysql.rds_skip_transaction_with_gtid('3E11FA47-71CA-11E1-9E33-C80AA9429562:23');
```

## mysql.rds\$1start\$1replication\$1until\$1gtid(Aurora MySQL バージョン 3)
<a name="mysql_rds_start_replication_until_gtid"></a>

Aurora MySQL DB クラスターからのレプリケーションを開始し、指定したグローバルトランザクション識別子 (GTID) の後でレプリケーションを停止します。

### 構文
<a name="mysql_rds_start_replication_until_gtid-syntax"></a>

 

```
CALL mysql.rds_start_replication_until_gtid(gtid);
```

### パラメータ
<a name="mysql_rds_start_replication_until_gtid-parameters"></a>

 *gtid*   
レプリケーションがその後で停止する GTID。

### 使用に関する注意事項
<a name="mysql_rds_start_replication_until_gtid-usage-notes"></a>

マスターユーザーが `mysql.rds_start_replication_until_gtid` を実行する必要があります。

この手順は Aurora MySQL バージョン 3.04 以降でサポートされています。

`mysql.rds_start_replication_until_gtid` ストアドプロシージャは、以下を含むマネージドレプリケーションではサポートされていません。
+ [AWS リージョン 間での Amazon Aurora MySQL DB クラスターのレプリケーション](AuroraMySQL.Replication.CrossRegion.md)
+ [Aurora リードレプリカを使用した、RDS for MySQL DB インスタンスから Amazon Aurora MySQL DB クラスターへのデータの移行](AuroraMySQL.Migrating.RDSMySQL.Replica.md)

`gtid`パラメータで指定したトランザクションがレプリカによって既に実行されている場合、レプリケーションは即座に停止します。

### 例
<a name="mysql_rds_start_replication_until_gtid-examples"></a>

次の例では、レプリケーションをスタートし、GTID `3E11FA47-71CA-11E1-9E33-C80AA9429562:23` に達するまで変更をレプリケートします。

```
call mysql.rds_start_replication_until_gtid('3E11FA47-71CA-11E1-9E33-C80AA9429562:23');
```

# クエリログのローテーション
<a name="mysql-stored-proc-logging"></a>

以下のストアドプロシージャは、MySQL ログをバックアップテーブルにローテーションします。詳細については、「[Aurora MySQL データベースのログファイル](USER_LogAccess.Concepts.MySQL.md)」を参照してください。

**Topics**
+ [mysql.rds\$1rotate\$1general\$1log](#mysql_rds_rotate_general_log)
+ [mysql.rds\$1rotate\$1slow\$1log](#mysql_rds_rotate_slow_log)

## mysql.rds\$1rotate\$1general\$1log
<a name="mysql_rds_rotate_general_log"></a>

`mysql.general_log` テーブルをバックアップテーブルとしてローテーションさせます。

### 構文
<a name="mysql_rds_rotate_general_log-syntax"></a>

 

```
CALL mysql.rds_rotate_general_log;
```

### 使用に関する注意事項
<a name="mysql_rds_rotate_general_log-usage-notes"></a>

`mysql.general_log` テーブルのバックアップテーブルとしてのローテーションは、`mysql.rds_rotate_general_log` プロシージャを呼び出すことで実行できます。ログテーブルのローテーションが実行されると、現在のログテーブルがバックアップのログテーブルにコピーされ、現在のログテーブル内にあるエントリは削除されます。バックアップのログテーブルがすでに存在する場合は、現在のログテーブルをバックアップにコピーする前に、削除されます。バックアップのログテーブルは、必要に応じて照会することができます。`mysql.general_log` テーブルに対するバックアップのログテーブルは、`mysql.general_log_backup` という名前になります。

`log_output` パラメータが `TABLE` に設定されている場合にのみ、このプロシージャを実行できます。

## mysql.rds\$1rotate\$1slow\$1log
<a name="mysql_rds_rotate_slow_log"></a>

`mysql.slow_log` テーブルをバックアップテーブルとしてローテーションさせます。

### 構文
<a name="mysql_rds_rotate_slow_log-syntax"></a>

 

```
CALL mysql.rds_rotate_slow_log;
```

### 使用に関する注意事項
<a name="mysql_rds_rotate_slow_log-usage-notes"></a>

`mysql.slow_log` テーブルのバックアップテーブルとしてのローテーションは、`mysql.rds_rotate_slow_log` プロシージャを呼び出すことで実行できます。ログテーブルのローテーションが実行されると、現在のログテーブルがバックアップのログテーブルにコピーされ、現在のログテーブル内にあるエントリは削除されます。バックアップのログテーブルがすでに存在する場合は、現在のログテーブルをバックアップにコピーする前に、削除されます。

バックアップのログテーブルは、必要に応じて照会することができます。`mysql.slow_log` テーブルに対するバックアップのログテーブルは、`mysql.slow_log_backup` という名前になります。

# バイナリログ構成の設定と表示
<a name="mysql-stored-proc-configuring"></a>

次のストアドプロシージャは、バイナリログファイルの保存などの設定パラメータを設定および表示します。

**Topics**
+ [mysql.rds\$1set\$1configuration](#mysql_rds_set_configuration)
+ [mysql.rds\$1show\$1configuration](#mysql_rds_show_configuration)

## mysql.rds\$1set\$1configuration
<a name="mysql_rds_set_configuration"></a>

バイナリログを保持する時間数またはレプリケーションを遅延させる秒数を指定します。

### 構文
<a name="mysql_rds_set_configuration-syntax"></a>

 

```
CALL mysql.rds_set_configuration(name,value);
```

### パラメータ
<a name="mysql_rds_set_configuration-parameters"></a>

 *.name*   
設定する設定パラメータの名前。

 *値*   
設定パラメータの値。

### 使用に関する注意事項
<a name="mysql_rds_set_configuration-usage-notes"></a>

`mysql.rds_set_configuration` プロシージャは、以下の設定パラメータをサポートしています。
+ [バイナリログの保持時間](#mysql_rds_set_configuration-usage-notes.binlog-retention-hours)

設定パラメータは永続的に保存され、DB インスタンスの再起動やフェイルオーバー後も存続します。

#### バイナリログの保持時間
<a name="mysql_rds_set_configuration-usage-notes.binlog-retention-hours"></a>

`binlog retention hours` パラメータは、バイナリログファイルを保持する時間数を指定するために使用されます。Amazon Aurora では、通常、バイナリログは可能な限りすみやかに消去されますが、Aurora の外部にある MySQL データベースでのレプリケーションのためにバイナリログが必要になる場合があります。

`binlog retention hours` の初期値は `NULL` です。Aurora MySQL の場合、`NULL` はバイナリログが遅延してクリーンアップされることを意味します。Aurora MySQL バイナリログは、一定期間 (通常は 1 日以内)、システムに残ることがあります。

DB クラスターのバイナリログを保持する時間数を指定するには、`mysql.rds_set_configuration` ストアドプロシージャを使用して、次の例のように、レプリケーションを実行するのに十分な期間を指定します。

`call mysql.rds_set_configuration('binlog retention hours', 24);`

**注記**  
`binlog retention hours` には、値 `0` は使用できません。

Aurora MySQL バージョン 2.11.0 以降、およびバージョン 3 DB クラスターの場合、最大 `binlog retention hours` 値は 2160 (90 日) です。

保持期間を設定したら、DB インスタンスのストレージ使用状況をモニタリングして、保持されたバイナリログに必要以上の容量が使用されないようにします。

## mysql.rds\$1show\$1configuration
<a name="mysql_rds_show_configuration"></a>

バイナリログを保持する時間数。

### 構文
<a name="mysql_rds_show_configuration-syntax"></a>

 

```
CALL mysql.rds_show_configuration;
```

### 使用に関する注意事項
<a name="mysql_rds_show_configuration-usage-notes"></a>

Amazon RDS がバイナリログを保持する時間数を確認するには、`mysql.rds_show_configuration` ストアドプロシージャを使用します。

### 例
<a name="mysql_rds_show_configuration-examples"></a>

以下の例では、保持期間を表示しています。

```
call mysql.rds_show_configuration;
                name                         value     description
                binlog retention hours       24        binlog retention hours specifies the duration in hours before binary logs are automatically deleted.
```

# Aurora MySQL — 固有の information\$1schema テーブル
<a name="AuroraMySQL.Reference.ISTables"></a>

Aurora MySQL には、Aurora に固有の特定の `information_schema` テーブルがあります。

## information\$1schema.aurora\$1global\$1db\$1instance\$1status
<a name="AuroraMySQL.Reference.ISTables.aurora_global_db_instance_status"></a>

`information_schema.aurora_global_db_instance_status` テーブルには、グローバルデータベースのプライマリ DB クラスターとセカンダリ DB クラスター内のすべての DB インスタンスのステータスに関する情報が含まれています。使用できる列を次の表に示します。残りの列は Aurora 内部でのみ使用されます。

**注記**  
この情報スキーマテーブルは、Aurora MySQL バージョン 3.04.0 以降のグローバルデータベースでのみ使用できます。


| 列 | データ型 | 説明 | 
| --- | --- | --- | 
| SERVER\$1ID | varchar(100) | DB インスタンスの ID。 | 
| SESSION\$1ID | varchar(100) | 現在のセッションの一意識別子。MASTER\$1SESSION\$1ID の値は、Writer (プライマリ) DB インスタンスを識別します。 | 
| AWS\$1REGION | varchar(100) | このグローバルデータベースインスタンスが実行する AWS リージョン。リージョンのリストについては、「[リージョンの可用性](Concepts.RegionsAndAvailabilityZones.md#Aurora.Overview.Availability)」を参照してください。 | 
| DURABLE\$1LSN | bigint unsigned | ストレージで耐久性のあるログシーケンス番号 (LSN)。ログシーケンス番号 (LSN) は、データベーストランザクションログ内のレコードを識別する一意の連続番号です。LSN は、より大きな LSN が後のトランザクションを表すように順序付けられます。 | 
| HIGHEST\$1LSN\$1RCVD | bigint unsigned | ライター DB インスタンスから DB インスタンスが受信した最も高い LSN。 | 
| OLDEST\$1READ\$1VIEW\$1TRX\$1ID | bigint unsigned | ライター DB インスタンスがパージできる最も古いトランザクションの ID。 | 
| OLDEST\$1READ\$1VIEW\$1LSN | bigint unsigned | ストレージから読み取るために DB インスタンスが使用した最も古い LSN。 | 
| VISIBILITY\$1LAG\$1IN\$1MSEC | float(10,0) unsigned | プライマリ DB クラスターのリーダーの場合、この DB インスタンスがライター DB インスタンスよりどれだけ遅れているか (ミリ秒単位)。セカンダリ DB クラスターのリーダーの場合、この DB インスタンスがセカンダリボリュームからどれだけ遅れているかをミリ秒単位で示します。 | 

## information\$1schema.aurora\$1global\$1db\$1status
<a name="AuroraMySQL.Reference.ISTables.aurora_global_db_status"></a>

`information_schema.aurora_global_db_status` テーブルには、Aurora グローバルデータベースの遅延のさまざまな側面に関する情報が含まれています。具体的には、基盤となる Aurora ストレージの遅延 (いわゆる耐久性の遅延) と目標復旧時点 (RPO) 間の遅延などです。使用できる列を次の表に示します。残りの列は Aurora 内部でのみ使用されます。

**注記**  
この情報スキーマテーブルは、Aurora MySQL バージョン 3.04.0 以降のグローバルデータベースでのみ使用できます。


| 列 | データ型 | 説明 | 
| --- | --- | --- | 
| AWS\$1REGION | varchar(100) | このグローバルデータベースインスタンスが実行する AWS リージョン。リージョンのリストについては、「[リージョンの可用性](Concepts.RegionsAndAvailabilityZones.md#Aurora.Overview.Availability)」を参照してください。 | 
| HIGHEST\$1LSN\$1WRITTEN | bigint unsigned | この DB クラスターに現在存在するログシーケンス番号 (LSN) の最大値。ログシーケンス番号 (LSN) は、データベーストランザクションログ内のレコードを識別する一意の連続番号です。LSN は、より大きな LSN が後のトランザクションを表すように順序付けられます。 | 
| DURABILITY\$1LAG\$1IN\$1MILLISECONDS | float(10,0) unsigned | セカンダリ DB クラスターの HIGHEST\$1LSN\$1WRITTEN とプライマリ DB クラスターの HIGHEST\$1LSN\$1WRITTEN とのタイムスタンプ値の差。この値は、Aurora グローバルデータベースのプライマリ DB クラスターでは常に 0 です。 | 
| RPO\$1LAG\$1IN\$1MILLISECONDS | float(10,0) unsigned | 目標復旧時点 (RPO) の遅延。RPO 遅延とは、最近のユーザートランザクション COMMIT が、Aurora グローバルデータベースのプライマリ DB クラスターに保存された後、セカンダリ DB クラスターに保存されるまでにかかる時間です。この値は、Aurora グローバルデータベースのプライマリ DB クラスターでは常に 0 です。 簡単に言うと、このメトリクスは、Aurora グローバルデータベース内の各 Aurora MySQL DB クラスターの目標復旧時点、つまり、障害が発生した場合に失われる可能性のあるデータの量を計算します。遅延と同様に、RPO は時間単位で測定されます。 | 
| LAST\$1LAG\$1CALCULATION\$1TIMESTAMP | datetime | DURABILITY\$1LAG\$1IN\$1MILLISECONDS と RPO\$1LAG\$1IN\$1MILLISECONDS について値が最後に計算された時刻を指定するタイムスタンプ。1970-01-01 00:00:00\$100 のような時間値は、これがプライマリ DB クラスターであることを意味します。 | 
| OLDEST\$1READ\$1VIEW\$1TRX\$1ID | bigint unsigned | ライター DB インスタンスがパージできる最も古いトランザクションの ID。 | 

## information\$1schema.replica\$1host\$1status
<a name="AuroraMySQL.Reference.ISTables.replica_host_status"></a>

`information_schema.replica_host_status` テーブルにはレプリケーション情報が含まれています。使用できる列を以下のテーブルに示します。残りの列は Aurora 内部でのみ使用されます。


| 列 | データ型 | 説明 | 
| --- | --- | --- | 
| CPU | double | レプリカホストの CPU 使用率。 | 
| IS\$1CURRENT | tinyint | レプリカが最新かどうか。 | 
| LAST\$1UPDATE\$1TIMESTAMP | datetime(6) | 前回の更新が行われた時刻。レコードが古くなっているかどうかを判断するために使用されます。 | 
| REPLICA\$1LAG\$1IN\$1MILLISECONDS | double | ミリ秒単位でのレプリカ遅延。 | 
| SERVER\$1ID | varchar(100) | データベースサーバーの ID。 | 
| SESSION\$1ID | varchar(100) | データベースセッションの ID。DB インスタンスがライターインスタンスかリーダーインスタンスかを判断するために使用されます。 | 

**注記**  
レプリカインスタンスが遅延すると、その `information_schema.replica_host_status` テーブルからクエリされる情報が古くなることがあります。このような状況では、代わりにライターインスタンスからクエリを実行することをお勧めします。  
`mysql.ro_replica_status` テーブルにも同様の情報がありますが、使用することは推奨されません。

## information\$1schema.aurora\$1forwarding\$1processlist
<a name="AuroraMySQL.Reference.ISTables.aurora_forwarding_processlist"></a>

`information_schema.aurora_forwarding_processlist` テーブルには、書き込み転送に関係するプロセスについての情報が含まれています。

このテーブルの内容は、グローバルまたはクラスター内書き込み転送がオンになっている DB クラスターのライター DB インスタンスでのみ表示されます。リーダー DB インスタンスでは、空の結果セットが返されます。


| フィールド | データ型 | 説明 | 
| --- | --- | --- | 
| ID | bigint | ライター DB インスタンス上の接続の識別子。この識別子は、SHOW PROCESSLIST ステートメントの Id 列に表示され、スレッド内の CONNECTION\$1ID() 関数によって返される値と同じです。 | 
| USER | varCHAR(32) | ステートメントを発行した MySQL ユーザー。 | 
| HOST | varCHAR(255) | ステートメントを発行した MySQL クライアント。転送されたステートメントの場合、このフィールドには、転送側リーダー DB インスタンスで接続を確立したアプリケーションクライアントのホストアドレスが表示されます。 | 
| DB | varCHAR(64) | スレッドのデフォルトデータベース。 | 
| コマンド | varCHAR(16) | スレッドがクライアントに代わって実行しているコマンドのタイプ、またはセッションがアイドル状態の場合は Sleep。スレッドコマンドの説明については、MySQL ドキュメントの「[スレッドコマンド値](https://dev.mysql.com/doc/refman/8.0/en/thread-commands.html)」を参照してください。 | 
| TIME | 整数 | スレッドが現在の状態になっていた時間 (秒単位)。 | 
| STATE | varCHAR(64) | スレッドが何をしているのかを示すアクション、イベント、または状態。状態値の説明については、MySQL ドキュメントの「[一般的なスレッドの状態](https://dev.mysql.com/doc/refman/8.0/en/general-thread-states.html)」を参照してください。 | 
| INFO | longtext | スレッドが実行しているステートメント、またはステートメントを実行していない場合は NULL。ステートメントは、サーバーに送信されるステートメントかもしれず、ステートメントが他のステートメントを実行する場合は最も内側のステートメントかもしれません。 | 
| IS\$1FORWARDED | bigint | スレッドがリーダー DB インスタンスから転送されるかどうかを示します。 | 
| REPLICA\$1SESSION\$1ID | bigint | Aurora レプリカの接続識別子。この識別子は、転送側の Aurora リーダー DB インスタンスで SHOW PROCESSLIST ステートメントの Id 列に表示されるのと同じ値です。 | 
| REPLICA\$1INSTANCE\$1IDENTIFIER | varCHAR(64) | 転送側スレッドの DB インスタンス識別子。 | 
| REPLICA\$1CLUSTER\$1NAME | varCHAR(64) | 転送側スレッドの DB クラスター識別子。クラスター内書き込み転送の場合、この識別子は、ライター DB インスタンスと同じ DB クラスターです。 | 
| REPLICA\$1REGION | varCHAR(64) | 転送側スレッドの送信元の AWS リージョン。クラスター内書き込み転送の場合、このリージョンは、ライター DB インスタンスと同じ AWS リージョン です。 | 

# Amazon Aurora MySQL のデータベースエンジンの更新
<a name="AuroraMySQL.Updates"></a><a name="mysql_relnotes"></a>

Amazon Aurora は定期的に更新をリリースします。更新はシステムメンテナンスの時間中に Aurora DB クラスターに適用されます。更新が適用されるタイミングは、リージョンや DB クラスターのメンテナンスウィンドウの設定、および更新のタイプによって異なります。

Amazon Aurora のリリースは、数日のうちに、すべての AWS リージョンで使用可能になります。一部のリージョンでは、別のリージョンではまだ使用できないエンジンバージョンが一時的に表示されることがあります。

 更新は、DB クラスター内のすべてのインスタンスに同時に適用されます。更新では、DB クラスター内のすべてのインスタンスでデータベースを再起動する必要があるため、20 ～ 30 秒のダウンタイムが発生します。その後、DB クラスターの使用を再開できます。[AWS マネジメントコンソール](https://console.aws.amazon.com/) でメンテナンスウィンドウの設定を表示または変更できます。

Amazon Aurora でサポートされている Aurora MySQL バージョンの詳細については、[https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/Welcome.html](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/Welcome.html)を参照してください。

 次に、クラスターに適した Aurora MySQL バージョンを選択する方法、クラスターの作成時またはアップグレード時にバージョンを指定する方法、最小限の中断でクラスターを特定のバージョンから別のバージョンにアップグレードする手順を確認できます。

**Topics**
+ [Aurora MySQL のバージョン番号の確認](AuroraMySQL.Updates.Versions.md)
+ [Amazon Aurora MySQL の長期サポート (LTS) とベータリリース](AuroraMySQL.Update.SpecialVersions.md)
+ [Amazon Aurora MySQL 互換エディションバージョン 2 の標準サポート終了に向けて準備する](Aurora.MySQL57.EOL.md)
+ [Amazon Aurora MySQL 互換エディションバージョン 1 のサポート終了に向けて準備する](Aurora.MySQL56.EOL.md)
+ [Amazon Aurora MySQL DB クラスターのアップグレード](AuroraMySQL.Updates.Upgrading.md)
+ [Amazon Aurora MySQL に関するデータベースエンジンの更新と修正](AuroraMySQL.Updates.RN.md)

# Aurora MySQL のバージョン番号の確認
<a name="AuroraMySQL.Updates.Versions"></a>

 Aurora MySQL 互換エディション は MySQL データベースエンジンと互換性がありますが、Aurora MySQL には Aurora MySQL のバージョン別に固有の機能とバグ修正が含まれています。アプリケーションデベロッパーは、SQL を使用して、アプリケーションの Aurora MySQL バージョンを確認できます。データベース管理者は、Aurora MySQL DB クラスターと DB インスタンスの作成時またはアップグレード時に、Aurora MySQL のバージョンを確認および指定できます。

**Topics**
+ [AWS による Aurora MySQL エンジンバージョンの確認または指定](#AuroraMySQL.Updates.EngineVersions)
+ [SQL を使用した Aurora MySQL バージョンの確認](#AuroraMySQL.Updates.DBVersions)

## AWS による Aurora MySQL エンジンバージョンの確認または指定
<a name="AuroraMySQL.Updates.EngineVersions"></a>

 AWS マネジメントコンソール、AWS CLI、あるいは RDS API のいずれかを使用して管理タスクを実行する際に、わかりやすい英数字形式で Aurora MySQL バージョンを指定します。

 Aurora MySQL 2 から、Aurora エンジンバージョンの構文は次のとおりです。

```
mysql-major-version.mysql_aurora.aurora-mysql-version
```

 `mysql-major-version-` 部分は `5.7` または `8.0` です。この値は、クライアントプロトコルのバージョンと、対応する Aurora MySQL バージョンでの一般的なレベルの MySQL 機能のサポートを表します。

 `aurora-mysql-version` は、Aurora MySQL メジャーバージョン、Aurora MySQL マイナーバージョン、パッチレベルの 3 つのパートからなるドット付きの値です。メジャーバージョンは `2` または `3` です。これらの値は、MySQL 5.7 または 8.0 と互換性がある Aurora MySQL をそれぞれ表しています。マイナーバージョンは、2.x または 3.x シリーズ内の機能リリースを表します。パッチレベルは、各マイナーバージョンで `0` から始まり、マイナーバージョンに適用される以降の一連のバグ修正を表します。まれに、新しい機能がマイナーバージョンに組み込まれ、すぐには表示されないことがあります。このような場合、この機能はチューニングされ、後のパッチレベルで公開されます。

すべての 2.x Aurora MySQL エンジンバージョンは、コミュニティ MySQL 5.7.12 以上とワイヤー互換性があります。すべての 3.x Aurora MySQL エンジンバージョンは、MySQL 8.0.23 以上とワイヤー互換性があります。特定の 3.x バージョンのリリースノートを参照して、対応する MySQL 互換バージョンを検索することができます。

例えば、Aurora MySQL 3.04.0 と 2.11.2 のエンジンバージョンは、次のとおりです。

```
8.0.mysql_aurora.3.04.0
5.7.mysql_aurora.2.11.2
```

**注記**  
コミュニティ MySQL バージョンと Aurora MySQL 2.x バージョンとの間には、1 対 1 の対応はありません。Aurora MySQL バージョン 3 では、より直接的なマッピングがあります。特定の Aurora MySQL リリースにどのバグ修正と新しい機能があるかを確認するには、*Aurora MySQL のリリースノート*の「[Amazon Aurora MySQL バージョン 3 のデータベースエンジンの更新](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html)」と「[Amazon Aurora MySQL バージョン 2 のデータベースエンジンの更新](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.20Updates.html)」を参照してください。新機能とリリースの時系列リストについては、「[ドキュメント履歴](WhatsNew.md)」を参照してください。セキュリティ関連の修正に必要な最小バージョンを確認するには、*Aurora MySQL のリリースノート*の「[Aurora MySQL で修正されたセキュリティの脆弱性](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.CVE_list.html)」を参照してください。

Aurora MySQL エンジンバージョンは、AWS CLI コマンドと RDS API オペレーションで指定します。例えば、`--engine-version` オプションは、AWS CLI の [create-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html) コマンドと [modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html) コマンドを実行するときに指定します。`EngineVersion` パラメータは、RDS API の [CreateDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBCluster.html) オペレーションと [ModifyDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBCluster.html) オペレーションを実行するときに指定します。

Aurora MySQL バージョン 2 以降では、AWS マネジメントコンソール のエンジンバージョンに Aurora バージョンも含まれます。クラスターのアップグレードに伴って、表示される値が変わります。この変更により、クラスターに接続したり、SQL コマンドを実行せずに、Aurora MySQL の正確なバージョンを指定および確認できます。

**ヒント**  
CloudFormation を通じて管理される Aurora クラスターの場合、この `EngineVersion` 設定の変更に伴って、CloudFormation によるアクションがトリガーされる場合があります。CloudFormation 設定の変更を `EngineVersion` で処理する方法については、[CloudFormation のドキュメント](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html)を参照してください。

## SQL を使用した Aurora MySQL バージョンの確認
<a name="AuroraMySQL.Updates.DBVersions"></a>

 SQL クエリを使用してアプリケーションで取得できる Aurora バージョン番号は、形式として `<major version>.<minor version>.<patch version>` を使用します 。`AURORA_VERSION` システム可変をクエリすることで、Aurora MySQL クラスター内の任意の DB インスタンスについて、このバージョン番号を取得できます。このバージョン番号を取得するには、次のいずれかのクエリを使用します。

```
select aurora_version();
select @@aurora_version;
```

 これらのクエリは、次のような出力を生成します。

```
mysql> select aurora_version(), @@aurora_version;
+------------------+------------------+
| aurora_version() | @@aurora_version |
+------------------+------------------+
| 3.05.2           | 3.05.2           |
+------------------+------------------+
```

 「[AWS による Aurora MySQL エンジンバージョンの確認または指定](#AuroraMySQL.Updates.EngineVersions)」で説明している手法でコンソール、CLI、および RDS API によって返されるバージョン番号は、通常、より分かりやすいものです。

# Amazon Aurora MySQL の長期サポート (LTS) とベータリリース
<a name="AuroraMySQL.Update.SpecialVersions"></a>

Aurora MySQL は、一部の Aurora MySQL エンジンバージョンに対して長期サポート (LTS) とベータリリースを提供します。

**Topics**
+ [Aurora MySQL 長期サポート (LTS) リリース](#AuroraMySQL.Updates.LTS)
+ [Aurora MySQL ベータリリース](#AuroraMySQL.Updates.Beta)

## Aurora MySQL 長期サポート (LTS) リリース
<a name="AuroraMySQL.Updates.LTS"></a>

新しい Aurora MySQL バージョンは、それぞれ DB クラスターを作成またはアップグレードする際に一定期間使用できます。この期間後は、そのバージョンを使用するためにクラスターをアップグレードする必要があります。サポート期間終了の際にクラスターを手動でアップグレード、または Aurora MySQL バージョンがサポートされなくなると同時に Aurora は自動的にアップグレードできます。

Aurora は、特定の Aurora MySQL バージョンを長期サポート (LTS) のリリースとして指定します。LTS リリースを使用する DB クラスターは、非 LTS リリースを使用するクラスターよりも同じバージョンに長くとどまるので、アップグレードサイクルの数は少なくなります。LTS リリースを使用するデータベースクラスターは、少なくとも 3 年間、またはメジャーバージョンの標準サポートの終了のいずれか早い方まで、同じマイナーバージョンを維持できます。LTS リリースにある DB クラスターをアップグレードする必要がある場合、Aurora は次の LTS リリースにアップグレードされます。これで、クラスターを長時間再度アップグレードする必要はありません。

Aurora MySQL LTS リリースの存続期間中、新しいパッチレベルは重要な問題の修正を導入します。パッチレベルには、新しい機能は含まれていません。LTS リリースを実行している DB クラスターに、このようなパッチを適用するかどうかを選択できます。LTS マイナーバージョンの最新のパッチリリースにアップグレードするには、LTS リリースを実行しているお客様に、少なくとも 1 年に 1 回、重要度の高いセキュリティと運用上の修正を活用することをお勧めします。特定の重要な修正については、Amazon は同じ LTS リリース内のパッチレベルへのマネージドアップグレードを実行する場合があります。そのようなマネージドアップグレードは、クラスターのメンテナンスウィンドウで自動的に実行されます。すべての Aurora MySQL リリース (LTS リリースと非 LTS リリースの両方) は、広範な安定性と運用テストを受けています。一部のマイナーバージョンは LTS リリースとして指定され、お客様は新しいマイナーバージョンにアップグレードすることなく、それらのマイナーバージョンをより長く維持できます。

ほとんど Aurora MySQL クラスターでは、LTS リリースを使用する代わりに、最新リリースへのアップグレードを推奨します。これにより、マネージドサービスとして Aurora を利用して最新の機能とバグ修正にアクセスできます。LTS リリースは、次の特性を持つクラスターを対象としています。
+ 重要なパッチの稀な問題以外のアップグレードのために、Aurora MySQL アプリケーションのダウンタイムに対応する余裕はありません。
+ クラスターおよび関連アプリケーションのテストサイクルは、Aurora MySQL データベースエンジンの更新ごとに時間がかかります。
+ Aurora MySQL クラスターのデータベースバージョンには、アプリケーションに必要なすべての DB エンジン機能とバグ修正が含まれています。

Aurora MySQL の現在の LTS リリースは以下のとおりです。
+ Aurora MySQL バージョン 3.10.\$1 
+ Aurora MySQL バージョン 3.04.\$1 

LTS バージョンの詳細については、「*Aurora MySQL のリリースノート*」の「[Amazon Aurora MySQL バージョン 3 のデータベースエンジンのアップデート](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html)」を参照してください。

**注記**  
LTS バージョンの自動マイナーバージョンアップグレードを無効にすることをお勧めします。`AutoMinorVersionUpgrade` パラメータを `false` に設定するか、AWS マネジメントコンソールの **[マイナーバージョン自動アップグレードの有効化]** チェックボックスをオフにします。  
無効にしない場合、DB クラスターが非 LTS バージョンにアップグレードされる可能性があります。

## Aurora MySQL ベータリリース
<a name="AuroraMySQL.Updates.Beta"></a>

Aurora MySQL ベータリリースは、限定された数の AWS リージョン でのセキュリティ修正限定の早期リリースです。これらの修正は、次回のパッチリリースで対象範囲を広げ、すべてのリージョンにデプロイされる予定です。

ベータリリースの番号付けは、Aurora MySQL マイナーバージョンと似ていますが、2.12.0.1 や 3.05.0.1 など、4 桁目があります。

詳細については、*Aurora MySQL のリリースノート*の「[Amazon Aurora MySQL バージョン 2 データベースエンジンの更新](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.20Updates.html)」と「[Amazon Aurora MySQL バージョン 3 のデータベースエンジンの更新](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html)」を参照してください。

# Amazon Aurora MySQL 互換エディションバージョン 2 の標準サポート終了に向けて準備する
<a name="Aurora.MySQL57.EOL"></a>

Amazon Aurora MySQL 互換エディション バージョン 2 (MySQL 5.7 互換) は 2024 年 10 月 31 日に標準サポートを終了する予定です。Aurora MySQL バージョン 2 の標準サポート期間が終了する前に、Aurora MySQL バージョン 2 を実行しているすべてのクラスターをデフォルトの Aurora MySQL バージョン 3 (MySQL 8.0 互換) 以降にアップグレードすることをお勧めしています。2024 年 10 月 31 日、Amazon RDS はデータベースを [Amazon RDS 延長サポート](extended-support.md)に自動的に登録します。これは、Aurora Serverless バージョン 1 クラスターで Amazon Aurora MySQL バージョン 2 (MySQL 5.7 互換) を実行している場合には適用されません。Aurora Serverless バージョン 1 のクラスターを Aurora MySQL バージョン 3 にアップグレードする場合は、「[Aurora Serverless v1 DB クラスターのアップグレードパス](#Aurora-Upgrade-Serverlessv1-Clusters)」を参照してください。

Aurora MySQL メジャーバージョンのサポート終了日は、「[https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.release-calendars.html#AuroraMySQL.release-calendars.major](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.release-calendars.html#AuroraMySQL.release-calendars.major)」で確認できます。

Aurora MySQL バージョン 2 を実行しているクラスターをお持ちの場合は、標準サポート期間の終了が近づくと、アップグレードの実施方法に関する最新情報を記載した通知が定期的に届きます。このページは定期的に最新情報で更新されます。

## 標準サポート終了のタイムライン
<a name="timeline"></a>

1. 現在から 2024 年 10 月 日まで – Aurora MySQL バージョン 1 (MySQL 5.6 互換) クラスターから Aurora MySQL バージョン 2 (MySQL 5.7 互換) または Aurora MySQL 3 (MySQL 8.0 互換) にアップグレードできます。

1. 2024 年 10 月 31 日 — この日をもって、Aurora MySQL バージョン 2 は標準サポートが終了します。Amazon RDS では、クラスターが自動的に Amazon RDS 延長サポートに登録されます。

RDS 延長サポートに自動的に登録されます。詳細については、「[Amazon Aurora の Amazon RDS 延長サポート](extended-support.md)」を参照してください。

## この製品終了プロセスの影響を受けるクラスターの確認
<a name="find-cluster"></a>

この製品終了プロセスの影響を受けるクラスターを確認するには、次の手順を使用します。

**重要**  
これらの手順は、すべての AWS リージョン で、また、リソースが存在しているすべての AWS アカウント で必ず実行してください。

### コンソール
<a name="aurora-find-mysqlv1-cluster.CON"></a>

**Aurora MySQL バージョン 2 クラスターを見つけるには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1.  ナビゲーションペインで、**データベース** を選択します。

1.  **[データベースによるフィルタ]** ボックスで **[5.7]** と入力します。

1. エンジン列で Aurora MySQL を確認します。

### AWS CLI
<a name="aurora-find-mysqlv1-cluster.CLI"></a>

AWS CLI を使用してこのサポート終了プロセスの影響を受けるクラスターを見つけるには、[describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) コマンドを呼び出します。次のサンプルスクリプトを使用できます。

**Example**  

```
aws rds describe-db-clusters --include-share --query 'DBClusters[?(Engine==`aurora-mysql` && contains(EngineVersion,`5.7.mysql_aurora`))].{EngineVersion:EngineVersion, DBClusterIdentifier:DBClusterIdentifier, EngineMode:EngineMode}' --output table --region us-east-1     
        
        +---------------------------------------------------------------+
        |                      DescribeDBClusters                       |
        +---------------------+---------------+-------------------------+
        |         DBCI        |      EM       |          EV             |
        +---------------------+---------------+-------------------------+
        |    aurora-mysql2    |  provisioned  | 5.7.mysql_aurora.2.11.3 |
        | aurora-serverlessv1 |   serverless  | 5.7.mysql_aurora.2.11.3 |
        +---------------------+---------------+-------------------------+
```

### RDS API
<a name="Aurora-find-mysqlv1-cluster.API"></a>

Aurora MySQL バージョン 2 を実行している Aurora MySQL DB クラスターを見つけるには、RDS [DescribeDBClusters](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html) API オペレーションを次の必須パラメータとともに使用します。
+  `DescribeDBClusters`
  + Filters.Filter.N
    + 名前
      + engine
    + Values.Value.N
      + ['aurora']

## Amazon RDS 延長サポート
<a name="Aurora-RDS-Extended-Support"></a>

Amazon RDS 延長サポートは、2024 年 10 月 31 日のサポート終了日まで、コミュニティ MySQL 5.7 を介して無料でご利用いただけます。2024 年 10 月 31 日、Amazon RDS はデータベースを Aurora MySQL バージョン 2 の RDS 延長サポートに自動的に登録します。RDS Aurora 延長サポートは有料サービスで、2027 年 2 月の RDS 延長サポート終了まで、Aurora MySQL バージョン 2 のサポートが最大 28 か月間追加されます。RDS 延長サポートは Aurora MySQL マイナーバージョン 2.11 と 2.12 でのみ提供されます。標準サポート終了後に Amazon Aurora MySQL バージョン 2 を使用するには、2024 年 10 月 31 日までにこれらのマイナーバージョンのいずれかでデータベースを実行することを計画してください。

RDS 延長サポートに関する料金やその他の考慮事項などの詳細については、「[Amazon Aurora の Amazon RDS 延長サポート](extended-support.md)」を参照してください。

## アップグレードの実行
<a name="Aurora-Performing-an-Upgrade"></a>

メジャーバージョン間のアップグレードでは、マイナーバージョンよりも広範な計画とテストが必要です。このプロセスにはかなりの時間がかかることがあります。アップグレードには、アップグレード前、アップグレード、アップグレード後のアクティビティの 3 段階のプロセスがあります。

**アップグレード前:**

アップグレード後のアプリケーションが予期した通りに機能するように、アップグレードを実行する前に、アップグレードしたクラスターのアプリケーションの互換性、パフォーマンス、メンテナンス手順、および同様の考慮事項をチェックすることをお勧めします。ここでは、アップグレードをより快適に行うための 5 つの推奨事項を紹介します。
+ まず、[メジャーバージョンの Aurora MySQL インプレースアップグレードの仕組み](AuroraMySQL.Updates.MajorVersionUpgrade.md#AuroraMySQL.Upgrading.Sequence) を理解することが重要です。
+ 次に、[Aurora MySQL バージョン 2 からバージョン 3 へのアップグレード](AuroraMySQL.Updates.MajorVersionUpgrade.md#AuroraMySQL.Updates.MajorVersionUpgrade.2to3) で利用できるアップグレード方法を確認します。
+ アップグレードの適切な時期とアプローチを決定するために、Aurora MySQL バージョン 3 と [Aurora MySQL バージョン 2 と Aurora MySQL バージョン 3 の比較](AuroraMySQL.Compare-v2-v3.md) での現在環境の違いについて学習することができます。
+ 使いやすくて最適なオプションを決定したら、[Aurora MySQL クラスターのメジャーバージョンアップグレードの計画](AuroraMySQL.Updates.MajorVersionUpgrade.md#AuroraMySQL.Upgrading.Planning) を使用して、クローンクラスターで模擬インプレースアップグレードを試してください。
+ 「[Aurora MySQL のメジャーバージョンアップグレードの事前チェック](AuroraMySQL.upgrade-prechecks.md)」を確認します。アップグレードプレチェッカーを実行して、データベースを正常にアップグレードできるかどうか、アップグレード後にアプリケーションの非互換性の問題がないか、パフォーマンスやメンテナンス手順などに関する考慮事項について確認できます。
+ すべての種類またはバージョンの Aurora MySQL クラスターでインプレースアップグレードメカニズムを使用できるわけではありません。詳細については、「[Aurora MySQL メジャーバージョンのアップグレードプロセス](AuroraMySQL.Updates.MajorVersionUpgrade.md#AuroraMySQL.Upgrading.Compatibility)」を参照してください。

ご質問やご不明点がございましたら、[コミュニティフォーラム](https://repost.aws/)や[プレミアムサポート](https://aws.amazon.com/premiumsupport/)から AWS サポートチームにお問い合わせください。

**アップグレードの実行:**

以下のいずれかのアップグレード手法を使用できます。システムで発生するダウンタイムの長さは、選択した手法によって異なります。
+ **ブルー/グリーンデプロイ** - アプリケーションのダウンタイムの削減が最優先事項である場合は、[Amazon RDS ブルー/グリーンデプロイ](https://aws.amazon.com/blogs/aws/new-fully-managed-blue-green-deployments-in-amazon-aurora-and-amazon-rds/)を使用して、プロビジョニングされた Amazon Aurora DB クラスターのメジャーバージョンアップグレードを実行することもできます。ブルー/グリーンのデプロイは、本稼働環境をコピーするステージング環境を作成します。本稼働環境のワークロードに影響を与えずに、グリーン (ステージング) 環境の Aurora DB クラスターに特定の変更を加えることができます。スイッチオーバーには通常 1 分もかからず、データが失われることはありません。詳細については、「[Amazon Aurora ブルー/グリーンデプロイの概要](blue-green-deployments-overview.md)」を参照してください。これによりダウンタイムは最小限に抑えられますが、アップグレードの実行中に追加のリソースを実行する必要があります。
+ **インプレースアップグレード** - Aurora が自動的に事前チェックプロセスを実行し、クラスターをオフラインにし、クラスターをバックアップし、アップグレードを実行して、クラスターをオンラインに戻す[インプレースアップグレード](AuroraMySQL.Updates.MajorVersionUpgrade.md#AuroraMySQL.Upgrading.Sequence)を実行できます。メジャーバージョンのインプレースアップグレードは数回クリックするだけで実行でき、他のクラスターとの調整やフェイルオーバーは必要ありませんが、ダウンタイムは発生します。詳細については、[インプレースアップグレードの実行手順](AuroraMySQL.Upgrading.Procedure.md)を参照してください。
+ **スナップショットと復元** - Aurora MySQL バージョン 2 クラスターのアップグレードは、Aurora MySQL バージョン 2 スナップショットから、Aurora MySQL バージョン 3 クラスターに復元することで実行できます。そのためには、スナップショットを作成し、そこから[復元する](aurora-restore-snapshot.md)プロセスに従う必要があります。スナップショットから復元するため、このプロセスにはデータベースの中断が伴います。

**アップグレード後:**

アップグレード後は、システム (アプリケーションとデータベース) を注意深くモニタリングし、必要に応じて微調整する必要があります。アップグレード前の手順を綿密に実行することで、必要な変更を最小限に抑えることができます。詳細については、「[Amazon Aurora MySQL データベースのパフォーマンスのトラブルシューティング](aurora-mysql-troubleshooting.md)」を参照してください。

Aurora MySQL メジャーバージョンのアップグレードの方法、計画、テスト、トラブルシューティングの詳細については、[Aurora MySQL インプレースアップグレードのトラブルシューティング](AuroraMySQL.Upgrading.Troubleshooting.md) を含め「[Amazon Aurora MySQL DB クラスターのメジャーバージョンのアップグレード](AuroraMySQL.Updates.MajorVersionUpgrade.md)」を精読してください。また、一部のインスタンスタイプは Aurora MySQL バージョン 3 ではサポートされていません。詳細については、「[Amazon Aurora DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。

## Aurora Serverless v1 DB クラスターのアップグレードパス
<a name="Aurora-Upgrade-Serverlessv1-Clusters"></a>

メジャーバージョン間のアップグレードでは、マイナーバージョンよりも広範な計画とテストが必要です。このプロセスにはかなりの時間がかかることがあります。アップグレードには、アップグレード前、アップグレード、アップグレード後のアクティビティの 3 段階のプロセスがあります。

 Aurora MySQL バージョン 2 (MySQL 5.7 互換) は、引き続き Aurora Serverless v1 クラスターの標準サポートを受けることができます。

Amazon Aurora MySQL 3 (MySQL 8.0 互換) にアップグレードし、引き続き Aurora Serverless を実行する場合は、Amazon Aurora Serverless v2 を使用することができます。Aurora Serverless v1 と Aurora Serverless v2 の違いを理解するには、「[Aurora Serverless v2 と Aurora Serverless v1 の比較](aurora-serverless-v2.upgrade.md#aurora-serverless.comparison)」を参照してください。

**Aurora Serverless v2 へのアップグレード**： Aurora Serverless v1 クラスターを Aurora Serverless v2 にアップグレードできます。詳細については、「[Aurora Serverless v1 クラスターから Aurora Serverless v2 クラスターへのアップグレード](aurora-serverless-v2.upgrade.md#aurora-serverless-v2.upgrade-from-serverless-v1-procedure)」を参照してください。

# Amazon Aurora MySQL 互換エディションバージョン 1 のサポート終了に向けて準備する
<a name="Aurora.MySQL56.EOL"></a>

Amazon Aurora MySQL 互換エディション バージョン 1 (MySQL 5.6 互換) は 2023 年 2 月 28 日にサポートを終了する予定です。Aurora MySQL バージョン 1 を実行しているすべてのクラスター (プロビジョニングおよび Aurora Serverless) を Aurora MySQL バージョン 2 (MySQL 5.7 互換) または Aurora MySQL バージョン 3 (MySQL 8.0 互換) にアップグレードすることをお勧めします。Aurora MySQL バージョン 1 のサポート期間が終了する前にこれを行ってください。

Aurora にプロビジョニングされた DB クラスターの場合、いくつかの方法で Aurora MySQL バージョン 1 から Aurora MySQL バージョン 2 へのアップグレードを完了できます。インプレースアップグレードメカニズムの手順については、「[インプレースアップグレードの実行手順](AuroraMySQL.Upgrading.Procedure.md)」を参照してください。アップグレードを完了するもう 1 つの方法は、Aurora MySQL バージョン 1 クラスターのスナップショットを取得し、Aurora MySQL バージョン 2 クラスターにスナップショットを復元することです。または、古いクラスターと新しいクラスターを並べて実行するマルチステッププロセスに従うこともできます。各メソッドの詳細については、「[Amazon Aurora MySQL DB クラスターのメジャーバージョンのアップグレード](AuroraMySQL.Updates.MajorVersionUpgrade.md)」を参照してください。

Aurora Serverless v1DB クラスターの場合、Aurora MySQL バージョン 1 から Aurora MySQL バージョン 2 へのインプレースアップグレードを実行できます。各メソッドの詳細については、「[Aurora Serverless v1 DB クラスターの変更](aurora-serverless.modifying.md)」を参照してください。

Aurora にプロビジョニングされた DB クラスターの場合、2 段階のアップグレードプロセスを使用して Aurora MySQL バージョン 1 から Aurora MySQL バージョン 3 へのアップグレードを完了できます。

1. 前述の方法を使用して Aurora MySQL バージョン 1 から Aurora MySQL バージョン 2 にアップグレードします。

1. Aurora MySQL バージョン 2 から Aurora MySQL バージョン 3 にアップグレードするには、バージョン 1 からバージョン 2 へのアップグレードと同じ方法を使用します。詳細については、「[Aurora MySQL バージョン 2 からバージョン 3 へのアップグレード](AuroraMySQL.Updates.MajorVersionUpgrade.md#AuroraMySQL.Updates.MajorVersionUpgrade.2to3)」を参照してください。[Aurora MySQL バージョン 2 と 3 の特徴の違い](AuroraMySQL.Compare-v2-v3.md#AuroraMySQL.Compare-v2-v3-features) を書き留めます。

Aurora メジャーバージョンの今後の製品終了日については、「[Amazon Aurora バージョン](Aurora.VersionPolicy.md)」を参照してください。Amazon は、お客様がサポート終了日より前にアップグレードしなかったクラスターを自動的にアップグレードします。製品終了日を過ぎると、後続のメジャーバージョンへのこれらの自動アップグレードは、クラスターのスケジュールされたメンテナンス期間中に行われます。

製品終了となる Aurora MySQL バージョン 1 クラスター (プロビジョニングおよび Aurora Serverless) のアップグレードに関するその他のマイルストーンを次に示します。各日付のスタート時刻は 00:00 協定世界時 (UTC) です。

1. 現在から 2023 年 2 月 28 日まで – Aurora MySQL バージョン 1 (MySQL 5.6 互換) クラスターから Aurora MySQL バージョン 2 (MySQL 5.7 互換) へのアップグレードをいつでも開始できます。Aurora MySQL バージョン 2 から、Aurora にプロビジョニングされた DB クラスターを Aurora MySQL バージョン 3 (MySQL 8.0 互換) にさらにアップグレードできます。

1. 2023 年 1 月 16 日 – これ以降、新しい Aurora MySQL バージョン 1 のクラスターまたはインスタンスを AWS マネジメントコンソール からも AWS Command Line Interface (AWS CLI) からも作成できなくなります。Aurora Global Database に新しいセカンダリリージョンを追加することもできません。このために、「[予期しない停止からの Amazon Aurora Global Database の復旧](aurora-global-database-disaster-recovery.md#aurora-global-database-failover)」で説明されているように、予期しない停止からの復旧が難しくなる可能性があります。この時点以降はステップ 5 と 6 を完了できないからです。また、Aurora MySQL バージョン 1 を実行する新しいクロスリージョンリードレプリカを作成することもできません。2023 年 2 月 28 日までは、既存の Aurora MySQL バージョン 1 クラスターに対して次の操作は実行できます。
   + Aurora MySQL バージョン 1 クラスターのスナップショットを元のスナップショットクラスターと同じバージョンに復元する。
   + リードレプリカの追加 (Aurora Serverless DB クラスターには適用されません)。
   + インスタンス設定を変更する。
   + ポイントインタイム復元を実行する。
   + 既存のバージョン 1 クラスターのクローンを作成する。
   + Aurora MySQL バージョン 2 以上を実行する新しいクロスリージョンリードレプリカを作成します。

1.  2023 年 2 月 28 日 – これ以降、次のスケジュールされたメンテナンス期間内に Aurora MySQL バージョン 1 のクラスターを Aurora MySQL バージョン 2 のデフォルトバージョンに自動的にアップグレードする予定です。Aurora MySQL バージョン 1 DB スナップショットを復元すると、復元されたクラスターが Aurora MySQL バージョン 2 のこの時点のデフォルトバージョンに自動的にアップグレードされます。

メジャーバージョン間のアップグレードでは、マイナーバージョンよりも広範な計画とテストが必要です。このプロセスにはかなりの時間がかかることがあります。

ダウンタイムの削減が最優先事項である場合は、[ブルー/グリーンデプロイ](https://aws.amazon.com/blogs/aws/new-fully-managed-blue-green-deployments-in-amazon-aurora-and-amazon-rds/)を使用して、プロビジョニングされた Amazon Aurora DB クラスターのメジャーバージョンアップグレードを実行することもできます。ブルー/グリーンのデプロイは、本稼働環境をコピーするステージング環境を作成します。本稼働環境のワークロードに影響を与えずに、グリーン (ステージング) 環境の Aurora DB クラスターに変更を加えることができます。切り替えには通常 1 分もかからず、データが失われることはなく、アプリケーションを変更する必要もありません。詳細については、「[Amazon Aurora ブルー/グリーンデプロイの概要](blue-green-deployments-overview.md)」を参照してください。

アップグレードの完了後に、フォローアップ作業が必要な場合もあります。例えば、SQL の互換性、特定の MySQL 関連機能の動作方法、またはパラメータ設定が古いバージョンと新しいバージョンで異なることが原因でフォローアップが必要になることがあります。

Aurora MySQL メジャーバージョンのアップグレードの方法、計画、テスト、トラブルシューティングの詳細については、「[Amazon Aurora MySQL DB クラスターのメジャーバージョンのアップグレード](AuroraMySQL.Updates.MajorVersionUpgrade.md)」を精読してください。

## この製品終了プロセスの影響を受けるクラスターの確認
<a name="find-cluster"></a>

この製品終了プロセスの影響を受けるクラスターを確認するには、次の手順を使用します。

**重要**  
これらの手順は、すべての AWS リージョン で、また、リソースが存在しているすべての AWS アカウント で必ず実行してください。

### コンソール
<a name="aurora-find-mysqlv1-cluster.CON"></a>

**Aurora MySQL バージョン 1 クラスターを見つけるには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1.  ナビゲーションペインで、**データベース**を選択します。

1.  **[Filter by databases]** (データベースによるフィルタリング) ボックスで **[5.6]** と入力します。

1. エンジン列で Aurora MySQL を確認します。

### AWS CLI
<a name="aurora-find-mysqlv1-cluster.CLI"></a>

AWS CLI を使用してこのサポート終了プロセスの影響を受けるクラスターを見つけるには、[describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) コマンドを呼び出します。次のサンプルスクリプトを使用できます。

**Example**  

```
aws rds describe-db-clusters --include-share --query 'DBClusters[?Engine==`aurora`].{EV:EngineVersion, DBCI:DBClusterIdentifier, EM:EngineMode}' --output table --region us-east-1     
        
        +------------------------------------------+
        |            DescribeDBClusters            |
        +---------------+--------------+-----------+
        |     DBCI      |     EM       |    EV     |
        +---------------+--------------+-----------+
        |  my-database-1|  serverless  |  5.6.10a  |
        +---------------+--------------+-----------+
```

### RDS API
<a name="Aurora-find-mysqlv1-cluster.API"></a>

Aurora MySQL バージョン 1 を実行している Aurora MySQL DB クラスターを見つけるには、RDS [DescribeDBClusters](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html) API オペレーションを次の必須パラメータとともに使用します。
+  `DescribeDBClusters`
  + Filters.Filter.N
    + 名前
      + engine
    + Values.Value.N
      + ['aurora']

# Amazon Aurora MySQL DB クラスターのアップグレード
<a name="AuroraMySQL.Updates.Upgrading"></a><a name="mysql_upgrade"></a>

 Aurora MySQL DB クラスターをアップグレードして、バグ修正や新しい Aurora MySQL 機能を取得したり、基盤となるデータベースエンジンを完全に新しいバージョンに変更したりできます。次のセクションで、その方法について説明します。

**注記**  
 実行するアップグレードの種類は、許容できるクラスターのダウンタイム、実施する予定の検証テストの量、ユースケースにおける特定のバグ修正または新機能の重要度によって異なります。また、頻繁に実行予定の小規模なアップグレードなのか、複数の中間のバージョンをスキップする、ときどき実行するアップグレードなのかによっても異なります。アップグレードごとに、クラスターのメジャーバージョン、マイナーバージョン、およびパッチレベルを変更できます。Aurora MySQL メジャーバージョン、マイナーバージョン、パッチレベルの区別に慣れていない場合は、「[Aurora MySQL のバージョン番号の確認](AuroraMySQL.Updates.Versions.md)」で背景情報を読むことができます。

**ヒント**  
ブルー/グリーンデプロイを使用することで、DB クラスターのアップグレードに必要なダウンタイムを最小限に抑えることができます。詳細については、「[データベース更新のために Amazon Aurora ブルー/グリーンデプロイを使用する](blue-green-deployments.md)」を参照してください。

**Topics**
+ [Aurora MySQL DB クラスターのマイナーバージョンまたはパッチレベルのアップグレード](AuroraMySQL.Updates.Patching.md)
+ [Amazon Aurora MySQL DB クラスターのメジャーバージョンのアップグレード](AuroraMySQL.Updates.MajorVersionUpgrade.md)

# Aurora MySQL DB クラスターのマイナーバージョンまたはパッチレベルのアップグレード
<a name="AuroraMySQL.Updates.Patching"></a>

 DB クラスターのマイナーバージョンをアップグレードしたり、DB クラスターにパッチを適用したりするには、次の方法を使用できます。
+ [エンジンのバージョンを変更して Aurora MySQL アップグレードする](AuroraMySQL.Updates.Patching.ModifyEngineVersion.md) (Aurora MySQL バージョン 2 および 3)
+ [Aurora MySQL マイナーバージョン間の自動アップグレードの有効化](AuroraMySQL.Updates.AMVU.md)

 ダウンタイムなしのパッチ適用によってアップグレードプロセス中の中断を減らす方法については、「[ダウンタイムのないパッチ適用の使用](AuroraMySQL.Updates.ZDP.md)」を参照してください。

Aurora MySQL DB クラスターのマイナーバージョンアップグレードの実行については、以下のトピックを参照してください。

**Topics**
+ [マイナーバージョンアップグレードを実行する前に](#USER_UpgradeDBInstance.PostgreSQL.BeforeMinor)
+ [Aurora MySQL のマイナーバージョンアップグレードの事前チェック](#AuroraMySQL.minor-upgrade-prechecks)
+ [エンジンのバージョンを変更して Aurora MySQL アップグレードする](AuroraMySQL.Updates.Patching.ModifyEngineVersion.md)
+ [Aurora MySQL マイナーバージョン間の自動アップグレードの有効化](AuroraMySQL.Updates.AMVU.md)
+ [ダウンタイムのないパッチ適用の使用](AuroraMySQL.Updates.ZDP.md)
+ [代替のブルー/グリーンのアップグレードテクニック](#AuroraMySQL.UpgradingMinor.BlueGreen)

## マイナーバージョンアップグレードを実行する前に
<a name="USER_UpgradeDBInstance.PostgreSQL.BeforeMinor"></a>

マイナーバージョンのアップグレード中のダウンタイムを低減するには、次のアクションを実行することをお勧めします。
+ Aurora DB クラスターのメンテナンスは、トラフィックが少ない時間帯に実行する必要があります。メンテナンスウィンドウを適切に設定するには、Performance Insights を使用してこのような時間帯を特定します。Performance Insights については、「[Amazon RDS での Performance Insights を使用した DB 負荷のモニタリング](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.html)」を参照してください。DB クラスターのメンテナンスウィンドウの詳細については、「[DB クラスターの適切なメンテナンスウィンドウの調整](USER_UpgradeDBInstance.Maintenance.md#AdjustingTheMaintenanceWindow.Aurora)」を参照してください。
+ エクスポネンシャルバックオフとジッターをサポートする AWS SDK を使用することが、ベストプラクティスです。詳細については、 ブログ投稿、「[エクスポネンシャルバックオフとジッター](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)」を参照してください。

## Aurora MySQL のマイナーバージョンアップグレードの事前チェック
<a name="AuroraMySQL.minor-upgrade-prechecks"></a>

マイナーバージョンアップグレードを開始すると、Amazon Aurora は自動的に事前チェックを実行します。

これらの事前確認は必須です。スキップすることはできません。事前チェックには次の利点があります。
+ アップグレード中の計画外のダウンタイムを回避することができます。
+ 非互換性がある場合、Amazon Aurora でアップグレードすることはできません。詳細を示すログが出力されます。ログを使用して、非互換性を排除することにより、データベースをアップグレードする準備を行うことができます。非互換性の排除の詳細については、MySQL ドキュメントの「[アップグレードのためのインストールの準備](https://dev.mysql.com/doc/refman/8.0/en/upgrade-prerequisites.html)」を参照してください。

DB インスタンスがアップグレードで停止される前に事前チェックが実行されます。つまり、実行時にダウンタイムが発生することはありません。事前チェックで非互換性が見つかった場合、DB インスタンスが停止する前に、Aurora により自動的にアップグレードがキャンセルされます。Aurora では、非互換性のためのイベントも生成されます。Amazon Aurora イベントの詳細については、「[Amazon RDS イベント通知の操作](USER_Events.md)」を参照してください。

Aurora は、ログファイル `PrePatchCompatibility.log` に各非互換性に関する詳細情報を記録します。ほとんどの場合、ログエントリには非互換性を修正するための MySQL のドキュメントへのリンクが含まれています。ログの表示の詳細については、「[データベースログファイルの表示とリスト化](USER_LogAccess.Procedural.Viewing.md)」を参照してください。

事前チェックの性質上、データベース内のオブジェクトが分析されます。この分析によりリソースが消費され、アップグレードが完了するまでの時間が長くなります。

# エンジンのバージョンを変更して Aurora MySQL アップグレードする
<a name="AuroraMySQL.Updates.Patching.ModifyEngineVersion"></a>

Aurora MySQL DB クラスターのマイナーバージョンをアップグレードすると、既存のクラスターに追加の修正と新しい機能が適用されます。

このようなアップグレードは、元のバージョンとアップグレード後のバージョンの両方が Aurora MySQL メジャーバージョン (バージョン 2 または パージョン 3) である Aurora MySQL クラスターに適用されます。このプロセスは、Aurora MySQL メタデータの変換やテーブルデータの再編成を必要としないため、迅速で単純明快です。

この種のアップグレードを実行するには、AWS マネジメントコンソール、AWS CLI、RDS API のいずれかを使用して DB クラスターのエンジンバージョンを変更します。例えば、クラスターで Aurora MySQL 3.x が実行されている場合は、より高い 3.x バージョンを選択します。

Aurora Global Database でマイナーアップグレードを実行する場合は、プライマリクラスターをアップグレードする前に、すべてのセカンダリクラスターをアップグレードします。

**注記**  
Aurora MySQL バージョン 3.04.\$1 以上またはバージョン 2.12.\$1 へのマイナーバージョンアップグレードを実行するには、次のプロセスを使用します。  
グローバルクラスターからすべてのセカンダリリージョンを削除します。「[Amazon Aurora Global Database からのクラスターの削除](aurora-global-database-detaching.md)」のステップを実行してください。
必要に応じて、プライマリリージョンのエンジンバージョンをバージョン 3.04.\$1 以上、またはバージョン 2.12.\$1 にアップグレードします。「[To modify the engine version of a DB cluster](#modify-db-cluster-engine-version)」のステップを実行してください。
グローバルクラスターにセカンダリリージョンを追加します。「[AWS リージョン の Amazon Aurora Global Database への追加](aurora-global-database-attaching.md)」のステップを実行してください。

 **DB クラスターのエンジンバージョンを変更するには** 
+ **コンソールを使用する場合** -クラスターのプロパティを変更します。[**DB クラスターの変更**] ウィンドウの [**DB エンジンバージョン**] ボックスで、Aurora MySQL エンジンバージョンを変更します。クラスターを変更するための一般的な手順に慣れていない場合は、「[コンソール、CLI、API を使用した DB クラスターの変更](Aurora.Modifying.md#Aurora.Modifying.Cluster)」の手順に従ってください。
+ **AWS CLI を使用する場合** - AWS CLI コマンドの [modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html) を呼び出し、DB クラスターの名前を `--db-cluster-identifier` オプションで指定しながら、エンジンバージョンを `--engine-version` オプションで指定します。

  例えば、Aurora MySQL バージョン 3.04.1 にアップグレードするには、`--engine-version` オプションを `8.0.mysql_aurora.3.04.1` に設定します。DB クラスターのエンジンバージョンをすぐに更新するには、`--apply-immediately` オプションを指定します。
+ **RDS API を使用する場合** - [ModifyDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBCluster.html) API オペレーションを呼び出し、`DBClusterIdentifier` で DB クラスターの名前を指定して `EngineVersion` パラメータでエンジンバージョンを指定します。DB クラスターのエンジンバージョンをすぐに更新するには、`ApplyImmediately` パラメータを `true` に設定します。

# Aurora MySQL マイナーバージョン間の自動アップグレードの有効化
<a name="AuroraMySQL.Updates.AMVU"></a><a name="amvu"></a>

Amazon Aurora MySQL DB クラスターの場合、Aurora で DB クラスターを自動的に新しいマイナーバージョンにアップグレードするように指定できます。そのためには、DB クラスターの `AutoMinorVersionUpgrade` プロパティ (AWS マネジメントコンソール の **[マイナーバージョン自動アップグレード**]) を設定します。

自動アップグレードはメンテナンスウィンドウ中に実行されます。DB クラスター内の個々の DB インスタンスのメンテナンスウィンドウがクラスターメンテナンスウィンドウと異なる場合は、クラスターメンテナンスウィンドウが優先されます。

マイナーバージョンの自動アップグレードは、次の種類の Aurora MySQL クラスターには適用されません。
+ Aurora グローバルデータベースの一部であるクラスター
+ クロスリージョンレプリカを持つクラスター

停止時間は、ワークロード、クラスターサイズ、バイナリログデータの量、および Aurora がゼロダウンタイムパッチ適用 (ZDP) 機能を使用できるかどうかによって異なります。Aurora はデータベースクラスターを再起動するため、クラスターの使用を再開する前に、可用性が短時間失われることがあります。特に、バイナリログデータの量が復旧時間に影響を与えます。DB インスタンスは、復旧中にバイナリログデータを処理します。したがって、バイナリログデータが大量である場合、復旧時間が長くなります。

**注記**  
Aurora は、DB クラスター内のすべての DB インスタンスで `AutoMinorVersionUpgrade` 設定が有効になっている場合にのみ、自動アップグレードを実行します。設定方法、およびクラスターレベルとインスタンスレベルで適用した場合にどのように機能するかについては、「[Aurora DB クラスターのマイナーバージョン自動アップグレード](USER_UpgradeDBInstance.Maintenance.md#Aurora.Maintenance.AMVU)」を参照してください。  
その後、`AutoUpgrade` が true に設定されているマイナー DB エンジンへの DB クラスターインスタンスのアップグレードパスが存在する場合、アップグレードが実行されます。`AutoUpgrade` 設定は動的で、RDS によって設定されます。  
マイナーバージョンの自動アップグレードは、デフォルトのマイナーバージョンについて実行されます。

次のような CLI コマンドを使用すると、Aurora MySQL クラスター内のすべての DB インスタンスで `AutoMinorVersionUpgrade` 設定のステータスを確認できます。

```
aws rds describe-db-instances \
  --query '*[].{DBClusterIdentifier:DBClusterIdentifier,DBInstanceIdentifier:DBInstanceIdentifier,AutoMinorVersionUpgrade:AutoMinorVersionUpgrade}'
```

このコマンドでは、次のような出力が生成されます。

```
[
  {
      "DBInstanceIdentifier": "db-t2-medium-instance",
      "DBClusterIdentifier": "cluster-57-2020-06-03-6411",
      "AutoMinorVersionUpgrade": true
  },
  {
      "DBInstanceIdentifier": "db-t2-small-original-size",
      "DBClusterIdentifier": "cluster-57-2020-06-03-6411",
      "AutoMinorVersionUpgrade": false
  },
  {
      "DBInstanceIdentifier": "instance-2020-05-01-2332",
      "DBClusterIdentifier": "cluster-57-2020-05-01-4615",
      "AutoMinorVersionUpgrade": true
  },
... output omitted ...
```

この例では、DB クラスター `cluster-57-2020-06-03-6411` の **[マイナーバージョン自動アップグレードの有効化]** がオフになっています。これは、クラスター内の DB インスタンスの 1 つでオフになっているためです。

# ダウンタイムのないパッチ適用の使用
<a name="AuroraMySQL.Updates.ZDP"></a><a name="zdp"></a>

Aurora MySQL DB クラスターのアップグレードを実行する場合、データベースがシャットダウンされたときおよびアップグレード中に停止する可能性があります。デフォルトでは、データベースがビジー状態のときにアップグレードをスタートすると、DB クラスターが処理しているすべての接続とトランザクションが失われます。アップグレードを実行するためにデータベースがアイドル状態になるまで待機する場合は、長時間待機しなければならない場合があります。

ダウンタイムのないパッチ適用 (ZDP) 機能では、ベストエフォートに基づいて、Aurora MySQL アップグレード中のクライアント接続を維持するよう試みます。ZDP が正常に完了されると、アプリケーションのセッションが保持され、アップグレードの進行中にデータベースエンジンが再起動します。データベースエンジンの再起動により、数秒から約 1 分間スループットが低下する可能性があります。

ZDP は以下には適用されません。
+ オペレーティングシステム (OS) のパッチとアップグレード
+ メジャーバージョンのアップグレード

ZDP は、サポートされているすべての Aurora MySQL バージョンと DB インスタンスクラスで使用できます。

ZDP は Aurora Serverless v1 または Aurora グローバルデータベースではサポートされていません。

**注記**  
T DB インスタンスクラスを、開発サーバーおよびテストサーバー、または他の本稼働以外のサーバーにのみ使用することをお勧めします。T インスタンスクラスの詳細については、「[開発やテストのための T インスタンスクラスの使用](AuroraMySQL.BestPractices.Performance.md#AuroraMySQL.BestPractices.T2Medium)」を参照してください。

MySQL エラーログで ZDP 中に重要な属性のメトリクスを確認できます。AWS マネジメントコンソール の [**イベント**] ページでは、Aurora MySQL で ZDP を使用する場合や、ZDP の使用を選択しない場合に関する情報も確認できます。

Aurora MySQL では、バイナリログレプリケーションが有効かどうかにかかわらず、Aurora はダウンタイムゼロでパッチを実行できます。バイナリログレプリケーションが有効な場合、Aurora MySQL は、ZDP オペレーション中にバイナリログターゲットへの接続を自動的に切断します。Aurora MySQL は自動的にバイナリログターゲットに再接続し、再起動の完了後にレプリケーションを再開します。

また、ZDP は、Aurora MySQL の再起動の機能拡張との組み合わせでも機能します。ライター DB インスタンスにパッチを適用すると、同時にリーダーにパッチが自動適用されます。パッチの実行後、Aurora は、ライター DB インスタンスとリーダー DB インスタンスの両方で接続を復元します。

ZDP は、以下の状態では正常に完了されない場合があります。
+ 長期実行クエリまたはトランザクションが進行中である。この場合、Aurora が ZDP を実行すると、未処理のトランザクションはすべてキャンセルされますが、接続は保持されます。
+ データ定義言語 (DDL) ステートメントの実行中などは、一時テーブル、ユーザーロック、またはテーブルロックが使用中です。Aurora はこれらの接続を切断します。
+ パラメータの変更が保留中である。

上記の状態のいずれかにより、ZDP を実行するための適切な時間枠が確保されない場合、パッチ適用はスタンダードの動作に戻ります。

ZDP オペレーションが成功した後も接続はそのまま残りますが、一部の可変と機能は再初期化されます。次の種類の情報は、ダウンタイムのないパッチ適用によって生じる再起動を通じては保持されません。
+ グローバル可変 Aurora はセッション可変を復元しますが、再起動後のグローバル可変の復元は行いません。
+ ステータス可変。特に、エンジンステータスによって報告される稼働時間の値は、ZDR または ZDP メカニズムを使用する再起動後にリセットされます。
+ `LAST_INSERT_ID`.
+ テーブルのメモリ内 `auto_increment` 状態。メモリ内自動インクリメント状態が再初期化されます。自動インクリメント値の詳細については、[MySQL リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html#innodb-auto-increment-initialization)を参照してください。
+ `INFORMATION_SCHEMA` および `PERFORMANCE_SCHEMA` テーブルからの診断情報。この診断情報は、`SHOW PROFILE` や `SHOW PROFILES` などのコマンドの出力にも表示されます。

ダウンタイムのない再起動に関連する次のアクティビティが [**Events**] (イベント) ページで報告されます。
+ ダウンタイムなしでのデータベースのアップグレードを試みています。
+ ダウンタイムなしでのデータベースのアップグレードの試行が終了しました。イベントは、プロセスにかかった時間を報告します。このイベントでは、再起動中に保持された接続の数とドロップされた接続の数も報告されます。データベースエラーログを参照して、再起動中に発生した処理の詳細を確認できます。

## 代替のブルー/グリーンのアップグレードテクニック
<a name="AuroraMySQL.UpgradingMinor.BlueGreen"></a>

状況によっては、古いクラスターからアップグレードされたクラスターへの即時の切り替えが最優先事項です。このような場合、古いクラスターと新しいクラスターを並べて実行するマルチステッププロセスを使用できます。ここでは、新しいクラスターが引き継ぐ準備ができるまで、古いクラスターから新しいクラスターにデータをレプリケートします。詳細については、[データベース更新のために Amazon Aurora ブルー/グリーンデプロイを使用する](blue-green-deployments.md) を参照してください

# Amazon Aurora MySQL DB クラスターのメジャーバージョンのアップグレード
<a name="AuroraMySQL.Updates.MajorVersionUpgrade"></a><a name="mvu"></a>

3.04.1 などの Aurora MySQL バージョン番号では、3 がメジャーバージョンを表します。Aurora MySQL バージョン 2 は MySQL 5.7 との互換性があります。Aurora MySQL バージョン 3 は MySQL 8.0 との互換性があります。

メジャーバージョン間のアップグレードでは、マイナーバージョンよりも広範な計画とテストが必要です。このプロセスにはかなりの時間がかかることがあります。アップグレードの完了後に、フォローアップ作業が必要な場合もあります。例えば、これは SQL 互換性の違いや、特定の MySQL 関連機能の動作方法の違いが原因で発生する可能性があります。または、古いバージョンと新しいバージョンでパラメータ設定が異なることが原因である可能性があります。

**Contents**
+ [Aurora MySQL バージョン 2 からバージョン 3 へのアップグレード](#AuroraMySQL.Updates.MajorVersionUpgrade.2to3)
+ [Aurora MySQL メジャーバージョンのアップグレードプロセス](#AuroraMySQL.Upgrading.Compatibility)
+ [メジャーバージョンの Aurora MySQL インプレースアップグレードの仕組み](#AuroraMySQL.Upgrading.Sequence)
+ [Aurora MySQL クラスターのメジャーバージョンアップグレードの計画](#AuroraMySQL.Upgrading.Planning)
  + [DB クラスターのクローン作成によるアップグレードのシミュレーション](#AuroraMySQL.Upgrading.Planning.clone)
  + [ブルー/グリーンデプロイ](#AuroraMySQL.UpgradingMajor.BlueGreen)
+ [Aurora MySQL のメジャーバージョンアップグレードの事前チェック](AuroraMySQL.upgrade-prechecks.md)
  + [Aurora MySQL の事前チェックプロセス](AuroraMySQL.upgrade-prechecks.md#AuroraMySQL.upgrade-prechecks.process)
  + [Aurora MySQL の事前チェックのログ形式](AuroraMySQL.upgrade-prechecks.md#AuroraMySQL.upgrade-prechecks.log-format)
  + [Aurora MySQL の事前チェックログ出力例](AuroraMySQL.upgrade-prechecks.md#AuroraMySQL.upgrade-prechecks.log-examples)
  + [Aurora MySQL の事前チェックパフォーマンス](AuroraMySQL.upgrade-prechecks.md#AuroraMySQL.upgrade-prechecks.performance)
  + [コミュニティ MySQL アップグレードの事前チェックの概要](AuroraMySQL.upgrade-prechecks.md#AuroraMySQL.upgrade-prechecks.community)
  + [Aurora MySQL アップグレードの事前チェックの概要](AuroraMySQL.upgrade-prechecks.md#AuroraMySQL.upgrade-prechecks.ams)
  + [Aurora MySQL の事前チェックの説明リファレンス](AuroraMySQL.upgrade-prechecks.descriptions.md)
    + [エラー](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-errors)
      + [エラーを報告する MySQL の事前チェック](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-errors.mysql)
      + [エラーを報告する Aurora MySQL の事前チェック](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-errors.aurora)
    + [警告](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-warnings)
      + [警告を報告する MySQL の事前チェック](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-warnings.mysql)
      + [警告を報告する Aurora MySQL の事前チェック](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-warnings.aurora)
    + [注意](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-notices)
    + [エラー、警告、または通知](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-all)
+ [インプレースアップグレードの実行手順](AuroraMySQL.Upgrading.Procedure.md)
  + [インプレースアップグレードはクラスターのパラメータグループにどのような影響を与えるか](AuroraMySQL.Upgrading.Procedure.md#AuroraMySQL.Upgrading.ParamGroups)
  + [Aurora MySQL バージョン間のクラスターのプロパティの変更](AuroraMySQL.Upgrading.Procedure.md#AuroraMySQL.Upgrading.Attrs)
  + [グローバルデータベースのインプレースメジャーアップグレード](AuroraMySQL.Upgrading.Procedure.md#AuroraMySQL.Upgrading.GlobalDB)
  + [バックトラックに関する考慮事項](AuroraMySQL.Upgrading.Procedure.md#AuroraMySQL.Upgrading.Backtrack)
+ [Aurora MySQL インプレースアップグレードのチュートリアル](AuroraMySQL.Upgrading.Tutorial.md)
+ [Aurora MySQL メジャーバージョンアップグレードが失敗する理由を確認する](AuroraMySQL.Upgrading.failure-events.md)
+ [Aurora MySQL インプレースアップグレードのトラブルシューティング](AuroraMySQL.Upgrading.Troubleshooting.md)
+ [Aurora MySQL バージョン 3 のアップグレード後のクリーンアップ](AuroraMySQL.mysql80-post-upgrade.md)
  + [空間インデックス](AuroraMySQL.mysql80-post-upgrade.md#AuroraMySQL.mysql80-spatial)

## Aurora MySQL バージョン 2 からバージョン 3 へのアップグレード
<a name="AuroraMySQL.Updates.MajorVersionUpgrade.2to3"></a>

MySQL 5.7 互換のクラスターがあり、それを MySQL-8.0 互換クラスターにアップグレードする場合は、クラスター自体でアップグレードプロセスを実行します。この種のアップグレードは、新しいクラスターを作成して行うアップグレードとは対照的な*インプレースアップグレード*です。この手法では、クラスターのエンドポイントやその他の特性を保持します。アップグレードは、すべてのデータを新しいクラスターボリュームにコピーする必要がないため、比較的高速で実行できます。この安定性により、アプリケーションの構成の変更を最小限に抑えることができます。また、アップグレードしたクラスターのテスト量を減らすことができます。これは、DB インスタンスとそのインスタンスクラス数はすべて同じままになるためです。

インプレースアップグレードのメカニズムでは、オペレーションの実行中に DB クラスターをシャットダウンする必要があります。Aurora はクリーンシャットダウンを実行し、トランザクションのロールバックやパージの取り消しなどの未処理のオペレーションを完了します。詳細については、「[メジャーバージョンの Aurora MySQL インプレースアップグレードの仕組み](#AuroraMySQL.Upgrading.Sequence)」を参照してください。

インプレースアップグレード手順は簡単に実行でき、関連するアプリケーションでの構成の変更を最小限に抑えることができるため有用です。例えば、インプレースアップグレードでは、クラスターのエンドポイントと一連の DB インスタンスが保持されます。ただし、インプレースアップグレードの所要時間は、スキーマのプロパティとクラスターのビジー状態によって異なります。したがって、クラスターのニーズに応じて、複数のアップグレード方法から選択できます。
+ [インプレースアップグレード](AuroraMySQL.Upgrading.Procedure.md)
+ [ブルー/グリーンデプロイ](#AuroraMySQL.UpgradingMajor.BlueGreen)
+ [スナップショット復元](aurora-restore-snapshot.md)
**注記**  
スナップショット復元のアップグレード手順に AWS CLI または RDS API を使用する場合、後続のオペレーションを実行して、復元された DB クラスターにライター DB インスタンスを作成する必要があります。

Aurora MySQL バージョン 3 および新機能に関する一般的な情報については、「[Aurora MySQL バージョン 3 は MYSQL 8.0 との互換性があります。](AuroraMySQL.MySQL80.md)」を参照してください。

アップグレードの計画の詳細については、「[Aurora MySQL クラスターのメジャーバージョンアップグレードの計画](#AuroraMySQL.Upgrading.Planning)」と「[インプレースアップグレードの実行手順](AuroraMySQL.Upgrading.Procedure.md)」を参照してください。

## Aurora MySQL メジャーバージョンのアップグレードプロセス
<a name="AuroraMySQL.Upgrading.Compatibility"></a>

すべての種類またはバージョンの Aurora MySQL クラスターでインプレースアップグレードメカニズムを使用できるわけではありません。次の表を参照して、各 Aurora MySQL クラスターの適切なアップグレードパスを確認してください。


|  Aurora MySQL DB クラスターのタイプ  | インプレースアップグレードを使用できますか? |  Action  | 
| --- | --- | --- | 
|   Aurora MySQL プロビジョニングクラスター、バージョン 2  |  はい  |  インプレースアップグレードは、MySQL 5.7 互換 Aurora MySQL クラスターでサポートされます。 Aurora MySQL バージョン 3 へのアップグレードの詳細については、[Aurora MySQL クラスターのメジャーバージョンアップグレードの計画](#AuroraMySQL.Upgrading.Planning) と [インプレースアップグレードの実行手順](AuroraMySQL.Upgrading.Procedure.md) を参照してください。  | 
|   Aurora MySQL プロビジョニングクラスター、バージョン 3  |  該当しない  |  Aurora MySQL バージョン 3 バージョン間でアップグレードするには、マイナーバージョンアップグレード手順を使用してください。  | 
|  Aurora Serverless v1 クラスター  |  該当しない  |  Aurora Serverless v1 はバージョン 2 でのみ Aurora MySQL でサポートされています。  | 
|  Aurora Serverless v2 クラスター  |  該当しない  | Aurora Serverless v2 はバージョン 3 でのみ Aurora MySQL でサポートされています。 | 
|  Aurora Global Database のクラスター  |  はい  |  Aurora MySQL をバージョン 2 からバージョン 3 にアップグレードするには、Aurora グローバルデータベースでクラスターの[インプレースアップグレードを実行する手順](AuroraMySQL.Upgrading.Procedure.md)に従います。グローバルクラスターでアップグレードを実行します。Aurora は、グローバルデータベースのプライマリクラスター、ならびにすべてのセカンダリクラスターに対し、同時に自動アップグレードを実行します。 AWS CLI または RDS API を使用する場合は、`modify-global-cluster` または `ModifyGlobalCluster` の代わりに `modify-db-cluster` コマンドまたは `ModifyDBCluster` オペレーションを呼び出します。 `lower_case_table_names` パラメータをデフォルトに設定してグローバルデータベースを再起動する場合にのみ、Aurora MySQL バージョン 2 からバージョン 3 へのインプレースアップグレードを実行できます。詳細については、「[メジャーバージョンのアップグレード](aurora-global-database-upgrade.md#aurora-global-database-upgrade.major)」を参照してください。  | 
|  パラレルクエリクラスター  |  はい  |  インプレースアップグレードを実行できます。  | 
|  バイナリログレプリケーションのターゲットのクラスター  |  おそらく  |  バイナリログのレプリケーションが Aurora MySQL クラスターからのものであれば、インプレースアップグレードを実行できます。バイナリログのレプリケーションが RDS for MySQL またはオンプレミス MySQL DB インスタンスからのものである場合は、アップグレードを実行できません。その場合は、スナップショットの復元メカニズムを使用してアップグレードします。  | 
|  DB インスタンスがゼロのクラスター  |  いいえ  |  AWS CLI または RDS API を使用すると、DB インスタンスをアタッチせずに、 Aurora MySQL クラスターを作成できます。同様に、クラスターボリューム内のデータをそのまま残しつつ、Aurora MySQL クラスターからすべての DB インスタンスを削除することもできます。クラスターに DB インスタンスがない場合、インプレースアップグレードを実行することはできません。 アップグレードメカニズムでは、システムテーブルやデータファイルなどに対して変換を実行するため、クラスターのライターインスタンスが必要です。この場合、AWS CLI または RDS API を使用して、クラスターのライターインスタンスを作成します。その後、インプレースアップグレードを実行します。  | 
|  バックトラックが有効なクラスター  |  はい  |  バックトラック機能を使用する Aurora MySQL クラスターのインプレースアップグレードを実行できます。ただし、アップグレード後は、クラスターをアップグレード前の時間までバックトラックすることはできません。  | 

## メジャーバージョンの Aurora MySQL インプレースアップグレードの仕組み
<a name="AuroraMySQL.Upgrading.Sequence"></a>

 Aurora MySQL は、メジャーバージョンのアップグレードを多段階プロセスとして実行します。アップグレードの現在のステータスを確認できます。アップグレードの一部のステップでは、進捗情報も確認できます。各ステージのスタート時に、Aurora MySQL によってイベントが記録されます。RDS コンソールの [**イベント**] ページで、発生したイベントを確認できます。イベントの使用の詳細については、「[Amazon RDS イベント通知の操作](USER_Events.md)」を参照してください。

**重要**  
 プロセスがスタートされると、アップグレードが成功または失敗するまで実行されます。進行中は、アップグレードをキャンセルできません。アップグレードが失敗した場合、Aurora はすべての変更をロールバックし、クラスターのエンジンバージョン、メタデータなどが前と同じ状態になります。

 アップグレードプロセスには、3 つのステージがあります。

1.  Aurora は、アップグレードプロセスをスタートする前に一連の[事前チェック](AuroraMySQL.upgrade-prechecks.md)を実行します。Aurora がこれらのチェックを実行している間、クラスターは実行を続けます。例えば、クラスターは、準備済みステートメントの XA トランザクションを使用したり、データ定義言語 (DDL) ステートメントを処理したりすることはできません。例えば、特定の種類の SQL ステートメントを送信中のアプリケーションをシャットダウンする必要がある場合があります。または、長時間実行される特定のステートメントが終了するまで待たなければならない可能性もあります。その場合は、アップグレードを再試行してください。一部のチェックでは、アップグレードの妨げにはならないものの、アップグレードに長時間かかる可能性がある条件をテストします。

    Aurora で必要な条件が満たされていないことが検出された場合は、イベントの詳細に示されている条件を変更します。[Aurora MySQL インプレースアップグレードのトラブルシューティング](AuroraMySQL.Upgrading.Troubleshooting.md) のガイダンスに従います。Aurora で、アップグレードを遅らせる原因となる条件が検出された場合は、長期間にわたりアップグレードをモニタリングすることを計画します。

1.  Aurora はクラスターをオフラインにします。次に、Aurora が前のステージと同様の一連のテストを実行し、シャットダウンプロセス中に新たな問題が発生していないことを確認します。この時点で、Aurora がアップグレードの妨げになる条件を検出した場合、Aurora はアップグレードをキャンセルし、クラスターをオンラインに戻します。この場合、条件がいつから適用されていないかを確認し、アップグレードを再度スタートします。

1.  Aurora は、クラスターボリュームのスナップショットを作成します。アップグレードの完了後に、互換性やその他の種類の問題を発見したとします。または、元のクラスターとアップグレードされたクラスターの両方を使用してテストを実行するとします。このような場合、このスナップショットから復元し、元のエンジンバージョンと元のデータを使用して新しいクラスターを作成することができます。
**ヒント**  
このスナップショットは手動スナップショットです。ただし、Aurora は、手動スナップショットのクォータに達した場合でも、それを作成してアップグレードプロセスを続行することができます。このスナップショットは、削除するまで永続的に残ります (必要な場合)。アップグレード後のテストをすべて完了したら、このスナップショットを削除してストレージ料金を最小限に抑えることができます。

1.  クラスターボリュームの Aurora クローンを作成します。クローン作成は、実際のテーブルデータのコピーを伴わない高速オペレーションです。アップグレード中、Aurora に問題が発生すると、クローンが作成されたクラスターボリュームから元のデータに戻り、クラスターをオンラインに戻します。アップグレード中のクローン作成の一時ボリュームは、単一のクラスターボリュームでの通常のクローン数の制限を受けません。

1.  Aurora は、ライター DB インスタンスのクリーンシャットダウンを実行します。クリーンシャットダウン中は、以下のオペレーションの進行状況イベントが 15 分ごとに記録されます。RDS コンソールの [**イベント**] ページで、発生したイベントを確認できます。
   +  Aurora は、古いバージョンの行の UNDO レコードを消去します。
   +  Aurora は、コミットされていないトランザクションをロールバックします。

1.  Aurora は、ライター DB インスタンスのエンジンバージョンをアップグレードします。
   +  Aurora は、新しいエンジンバージョンのバイナリをライター DB インスタンスにインストールします。
   +  Aurora は、ライター DB インスタンスを使用して、データを MySQL 5.7 互換のフォーマットにアップグレードします。このステージでは、Aurora によってシステムテーブルが変更され、クラスターボリュームのデータに影響を与えるその他の変換が実行されます。特に、Aurora はシステムテーブル内のパーティションのメタデータをアップグレードして、MySQL 5.7 のパーティションのフォーマットとの互換性を持たせます。クラスター内のテーブルに多数のパーティションがある場合、このステージには長時間かかります。

      このステージでエラーが発生した場合は、MySQL エラーログで詳細を確認できます。このステージのスタート後に何らかの理由でアップグレードプロセスが失敗した場合、Aurora はクローンが作成されたクラスターボリュームから元のデータを復元します。

1.  Aurora は、リーダー DB インスタンスのエンジンバージョンをアップグレードします。

1.  アップグレードプロセスは完了しました。アップグレードプロセスが正常に完了したことを示す最終イベントが、Aurora により記録されます。DB クラスターが新しいメジャーバージョンで実行されています。

## Aurora MySQL クラスターのメジャーバージョンアップグレードの計画
<a name="AuroraMySQL.Upgrading.Planning"></a>

アップグレードの適切な時期とアプローチを決定するには、Aurora MySQL バージョン 3 と現在の環境の違いを確認できます。
+ RDS for MySQL 8.0 または MySQL 8.0 Community Edition から変換する場合は、「[Aurora MySQL バージョン 3 と MySQL 8.0 コミュニティエディションの比較](AuroraMySQL.Compare-80-v3.md)」を参照してください。
+ Aurora MySQL バージョン 2、RDS for MySQL 5.7、またはコミュニティ MySQL 5.7 からアップグレードする場合は、「[Aurora MySQL バージョン 2 と Aurora MySQL バージョン 3 の比較](AuroraMySQL.Compare-v2-v3.md)」を参照してください。
+ カスタムパラメータグループの新しい MySQL 8.0 互換バージョンを作成します。必要なカスタムパラメータ値を新しいパラメータグループに適用します。[Aurora MySQL バージョン 3 のパラメータ変更](AuroraMySQL.Compare-v2-v3.md#AuroraMySQL.mysql80-parameter-changes) に相談して、パラメータの変更について学びます。
+ MySQL 8.0 Community Edition で導入された新しい予約キーワードの使用方法について、Aurora MySQL バージョン 2 のデータベーススキーマとオブジェクト定義を確認してください。アップグレードの前に行ってください。詳細については、MySQL ドキュメントの「[MySQL 8.0 の新しいキーワードと予約語](https://dev.mysql.com/doc/mysqld-version-reference/en/keywords-8-0.html#keywords-new-in-8-0)」を参照してください。

MySQL 固有のアップグレードに関する考慮事項とヒントについては、*MySQL リファレンスマニュアル*の [MySQL 8.0 での変更](https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html)を参照してください。例えば、コマンド `mysqlcheck --check-upgrade` を使用して、既存の Aurora MySQL データベースを分析し、潜在的なアップグレードの問題を特定します。

**注記**  
インプレースアップグレードまたはスナップショット復元技術を使用して Aurora MySQL バージョン 3 にアップグレードする場合は、大きな DB インスタンスクラスを使用することをお勧めします。例として、db.r5.24xlarge、db.r6g.16xlarge があります。これにより、DB インスタンスで使用可能な CPU 容量の大部分を使用して、アップグレードプロセスをより早く完了できます。メジャーバージョンのアップグレード完了後、必要な DB インスタンスクラスに変更できます。

アップグレード自体を完了したら、「[Aurora MySQL バージョン 3 のアップグレード後のクリーンアップ](AuroraMySQL.mysql80-post-upgrade.md)」のアップグレード後の手順に従います。最後に、アプリケーションの機能とパフォーマンスをテストします。

RDS from MySQL またはコミュニティ MySQL から変換する場合は、「[Amazon Aurora MySQL DB クラスターへのデータの移行](AuroraMySQL.Migrating.md)」で説明している移行手順に従います。場合によっては、バイナリログレプリケーションを使用して、移行の一環として Aurora MySQL バージョン 3 クラスターとデータを同期することがあります。その場合、ソースシステムはターゲット DB クラスターとの互換性があるバージョンを実行する必要があります。

クラスターをメジャーバージョン間でアップグレードした後、アプリケーションと管理手順をスムーズに動作させるには、事前のプランと準備が必要です。AWS CLI スクリプトまたは RDS API ベースのアプリケーションの更新に使用する管理コードの種類については、「[インプレースアップグレードはクラスターのパラメータグループにどのような影響を与えるか](AuroraMySQL.Upgrading.Procedure.md#AuroraMySQL.Upgrading.ParamGroups)」を参照してください。また、「[Aurora MySQL バージョン間のクラスターのプロパティの変更](AuroraMySQL.Upgrading.Procedure.md#AuroraMySQL.Upgrading.Attrs)」も参照してください。

アップグレード中に発生する可能性がある問題については、「[Aurora MySQL インプレースアップグレードのトラブルシューティング](AuroraMySQL.Upgrading.Troubleshooting.md)」を参照してください。アップグレードに長時間を要する可能性がある問題については、これらの条件を事前にテストして修正することができます。

**注記**  
インプレースアップグレードでは、オペレーションの実行中に DB クラスターをシャットダウンする必要があります。Aurora MySQL はクリーンシャットダウンを実行し、UNDO パージなどの未処理のオペレーションを完了します。パージする UNDO レコードが多いと、アップグレードに時間がかかることがあります。履歴リストの長さ (HLL) が短くなった後にのみ、アップグレードを実行することをお勧めします。HLL の一般的な許容値は 100,000 以下です。詳細については、この[ブログ記事](https://aws.amazon.com/blogs/database/amazon-aurora-mysql-version-2-with-mysql-5-7-compatibility-to-version-3-with-mysql-8-0-compatibility-upgrade-checklist-part-2)を参照してください。

### DB クラスターのクローン作成によるアップグレードのシミュレーション
<a name="AuroraMySQL.Upgrading.Planning.clone"></a>

アップグレードしたクラスターのアプリケーションの互換性、パフォーマンス、メンテナンス手順、および同様の考慮事項を確認できます。そのためには、実際のアップグレードの実行前に、アップグレードのシミュレーションを実行できます。この手法は、本番稼働用クラスターで特に役に立ちます。ここでは、ダウンタイムを最小限に抑え、アップグレードが完了したらすぐにアップグレードされたクラスターを使用できるようにすることが重要です。

以下のステップを使用します。

1. 元のクラスターのクローンを作成します。「[Amazon Aurora DB クラスターのボリュームのクローン作成](Aurora.Managing.Clone.md)」 の手順に従います。

1. 元のクラスターと同じようなライターおよびリーダー DB インスタンスのセットを設定します。

1. クローンが作成されたクラスターのインプレースアップグレードを実行します。「[インプレースアップグレードの実行手順](AuroraMySQL.Upgrading.Procedure.md)」 の手順に従います。

   クローンを作成したら、すぐにアップグレードをスタートします。これにより、クラスターボリュームは元のクラスターと同じ状態になります。アップグレードの実行前にクローンがアイドル状態になっている場合、Aurora がバックグラウンドでデータベースのクリーンアップ処理を実行します。その場合、クローンのアップグレードは、元のクラスターのアップグレードを正確にシミュレーションしません。

1. クローンが作成されたクラスターを使用して、アプリケーションの互換性、パフォーマンス、管理手順などをテストします。

1. 問題が発生した場合は、それらを考慮してアップグレードの計画を調整してください。例えば、上のバージョンの特徴セットと互換性を持たせるように、任意のアプリケーションコードを適用させます。クラスター内のデータ量を基に、アップグレードにかかる時間を推定します。クラスターがビジーではない時間にアップグレードをスケジュールすることもできます。

1. テストクラスターでアプリケーションとワークロードが適切に動作することが確認できたら、運用クラスターのインプレースアップグレードを実行します。

1. メジャーバージョンのアップグレード中のクラスターの合計ダウンタイムを最小限に抑えます。そのためには、アップグレード時にクラスターのワークロードが低いか、0 であることを確認します。特に、アップグレードのスタート時は、進行中の長時間実行トランザクションがないことを確認してください。

### ブルー/グリーンデプロイ
<a name="AuroraMySQL.UpgradingMajor.BlueGreen"></a>

状況によっては、古いクラスターからアップグレードされたクラスターへの即時の切り替えが最優先事項です。このような場合、古いクラスターと新しいクラスターを並べて実行するマルチステッププロセスを使用できます。ここでは、新しいクラスターが引き継ぐ準備ができるまで、古いクラスターから新しいクラスターにデータをレプリケートします。詳細については、[データベース更新のために Amazon Aurora ブルー/グリーンデプロイを使用する](blue-green-deployments.md) を参照してください

# Aurora MySQL のメジャーバージョンアップグレードの事前チェック
<a name="AuroraMySQL.upgrade-prechecks"></a>

MySQL 5.7 から MySQL 8.0 のように、MySQL をあるメジャーバージョンから別のメジャーバージョンにアップグレードするには、アーキテクチャの大幅な変更が伴うため、慎重な計画と準備が必要です。データベースエンジンソフトウェアの更新や、場合によってはシステムテーブルの更新に主に焦点を当てるマイナーバージョンアップグレードとは異なり、MySQL のメジャーアップグレードでは、データベースのメタデータの保存と管理方法に根本的な変更が加えられることがよくあります。

このような非互換性の特定を支援するために、Aurora MySQL バージョン 2 からバージョン 3 にアップグレードする際、Aurora はアップグレード互換性チェック (事前チェック) を自動的に実行して、データベースクラスター内のオブジェクトを調べ、アップグレードの進行をブロックする可能性のある既知の非互換性を特定します。Aurora MySQL 事前チェックの詳細については、「[Aurora MySQL の事前チェックの説明リファレンス](AuroraMySQL.upgrade-prechecks.descriptions.md)」を参照してください。Aurora 事前チェックは、コミュニティ MySQL [アップグレードチェッカーユーティリティ](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-upgrade.html)で実行されるチェックに加えて実行されます。

これらの事前確認は必須です。スキップすることはできません。事前チェックには次の利点があります。
+ これにより、ダウンタイムの延長につながるアップグレード障害が発生する可能性を減らすことができます。
+ 非互換性がある場合、Amazon Aurora はアップグレードの続行を阻止し、詳細を示すログを出力します。ログを使用して、非互換性を解決することにより、データベースをバージョン 3 にアップグレードする準備を行うことができます。非互換性の解決の詳細については、MySQL ドキュメントの「[Preparing your installation for upgrade](https://dev.mysql.com/doc/refman/8.0/en/upgrade-prerequisites.html)」と「[Upgrading to MySQL 8.0?」を参照してください。MySQL Server ブログの「知っておくべきこと](https://dev.mysql.com/blog-archive/upgrading-to-mysql-8-0-here-is-what-you-need-to-know/)」を参照してください。

  MySQL 8.0 へのアップグレードの詳細については、MySQL ドキュメントの「[MySQL のアップグレード](https://dev.mysql.com/doc/refman/8.0/en/upgrading.html)」を参照してください。

事前チェックは、DB クラスターがメジャーバージョンアップグレードのためにオフラインになる前に実行されます。事前チェックで非互換性が見つかった場合、DB インスタンスが停止する前に、Aurora により自動的にアップグレードがキャンセルされます。Aurora では、非互換性のためのイベントも生成されます。Amazon Aurora イベントの詳細については、「[Amazon RDS イベント通知の操作](USER_Events.md)」を参照してください。

事前チェックが完了すると、Aurora はそれぞれの非互換性に関する詳細情報を `upgrade-prechecks.log` ファイルに記録します。ほとんどの場合、ログエントリには非互換性を修正するための MySQL のドキュメントへのリンクが含まれています。ログの表示の詳細については、「[データベースログファイルの表示とリスト化](USER_LogAccess.Procedural.Viewing.md)」を参照してください。

**注記**  
事前チェックの性質上、データベース内のオブジェクトが分析されます。この分析によりリソースが消費され、アップグレードが完了するまでの時間が長くなります。事前チェックのパフォーマンスに関する考慮事項の詳細については、「[Aurora MySQL の事前チェックプロセス](#AuroraMySQL.upgrade-prechecks.process)」を参照してください。

**Contents**
+ [Aurora MySQL の事前チェックプロセス](#AuroraMySQL.upgrade-prechecks.process)
+ [Aurora MySQL の事前チェックのログ形式](#AuroraMySQL.upgrade-prechecks.log-format)
+ [Aurora MySQL の事前チェックログ出力例](#AuroraMySQL.upgrade-prechecks.log-examples)
+ [Aurora MySQL の事前チェックパフォーマンス](#AuroraMySQL.upgrade-prechecks.performance)
+ [コミュニティ MySQL アップグレードの事前チェックの概要](#AuroraMySQL.upgrade-prechecks.community)
+ [Aurora MySQL アップグレードの事前チェックの概要](#AuroraMySQL.upgrade-prechecks.ams)
+ [Aurora MySQL の事前チェックの説明リファレンス](AuroraMySQL.upgrade-prechecks.descriptions.md)
  + [エラー](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-errors)
    + [エラーを報告する MySQL の事前チェック](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-errors.mysql)
    + [エラーを報告する Aurora MySQL の事前チェック](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-errors.aurora)
  + [警告](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-warnings)
    + [警告を報告する MySQL の事前チェック](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-warnings.mysql)
    + [警告を報告する Aurora MySQL の事前チェック](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-warnings.aurora)
  + [注意](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-notices)
  + [エラー、警告、または通知](AuroraMySQL.upgrade-prechecks.descriptions.md#precheck-descriptions-all)

## Aurora MySQL の事前チェックプロセス
<a name="AuroraMySQL.upgrade-prechecks.process"></a>

前述のように、Aurora MySQL のアップグレードプロセスでは、メジャーバージョンのアップグレードを続行する前に、データベースの互換性チェック (事前チェック) を実行します。

インプレースアップグレードの場合、事前チェックはライター DB インスタンスがオンラインの間に実行されます。事前チェックが成功すると、アップグレードが続行されます。エラーが見つかった場合、`upgrade-prechecks.log` ファイルに記録され、アップグレードはキャンセルされます。アップグレードを再試行する前に、`upgrade-prechecks.log` ファイルで返されたエラーを解決します。

スナップショット復元アップグレードの場合、復元プロセス中に事前チェックが実行されます。成功すると、データベースは新しい Aurora MySQL バージョンにアップグレードされます。エラーが見つかった場合、`upgrade-prechecks.log` ファイルに記録され、アップグレードはキャンセルされます。アップグレードを再試行する前に、`upgrade-prechecks.log` ファイルで返されたエラーを解決します。

詳細については、「[Aurora MySQL メジャーバージョンアップグレードが失敗する理由を確認する](AuroraMySQL.Upgrading.failure-events.md)」および「[Aurora MySQL の事前チェックの説明リファレンス](AuroraMySQL.upgrade-prechecks.descriptions.md)」を参照してください。

事前チェックのステータスをモニタリングするには、DB クラスターで次のイベントを表示できます。


| 事前チェックのステータス | イベントメッセージ | Action | 
| --- | --- | --- | 
|  Started  |  アップグレードの準備中: オンラインアップグレードの事前チェックを開始しました。  | なし | 
|  失敗  |  データベースクラスターはアップグレードできない状態です: アップグレードの事前チェックに失敗しました。詳細については、upgrade-prechecks.log ファイルを参照してください。 アップグレード失敗の原因のトラブルシューティングの詳細については、以下を参照してください。 [https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Upgrading.Troubleshooting.html](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Upgrading.Troubleshooting.html)  |  `upgrade-prechecks.log` でエラーを確認します。 エラーを修正します。 アップグレードを再試行します。  | 
|  成功  |  アップグレードの準備中: オンラインアップグレードの事前チェックを完了しました。  |  事前チェックは成功し、エラーは返されませんでした。 `upgrade-prechecks.log` で警告と通知を確認します。  | 

イベントの表示の詳細については、「[Amazon RDS イベントの表示](USER_ListEvents.md)」を参照してください。

## Aurora MySQL の事前チェックのログ形式
<a name="AuroraMySQL.upgrade-prechecks.log-format"></a>

アップグレードの互換性チェック (事前チェック) が完了したら、`upgrade-prechecks.log` ファイルを確認できます。ログファイルには、各事前チェックの結果、影響を受けるオブジェクト、および修復情報が含まれます。

エラーがあると、アップグレードできません。アップグレードを再試行する前に解決する必要があります。

警告や通知はそれほど重要ではありませんが、アプリケーションのワークロードとの互換性の問題がないことを確認するために、注意深く確認することをお勧めします。特定された問題はすぐに対処してください。

ログファイルの形式は次のとおりです。
+ `targetVersion` – Aurora MySQL アップグレードの MySQL 互換バージョンです。
+ `auroraServerVersion` – 事前チェックが実行された Aurora MySQL バージョンです。
+ `auroraTargetVersion` – アップグレード先の Aurora MySQL バージョンです。
+ `checksPerformed` – 実行された事前チェックのリストが含まれています。
+ `id` – 実行中の事前チェックの名前です。
+ `title` – 実行中の事前チェックの説明です。
+ `status` – これは、事前チェックが成功したか失敗したかを示すものではありませんが、事前チェッククエリのステータスを表示します。
  + `OK` – 事前チェッククエリが実行され、正常に完了しました。
  + `ERROR` – 事前チェッククエリの実行に失敗しました。これは、リソースの制約、予期しないインスタンスの再起動、互換性の事前チェッククエリが中断されたなどの問題が原因で発生する可能性があります。

    詳細については、[この例](#precheck-query-failed)を参照してください。
+ `description` – 非互換性の一般的な説明と、問題を修正する方法です。
+ `documentationLink` – 該当する場合、関連する Aurora MySQL または MySQL ドキュメントへのリンクをここに示します。詳細については、「[Aurora MySQL の事前チェックの説明リファレンス](AuroraMySQL.upgrade-prechecks.descriptions.md)」を参照してください。
+ `detectedProblems` – 事前チェックでエラー、警告、または通知が返された場合、該当する場合には非互換性の詳細と非互換オブジェクトが表示されます。
  + `level` – 事前チェックで検出された非互換性のレベルです。有効なレベルは次のとおりです。
    + `Error` – 非互換性を解決するまで、アップグレードを続行することはできません。
    + `Warning` – アップグレードは続行できますが、非推奨のオブジェクト、構文、または設定が検出されました。警告を注意深く確認し、今後のリリースでの問題を避けるため、すぐに解決してください。
    + `Notice` – アップグレードは続行できますが、非推奨のオブジェクト、構文、または設定が検出されました。通知を注意深く確認し、今後のリリースでの問題を避けるため、すぐに解決してください。
  + `dbObject` – 非互換性が検出されたデータベースオブジェクトの名前です。
  + `description` – 非互換性の詳細な説明と、問題の修正方法です。
+ `errorCount` – 検出された非互換性エラーの数です。これらにより、アップグレードがブロックされています。
+ `warningCount` – 検出された非互換性警告の数です。これらはアップグレードをブロックするものではありませんが、今後のリリースでの問題を避けるため、すぐに対処してください。
+ `noticeCount` – 検出された非互換性通知の数です。これらはアップグレードをブロックするものではありませんが、今後のリリースでの問題を避けるため、すぐに対処してください。
+ `Summary` – 事前チェックの互換性エラー、警告、通知数の概要です。

## Aurora MySQL の事前チェックログ出力例
<a name="AuroraMySQL.upgrade-prechecks.log-examples"></a>

次の例は、表示される可能性のある事前チェックログ出力を示しています。実行される事前チェックの詳細については、「[Aurora MySQL の事前チェックの説明リファレンス](AuroraMySQL.upgrade-prechecks.descriptions.md)」を参照してください。

**事前チェックのステータスは OK で、非互換性は検出されませんでした。**  
事前チェッククエリが正常に完了しました。非互換性は検出されませんでした。  

```
{
  "id": "auroraUpgradeCheckIndexLengthLimitOnTinytext",
  "title": "Check for the tables with indexes defined with prefix length greater than 255 bytes on tiny text columns",
  "status": "OK",
  "detectedProblems": []
},
```

**事前チェックのステータスは OK で、エラーが検出されました。**  
事前チェッククエリが正常に完了しました。1 つのエラーが検出されました。  

```
{
  "id": "auroraUpgradeCheckForPrefixIndexOnGeometryColumns",
  "title": "Check for geometry columns on prefix indexes",
  "status": "OK",
  "description": "Consider dropping the prefix indexes of geometry columns and restart the upgrade.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test25.sbtest1",
        "description": "Table `test25`.`sbtest1` has an index `idx_t1` on geometry column/s. Mysql 8.0 does not support this type of index on a geometry column https://dev.mysql.com/worklog/task/?id=11808. To upgrade to MySQL 8.0, Run 'DROP INDEX `idx_t1` ON `test25`.`sbtest1`;"
      },
 }
```

**事前チェックのステータスは OK で、警告が検出されました。**  
警告は、事前チェックが成功または失敗したときに返されます。  
ここでは、事前チェッククエリが正常に完了しました。2 つの警告が検出されました。  

```
{
  "id": "zeroDatesCheck",
  "title": "Zero Date, Datetime, and Timestamp values",
  "status": "OK",
  "description": "Warning: By default zero date/datetime/timestamp values are no longer allowed in MySQL, as of 5.7.8 NO_ZERO_IN_DATE and NO_ZERO_DATE are included in SQL_MODE by default. These modes should be used with strict mode as they will be merged with strict mode in a future release. If you do not include these modes in your SQL_MODE setting, you are able to insert date/datetime/timestamp values that contain zeros. It is strongly advised to replace zero values with valid ones, as they may not work correctly in the future.",
  "documentationLink": "https://lefred.be/content/mysql-8-0-and-wrong-dates/",
  "detectedProblems": [
      {
        "level": "Warning",
        "dbObject": "global.sql_mode",
        "description": "does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates"
      },
      {
        "level": "Warning",
        "dbObject": "session.sql_mode",
        "description": " of 10 session(s) does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates"
      }
    ]
}
```

**事前チェックのステータスは ERROR で、非互換性は報告されていません。**  
事前チェッククエリがエラーで失敗したため、非互換性を検証できませんでした。  

```
{
  "id": "auroraUpgradeCheckForDatafilePathInconsistency",
  "title": "Check for inconsistency related to ibd file path.",
  "status": "ERROR",
  "description": "Can't connect to MySQL server on 'localhost:3306' (111) at 13/08/2024 12:22:20 UTC. This failure can occur due to low memory available on the instance for executing upgrade prechecks. Please check 'FreeableMemory' Cloudwatch metric to verify the available memory on the instance while executing prechecks. If instance ran out of memory, we recommend to retry the upgrade on a higher instance class."
}
```
この障害は、予期しないインスタンスの再起動や、データベースで互換性の事前チェッククエリが実行中に中断されたために発生する可能性があります。例えば、小規模な DB インスタンスクラスでは、インスタンスで使用可能なメモリが少なくなると、この状態になることがあります。  
`FreeableMemory` Amazon CloudWatch メトリクスを使用して、事前チェックの実行中にインスタンスで使用可能なメモリを確認できます。インスタンスがメモリ不足になった場合は、より大きな DB インスタンスクラスでアップグレードを再試行することをお勧めします。場合によっては、[ブルー/グリーンデプロイ](blue-green-deployments-overview.md)を使用できます。これにより、システムリソースを消費する本番稼働ワークロードから独立した「グリーン」DB クラスターで事前チェックとアップグレードを実行できます。  
詳細については、「[Aurora MySQL データベースのメモリ使用量に関する問題のトラブルシューティング](ams-workload-memory.md)」を参照してください。

**事前チェックの結果、1 つのエラーと 3 つの警告が検出されました。**  
互換性の事前チェックには、ソースおよびターゲットの Aurora MySQL バージョンに関する情報が含まれており、事前チェック出力の最後にはエラー、警告、通知数の概要があります。  
例えば、次の出力は、Aurora MySQL 2.11.6 から Aurora MySQL 3.07.1 にアップグレードしようとしたことを示しています。アップグレードで 1 つのエラーと 3 つの警告が返され、通知はありませんでした。エラーが返されるとアップグレードを続行できないため、[routineSyntaxCheck](AuroraMySQL.upgrade-prechecks.descriptions.md#routineSyntaxCheck) の互換性の問題を解決し、アップグレードを再試行する必要があります。  

```
{
  "serverAddress": "/tmp%2Fmysql.sock",
  "serverVersion": "5.7.12 - MySQL Community Server (GPL)",
  "targetVersion": "8.0.36",
  "auroraServerVersion": "2.11.6",
  "auroraTargetVersion": "3.07.1",
  "outfilePath": "/rdsdbdata/tmp/PreChecker.log",
  "checksPerformed": [{
      ... output for each individual precheck ...
      .
      .
      {
        "id": "oldTemporalCheck",
        "title": "Usage of old temporal type",
        "status": "OK",
          "detectedProblems": []
      },
      {
        "id": "routinesSyntaxCheck",
        "title": "MySQL 8.0 syntax check for routine-like objects",
        "status": "OK",
        "description": "The following objects did not pass a syntax check with the latest MySQL 8.0 grammar. A common reason is that they reference names that conflict with new reserved keywords. You must update these routine definitions and `quote` any such references before upgrading.",
        "documentationLink": "https://dev.mysql.com/doc/refman/en/keywords.html",
        "detectedProblems": [{
            "level": "Error",
            "dbObject": "test.select_res_word",
            "description": "at line 2,18: unexpected token 'except'"
        }]
      },
      .
      .
      .
      {
        "id": "zeroDatesCheck",
        "title": "Zero Date, Datetime, and Timestamp values",
        "status": "OK",
        "description": "Warning: By default zero date/datetime/timestamp values are no longer allowed in MySQL, as of 5.7.8 NO_ZERO_IN_DATE and NO_ZERO_DATE are included in SQL_MODE by default. These modes should be used with strict mode as they will be merged with strict mode in a future release. If you do not include these modes in your SQL_MODE setting, you are able to insert date/datetime/timestamp values that contain zeros. It is strongly advised to replace zero values with valid ones, as they may not work correctly in the future.",
        "documentationLink": "https://lefred.be/content/mysql-8-0-and-wrong-dates/",
        "detectedProblems": [{
            "level": "Warning",
            "dbObject": "global.sql_mode",
            "description": "does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates"
            },
            {
            "level": "Warning",
            "dbObject": "session.sql_mode",
            "description": " of 8 session(s) does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates"
            }
          ]
       },
       .
       .
       .
  }],
  "errorCount": 1,
  "warningCount": 3,
  "noticeCount": 0,
  "Summary": "1 errors were found. Please correct these issues before upgrading to avoid compatibility issues."
}
```

## Aurora MySQL の事前チェックパフォーマンス
<a name="AuroraMySQL.upgrade-prechecks.performance"></a>

互換性の事前チェックは、アップグレードのために DB インスタンスがオフラインになる前に実行されるため、通常の状況では、実行中に DB インスタンスのダウンタイムが発生することはありません。ただし、ライター DB インスタンスで実行されているアプリケーションのワークロードに影響を与える可能性があります。事前チェックは、[information\$1schema](https://dev.mysql.com/doc/mysql-infoschema-excerpt/5.7/en/information-schema-introduction.html) テーブルを介してデータディクショナリにアクセスします。これは、データベースオブジェクトが多い場合、遅くなる可能性があります。次の要素を考慮してください。
+ 事前チェックの期間は、テーブル、列、ルーチン、制約などのデータベースオブジェクトの数によって異なります。オブジェクトの数が多い DB クラスターの実行には時間がかかる場合があります。

  例えば、[removedFunctionsCheck](AuroraMySQL.upgrade-prechecks.descriptions.md#removedFunctionsCheck) は、[保存されているオブジェクト](https://dev.mysql.com/doc/refman/5.7/en/stored-objects.html)の数に基づいて、より長い時間がかかり、より多くのリソースを使用する場合があります。
+ インプレースアップグレードでは、より大きな DB インスタンスクラス (db.r5.24xlarge や db.r6g.16xlarge など) を使用すると、より多くの CPU を使用してアップグレードを迅速に完了できます。アップグレード後にダウンサイズできます。
+ 複数のデータベースにわたる `information_schema` に対するクエリは、特にオブジェクトが多く、DB インスタンスが小さい場合に遅くなる可能性があります。このような場合は、アップグレードのためにクローン作成、スナップショット復元、または[ブルー/グリーンデプロイ](blue-green-deployments-overview.md)を使用することを検討してください。
+ 事前チェックのリソース使用量 (CPU、メモリ) は、オブジェクトが増えるほど増加し、DB インスタンスが小さくなるほど実行時間が長くなる可能性があります。このような場合は、アップグレードのためにクローン作成、スナップショット復元、またはブルー/グリーンデプロイの使用をテストすることを検討してください。

  リソース不足が原因で事前チェックが失敗した場合、ステータス出力を使用して、事前チェックログで検出できます。

  ```
  "status": "ERROR",
  ```

詳細については、「[メジャーバージョンの Aurora MySQL インプレースアップグレードの仕組み](AuroraMySQL.Updates.MajorVersionUpgrade.md#AuroraMySQL.Upgrading.Sequence)」および「[Aurora MySQL クラスターのメジャーバージョンアップグレードの計画](AuroraMySQL.Updates.MajorVersionUpgrade.md#AuroraMySQL.Upgrading.Planning)」を参照してください。

## コミュニティ MySQL アップグレードの事前チェックの概要
<a name="AuroraMySQL.upgrade-prechecks.community"></a>

以下は、MySQL 5.7 から 8.0 までの非互換性の一般的なリストです。
+ MySQL 5.7 互換 DB クラスターでは、MySQL 8.0 でサポートされていない機能を使用しないでください。

  詳細については、MySQL ドキュメントの「[MySQL 8.0 で削除された機能](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals)」を参照してください。
+ キーワードや予約語に違反してはいけません。MySQL 8.0 では、以前に予約されていなかったキーワードもあります。

  詳細については、MySQL ドキュメントの「[キーワードと予約語](https://dev.mysql.com/doc/refman/8.0/en/keywords.html)」を参照してください。
+ Unicode サポートの改善のため、`utf8mb3` 文字セットを使用するオブジェクトを、`utf8mb4` 文字セットを使用するように変換することを検討してください。`utf8mb3` 文字セットは廃止されました。また、`utf8mb4` の代わりに `utf8` を文字セット参照に使用することを検討してください。現在 `utf8` は `utf8mb3` 文字セットの別名であるためです。

  詳細については、MySQL ドキュメントの「[utf8mb3 文字セット (3 バイトの UTF-8 Unicode エンコード)](https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb3.html)」を参照してください。
+ デフォルト以外の行形式の InnoDB テーブルは使用できません。
+ `ZEROFILL` または `display` の長さ型属性は使用できません。
+ ネイティブのパーティショニングをサポートしていないストレージエンジンを使用するパーティショニングされたテーブルがあってはいけません。
+ MySQL 5.7 の `mysql` システムデータベースに、MySQL 8.0 データディクショナリで使用されるテーブルと同じ名前のテーブルがあってはいけません。
+ テーブルで古いデータ型や関数を使用してはいけません。
+ 64 文字を超える外部キーの制約名があってはいけません。
+ `sql_mode` システム可変設定で、古い SQL モードを定義してはいけません。
+ 長さが 255 文字を超える `ENUM` または `SET` 列要素をそれぞれ持つテーブルまたはストアドプロシージャが存在してはいけません。
+ 共有 InnoDB テーブルスペースに存在するテーブルパーティションが存在してはいけません。
+ 表領域データファイルパスに循環参照が存在してはいけません。
+ `ASC` 句に `DESC` または `GROUP BY` 修飾子を使用するクエリおよびストアドプログラム定義が存在してはいけません。
+ 削除されたシステム変数が存在してはならず、システム変数は MySQL 8.0 の新しいデフォルト値を使用する必要があります。
+ ゼロ (`0`) の日付、日時、タイムスタンプ値は使用できません。
+ ファイルの削除または破損によるスキーマの不一致が存在してはいけません。
+ `FTS` 文字列を含むテーブル名が存在してはいけません。
+ 別のエンジンに属する InnoDB テーブルが存在してはいけません。
+ MySQL 5.7 に無効なテーブル名またはスキーマ名が存在してはいけません。

実行される事前チェックの詳細については、「[Aurora MySQL の事前チェックの説明リファレンス](AuroraMySQL.upgrade-prechecks.descriptions.md)」を参照してください。

MySQL 8.0 へのアップグレードの詳細については、MySQL ドキュメントの「[MySQL のアップグレード](https://dev.mysql.com/doc/refman/8.0/en/upgrading.html)」を参照してください。MySQL 8.0 の変更点の一般的な説明については、MySQL ドキュメントの「[What is new in MySQL 8.0](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html)」を参照してください。

## Aurora MySQL アップグレードの事前チェックの概要
<a name="AuroraMySQL.upgrade-prechecks.ams"></a>

バージョン 2 からバージョン 3 にアップグレードする場合、Aurora MySQL には以下のような独自の固有要件があります。
+ ビュー、ルーチン、トリガー、イベントに、`SQL_CACHE`、`SQL_NO_CACHE`、`QUERY_CACHE` などの非推奨の SQL 構文があってはいけません。
+ `FTS` インデックスのないテーブルには `FTS_DOC_ID` 列が存在しない必要があります。
+ InnoDB データディクショナリと実際のテーブル定義の間に列定義の不一致が存在してはいけません。
+ `lower_case_table_names` パラメータが `1` に設定されている場合は、すべてのデータベース名とテーブル名を小文字にする必要があります。
+ イベントとトリガーの definer は欠落していても、空にすることもできず、トリガーに無効な作成コンテキストでもいけません。
+ データベース内のすべてのトリガー名は一意である必要があります。
+ DDL リカバリと高速 DDL は、Aurora MySQL バージョン 3 ではサポートされていません。これらの機能に関連するデータベースにアーティファクトが存在してはいけません。
+ `REDUNDANT` または `COMPACT`行形式のテーブルには、767 バイトを超えるインデックスを含めることはできません。
+ `tiny` テキスト列に定義されているインデックスのプレフィックスの長さは 255 バイトを超えることはできません。`utf8mb4` 文字セットでは、サポートされるプレフィックスの長さは 63 文字に制限されます。

  MySQL 5.7 では、`innodb_large_prefix` パラメータを使用して、より大きなプレフィックス長が許可されていました。このパラメータは MySQL 8.0 では廃止されました。
+ `mysql.host` テーブルに InnoDB メタデータの不整合が存在してはいけません。
+ システムテーブルに列のデータ型の不一致が存在してはいけません。
+ `prepared` 状態の XA トランザクションが存在してはいけません。
+ ビューの列名は 64 文字以下にする必要があります。
+ ストアドプロシージャの特殊文字に一貫性を持たせることはできません。
+ テーブルにデータファイルパスの不整合が存在してはいけません。

実行される事前チェックの詳細については、「[Aurora MySQL の事前チェックの説明リファレンス](AuroraMySQL.upgrade-prechecks.descriptions.md)」を参照してください。

# Aurora MySQL の事前チェックの説明リファレンス
<a name="AuroraMySQL.upgrade-prechecks.descriptions"></a>

Aurora MySQL のアップグレードの事前チェックについては、ここで詳しく説明します。

**Contents**
+ [エラー](#precheck-descriptions-errors)
  + [エラーを報告する MySQL の事前チェック](#precheck-descriptions-errors.mysql)
  + [エラーを報告する Aurora MySQL の事前チェック](#precheck-descriptions-errors.aurora)
+ [警告](#precheck-descriptions-warnings)
  + [警告を報告する MySQL の事前チェック](#precheck-descriptions-warnings.mysql)
  + [警告を報告する Aurora MySQL の事前チェック](#precheck-descriptions-warnings.aurora)
+ [注意](#precheck-descriptions-notices)
+ [エラー、警告、または通知](#precheck-descriptions-all)

## エラー
<a name="precheck-descriptions-errors"></a>

次の事前チェックは、事前チェックが失敗し、アップグレードを続行できない場合にエラーを生成します。

**Topics**
+ [エラーを報告する MySQL の事前チェック](#precheck-descriptions-errors.mysql)
+ [エラーを報告する Aurora MySQL の事前チェック](#precheck-descriptions-errors.aurora)

### エラーを報告する MySQL の事前チェック
<a name="precheck-descriptions-errors.mysql"></a>

次の事前チェックは、コミュニティ MySQL から提供されています。
+ [checkTableMysqlSchema](#checkTableMysqlSchema)
+ [circularDirectoryCheck](#circularDirectoryCheck)
+ [columnsWhichCannotHaveDefaultsCheck](#columnsWhichCannotHaveDefaultsCheck)
+ [depreciatedSyntaxCheck](#depreciatedSyntaxCheck)
+ [engineMixupCheck](#engineMixupCheck)
+ [enumSetElementLengthCheck](#enumSetElementLengthCheck)
+ [foreignKeyLengthCheck](#foreignKeyLengthCheck)
+ [getDuplicateTriggers](#getDuplicateTriggers)
+ [getEventsWithNullDefiner](#getEventsWithNullDefiner)
+ [getMismatchedMetadata](#getMismatchedMetadata)
+ [getTriggersWithNullDefiner](#getTriggersWithNullDefiner)
+ [getValueOfVariablelower\$1case\$1table\$1names](#getValueOfVariable)
+ [groupByAscSyntaxCheck](#groupByAscSyntaxCheck)
+ [mysqlEmptyDotTableSyntaxCheck](#mysqlEmptyDotTableSyntaxCheck)
+ [mysqlIndexTooLargeCheck](#mysqlIndexTooLargeCheck)
+ [mysqlInvalid57NamesCheck](#mysqlInvalid57NamesCheck)
+ [mysqlOrphanedRoutinesCheck](#mysqlOrphanedRoutinesCheck)
+ [mysqlSchemaCheck](#mysqlSchemaCheck)
+ [nonNativePartitioningCheck](#nonNativePartitioningCheck)
+ [oldTemporalCheck](#oldTemporalCheck)
+ [partitionedTablesInSharedTablespaceCheck](#partitionedTablesInSharedTablespace)
+ [removedFunctionsCheck](#removedFunctionsCheck)
+ [routineSyntaxCheck](#routineSyntaxCheck)
+ [schemaInconsistencyCheck](#schemaInconsistencyCheck)

**checkTableMysqlSchema**  
**事前チェックレベル: Error**  
**`mysql` スキーマの `check table x for upgrade` コマンドによって報告された問題**  
Aurora MySQL バージョン 3 へのアップグレードを開始する前に、`check table for upgrade` が DB インスタンスの `mysql` スキーマ内の各テーブルで実行されます。`check table for upgrade` コマンドは、MySQL の新しいバージョンへのアップグレード中に発生する可能性のある問題がないかテーブルを調べます。アップグレードを試行する前にこのコマンドを実行すると、互換性がない箇所を事前に特定して解決できるため、実際のアップグレードプロセスがよりスムーズになります。  
このコマンドは、次のような各テーブルに対してさまざまなチェックを実行します。  
+ テーブル構造とメタデータがターゲットの MySQL バージョンと互換性があることを確認する
+ テーブルで使用される廃止または削除された機能を確認する
+ データ損失なしでテーブルを適切にアップグレードできることを確認する
詳細については、MySQL ドキュメントの「[CHECK TABLE Statement](https://dev.mysql.com/doc/refman/5.7/en/check-table.html)」を参照してください。  
**出力例:**  

```
{
  "id": "checkTableMysqlSchema",
  "title": "Issues reported by 'check table x for upgrade' command for mysql schema.",
  "status": "OK",
  "detectedProblems": []
}
```
`check table for upgrade` は複数のチェックを実行するため、この事前チェックの出力は、発生したエラーと発生したタイミングによって異なります。  
この事前チェックでエラーが発生した場合は、[AWS サポート](https://aws.amazon.com/support)でケースを開き、メタデータの不整合の解決をリクエストします。または、論理ダンプを実行してから新しい Aurora MySQL バージョン 3 DB クラスターに復元することで、アップグレードを再試行することもできます。

**circularDirectoryCheck**  
**事前チェックレベル: Error**  
**テーブルスペースのデータファイルパスの循環ディレクトリ参照**  
[MySQL 8.0.17](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-17.html) 以降、`CREATE TABLESPACE ... ADD DATAFILE` 句は循環ディレクトリ参照を許可しなくなりました。アップグレードの問題を回避するには、Aurora MySQL バージョン 3 にアップグレードする前に、テーブルスペースのデータファイルパスから循環ディレクトリ参照を削除します。  
**出力例:**  

```
{
  "id": "circularDirectory",
  "title": "Circular directory references in tablespace data file paths",
  "status": "OK",
  "description": "Error: Following tablespaces contain circular directory references (e.g. the reference '/../') in data file paths which as of MySQL 8.0.17 are not permitted by the CREATE TABLESPACE ... ADD DATAFILE clause. An exception to the restriction exists on Linux, where a circular directory reference is permitted if the preceding directory is a symbolic link. To avoid upgrade issues, remove any circular directory references from tablespace data file paths before upgrading.",
  "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-innodb-changes",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "ts2",
        "description": "circular reference in datafile path: '/home/ec2-user/dbdata/mysql_5_7_44/../ts2.ibd'",
        "dbObjectType": "Tablespace"
      }
  ]
}
```
このエラーが表示された場合は、[file-per-table テーブルスペース](https://dev.mysql.com/doc/refman/8.0/en/innodb-file-per-table-tablespaces.html)を使用してテーブルを再構築します。すべてのテーブルスペースとテーブル定義にデフォルトのファイルパスを使用します。  
Aurora MySQL は、一般的なテーブルスペースや `CREATE TABLESPACE` コマンドをサポートしていません。  
テーブルスペースを再構築する前に、MySQL ドキュメントの「[Online DDL Operations](https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html)」を参照して、フォアグラウンドトランザクションに対するロックとデータ移動の影響を理解してください。
再構築後、事前チェックに合格し、アップグレードを続行できます。  

```
{
  "id": "circularDirectoryCheck",
  "title": "Circular directory references in tablespace data file paths",
  "status": "OK",
  "detectedProblems": []
},
```

**columnsWhichCannotHaveDefaultsCheck**  
**事前チェックレベル: Error**  
**デフォルト値を設定できない列**  
MySQL 8.0.13 より前のバージョンでは、`BLOB`、`TEXT`、`GEOMETRY`、および `JSON` 列に[デフォルト値](https://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html)を含めることはできません。Aurora MySQL バージョン 3 にアップグレードする前に、これらの列のデフォルト句をすべて削除します。これらのデータ型のデフォルト処理の変更についての詳細は、MySQL ドキュメントの「[Data Type Default Values](https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html)」を参照してください。  
**出力例:**  

```
{
  "id": "columnsWhichCannotHaveDefaultsCheck",
  "title": "Columns which cannot have default values",
  "status": "OK",
  "description": "Error: The following columns are defined as either BLOB, TEXT, GEOMETRY or JSON and have a default value set. These data types cannot have default values in MySQL versions prior to 8.0.13, while starting with 8.0.13, the default value must be specified as an expression. In order to fix this issue, please use the ALTER TABLE ... ALTER COLUMN ... DROP DEFAULT statement.",
  "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html#data-type-defaults-explicit",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.test_blob_default.geo_col",
        "description": "geometry"
      }
  ]
},
```
`test.test_blob_default` テーブルの `geo_col` 列は、デフォルト値が指定された `BLOB`、`TEXT`、`GEOMETRY`、または `JSON` データ型を使用しているため、事前チェックではエラーが返されます。  
テーブル定義を見ると、`geo_col` 列が `geo_col geometry NOT NULL default ''` として定義されていることがわかります。  

```
mysql> show create table test_blob_default\G
*************************** 1. row ***************************
       Table: test_blob_default
Create Table: CREATE TABLE `test_blob_default` (
  `geo_col` geometry NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1
```
このデフォルト句を削除して、事前チェックが合格できるようにします。  
`ALTER TABLE` ステートメントを実行したり、テーブルスペースを再構築したりする前に、MySQL ドキュメントの「[Online DDL Operations](https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html)」を参照して、フォアグラウンドトランザクションに対するロックとデータ移動の影響を理解してください。

```
mysql> ALTER TABLE test_blob_default modify COLUMN geo_col geometry NOT NULL;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table test_blob_default\G
*************************** 1. row ***************************
       Table: test_blob_default
Create Table: CREATE TABLE `test_blob_default` (
  `geo_col` geometry NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
```
事前チェックに合格し、アップグレードを再試行できます。  

```
{
  "id": "columnsWhichCannotHaveDefaultsCheck",
  "title": "Columns which cannot have default values",
  "status": "OK",
  "detectedProblems": []
},
```

**depreciatedSyntaxCheck**  
**事前チェックレベル: Error**  
**定義での非推奨キーワードの使用**  
MySQL 8.0 では、[クエリキャッシュ](https://dev.mysql.com/doc/refman/5.7/en/query-cache.html)が削除されています。その結果、クエリキャッシュ固有の SQL 構文の一部が削除されました。データベースオブジェクトのいずれかに `QUERY CACHE`、`SQL_CACHE` または `SQL_NO_CACHE` のキーワードが含まれている場合、事前チェックエラーが返されます。この問題を解決するには、これらのオブジェクトを再作成し、前述のキーワードを削除します。  
**出力例:**  

```
{
  "id": "depreciatedSyntaxCheck",
  "title": "Usage of depreciated keywords in definition",
  "status": "OK",
  "description": "Error: The following DB objects contain keywords like 'QUERY CACHE', 'SQL_CACHE', 'SQL_NO_CACHE' which are not supported in major version 8.0. It is recommended to drop these DB objects or rebuild without any of the above keywords before upgrade.",
  "detectedProblems": [
      {
"level": "Error",
"dbObject": "test.no_query_cache_check",
"description": "PROCEDURE uses depreciated words in definition"
      }
  ]
}
```
事前チェックでは、`test.no_query_cache_check` ストアドプロシージャが、削除されたキーワードのいずれかを使用していることがレポートされます。プロシージャ定義を見ると、`SQL_NO_CACHE` を使用していることがわかります。  

```
mysql> show create procedure test.no_query_cache_check\G
*************************** 1. row ***************************
           Procedure: no_query_cache_check
            sql_mode:
    Create Procedure: CREATE DEFINER=`reinvent`@`%` PROCEDURE `no_query_cache_check`()
BEGIN
    SELECT SQL_NO_CACHE k from sbtest1 where id > 10 and id < 20 group by k asc;
END
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
```
キーワードを削除します。  

```
mysql> drop procedure test.no_query_cache_check;
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter //

mysql> CREATE DEFINER=`reinvent`@`%` PROCEDURE `no_query_cache_check`() BEGIN     SELECT k from sbtest1 where id > 10 and id < 20 group by k asc; END//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
```
キーワードを削除すると、事前チェックは正常に完了します。  

```
{
  "id": "depreciatedSyntaxCheck",
  "title": "Usage of depreciated keywords in definition",
  "status": "OK",
  "detectedProblems": []
}
```

**engineMixupCheck**  
**事前チェックレベル: Error**  
**別のエンジンに属する InnoDB によって認識されるテーブル**  
[schemaInconsistencyCheck](#schemaInconsistencyCheck) と同様、この事前チェックは、アップグレードに進む前に MySQL のテーブルメタデータが一貫していることを確認します。  
この事前チェックでエラーが発生した場合は、[AWS サポート](https://aws.amazon.com/support)でケースを開き、メタデータの不整合の解決をリクエストします。または、論理ダンプを実行してから新しい Aurora MySQL バージョン 3 DB クラスターに復元することで、アップグレードを再試行することもできます。  
**出力例:**  

```
{
  "id": "engineMixupCheck",
  "title": "Tables recognized by InnoDB that belong to a different engine",
  "status": "OK",
  "description": "Error: Following tables are recognized by InnoDB engine while the SQL layer believes they belong to a different engine. Such situation may happen when one removes InnoDB table files manually from the disk and creates e.g. a MyISAM table with the same name.\n\nA possible way to solve this situation is to e.g. in case of MyISAM table:\n\n1. Rename the MyISAM table to a temporary name (RENAME TABLE).\n2. Create some dummy InnoDB table (its definition does not need to match), then copy (copy, not move) and rename the dummy .frm and .ibd files to the orphan name using OS file commands.\n3. The orphan table can be then dropped (DROP TABLE), as well as the dummy table.\n4. Finally the MyISAM table can be renamed back to its original name.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "mysql.general_log_backup",
        "description": "recognized by the InnoDB engine but belongs to CSV"
      }
  ]
}
```

**enumSetElementLengthCheck**  
**事前チェックレベル: Error**  
**255 文字を超える要素を含む `ENUM` および `SET` 列定義**  
テーブルとストアドプロシージャには、255 文字または 1020 バイトを超える `ENUM` または `SET` 列要素が存在してはいけません。MySQL 8.0 より前では、合計最大長は 64K でしたが、8.0 では個々の要素が 255 文字または 1020 バイト (マルチバイトをサポート) に制限されています。`enumSetElementLengthCheck` の事前チェックに失敗した場合は、アップグレードを再試行する前に、これらの新しい制限を超える要素を変更します。  
**出力例:**  

```
{
  "id": "enumSetElementLengthCheck",
  "title": "ENUM/SET column definitions containing elements longer than 255 characters",
  "status": "OK",
  "description": "Error: The following columns are defined as either ENUM or SET and contain at least one element longer that 255 characters. They need to be altered so that all elements fit into the 255 characters limit.",
  "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/string-type-overview.html",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.large_set.s",
        "description": "SET contains element longer than 255 characters"
      }
  ]
},
```
`test.large_set` テーブルの `s` 列に 255 文字を超える `SET` 要素が含まれているため、事前チェックはエラーを報告します。  
この列の `SET` サイズを小さくすると、事前チェックに合格し、アップグレードを続行できます。  

```
{
  "id": "enumSetElementLenghtCheck",
  "title": "ENUM/SET column definitions containing elements longer than 255 characters",
  "status": "OK",
  "detectedProblems": []
},
```

**foreignKeyLengthCheck**  
**事前チェックレベル: Error**  
**64 文字を超える外部キーの制約名**  
[MySQL ドキュメント](https://dev.mysql.com/doc/refman/8.0/en/identifier-length.html)で説明されているように、MySQL では、識別子の長さは 64 文字に制限されています。外部キーの長さがこの値以上になり、アップグレードに失敗する可能性のある[問題](https://bugs.mysql.com/bug.php?id=88118)が特定されたため、この事前チェックが実装されました。この事前チェックでエラーが発生した場合は、アップグレードを再試行する前に 64 文字未満になるように制約を[変更または名前を変更](https://dev.mysql.com/doc/refman/8.0/en/alter-table.html)する必要があります。  
**出力例:**  

```
{
  "id": "foreignKeyLength",
  "title": "Foreign key constraint names longer than 64 characters",
  "status": "OK",
  "detectedProblems": []
}
```

**getDuplicateTriggers**  
**事前チェックレベル: Error**  
**データベース内のすべてのトリガー名は一意である必要があります。**  
データディクショナリの実装が変更されているため、MySQL 8.0 はデータベース内の大文字と小文字を区別するトリガーをサポートしていません。この事前チェックでは、DB クラスターに重複トリガーを含むデータベースが 1 つ以上ないことを検証します。詳細については、MySQL ドキュメントの「[Identifier Case Sensitivity](https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html)」を参照してください。  
**出力例:**  

```
{
  "id": "getDuplicateTriggers",
  "title": "MySQL pre-checks that all trigger names in a database are unique or not.",
  "status": "OK",
  "description": "Error: You have one or more database containing duplicate triggers. Mysql 8.0 does not support case sensitive triggers within a database https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html. To upgrade to MySQL 8.0, drop the triggers with case-insensitive duplicate names and recreate with distinct names.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test",
        "description": "before_insert_product"
      },
      {
        "level": "Error",
        "dbObject": "test",
        "description": "before_insert_PRODUCT"
      }
  ]
}
```
事前チェックでは、データベースクラスターに同じ名前のトリガーが 2 つあるものの、異なるケースである `test.before_insert_product` と `test.before_insert_PRODUCT` を使用しているというエラーが報告されます。  
アップグレードする前に、トリガーの名前を変更するか、新しい名前で削除して再作成します。  
`test.before_insert_PRODUCT` の名前を `test.before_insert_product_2` に変更すると、事前チェックは成功します。  

```
{
  "id": "getDuplicateTriggers",
  "title": "MySQL pre-checks that all trigger names in a database are unique or not.",
  "status": "OK",
  "detectedProblems": []
}
```

**getEventsWithNullDefiner**  
**事前チェックレベル: Error**  
**`mysql.event` の "definer" 列を null または空白にすることはできません。**  
`DEFINER` 属性は、トリガー、ストアドプロシージャ、イベントなど、ストアドオブジェクト定義を所有する MySQL アカウントを指定します。この属性は、保存されたオブジェクトが実行されるセキュリティコンテキストを制御する場合に特に便利です。ストアドオブジェクトを作成するときに、`DEFINER` が指定されていない場合、デフォルトはオブジェクトを作成したユーザーです。  
MySQL 8.0 にアップグレードする場合、MySQL データディクショナリの "definer" が `null` または空であるオブジェクトを保存することはできません。このようなストアドオブジェクトがある場合、事前チェックエラーが発生します。アップグレードを続行する前に、エラーを修正する必要があります。  
エラーの例  

```
{
  "id": "getEventsWithNullDefiner",
  "title": "The definer column for mysql.event cannot be null or blank.",
  "status": "OK",
  "description": "Error: Set definer column in mysql.event to a valid non-null definer.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.get_version",
        "description": "Set definer for event get_version in Schema test"
      }
  ]
}
```
事前チェックは、"definer" が `null` であるため、`test.get_version` [イベント](https://dev.mysql.com/doc/refman/5.7/en/events-overview.html)のエラーを返します。  
これを解決するために、イベント定義を確認できます。以下に示すとおり、"definer" は `null` または空白です。  

```
mysql> select db,name,definer from mysql.event where name='get_version';
+------+-------------+---------+
| db   | name        | definer |
+------+-------------+---------+
| test | get_version |         |
+------+-------------+---------+
1 row in set (0.00 sec)
```
有効な "definer" を指定してイベントを削除または再作成します。  
`DEFINER` を削除または再定義する前に、アプリケーションと権限の要件を慎重に検討して確認してください。詳細については、MySQL ドキュメントの「[Stored Object Access Control](https://dev.mysql.com/doc/refman/5.7/en/stored-objects-security.html)」を参照してください。

```
mysql> drop event test.get_version;
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> delimiter $$
mysql> CREATE EVENT get_version
    ->     ON SCHEDULE
    ->       EVERY 1 DAY
    ->     DO
    ->      ///DO SOMETHING //
    -> $$
Query OK, 0 rows affected (0.01 sec)

mysql> DELIMITER ;

mysql> select db,name,definer from mysql.event where name='get_version';
+------+-------------+------------+
| db   | name        | definer    |
+------+-------------+------------+
| test | get_version | reinvent@% |
+------+-------------+------------+
1 row in set (0.00 sec)
```
これで、事前チェックに合格です。  

```
{
  "id": "getEventsWithNullDefiner",
  "title": "The definer column for mysql.event cannot be null or blank.",
  "status": "OK",
  "detectedProblems": []},
```

**getMismatchedMetadata**  
**事前チェックレベル: Error**  
**InnoDB データディクショナリと実際のテーブル定義の間の列定義の不一致**  
[schemaInconsistencyCheck](#schemaInconsistencyCheck) と同様、この事前チェックは、アップグレードに進む前に MySQL のテーブルメタデータが一貫していることを確認します。この場合、事前チェックでは、InnoDB データディクショナリと MySQL テーブル定義が列定義と一致することを確認します。不一致が検出された場合、アップグレードは続行されません。  
この事前チェックでエラーが発生した場合は、[AWS サポート](https://aws.amazon.com/support)でケースを開き、メタデータの不整合の解決をリクエストします。または、論理ダンプを実行してから新しい Aurora MySQL バージョン 3 DB クラスターに復元することで、アップグレードを再試行することもできます。  
**出力例:**  

```
{
  "id": "getMismatchedMetadata",
  "title": "Column definition mismatch between InnoDB Data Dictionary and actual table definition.",
  "status": "OK",
  "description": "Error: Your database has mismatched metadata. The upgrade to mysql 8.0 will not succeed until this is fixed.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.mismatchTable",
        "description": "Table `test/mismatchTable` column names mismatch with InnoDb dictionary column names: iD <> id"
      }
  ]
}
```
事前チェックでは、`test.mismatchTable` テーブル内の `id` 列のメタデータの不一致が報告されます。具体的には、MySQL メタデータの列名は `iD` で、InnoDB の列名は `id` です。

**getTriggersWithNullDefiner**  
**事前チェックレベル: Error**  
**`information_schema.triggers` の "definer" 列は、`null` または空白にすることはできません。**  
事前チェックでは、データベースに、"definer" が `null` または空白で定義されたトリガーがないことを確認します。保存されたオブジェクトの "definer" の要件についての詳細は、「[getEventsWithNullDefiner](#getEventsWithNullDefiner)」を参照してください。  
**出力例:**  

```
{
  "id": "getTriggersWithNullDefiner",
  "title": "The definer column for information_schema.triggers cannot be null or blank.",
  "status": "OK",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.example_trigger",
        "description": "Set definer for trigger example_trigger in Schema test"
      }
  ]
}
```
`test` スキーマの `example_trigger` トリガーの "definer" が `null` であるため、事前チェックはエラーを返します。この問題を修正するには、有効なユーザーでトリガーを再作成するか、トリガーを削除して、"definer" を修正します。詳細については、「[getEventsWithNullDefiner](#getEventsWithNullDefiner)」の例を参照してください。  
`DEFINER` を削除または再定義する前に、アプリケーションと権限の要件を慎重に検討して確認してください。詳細については、MySQL ドキュメントの「[Stored Object Access Control](https://dev.mysql.com/doc/refman/5.7/en/stored-objects-security.html)」を参照してください。

**getValueOfVariablelower\$1case\$1table\$1names**  
**事前チェックレベル: Error**  
**`lower_case_table_names` パラメータが `1` に設定されている場合は、すべてのデータベース名とテーブル名を小文字にする必要があります。**  
MySQL 8.0 より前では、データベース名、テーブル名、およびその他のオブジェクトは、ファイルベースのメタデータ (.frm) などのデータディレクトリ内のファイルに対応していました。[lower\$1case\$1table\$1names](https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html) システム変数を使用すると、サーバーがデータベースオブジェクトの識別子の大文字と小文字の区別を処理する方法と、そのようなメタデータオブジェクトのストレージを制御できます。このパラメータは、再起動後に既に初期化されているサーバーで変更できます。  
ただし、MySQL 8.0 では、このパラメータは引き続きサーバーが識別子の大文字と小文字の区別を処理する方法を制御しますが、データディクショナリの初期化後に変更することはできません。MySQL 8.0 データベースをアップグレードまたは作成する場合、MySQL でデータディクショナリが初めて起動するときに `lower_case_table_names` に設定した値は、そのデータベースの存続期間に使用されます。この制限は、データベースオブジェクトがファイルベースのメタデータから `mysql` スキーマ内の内部 InnoDB テーブルに移行される[アトミックデータディクショナリ](https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html)実装の実装の一環として導入されました。  
詳細については、MySQL ドキュメントの「[Data Dictionary Changes](https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-data-dictionary-changes)」を参照してください。  
ファイルベースのメタデータを新しいアトミックデータディクショナリに更新する際のアップグレード時の問題を回避するため、この事前チェックでは、`lower_case_table_names = 1` の場合、すべてのテーブルがディスクに小文字で保存されていることを検証します。小文字で保存されていない場合、事前チェックエラーが返され、アップグレードに進む前にメタデータを修正する必要があります。  
**出力例:**  

```
{
  "id": "getValueOfVariablelower_case_table_names",
  "title": "MySQL pre-checks that all database or table names are lowercase when the lower_case_table_names parameter is set to 1.",
  "status": "OK",
  "description": "Error: You have one or more databases or tables with uppercase letters in the names, but the lower_case_table_names parameter is set to 1. To upgrade to MySQL 8.0, either change all database or table names to lowercase, or set the parameter to 0.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.TEST",
        "description": "Table test.TEST contains one or more capital letters in name while lower_case_table_names = 1"
      }
  ]
}
```
テーブル `test.TEST` に大文字が含まれているものの、`lower_case_table_names` が `1` に設定されているため、エラーが返されます。  
この問題を解決するために、小文字を使用するようにテーブルの名前を変更するか、アップグレードを開始する前に DB クラスターの `lower_case_table_names` パラメータを変更することができます。  
MySQL の[大文字と小文字の区別](https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html)に関するドキュメントを確認し、このような変更がアプリケーションにどのように影響するかを慎重にテストして確認します。  
また、MySQL 8.0 で [lower\$1case\$1table\$1names](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_lower_case_table_names) がどのように処理されるかについては、MySQL 8.0 のドキュメントを参照してください。

**groupByAscSyntaxCheck**  
**事前チェックレベル: Error**  
**削除された `GROUP BY ASC/DESC` 構文の使用**  
MySQL 8.0.13 以降、`GROUP BY` 句の非推奨の `ASC` または `DESC` 構文は削除されました。`GROUP BY` ソートに依存するクエリは、異なる結果を生成するようになりました。特定のソート順序を取得するには、`ORDER BY` 句を代わりに使用します。この構文を使用したオブジェクトがデータベースに存在する場合は、アップグレードを再試行する前に `ORDER BY` 句を使用してオブジェクトを再作成する必要があります。詳細については、MySQL ドキュメントの「[SQL Changes](https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-sql-changes)」を参照してください。  
**出力例:**  

```
{
  "id": "groupbyAscSyntaxCheck",
  "title": "Usage of removed GROUP BY ASC/DESC syntax",
  "status": "OK",
  "description": "Error: The following DB objects use removed GROUP BY ASC/DESC syntax. They need to be altered so that ASC/DESC keyword is removed from GROUP BY clause and placed in appropriate ORDER BY clause.",
  "documentationLink": "https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-13.html#mysqld-8-0-13-sql-syntax",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.groupbyasc",
        "description": "PROCEDURE uses removed GROUP BY ASC syntax",
        "dbObjectType": "Routine"
      }
  ]
}
```

**mysqlEmptyDotTableSyntaxCheck**  
**事前チェックレベル: Error**  
**ルーチンで使用される非推奨の `.<table>` 構文を確認します。**  
MySQL 8.0 では、ルーチンに非推奨の識別子構文 (`\".<table>\"`) を含めることができなくなります。保存されたルーチンまたはトリガーにそのような識別子が含まれている場合、アップグレードは失敗します。例えば、次の `.dot_table` リファレンスは許可されなくなりました。  

```
mysql> show create procedure incorrect_procedure\G
*************************** 1. row ***************************
           Procedure: incorrect_procedure
            sql_mode:
    Create Procedure: CREATE DEFINER=`reinvent`@`%` PROCEDURE `incorrect_procedure`()
BEGIN delete FROM .dot_table; select * from .dot_table where 1=1; END
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
```
正しい識別子構文とエスケープを使用するようにルーチンとトリガーを再作成すると、事前チェックに合格し、アップグレードを続行できます。識別子についての詳細は、MySQL ドキュメントの「[Schema Object Names](https://dev.mysql.com/doc/refman/8.0/en/identifiers.html)」を参照してください。  
**出力例:**  

```
{
  "id": "mysqlEmptyDotTableSyntaxCheck",
  "title": "Check for deprecated '.<table>' syntax used in routines.",
  "status": "OK",
  "description": "Error: The following routines contain identifiers in deprecated identifier syntax (\".<table>\"), and should be corrected before upgrade:\n",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.incorrect_procedure",
        "description": " routine body contains deprecated identifiers."
      }
  ]
}
```
非推奨の構文が含まれているため、事前チェックは、`test` データベース内の `incorrect_procedure` ルーチンのエラーを返します。  
ルーチンを修正すると、事前チェックは成功し、アップグレードを再試行できます。

**mysqlIndexTooLargeCheck**  
**事前チェックレベル: Error**  
**MySQL の 5.7 を超えるバージョンで機能するには大きすぎるインデックスがないかをチェックする**  
コンパクトまたは冗長な行形式の場合、プレフィックスが 767 バイトを超えるインデックスを作成することはできません。ただし、MySQL バージョン 5.7.35 より前では、これは可能でした。詳細については、「[MySQL 5.7.35 リリースノート](https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-35.html)」を参照してください。  
このバグの影響を受けたインデックスは、MySQL 8.0 にアップグレードするとアクセスできなくなります。この事前チェックでは、アップグレードを進める前に再構築する必要がある問題のあるインデックスを特定します。  

```
 {
  "id": "mysqlIndexTooLargeCheck",
  "title": "Check for indexes that are too large to work on higher versions of MySQL Server than 5.7",
  "status": "OK",
  "description": "Error: The following indexes ware made too large for their format in an older version of MySQL (older than 5.7.34). Normally those indexes within tables with compact or redundant row formats shouldn't be larger than 767 bytes. To fix this problem those indexes should be dropped before upgrading or those tables will be inaccessible.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.table_with_large_idx",
        "description": "IDX_2"
      }
  ]
}
```
`test.table_with_large_idx` テーブルには 767 バイトを超えるコンパクトな行形式または冗長な行形式を使用したテーブル上のインデックスが含まれているため、事前チェックはエラーを返します。これらのテーブルは、MySQL 8.0 にアップグレードするとアクセスできなくなります。アップグレードに進む前に、次のいずれかを実行します。  
+ 事前チェックで説明されているインデックスを削除します。
+ 事前チェックで説明されているインデックスを追加します。
+ テーブルで使用される行形式を変更します。
ここでは、テーブルを再構築して、事前チェックの失敗を解決します。テーブルを再構築する前に、[innodb\$1file\$1format](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_file_format) が `Barracuda` に設定され、[innodb\$1default\$1row\$1format](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_default_row_format) が `dynamic` に設定されていることを確認します。これらは MySQL 5.7 のデフォルトです。詳細については、MySQL ドキュメントの「[InnoDB Row Formats](https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html)」および「[InnoDB File-Format Management](https://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html)」を参照してください。  
テーブルスペースを再構築する前に、MySQL ドキュメントの「[Online DDL Operations](https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html)」を参照して、フォアグラウンドトランザクションに対するロックとデータ移動の影響を理解してください。

```
mysql > select @@innodb_file_format,@@innodb_default_row_format;
+----------------------+-----------------------------+
| @@innodb_file_format | @@innodb_default_row_format |
+----------------------+-----------------------------+
| Barracuda            | dynamic                     |
+----------------------+-----------------------------+
1 row in set (0.00 sec)

mysql> optimize table table_with_large_idx;
+---------------------------+----------+----------+-------------------------------------------------------------------+
| Table                     | Op       | Msg_type | Msg_text                                                          |
+---------------------------+----------+----------+-------------------------------------------------------------------+
| test.table_with_large_idx | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.table_with_large_idx | optimize | status   | OK                                                                |
+---------------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.02 sec)

# Verify FILE_FORMAT and ROW_FORMAT
mysql>  select * from information_schema.innodb_sys_tables where name like 'test/table_with_large_idx';
+----------+---------------------------+------+--------+-------+-------------+------------+---------------+------------+
| TABLE_ID | NAME                      | FLAG | N_COLS | SPACE | FILE_FORMAT | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE |
+----------+---------------------------+------+--------+-------+-------------+------------+---------------+------------+
|       43 | test/table_with_large_idx |   33 |      4 |    26 | Barracuda   | Dynamic    |             0 | Single     |
+----------+---------------------------+------+--------+-------+-------------+------------+---------------+------------+
1 row in set (0.00 sec)
```
テーブルを再構築すると、事前チェックに合格し、アップグレードを続行できます。  

```
{
  "id": "mysqlIndexTooLargeCheck",
  "title": "Check for indexes that are too large to work on higher versions of MySQL Server than 5.7",
  "status": "OK",
  "detectedProblems": []
},
```

**mysqlInvalid57NamesCheck**  
**事前チェックレベル: Error**  
**MySQL 5.7 で使用されている無効なテーブル名とスキーマ名をチェックする**  
MySQL 8.0 で新しいデータディクショナリに移行する場合、データベースインスタンスに `#mysql50#` というプレフィックスが付いたスキーマやテーブルを含めることはできません。このようなオブジェクトが存在する場合、アップグレードは失敗します。この問題を解決するには、返されたスキーマとテーブルに対して [mysqlcheck](https://dev.mysql.com/doc/refman/8.0/en/mysqlcheck.html) を実行します。  
[--fix-db-names](https://dev.mysql.com/doc/refman/5.7/en/mysqlcheck.html#option_mysqlcheck_fix-db-names) と [--fix-table-names](https://dev.mysql.com/doc/refman/5.7/en/mysqlcheck.html#option_mysqlcheck_fix-table-names) が [MySQL 8.0](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html) から削除されているため、必ず [MySQL 5.7 バージョン](https://downloads.mysql.com/archives/community/)の `mysqlcheck` を使用してください。
**出力例:**  

```
{
  "id": "mysqlInvalid57NamesCheck",
  "title": "Check for invalid table names and schema names used in 5.7",
  "status": "OK",
  "description": "The following tables and/or schemas have invalid names. In order to fix them use the mysqlcheck utility as follows:\n\n  $ mysqlcheck --check-upgrade --all-databases\n  $ mysqlcheck --fix-db-names --fix-table-names --all-databases\n\nOR via mysql client, for eg:\n\n  ALTER DATABASE `#mysql50#lost+found` UPGRADE DATA DIRECTORY NAME;",
  "documentationLink": "https://dev.mysql.com/doc/refman/5.7/en/identifier-mapping.html https://dev.mysql.com/doc/refman/5.7/en/alter-database.html https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "#mysql50#fix_db_names",
        "description": "Schema name"
      }
  ]
}
```
事前チェックでは、スキーマの名前 `#mysql50#fix_db_names` が無効であることが報告されます。  
スキーマ名を修正すると、事前チェックに合格し、アップグレードを続行できます。  

```
{
  "id": "mysqlInvalid57NamesCheck",
  "title": "Check for invalid table names and schema names used in 5.7",
  "status": "OK",
  "detectedProblems": []
},
```

**mysqlOrphanedRoutinesCheck**  
**事前チェックレベル: Error**  
**5.7 で孤立したルーチンをチェックする**  
MySQL 8.0 で新しいデータディクショナリに移行する場合、データベースにスキーマが存在しないストアドプロシージャがあると、アップグレードは失敗します。この事前チェックは、DB インスタンスのストアドプロシージャで参照されるすべてのスキーマがまだ存在していることを確認します。アップグレードを続行できるようにするには、これらのストアドプロシージャを削除します。  
**出力例:**  

```
{
  "id": "mysqlOrphanedRoutinesCheck",
  "title": "Check for orphaned routines in 5.7",
  "status": "OK",
  "description": "Error: The following routines have been orphaned. Schemas that they are referencing no longer exists.\nThey have to be cleaned up or the upgrade will fail.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "dropped_db.get_version",
        "description": "is orphaned"
      }
  ]
},
```
事前チェックでは、`dropped_db` データベース内の `get_version` ストアドプロシージャが孤立していることが報告されます。  
この手順をクリーンアップするには、欠落しているスキーマを再作成します。  

```
mysql> create database dropped_db;
Query OK, 1 row affected (0.01 sec)
```
スキーマが再作成されたら、プロシージャを削除してアップグレードを続行できます。  

```
{
  "id": "mysqlOrphanedRoutinesCheck",
  "title": "Check for orphaned routines in 5.7",
  "status": "OK",
  "detectedProblems": []
},
```

**mysqlSchemaCheck**  
**事前チェックレベル: Error**  
**MySQL 8.0 の新しいテーブルと競合する `mysql` スキーマのテーブル名**  
MySQL 8.0 で導入された新しい[アトミックデータディクショナリ](https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html)は、`mysql` スキーマ内の内部 InnoDB テーブルのセットにすべてのメタデータを保存します。アップグレード中、新しい[内部データディクショナリテーブル](https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-schema.html)が `mysql` スキーマに作成されます。アップグレードの失敗につながる名前の衝突を避けるため、事前チェックでは `mysql` スキーマ内のすべてのテーブル名を調べ、新しいテーブル名がまだ使用されていないことを確認します。使用されているとエラーが返され、アップグレードを続行することはできません。  
**出力例:**  

```
{
  "id": "mysqlSchema",
  "title": "Table names in the mysql schema conflicting with new tables in the latest MySQL.",
  "status": "OK",
  "description": "Error: The following tables in mysql schema have names that will conflict with the ones introduced in the latest version. They must be renamed or removed before upgrading (use RENAME TABLE command). This may also entail changes to applications that use the affected tables.",
  "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/upgrade-before-you-begin.html",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "mysql.tablespaces",
        "description": "Table name used in mysql schema.",
        "dbObjectType": "Table"
      }
  ]
}
```
`mysql` スキーマに `tablespaces` という名前のテーブルがあるため、エラーが返されます。これは、MySQL 8.0 の新しい内部データディクショナリテーブル名の 1 つです。アップグレードする前に、`RENAME TABLE` コマンドを使用して、このようなテーブルの名前を変更または削除する必要があります。

**nonNativePartitioningCheck**  
**事前チェックレベル: Error**  
**非ネイティブパーティショニングのエンジンを使用したパーティションテーブル**  
[MySQL 8.0 ドキュメント](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html)によると、現在、[InnoDB](https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html) と [NDB](https://dev.mysql.com/doc/refman/8.0/en/mysql-cluster.html) の 2 つのストレージエンジンがネイティブパーティショニングのサポートを提供しています。このうち、Aurora MySQL バージョン 3 では InnoDB のみがサポートされており、MySQL 8.0 と互換性があります。他のストレージエンジンを使用して MySQL 8.0 でパーティションテーブルを作成しようとすると失敗します。この事前チェックでは、非ネイティブパーティショニングを使用している DB クラスター内のテーブルを検索します。もし何かが返された場合は、パーティショニングを削除するか、ストレージエンジンを InnoDB に変換する必要があります。  
**出力例:**  

```
{
  "id": "nonNativePartitioning",
  "title": "Partitioned tables using engines with non native partitioning",
  "status": "OK",
  "description": "Error: In the latest MySQL storage engine is responsible for providing its own partitioning handler, and the MySQL server no longer provides generic partitioning support. InnoDB and NDB are the only storage engines that provide a native partitioning handler that is supported in the latest MySQL. A partitioned table using any other storage engine must be altered—either to convert it to InnoDB or NDB, or to remove its partitioning—before upgrading the server, else it cannot be used afterwards.",
  "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-configuration-changes",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.partMyisamTable",
         "description": "MyISAM engine does not support native partitioning",
         "dbObjectType": "Table"
      }
  ]
}
```
ここでは、MyISAM テーブルでパーティショニングが使用されているため、アップグレードを続行する前にアクションが必要です。

**oldTemporalCheck**  
**事前チェックレベル: Error**  
**旧日時型の使用**  
"旧日時" とは、MySQL バージョン 5.5 以下で作成された日時型の列 (`TIMESTAMP` や `DATETIME` など) を指します。MySQL 8.0 では、これらの旧日時データ型のサポートは廃止されます。つまり、データベースにこれらの旧日時型が含まれている場合、MySQL 5.7 から 8.0 へのインプレースアップグレードは不可能です。これを修正するには、アップグレードに進む前に、このような旧日時データ型を含むテーブルを[再構築](https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html)する必要があります。  
MySQL 5.7 での旧日時データ型の廃止の詳細については、この[ブログ](https://dev.mysql.com/blog-archive/how-to-easily-identify-tables-with-temporal-types-in-old-format/)を参照してください。MySQL 8.0 での旧日時データ型の廃止の詳細については、この[ブログ](https://dev.mysql.com/blog-archive/mysql-8-0-removing-support-for-old-temporal-datatypes/)を参照してください。  
テーブルスペースを再構築する前に、MySQL ドキュメントの「[Online DDL Operations](https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html)」を参照して、フォアグラウンドトランザクションに対するロックとデータ移動の影響を理解してください。
**出力例:**  

```
{
  "id": "oldTemporalCheck",
  "title": "Usage of old temporal type",
  "status": "OK",
  "description": "Error: Following table columns use a deprecated and no longer supported temporal disk storage format. They must be converted to the new format before upgrading. It can by done by rebuilding the table using 'ALTER TABLE <table_name> FORCE' command",
  "documentationLink": "https://dev.mysql.com/blog-archive/mysql-8-0-removing-support-for-old-temporal-datatypes/",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.55_temporal_table.timestamp_column",
        "description": "timestamp /* 5.5 binary format */",
        "dbObjectType": "Column"
      }
  ]
},
```
テーブル `test.55_temporal_table` の `timestamp_column` 列にエラーが報告されます。これは、サポートされなくなった旧日時ディスクストレージ形式を使用しているためです。  
この問題を解決してアップグレードを続行できるようにするには、テーブルを再構築して、旧日時ディスクストレージ形式を MySQL 5.6 で導入された新しい形式に変換します。変換の詳細および前提条件については、MySQL ドキュメントの「[Converting Between 3-Byte and 4-Byte Unicode Character Sets](https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-conversion.html)」を参照してください。  
次のコマンドを実行して、この事前チェックで説明されているテーブルを再構築すると、旧日時型が小数秒の精度で新しい形式に変換されます。  

```
ALTER TABLE ... ENGINE=InnoDB;
```
テーブルの再構築についての詳細は、MySQL ドキュメントの「[ALTER TABLE Statement](https://dev.mysql.com/doc/refman/8.0/en/alter-table.html)」を参照してください。  
問題のテーブルを再構築し、アップグレードを再開すると、互換性チェックに合格し、アップグレードを続行できます。  

```
{
  "id": "oldTemporalCheck",
  "title": "Usage of old temporal type",
  "status": "OK",
  "detectedProblems": []
}
```

**partitionedTablesInSharedTablespaceCheck**  
**事前チェックレベル: Error**  
**共有テーブルスペースでのパーティションテーブルの使用**  
[MySQL 8.0.13](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-13.html) 以降、共有テーブルスペースにテーブルパーティションを配置するサポートは廃止されます。アップグレードする前に、そのようなテーブルを共有テーブルスペースから file-per-table テーブルスペースに移動します。  
テーブルスペースを再構築する前に、MySQL ドキュメントの「[Partitioning Operations](https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html#online-ddl-partitioning)」を参照して、フォアグラウンドトランザクションに対するロックとデータ移動の影響を理解してください。
**出力例:**  

```
{
  "id": "partitionedTablesInSharedTablespaceCheck",
  "title": "Usage of partitioned tables in shared tablespaces",
  "status": "OK",
  "description": "Error: The following tables have partitions in shared tablespaces. They need to be moved to file-per-table tablespace before upgrading. You can do this by running query like 'ALTER TABLE table_name REORGANIZE PARTITION X INTO (PARTITION X VALUES LESS THAN (30) TABLESPACE=innodb_file_per_table);'",
  "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.partInnoDBTable",
        "description": "Partition p1 is in shared tablespace innodb",
        "dbObjectType": "Table"
      }
  ]
}
```
テーブル `test.partInnoDBTable` のパーティション `p1` がシステムテーブルスペースにあるため、事前チェックに失敗します。  
この問題を解決するには、`test.partInnodbTable` テーブルを再構築し、問題のあるパーティションを file-per-table テーブルスペースの `p1` に配置します。  

```
mysql > ALTER TABLE partInnodbTable REORGANIZE PARTITION p1
    ->   INTO (PARTITION p1 VALUES LESS THAN ('2014-01-01') TABLESPACE=innodb_file_per_table);
Query OK, 0 rows affected, 1 warning (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
```
そうすると、事前チェックに合格します。  

```
{
  "id": "partitionedTablesInSharedTablespaceCheck",
  "title": "Usage of partitioned tables in shared tablespaces",
  "status": "OK",
  "detectedProblems": []
}
```

**removedFunctionsCheck**  
**事前チェックレベル: Error**  
**最新の MySQL バージョンから削除された関数の使用**  
MySQL 8.0 では、いくつかの組み込み関数が削除されました。この事前チェックでは、これらの関数を使用する可能性のあるオブジェクトについてデータベースを調べます。見つかった場合は、エラーが返されます。アップグレードを再試行する前に、問題を解決する必要があります。  
削除された関数の大部分は[空間関数](https://dev.mysql.com/doc/refman/5.7/en/gis-wkt-functions.html)であり、同等の `ST_*` 関数に置き換えられました。このような場合は、新しいプロシージャ命名を使用するようにデータベースオブジェクトを変更します。詳細については、MySQL ドキュメントの「[MySQL 8.0 で削除された機能](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals)」を参照してください。  
**出力例:**  

```
{
  "id": "removedFunctionsCheck",
  "title": "Usage of removed functions",
  "status": "OK",
  "description": "Error: The following DB objects use functions that were removed in the latest MySQL version. Please make sure to update them to use supported alternatives before upgrade.",
  "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.GetLocationsInPolygon",
        "description": "PROCEDURE uses removed function POLYGONFROMTEXT (consider using ST_POLYGONFROMTEXT instead)",
        "dbObjectType": "Routine"
      },
      {
        "level": "Error",
        "dbObject": "test.InsertLocation",
        "description": "PROCEDURE uses removed function POINTFROMTEXT (consider using ST_POINTFROMTEXT instead)",
        "dbObjectType": "Routine"
      }
  ]
},
```
事前チェックでは、`test.GetLocationsInPolygon` ストアドプロシージャが [POLYGONFROMTEXT](https://dev.mysql.com/doc/refman/5.7/en/gis-wkt-functions.html#function_polyfromtext) と [POINTFROMTEXT](https://dev.mysql.com/doc/refman/5.7/en/gis-wkt-functions.html#function_st-mpointfromtext) の 2 つの削除された関数を使用していることが報告されます。また、新しい [ST\$1POLYGONFROMTEXT](https://dev.mysql.com/doc/refman/8.0/en/gis-wkt-functions.html#function_st-polyfromtext) と [ST\$1POINTFROMTEXT](https://dev.mysql.com/doc/refman/8.0/en/gis-wkt-functions.html#function_st-mpointfromtext) を代替として使用することが提案されます。提案を使用してプロシージャを再作成すると、事前チェックは正常に完了します。  

```
{
  "id": "removedFunctionsCheck",
  "title": "Usage of removed functions",
  "status": "OK",
  "detectedProblems": []
},
```
ほとんどの場合、非推奨の関数には直接置き換えがありますが、アプリケーションをテストし、変更の結果として動作に変化がないかドキュメントを確認してください。

**routineSyntaxCheck**  
**事前チェックレベル: Error**  
**ルーチンのようなオブジェクトの MySQL 構文チェック**  
MySQL 8.0 では、以前に予約されていなかった[予約キーワード](https://dev.mysql.com/doc/mysqld-version-reference/en/keywords-8-0.html#keywords-new-in-8-0)があります。アップグレード事前チェッカーは、データベースオブジェクトの名前およびその定義と本文で、予約キーワードの使用を評価します。ストアドプロシージャ、関数、イベント、トリガーなどのデータベースオブジェクトで予約キーワードが使用されていることが検出されると、アップグレードは失敗し、エラーが `upgrade-prechecks.log` ファイルに発行されます。この問題を解決するには、アップグレード前にこれらのオブジェクト定義を更新し、そのような参照を一重引用符 (') で囲む必要があります。MySQL の予約語のエスケープについての詳細は、MySQL ドキュメントの「[String Literals](https://dev.mysql.com/doc/refman/8.0/en/string-literals.html)」を参照してください。  
または、名前を別の名前に変更することもできます。そのため、アプリケーションの変更が必要になる場合があります。  
**出力例:**  

```
{
  "id": "routineSyntaxCheck",
  "title": "MySQL syntax check for routine-like objects",
  "status": "OK",
  "description": "The following objects did not pass a syntax check with the latest MySQL grammar. A common reason is that they reference names that conflict with new reserved keywords. You must update these routine definitions and `quote` any such references before upgrading.",
  "documentationLink": "https://dev.mysql.com/doc/refman/en/keywords.html",
  "detectedProblems": [
      {
         "level": "Error",
         "dbObject": "test.select_res_word",
         "description": "at line 2,18: unexpected token 'except'",
         "dbObjectType": "Routine"
      }
  ]
}
```
この問題を修正するには、ルーチン定義を確認します。  

```
SHOW CREATE PROCEDURE test.select_res_word\G

*************************** 1. row ***************************
           Procedure: select_res_word
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    Create Procedure: CREATE PROCEDURE 'select_res_word'()
BEGIN
    SELECT * FROM except;
END
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
```
プロシージャは、MySQL 8.0 の新しいキーワードである `except` という名前のテーブルを使用します。文字列リテラルをエスケープして、プロシージャを再作成します。  

```
> drop procedure if exists select_res_word;
Query OK, 0 rows affected (0.00 sec)

> DELIMITER $$
 > CREATE PROCEDURE select_res_word()
    -> BEGIN
    ->     SELECT * FROM 'except';
    -> END$$
Query OK, 0 rows affected (0.00 sec)

 > DELIMITER ;
```
これで、事前チェックに合格です。  

```
{
  "id": "routineSyntaxCheck",
  "title": "MySQL syntax check for routine-like objects",
  "status": "OK",
  "detectedProblems": []
}
```

**schemaInconsistencyCheck**  
**事前チェックレベル: Error**  
**ファイルの削除または破損によるスキーマの不一致**  
前述したように、MySQL 8.0 は、`mysql` スキーマ内の内部 InnoDB テーブルのセットにすべてのメタデータを保存する[アトミックデータディクショナリ](https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html)を導入しました。この新しいアーキテクチャは、古いファイルベースのアプローチから "アトミック DDL" 問題を解決し、データベースメタデータを管理するトランザクションの [ACID](https://en.wikipedia.org/wiki/ACID) 準拠の方法を提供します。MySQL 8.0 より前では、DDL オペレーションが予期せず中断した場合、スキーマオブジェクトが孤立する可能性がありました。アップグレード中にファイルベースのメタデータを新しいアトミックデータディクショナリテーブルに移行すると、DB インスタンスにこのような孤立したスキーマオブジェクトがないことが保証されます。孤立したオブジェクトが発生した場合、アップグレードは失敗します。  
アップグレードを開始する前にこれらの孤立したオブジェクトを検出しやすくするため、`schemaInconsistencyCheck` 事前チェックが実行されて、すべてのデータディクショナリメタデータオブジェクトが同期されていることを確認します。孤立したメタデータオブジェクトが検出されると、アップグレードは続行されません。アップグレードを続行するには、これらの孤立したメタデータオブジェクトをクリーンアップします。  
この事前チェックでエラーが発生した場合は、[AWS サポート](https://aws.amazon.com/support)でケースを開き、メタデータの不整合の解決をリクエストします。または、論理ダンプを実行してから新しい Aurora MySQL バージョン 3 DB クラスターに復元することで、アップグレードを再試行することもできます。  
**出力例:**  

```
{
  "id": "schemaInconsistencyCheck",
  "title": "Schema inconsistencies resulting from file removal or corruption",
  "status": "OK",
  "description": "Error: Following tables show signs that either table datadir directory or frm file was removed/corrupted. Please check server logs, examine datadir to detect the issue and fix it before upgrade",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.schemaInconsistencyCheck_failure",
        "description": "present in INFORMATION_SCHEMA's INNODB_SYS_TABLES table but missing from TABLES table"
      }
  ]
}
```
事前チェックでは、`test.schemaInconsistencyCheck_failure` テーブルに一貫性のないメタデータがあることが報告されます。この場合、テーブルは InnoDB ストレージエンジンメタデータ (`information_schema.INNODB_SYS_TABLES`) に存在しますが、MySQL メタデータ (`information_schema.TABLES`) には存在しません。

### エラーを報告する Aurora MySQL の事前チェック
<a name="precheck-descriptions-errors.aurora"></a>

次の事前チェックは、Aurora MySQL に固有のものです。
+ [auroraCheckDDLRecovery](#auroraCheckDDLRecovery)
+ [auroraCheckRdsUpgradePrechecksTable](#auroraCheckRdsUpgradePrechecksTable)
+ [auroraFODUpgradeCheck](#auroraFODUpgradeCheck)
+ [auroraGetDanglingFulltextIndex](#auroraGetDanglingFulltextIndex)
+ [auroraUpgradeCheckForDatafilePathInconsistency](#auroraUpgradeCheckForDatafilePathInconsistency)
+ [auroraUpgradeCheckForFtsSpaceIdZero](#auroraUpgradeCheckForFtsSpaceIdZero)
+ [auroraUpgradeCheckForIncompleteXATransactions](#auroraUpgradeCheckForIncompleteXATransactions)
+ [auroraUpgradeCheckForInstanceLimit](#auroraUpgradeCheckForInstanceLimit)
+ [auroraUpgradeCheckForInternalUsers](#auroraUpgradeCheckForInternalUsers)
+ [auroraUpgradeCheckForMasterUser](#auroraUpgradeCheckForMasterUser)
+ [auroraUpgradeCheckForPrefixIndexOnGeometryColumns](#auroraUpgradeCheckForPrefixIndexOnGeometryColumns)
+ [auroraUpgradeCheckForSpecialCharactersInProcedures](#auroraUpgradeCheckForSpecialCharactersInProcedures)
+ [auroraUpgradeCheckForSysSchemaObjectTypeMismatch](#auroraUpgradeCheckForSysSchemaObjectTypeMismatch)
+ [auroraUpgradeCheckForViewColumnNameLength](#auroraUpgradeCheckForViewColumnNameLength)
+ [auroraUpgradeCheckIndexLengthLimitOnTinyColumns](#auroraUpgradeCheckIndexLengthLimitOnTinyColumns)
+ [auroraUpgradeCheckMissingInnodbMetadataForMysqlHostTable](#auroraUpgradeCheckMissingInnodbMetadataForMysqlHostTable)
+ [auroraUpgradeCheckForInvalidUtf8mb3ColumnComments](#auroraUpgradeCheckForInvalidUtf8mb3ColumnComments)

**auroraCheckDDLRecovery**  
**事前チェックレベル: Error**  
**Aurora DDL リカバリ機能に関連するアーティファクトをチェックする**  
Aurora MySQL でのデータ定義言語 (DDL) リカバリ実装の一環として、実行中の DDL ステートメントのメタデータは `mysql` スキーマの `ddl_log_md_table` および `ddl_log_table` テーブルに保持されます。Aurora の DDL リカバリの実装は、MySQL 8.0 の新しい[アトミックデータディクショナリ](https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html)実装の一部であるため、バージョン 3 以降ではサポートされていません。互換性チェック中に DDL ステートメントが実行されている場合、この事前チェックが失敗する可能性があります。DDL ステートメントが実行されていない間は、アップグレードを試すことをお勧めします。  
この事前チェックが実行中の DDL ステートメントなしで失敗する場合は、[AWS サポート](https://aws.amazon.com/support)でケースを開き、メタデータの不整合の解決をリクエストします。または、論理ダンプを実行してから新しい Aurora MySQL バージョン 3 DB クラスターに復元することで、アップグレードを再試行することもできます。  
DDL ステートメントが実行されている場合、事前チェック出力は次のメッセージを出力します。  

```
“There are DDL statements in process. Please allow DDL statements to finish before upgrading.”
```
**出力例:**  

```
{
  "id": "auroraCheckDDLRecovery",
  "title": "Check for artifacts related to Aurora DDL recovery feature",
  "status": "OK",
  "description": "Aurora implementation of DDL recovery is not supported from 3.x onwards. This check verifies that the database do not have artifacts realted to the feature",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "mysql.ddl_log_md_table",
        "description": "Table mysql.ddl_log_md_table is not empty. Your database has pending DDL recovery operations. Reachout to AWS support for assistance."
      },
      {
        "level": "Error",
        "dbObject": "mysql.ddl_log_table",
        "description": "Table mysql.ddl_log_table is not empty. Your database has pending DDL recovery operations. Reachout to AWS support for assistance."
      },
      {
        "level": "Error",
        "dbObject": "information_schema.processlist",
        "description": "There are DDL statements in process. Please allow DDL statements to finish before upgrading."
      }
  ]
}
```
事前チェックは、互換性チェックと同時に実行中の DDL が原因でエラーを返しました。DDL を実行せずにアップグレードを再試行することをお勧めします。

**auroraCheckRdsUpgradePrechecksTable**  
**事前チェックレベル: Error**  
**`mysql.rds_upgrade_prechecks` テーブルの存在を確認する**  
これは、RDS サービスによって実行される内部のみの事前チェックです。エラーはアップグレード時に自動的に処理されます。これらのエラーは無視して問題ありません。  
この事前チェックでエラーが発生した場合は、[AWS サポート](https://aws.amazon.com/support)でケースを開き、メタデータの不整合の解決をリクエストします。または、論理ダンプを実行してから新しい Aurora MySQL バージョン 3 DB クラスターに復元することで、アップグレードを再試行することもできます。  

```
{
  "id": "auroraCheckRdsUpgradePrechecksTable",
  "title": "Check existence of mysql.rds_upgrade_prechecks table",
  "status": "OK",
  "detectedProblems": []
}
```

**auroraFODUpgradeCheck**  
**事前チェックレベル: Error**  
**Aurora 高速 DDL 機能に関連するアーティファクトをチェックする**  
[高速 DDL](AuroraMySQL.Managing.FastDDL.md) 最適化は、一部の DDL オペレーションの効率を向上させるために、Aurora MySQL バージョン 2 の[ラボモード](AuroraMySQL.Updates.LabMode.md)で導入されました。Aurora MySQL バージョン 3 では、ラボモードが削除され、高速 DDL 実装は、[Instant DDL](https://dev.mysql.com/doc/refman/8.4/en/innodb-online-ddl-operations.html) と呼ばれる MySQL 8.0 機能に置き換えられました。  
Aurora MySQL バージョン 3 にアップグレードする前に、ラボモードで高速 DDL を使用するテーブルは、Aurora MySQL バージョン 3 との互換性を確保するために `OPTIMIZE TABLE` または `ALTER TABLE ... ENGINE=InnoDB` コマンドを実行して再構築する必要があります。  
この事前チェックは、このようなテーブルのリストを返します。返されたテーブルが再構築されたら、アップグレードを再試行できます。  
**出力例:**  

```
{
  "id": "auroraFODUpgradeCheck",
  "title": "Check for artifacts related to Aurora fast DDL feature",
  "status": "OK",
  "description": "Aurora fast DDL is not supported from 3.x onwards. This check verifies that the database does not have artifacts related to the feature",
  "documentationLink": "https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Managing.FastDDL.html#AuroraMySQL.Managing.FastDDL-v2",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.test",
        "description": "Your table has pending Aurora fast DDL operations. Run 'OPTIMIZE TABLE <table name>' for the table to apply all the pending DDL updates. Then try the upgrade again."
      }
  ]
}
```
事前チェックでは、テーブル `test.test` に保留中の高速 DDL オペレーションがあることが報告されます。  
アップグレードを続行できるようにするには、テーブルを再構築し、アップグレードを再試行します。  
テーブルスペースを再構築する前に、MySQL ドキュメントの「[Online DDL Operations](https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html)」を参照して、フォアグラウンドトランザクションに対するロックとデータ移動の影響を理解してください。

```
mysql> optimize table test.test;
+-----------+----------+----------+-------------------------------------------------------------------+
| Table     | Op       | Msg_type | Msg_text                                                          |
+-----------+----------+----------+-------------------------------------------------------------------+
| test.test | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.test | optimize | status   | OK                                                                |
+-----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.04 sec)
```
テーブルを再構築すると、事前チェックに成功します。  

```
{
  "id": "auroraFODUpgradeCheck",
  "title": "Check for artifacts related to Aurora fast DDL feature",
  "status": "OK",
  "detectedProblems": []
}
```

**auroraGetDanglingFulltextIndex**  
**事前チェックレベル: Error**  
**ダングリング `FULLTEXT` インデックス参照を含むテーブル**  
MySQL 5.6.26 より前では、全文検索インデックスを削除すると、非表示の `FTS_DOC_ID` 列と `FTS_DOC_ID_INDEX` 列が孤立する可能性があります。詳細については、「[バグ \$176012](https://bugs.mysql.com/bug.php?id=76012)」を参照してください。  
これが発生した MySQL の以前のバージョンでテーブルが作成されている場合、Aurora MySQL バージョン 3 へのアップグレードが失敗する可能性があります。この事前チェックでは、MySQL 8.0 にアップグレードする前に、このような孤立した、または "ダングリング" FULLTEXT インデックスが DB クラスターに存在しないことを確認します。この事前チェックが失敗した場合は、そのようなダングリング FULLTEXT インデックスを含むテーブルを再構築します。  
**出力例:**  

```
{
  "id": "auroraGetDanglingFulltextIndex",
  "title": "Tables with dangling FULLTEXT index reference",
  "status": "OK",
  "description": "Error: The following tables contain dangling FULLTEXT index which is not supported. It is recommended to rebuild the table before upgrade.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.table_with_fts_index",
        "description": "Table `test.table_with_fts_index` contains dangling FULLTEXT index. Kindly recreate the table before upgrade."
      }
  ]
},
```
`test.table_with_fts_index` テーブルにダングリング FULLTEXT インデックスが含まれているため、エラーが事前チェックによってレポートされます。アップグレードを続行できるようにするには、FULLTEXT インデックスの補助テーブルをクリーンアップするようにテーブルを再構築します。`OPTIMIZE TABLE test.table_with_fts_index` または `ALTER TABLE test.table_with_fts_index, ENGINE=INNODB` を使用します。  
テーブルを再構築すると、事前チェックに合格します。  

```
{
  "id": "auroraGetDanglingFulltextIndex",
  "title": "Tables with dangling FULLTEXT index reference",
  "status": "OK",
  "detectedProblems": []
},
```

**auroraUpgradeCheckForDatafilePathInconsistency**  
**事前チェックレベル: Error**  
**`ibd` ファイルパスに関連する不整合をチェックする**  
この事前チェックは、Aurora MySQL バージョン 3.03.0 以前にのみ適用されます。この事前チェックでエラーが発生した場合は、Aurora MySQL バージョン 3.04 以降にアップグレードします。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForDatafilePathInconsistency",
  "title": "Check for inconsistency related to ibd file path.",
  "status": "OK",
  "detectedProblems": []
}
```

**auroraUpgradeCheckForFtsSpaceIdZero**  
**事前チェックレベル: Error**  
**スペース ID がゼロの FULLTEXT インデックスをチェックする**  
MySQL では、InnoDB テーブルに [FULLTEXT インデックス](https://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html)を追加すると、多数の補助インデックステーブルスペースが作成されます。バージョン 5.6.20 で修正された以前のバージョンの MySQL の[バグ](https://bugs.mysql.com/bug.php?id=72132)により、これらの補助インデックステーブルが、独自の InnoDB テーブルスペースではなく、[システムテーブルスペース](https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_system_tablespace)に作成された可能性があります。  
このような補助テーブルスペースが存在する場合、アップグレードは失敗します。事前チェックエラーに記載されている FULLTEXT インデックスを再作成し、アップグレードを再試行します。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForFtsSpaceIdZero",
  "title": "Check for fulltext index with space id as zero",
  "status": "OK",
  "description": "The auxiliary tables of FTS indexes on the table are created in system table-space. Due to this DDL queries executed on MySQL8.0 shall cause database unavailability. To avoid that, drop and recreate all the FTS indexes on the table or rebuild the table using ALTER TABLE query before the upgrade.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.fts_space_zero_check",
        "description": " The auxiliary tables of FTS indexes on the table 'test.fts_space_zero_check' are created in system table-space due to https://bugs.mysql.com/bug.php?id=72132. In MySQL8.0, DDL queries executed on this table shall cause database unavailability. To avoid that, drop and recreate all the FTS indexes on the table or rebuild the table using ALTER TABLE query before the upgrade."
      }
  ]
},
```
システムテーブルスペースに補助全文検索 (FTS) テーブルがあるため、この事前チェックは `test.fts_space_zero_check` テーブルのエラーを報告します。  
このテーブルに関連付けられた FTS インデックスを削除して再作成すると、事前チェックは成功します。  
テーブルスペースを再構築する前に、MySQL ドキュメントの「[Partitioning Operations](https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html#online-ddl-partitioning)」を参照して、フォアグラウンドトランザクションに対するロックとデータ移動の影響を理解してください。

```
{
 "id": "auroraUpgradeCheckForFtsSpaceIdZero",
 "title": "Check for fulltext index with space id as zero",
 "status": "OK",
 "detectedProblems": []
}
```

**auroraUpgradeCheckForIncompleteXATransactions**  
**事前チェックレベル: Error**  
**準備済み状態の XA トランザクションをチェックする**  
メジャーバージョンアップグレードプロセスの実行中に、Aurora MySQL バージョン 2 DB インスタンスを[クリーンシャットダウン](https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_slow_shutdown)する必要があります。これにより、すべてのトランザクションがコミットまたはロールバックされ、InnoDB がすべての undo ログレコードを消去します。トランザクションのロールバックが必要なため、データベースに準備済み状態の [XA トランザクション](https://dev.mysql.com/doc/refman/5.7/en/xa.html)がある場合、クリーンシャットダウンの進行をブロックできます。このため、準備済みの XA トランザクションが検出されると、コミットまたはロールバックするアクションを実行するまでアップグレードを続行できなくなります。  
`XA RECOVER` を使用して準備された状態で XA トランザクションを検索する方法の詳細については、MySQL ドキュメントの「[XA Transaction SQL Statements](https://dev.mysql.com/doc/refman/5.7/en/xa-statements.html)」を参照してください。XA トランザクションの状態の詳細については、MySQL ドキュメントの「[XA Transaction States](https://dev.mysql.com/doc/refman/5.7/en/xa-states.html)」を参照してください。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForIncompleteXATransactions",
  "title": "Pre-checks for XA Transactions in prepared state.",
  "status": "OK",
  "description": "Your cluster currently has XA transactions in the prepared state. To proceed with the upgrade, commit or rollback these transactions.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "all",
        "description": "Your cluster currently has XA transactions in the prepared state. To proceed with the upgrade, commit or rollback these transactions."
      }
  ]
}
```
この事前チェックでは、コミットまたはロールバックする必要がある準備済み状態のトランザクションがあるため、エラーが報告されます。  
データベースにログインしたら、[information\$1schema.innodb\$1trx](https://dev.mysql.com/doc/refman/5.7/en/information-schema-innodb-trx-table.html) テーブルと `XA RECOVER` 出力で詳細を確認できます。  
トランザクションをコミットまたはロールバックする前に、[MySQL ドキュメント](https://dev.mysql.com/doc/refman/5.7/en/xa-restrictions.html)とアプリケーション要件を確認することをお勧めします。

```
mysql> select trx_started,
    trx_mysql_thread_id,
    trx_id,trx_state,
    trx_operation_state,
    trx_rows_modified,
    trx_rows_locked 
from 
    information_schema.innodb_trx;
+---------------------+---------------------+---------+-----------+---------------------+-------------------+-----------------+
| trx_started         | trx_mysql_thread_id | trx_id  | trx_state | trx_operation_state | trx_rows_modified | trx_rows_locked |
+---------------------+---------------------+---------+-----------+---------------------+-------------------+-----------------+
| 2024-08-12 01:09:39 |                   0 | 2849470 | RUNNING   | NULL                |                 1 |               0 |
+---------------------+---------------------+---------+-----------+---------------------+-------------------+-----------------+
1 row in set (0.00 sec)

mysql> xa recover;
+----------+--------------+--------------+--------+
| formatID | gtrid_length | bqual_length | data   |
+----------+--------------+--------------+--------+
|        1 |            6 |            0 | xatest |
+----------+--------------+--------------+--------+
1 row in set (0.00 sec)
```
この場合、準備済みのトランザクションをロールバックします。  

```
mysql> XA ROLLBACK 'xatest';
Query OK, 0 rows affected (0.00 sec)
v
mysql> xa recover;
Empty set (0.00 sec)
```
XA トランザクションがロールバックされると、事前チェックは成功します。  

```
{
  "id": "auroraUpgradeCheckForIncompleteXATransactions",
  "title": "Pre-checks for XA Transactions in prepared state.",
  "status": "OK",
  "detectedProblems": []
}
```

**auroraUpgradeCheckForInstanceLimit**  
**事前チェックレベル: Error**  
**現在のインスタンスクラスでアップグレードがサポートされているかどうかを確認する**  
ライター [DB インスタンスクラス](Concepts.DBInstanceClass.md)が db.r6i.32xlarge である Aurora MySQL バージョン 2.12.0 または 2.12.1 からのインプレースアップグレードの実行は現在サポートされていません。この場合、事前チェックはエラーを返します。アップグレードを続行できるようにするには、DB インスタンスクラスを db.r6i.24xlarge 以下に変更します。または、Aurora MySQL バージョン 2.12.2 以降にアップグレードできます。Aurora MySQL バージョン 3 へのインプレースアップグレードは db.r6i.32xlarge でサポートされています。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForInstanceLimit",
  "title": "Checks if upgrade is supported on the current instance class",
  "status": "OK",
  "description": "Upgrade from Aurora Version 2.12.0 and 2.12.1 may fail for 32.xl and above instance class.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "all",
        "description": "Upgrade is not supported on this instance size for Aurora MySql Version 2.12.1. Before upgrading to Aurora MySql 3, please consider either: 1. Changing the instance class to 24.xl or lower. -or- 2. Upgrading to patch version 2.12.2 or higher."
      }
  ]
},
```
ライター DB インスタンスが db.r6i.32xlarge インスタンスクラスを使用し、Aurora MySQL バージョン 2.12.1 で実行されているため、事前チェックはエラーを返します。

**auroraUpgradeCheckForInternalUsers**  
**事前チェックレベル: Error**  
**8.0 の内部ユーザーをチェックする**  
この事前チェックは、Aurora MySQL バージョン 3.03.0 以前にのみ適用されます。この事前チェックでエラーが発生した場合は、Aurora MySQL バージョン 3.04 以降にアップグレードします。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForInternalUsers",
  "title": "Check for 8.0 internal users.",
  "status": "OK",
  "detectedProblems": []
}
```

**auroraUpgradeCheckForMasterUser**  
**事前チェックレベル: Error**  
**RDS マスターユーザーが存在するかどうかを確認する**  
MySQL 8 は、権限管理をより簡単かつきめ細かなものにするために、[ロール](https://dev.mysql.com/doc/refman/8.0/en/roles.html)と[動的権限](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#static-dynamic-privileges)をサポートする新しい権限モデルを追加しました。この変更の一環として、Aurora MySQL は新しい `rds_superuser_role` を導入しました。これは、Aurora MySQL バージョン 2 からバージョン 3 へのアップグレード時にデータベースのマスターユーザーに自動的に付与されます。  
Aurora MySQL のマスターユーザーに割り当てられたロールと権限の詳細については、「[マスターユーザーアカウント権限](UsingWithRDS.MasterAccounts.md)」を参照してください。Aurora MySQL バージョン 3 のロールベースの特権モデルの詳細については、「[ロールベースの特権モデル](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model)」を参照してください。  
この事前チェックは、マスターユーザーがデータベースに存在することを確認します。マスターユーザーが存在しない場合、事前チェックに失敗します。アップグレードを続行できるようにするには、マスターユーザーのパスワードをリセットするか、ユーザーを手動で作成して、マスターユーザーを再作成します。次に、アップグレードを再試行します。マスターユーザーのパスワードのリセットについての詳細は、「[データベースマスターユーザーのパスワードの変更](Aurora.Modifying.md#Aurora.Modifying.Password)」を参照してください。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForMasterUser",
  "title": "Check if master user exists",
  "status": "OK",
  "description": "Throws error if master user has been dropped!",
  "documentationLink": "https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.MasterAccounts.html",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "all",
        "description": "Your Master User on host '%' has been dropped. To proceed with the upgrade, recreate the master user `reinvent` on default host '%'"
      }
  ]
}
```
マスターユーザーのパスワードをリセットすると、事前チェックに合格し、アップグレードを再試行できます。  
次の例では、AWS CLI を使用してパスワードをリセットします。パスワードの変更は即時適用されます。  

```
aws rds modify-db-cluster \
    --db-cluster-identifier my-db-cluster \
    --master-user-password my-new-password
```
その後、事前チェックは成功します。  

```
{
  "id": "auroraUpgradeCheckForMasterUser",
  title": "Check if master user exists",
  "status": "OK",
  "detectedProblems": []
}
```

**auroraUpgradeCheckForPrefixIndexOnGeometryColumns**  
**事前チェックレベル: Error**  
**プレフィックスインデックスのジオメトリ列をチェックする**  
[MySQL 8.0.12](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-12.html#mysqld-8-0-12-spatial-support) 以降、[GEOMETRY](https://dev.mysql.com/doc/refman/5.7/en/gis-data-formats.html) データ型を使用して列に[プレフィックス付き](https://dev.mysql.com/doc/refman/5.7/en/column-indexes.html#column-indexes-prefix)インデックスを作成することはできなくなります。詳細については、[WL\$111808](https://dev.mysql.com/worklog/task/?id=11808) を参照してください。  
このようなインデックスが存在する場合、アップグレードは失敗します。問題を解決するには、事前チェックの失敗で言及されたテーブルのプレフィックス付き `GEOMETRY` インデックスを削除します。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForPrefixIndexOnGeometryColumns",
  "title": "Check for geometry columns on prefix indexs",
  "status": "OK",
  "description": "Consider dropping the prefix Indexes of geometry columns and restart the upgrade.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.geom_index_prefix",
        "description": "Table `test`.`geom_index_prefix` has an index `LatLon` on geometry column/s. Mysql 8.0 does not support this type of index on a geometry column https://dev.mysql.com/worklog/task/?id=11808. To upgrade to MySQL 8.0, Run 'DROP INDEX `LatLon` ON `test`.`geom_index_prefix`;"
      }
  ]
}
```
`test.geom_index_prefix` テーブルの `GEOMETRY` 列にプレフィックスが付いたインデックスが含まれているため、事前チェックはエラーを報告します。  
このインデックスを削除すると、事前チェックは成功します。  

```
{
  "id": "auroraUpgradeCheckForPrefixIndexOnGeometryColumns",
  "title": "Check for geometry columns on prefix indexs",
  "status": "OK",
  "detectedProblems": []
}
```

**auroraUpgradeCheckForSpecialCharactersInProcedures**  
**事前チェックレベル: Error**  
**ストアドプロシージャの特殊文字に関連する不整合をチェックする**  
MySQL 8.0 より前では、データベース名、テーブル名、およびその他のオブジェクトは、データディレクトリ内のファイル、つまりファイルベースのメタデータに対応していました。MySQL 8.0 へのアップグレードの一環として、すべてのデータベースオブジェクトは、`mysql` スキーマに保存されている新しい内部データディクショナリテーブルに移行され、新しく実装された[アトミックデータディクショナリ](https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html)をサポートします。ストアドプロシージャの移行の一環として、各プロシージャのプロシージャ定義と本文は、新しいデータディクショナリに取り込まれるときに検証されます。  
MySQL 8 より前では、場合によっては、保存されたルーチンを作成したり、特殊文字を含むプロシージャを `mysql.proc` テーブルに直接挿入したりできました。例えば、非準拠の[改行なしスペース文字](https://en.wikipedia.org/wiki/Non-breaking_space) `\xa0` を含むコメントが含まれたストアドプロシージャを作成できます。このようなプロシージャが検出されると、アップグレードは失敗します。  
この事前チェックは、ストアドプロシージャの本文と定義にそのような文字が含まれていないことを検証します。アップグレードを続行できるようにするには、これらのストアドプロシージャを非表示文字または特殊文字なしで再作成します。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForSpecialCharactersInProcedures",
  "title": "Check for inconsistency related to special characters in stored procedures.",
  "status": "OK",
  "description": "Following procedure(s) has special characters inconsistency.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "information_schema.routines",
        "description": "Data Dictionary Metadata is inconsistent for the procedure `get_version_proc` in the database `test` due to usage of special characters in procedure body. To avoid that, drop and recreate the procedure without any special characters before proceeding with the Upgrade."
      }
  ]
}
```
事前チェックでは、DB クラスターに、プロシージャ本文に特殊文字を含む `test` データベース内の `get_version_proc` というプロシージャが含まれていることが報告されます。  
ストアドプロシージャを削除して再作成すると、事前チェックが成功し、アップグレードを続行できます。  

```
{
  "id": "auroraUpgradeCheckForSpecialCharactersInProcedures",
  "title": "Check for inconsistency related to special characters in stored procedures.",
  "status": "OK",
  "detectedProblems": []
},
```

**auroraUpgradeCheckForSysSchemaObjectTypeMismatch**  
**事前チェックレベル: Error**  
**`sys` スキーマのオブジェクトタイプの不一致を確認する**  
[sys スキーマ](https://dev.mysql.com/doc/refman/8.0/en/sys-schema.html)は、ユーザーが DB インスタンスのトラブルシューティング、最適化、モニタリングを行うのに役立つ MySQL データベース内のオブジェクトとビューのセットです。Aurora MySQL バージョン 2 からバージョン 3 へのメジャーバージョンアップグレードを実行すると、`sys` スキーマビューが再作成され、新しい Aurora MySQL バージョン 3 定義に更新されます。  
アップグレードの一環として、`sys` スキーマ内のオブジェクトがビューではなくストレージエンジン ([INFORMATION\$1SCHEMA.TABLES](https://dev.mysql.com/doc/refman/5.7/en/information-schema-tables-table.html) の `sys_config/BASE TABLE`) を使用して定義されている場合、アップグレードは失敗します。このようなテーブルは、`information_schema.tables` テーブルにあります。これは予想される動作ではありませんが、ユーザーエラーが原因で発生する場合があります。  
この事前チェックでは、すべての `sys` スキーマオブジェクトを検証して、ユーザーが正しいテーブル定義を使用し、ビューが誤って InnoDB または MyISAM テーブルとして定義されていないことを確認します。問題を解決するには、返されたオブジェクトの名前を変更または削除して手動で修正します。次に、アップグレードを再試行します。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForSysSchemaObjectTypeMismatch",
  "title": "Check object type mismatch for sys schema.",
  "status": "OK",
  "description": "Database contains objects with type mismatch for sys schema.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "sys.waits_global_by_latency",
        "description": "Your object sys.waits_global_by_latency has a type mismatch. To fix the inconsistency we recommend to rename or remove the object before upgrading (use RENAME TABLE command). "
      }
  ]
}
```
事前チェックでは、`sys` スキーマの [sys.waits\$1global\$1by\$1latency](https://dev.mysql.com/doc/refman/5.7/en/sys-waits-global-by-latency.html) ビューに、アップグレードの進行を妨げているタイプの不一致があることが報告されます。  
DB インスタンスにログインすると、このオブジェクトがビューになるタイミングで InnoDB テーブルとして定義されていることがわかります。  

```
mysql> show create table sys.waits_global_by_latency\G
*************************** 1. row ***************************
       Table: waits_global_by_latency
Create Table: CREATE TABLE `waits_global_by_latency` (
  `events` varchar(128) DEFAULT NULL,
  `total` bigint(20) unsigned DEFAULT NULL,
  `total_latency` text,
  `avg_latency` text,
  `max_latency` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
```
この問題を解決するには、[正しい定義](https://github.com/mysql/mysql-server/blob/mysql-5.7.44/scripts/sys_schema/views/p_s/waits_global_by_latency.sql)でビューを削除して再作成するか、名前を変更します。アップグレードプロセス中に、ビューは正しいテーブル定義で自動的に作成されます。  

```
mysql> RENAME TABLE sys.waits_global_by_latency to sys.waits_global_by_latency_old;
Query OK, 0 rows affected (0.01 sec)
```
これを行うと、事前チェックに合格します。  

```
{
  "id": "auroraUpgradeCheckForSysSchemaObjectTypeMismatch",
  "title": "Check object type mismatch for sys schema.",
  "status": "OK",
  "detectedProblems": []
}
```

**auroraUpgradeCheckForViewColumnNameLength**  
**事前チェックレベル: Error**  
**ビュー内の列名の上限を確認する**  
MySQL の[列名の最大許容長](https://dev.mysql.com/doc/refman/5.7/en/identifier-length.html)は 64 文字です。MySQL 8.0 より前では、場合によっては 64 文字を超える列名でビューを作成できました。このようなビューがデータベースインスタンスに存在する場合、事前チェックエラーが返され、アップグレードは失敗します。アップグレードを続行できるようにするには、問題のビューを再作成し、列の長さが 64 文字未満であることを確認する必要があります。次に、アップグレードを再試行します。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForViewColumnNameLength",
  "title": "Check for upperbound limit related to column name in view.",
  "status": "OK",
  "description": "Following view(s) has column(s) with length greater than 64.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.colname_view_test.col2_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad",
        "description": "View `test`.`colname_view_test`has column `col2_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad` with invalid column name length. To avoid Upgrade errors, view should be altered by renaming the column name so that its length is not 0 and doesn't exceed 64."
      }
  ]
}
```
事前チェックでは、`test.colname_view_test` ビューに最大許容列長である 64 文字を超える列 `col2_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad` が含まれていることが報告されます。  
ビュー定義を見ると、問題のある列が表示されます。  

```
mysql> desc `test`.`colname_view_test`;
+------------------------------------------------------------------+-------------+------+-----+---------+-------+
| Field                                                            | Type        | Null | Key | Default | Extra |
+------------------------------------------------------------------+-------------+------+-----+---------+-------+
| col1                                                             | varchar(20) | YES  |     | NULL    |       |
| col2_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad_pad | int(11)     | YES  |     | NULL    |       |
+------------------------------------------------------------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
```
アップグレードを続行できるようにするには、列の長さが 64 文字を超えないようにして、ビューを再作成します。  

```
mysql> drop view `test`.`colname_view_test`;
Query OK, 0 rows affected (0.01 sec)

mysql> create view `test`.`colname_view_test`(col1, col2_nopad) as select inf, fodcol from test;
Query OK, 0 rows affected (0.01 sec)

mysql> desc `test`.`colname_view_test`;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| col1       | varchar(20) | YES  |     | NULL    |       |
| col2_nopad | int(11)     | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
```
これを行うと、事前チェックは成功します。  

```
{
  "id": "auroraUpgradeCheckForViewColumnNameLength",
  "title": "Check for upperbound limit related to column name in view.",
  "status": "OK",
  "detectedProblems": []
}
```

**auroraUpgradeCheckIndexLengthLimitOnTinyColumns**  
**事前チェックレベル: Error**  
**小さな列でプレフィックスの長さが 255 バイトを超えるインデックスが定義されているテーブルをチェックする**  
MySQL で[バイナリデータ型](https://dev.mysql.com/doc/refman/5.7/en/binary-varbinary.html)を使用して列にインデックスを作成する場合は、インデックス定義に[プレフィックス](https://dev.mysql.com/doc/refman/5.7/en/column-indexes.html#column-indexes-prefix)の長さを追加する必要があります。MySQL 8.0 より前では、場合によっては、このようなデータ型の最大許容サイズを超えるプレフィックス長を指定できました。例として `TINYTEXT` 列と `TINYBLOB` 列があります。最大許容データサイズは 255 バイトですが、これより大きいインデックスプレフィックスが許可されていました。詳細については、MySQL ドキュメントの「[InnoDB Limits](https://dev.mysql.com/doc/refman/8.0/en/innodb-limits.html)」を参照してください。  
この事前チェックが失敗した場合は、問題のあるインデックスを削除するか、`TINYTEXT` 列と `TINYBLOB` 列のインデックスのプレフィックス長を 255 バイト未満に減らします。次に、アップグレードを再試行します。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckIndexLengthLimitOnTinyColumns",
  "title": "Check for the tables with indexes defined with prefix length greater than 255 bytes on tiny columns",
  "status": "OK",
  "description": "Prefix length of the indexes defined on tiny columns cannot exceed 255 bytes. With utf8mb4 char set, this limits the prefix length supported upto 63 characters only. A larger prefix length was allowed in MySQL5.7 using innodb_large_prefix parameter. This parameter is deprecated in MySQL 8.0.",
  "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/innodb-limits.html, https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.tintxt_prefixed_index.col1",
        "description": "Index 'PRIMARY' on tinytext/tinyblob column `col1` of table `test.tintxt_prefixed_index` is defined with prefix length exceeding 255 bytes. Reduce the prefix length to <=255 bytes depending on character set used. For utf8mb4, it should be <=63."
      }
  ]
}
```
TINYTEXT 列または TINYBLOB 列に 255 バイトを超えるプレフィックス `PRIMARY` を持つインデックスがあるため、このプレチェックは `test.tintxt_prefixed_index` テーブルのエラーを報告します。  
このテーブルの定義を見ると、プライマリキーの `TINYTEXT` 列 `col1` のプレフィックスが 65 であることがわかります。テーブルは、1 文字あたり 4 バイトを格納する `utf8mb4` 文字セットを使用して定義されるため、プレフィックスは 255 バイトの制限を超えています。  

```
mysql> show create table `test`.`tintxt_prefixed_index`\G
*************************** 1. row ***************************
       Table: tintxt_prefixed_index
Create Table: CREATE TABLE `tintxt_prefixed_index` (
  `col1` tinytext NOT NULL,
  `col2` tinytext,
  `col_id` tinytext,
  PRIMARY KEY (`col1`(65))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)
```
`utf8mb4` 文字セットの使用中にインデックスプレフィックスを 63 に変更すると、アップグレードを続行できます。  

```
mysql> alter table `test`.`tintxt_prefixed_index` drop PRIMARY KEY, ADD  PRIMARY KEY (`col1`(63));
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
```
これを行うと、事前チェックは成功します。  

```
{
  "id": "auroraUpgradeCheckIndexLengthLimitOnTinyColumns",
  "title": "Check for the tables with indexes defined with prefix length greater than 255 bytes on tiny columns",
  "status": "OK",
  "detectedProblems": []
}
```

**auroraUpgradeCheckMissingInnodbMetadataForMysqlHostTable**  
**事前チェックレベル: Error**  
**`mysql.host` テーブルに欠落している InnoDB メタデータの不整合を確認する**  
これは、RDS サービスによって実行される内部のみの事前チェックです。エラーはアップグレード時に自動的に処理されます。これらのエラーは無視して問題ありません。  
この事前チェックでエラーが発生した場合は、[AWS サポート](https://aws.amazon.com/support)でケースを開き、メタデータの不整合の解決をリクエストします。または、論理ダンプを実行してから新しい Aurora MySQL バージョン 3 DB クラスターに復元することで、アップグレードを再試行することもできます。

**auroraUpgradeCheckForInvalidUtf8mb3ColumnComments**  
**事前チェックレベル: Error**  
**無効な utf8mb3 列コメントをチェックする**  
この事前チェックでは、無効な utf8mb3 文字エンコーディングの列コメントを含むテーブルを特定します。MySQL 8.0 では、列コメントを含むメタデータの文字エンコーディングに、より厳格な検証が適用されます。列コメントに含まれている文字が utf8mb3 文字セットの有効な文字でない場合、アップグレードは失敗します。  
この問題の最も一般的な原因は、列コメントに BMP (基本多言語面) 以外の文字が存在することです。BMP 以外の文字には 4 バイトの UTF-8 エンコード (utf8mb4) が必要ですが、utf8mb3 は 3 バイトのシーケンスのみをサポートしており、これらの文字を表すことはできません。  
この問題を解決するには、アップグレードを試みる前に、列コメントを変更して BMP 以外の文字を削除または置換する必要があります。列コメントを更新するには、`ALTER TABLE` ステートメントを使用できます。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForInvalidUtf8mb3ColumnComments",
  "title": "Check for invalid utf8mb3 column comments.",
  "status": "OK",
  "description": "Following table(s) has/have invalid utf8mb3 comments on the column/columns.",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.t2",
        "description": "Table test.t2 has invalid utf8mb3 comments in it's column/columns. This is due to non-BMP characters in the comment field. To fix the inconsistency, we recommend you to modify comment fields to not use non-BMP characters and try the upgrade again."
      }
  ]
}
```
事前チェックでは、1 つ以上の列コメントに無効な utf8mb3 文字 (特に BMP 以外の文字) が `test.t2` テーブルに含まれていることがレポートされます。  
この問題を解決するには、問題のある列を特定し、コメントを更新できます。まず、テーブル構造を調べて、コメントのある列を特定します。  

```
mysql> SHOW CREATE TABLE test.t2\G
```
問題のあるコメントを含む列を特定したら、`ALTER TABLE` ステートメントを使用して更新します。例:  

```
mysql> ALTER TABLE test.t2 MODIFY COLUMN column_name data_type COMMENT 'Updated comment without non-BMP characters';
```
または、コメントを完全に削除することもできます。  

```
mysql> ALTER TABLE test.t2 MODIFY COLUMN column_name data_type COMMENT '';
```
問題のある列コメントをすべて更新すると、事前チェックに合格し、アップグレードを続行できます。  

```
{
  "id": "auroraUpgradeCheckForInvalidUtf8mb3ColumnComments",
  "title": "Check for invalid utf8mb3 column comments.",
  "status": "OK",
  "detectedProblems": []
}
```
列コメントを変更する前に、これらのコメントに依存するアプリケーションコードやドキュメントが適切に更新されていることを確認してください。アプリケーションで BMP 以外の文字が必要な場合は、Unicode サポートを強化するために utf8mb4 文字セットへの移行を検討してください。

## 警告
<a name="precheck-descriptions-warnings"></a>

次の事前チェックは、事前チェックが失敗してもアップグレードを続行できるときに警告を生成します。

**Topics**
+ [警告を報告する MySQL の事前チェック](#precheck-descriptions-warnings.mysql)
+ [警告を報告する Aurora MySQL の事前チェック](#precheck-descriptions-warnings.aurora)

### 警告を報告する MySQL の事前チェック
<a name="precheck-descriptions-warnings.mysql"></a>

次の事前チェックは、コミュニティ MySQL から提供されています。
+ [defaultAuthenticationPlugin](#defaultAuthenticationPlugin)
+ [maxdbFlagCheck](#maxdbFlagCheck)
+ [mysqlDollarSignNameCheck](#mysqlDollarSignNameCheck)
+ [reservedKeywordsCheck](#reservedKeywordsCheck)
+ [utf8mb3Check](#utf8mb3Check)
+ [zeroDatesCheck](#zeroDatesCheck)

**defaultAuthenticationPlugin**  
**事前チェックレベル: Warning**  
**デフォルトの認証プラグインに関する新しい考慮事項**  
MySQL 8.0 では、`caching_sha2_password` 認証プラグインが導入され、廃止された `mysql_native_password` プラグインよりもパスワード暗号化の安全性とパフォーマンスが向上しました。Aurora MySQL バージョン 3 の場合、データベースユーザーに使用されるデフォルトの認証プラグインは `mysql_native_password` プラグインです。  
この事前チェックは、このプラグインが削除され、将来のメジャーバージョンリリースでデフォルトが変更されることを警告します。この変更の前に、アプリケーションクライアントとユーザーの互換性を評価することを検討してください。  
詳細については、MySQL ドキュメントの「[caching\$1sha2\$1password Compatibility Issues and Solutions](https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatibility-issues)」を参照してください。  
**出力例:**  

```
{
  "id": "defaultAuthenticationPlugin",
  "title": "New default authentication plugin considerations",
  "description": "Warning: The new default authentication plugin 'caching_sha2_password' offers more secure password hashing than previously used 'mysql_native_password' (and consequent improved client connection authentication). However, it also has compatibility implications that may affect existing MySQL installations. If your MySQL installation must serve pre-8.0 clients and you encounter compatibility issues after upgrading, the simplest way to address those issues is to reconfigure the server to revert to the previous default authentication plugin (mysql_native_password). For example, use these lines in the server option file:\n\n[mysqld]\ndefault_authentication_plugin=mysql_native_password\n\nHowever, the setting should be viewed as temporary, not as a long term or permanent solution, because it causes new accounts created with the setting in effect to forego the improved authentication security.\nIf you are using replication please take time to understand how the authentication plugin changes may impact you.",
  "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatibility-issues\nhttps://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-replication"
},
```

**maxdbFlagCheck**  
**事前チェックレベル: Warning**  
**廃止された `MAXDB` `sql_mode` フラグの使用**  
MySQL 8.0 では、非推奨の [sql\$1mode](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sql_mode) システム変数オプションがいくつか[削除](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html)されました。そのうちの 1 つは `MAXDB` です。この事前チェックでは、現在接続されているすべてのセッションをルーチンおよびトリガーとともに調べ、`MAXDB` を含む任意の組み合わせに `sql_mode` が設定されていないことを確認します。  
**出力例:**  

```
{
  "id": "maxdbFlagCheck",
  "title": "Usage of obsolete MAXDB sql_mode flag",
  "status": "OK",
  "description": "Warning: The following DB objects have the obsolete MAXDB option persisted for sql_mode, which will be cleared during the upgrade. It can potentially change the datatype DATETIME into TIMESTAMP if it is used inside object's definition, and this in turn can change the behavior in case of dates earlier than 1970 or later than 2037. If this is a concern, please redefine these objects so that they do not rely on the MAXDB flag before running the upgrade.",
  "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals",
  "detectedProblems": [
      {
        "level": "Warning",
        "dbObject": "test.maxdb_stored_routine",
        "description": "PROCEDURE uses obsolete MAXDB sql_mode",
        "dbObjectType": "Routine"
      }
  ]
}
```
事前チェックでは、`test.maxdb_stored_routine` ルーチンにサポートされていない `sql_mode` オプションが含まれていることが報告されます。  
データベースにログインすると、`sql_mode` に `MAXDB` が含まれるルーチン定義が表示されます。  

```
 > SHOW CREATE PROCEDURE test.maxdb_stored_routine\G

*************************** 1. row ***************************
           Procedure: maxdb_stored_routine
            sql_mode: PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,MAXDB,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER
    Create Procedure: CREATE DEFINER="msandbox"@"localhost" PROCEDURE "maxdb_stored_routine"()
BEGIN
    SELECT * FROM test;
END
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
```
問題を解決するには、クライアントで正しい `sql_mode` を設定した後にプロシージャを再作成します。  
[MySQL ドキュメント](https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html)によると、MySQL は、ルーチンを作成または変更したときに有効な `sql_mode` 設定を保存します。ルーチンの開始時の `sql_mode` 設定に関係なく、常にこの設定でルーチンを実行します。  
`sql_mode` を変更する前に、MySQL ドキュメントの「[Server SQL Modes](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html)」を参照してください。アプリケーションへの影響の可能性を慎重に評価します。
サポートされていない `sql_mode` なしでプロシージャを再作成します。  

```
mysql > set sql_mode='PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql > DROP PROCEDURE test.maxdb_stored_routine\G
Query OK, 0 rows affected (0.00 sec)

mysql >
mysql > DELIMITER $$
mysql >
mysql > CREATE PROCEDURE test.maxdb_stored_routine()
    -> SQL SECURITY DEFINER
    -> BEGIN
    ->     SELECT * FROM test;
    -> END$$
Query OK, 0 rows affected (0.00 sec)

mysql >
mysql > DELIMITER ;
mysql > show create procedure test.maxdb_stored_routine\G
*************************** 1. row ***************************
           Procedure: maxdb_stored_routine
            sql_mode: PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE
    Create Procedure: CREATE DEFINER="msandbox"@"localhost" PROCEDURE "maxdb_stored_routine"()
BEGIN
    SELECT * FROM test;
END
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
```
事前チェックは成功しました。  

```
{
  "id": "maxdbFlagCheck",
  "title": "Usage of obsolete MAXDB sql_mode flag",
  "status": "OK",
  "detectedProblems": []
}
```

**mysqlDollarSignNameCheck**  
**事前チェックレベル: Warning**  
**オブジェクト名に非推奨の単一のドル記号が使用されているかどうかをチェックする**  
[MySQL 8.0.32](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-32.html#mysqld-8-0-32-deprecation-removal) 以降、引用符で囲まれていない識別子の最初の文字としてドル記号 (`$`) の使用が廃止されます。`$` を最初の文字として含むスキーマ、テーブル、ビュー、列、またはルーチンがある場合、この事前チェックは警告を返します。この警告はアップグレードの進行を妨げませんが、すぐに対応して解決することをお勧めします。[MySQL 8.4](https://dev.mysql.com/doc/refman/8.4/en/mysql-nutshell.html) 以降、このような識別子は警告ではなく構文エラーを返します。  
**出力例:**  

```
{
  "id": "mysqlDollarSignNameCheck",
  "title": "Check for deprecated usage of single dollar signs in object names",
  "status": "OK",
  "description": "Warning: The following objects have names with deprecated usage of dollar sign ($) at the begining of the identifier. To correct this warning, ensure, that names starting with dollar sign, also end with it, similary to quotes ($example$). ",
  "detectedProblems": [
      {
        "level": "Warning",
        "dbObject": "test.$deprecated_syntx",
        "description": " name starts with $ sign."
      }
  ]
},
```
`test` スキーマの `$deprecated_syntx` テーブルに最初の文字として `$` が含まれているため、事前チェックは警告を報告します。

**reservedKeywordsCheck**  
**事前チェックレベル: Warning**  
**新しい予約キーワードと競合する名前を持つデータベースオブジェクトの使用**  
このチェックは、新しい予約キーワードと競合する名前を持つデータベースオブジェクトの使用を確認する点で、[routineSyntaxCheck](#routineSyntaxCheck) に似ています。アップグレードはブロックされませんが、警告を慎重に評価する必要があります。  
**出力例:**  
`except` という名前のテーブルで前の例を使用すると、事前チェックは警告を返します。  

```
{
  "id": "reservedKeywordsCheck",
  "title": "Usage of db objects with names conflicting with new reserved keywords",
  "status": "OK",
  "description": "Warning: The following objects have names that conflict with new reserved keywords. Ensure queries sent by your applications use `quotes` when referring to them or they will result in errors.",
  "documentationLink": "https://dev.mysql.com/doc/refman/en/keywords.html",
  "detectedProblems": [
      {
        "level": "Warning",
        "dbObject": "test.except",
        "description": "Table name",
        "dbObjectType": "Table"
      }
  ]
}
```
この警告は、確認すべきアプリケーションクエリが存在する可能性があることを知らせます。アプリケーションクエリが[文字列リテラルから正しくエスケープ](https://dev.mysql.com/doc/refman/8.0/en/string-literals.html)されていない場合、MySQL 8.0 にアップグレードした後にエラーが発生する可能性があります。アプリケーションを確認するために、バージョン 3 で実行されている Aurora MySQL DB クラスターのクローンまたはスナップショットに対してテストを実行します。  
アップグレード後に失敗するエスケープされていないアプリケーションクエリの例:  

```
SELECT * FROM escape;
```
アップグレード後に成功する、正しくエスケープされたアプリケーションクエリの例:  

```
SELECT * FROM 'escape';
```

**utf8mb3Check**  
**事前チェックレベル: Warning**  
**`utf8mb3` 文字セットの使用**  
MySQL 8.0 では、`utf8mb3` 文字セットは廃止され、今後の MySQL メジャーバージョンで削除されます。この事前チェックは、この文字セットを使用するデータベースオブジェクトが検出された場合に警告を生成するために実装されます。これによりアップグレードの進行が妨げられることはありませんが、MySQL 8.0 のデフォルトである `utf8mb4` 文字セットにテーブルを移行することを検討するよう強くお勧めします。[utf8mb3](https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb3.html) と [utf8mb4](https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb4.html) の詳細については、MySQL ドキュメントの「[Converting Between 3-Byte and 4-Byte Unicode Character Sets](https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-conversion.html)」を参照してください。  
**出力例:**  

```
{
  "id": "utf8mb3",
  "title": "Usage of utf8mb3 charset",
  "status": "OK",
  "description": "Warning: The following objects use the deprecated utf8mb3 character set. It is recommended to convert them to use utf8mb4 instead, for improved Unicode support. The utf8mb3 character is subject to removal in the future.",
  "documentationLink": "https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb3.html",
  "detectedProblems": [
      {
        "level": "Warning",
        "dbObject": "test.t1.col1",
        "description": "column's default character set: utf8",
        "dbObjectType": "Column"
      },
      {
        "level": "Warning",
        "dbObject": "test.t1.col2",
        "description": "column's default character set: utf8",
        "dbObjectType": "Column"
      }
  ]
}
```
この問題を解決するには、参照されているオブジェクトとテーブルを再構築します。変換の詳細および前提条件については、MySQL ドキュメントの「[Converting Between 3-Byte and 4-Byte Unicode Character Sets](https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-conversion.html)」を参照してください。

**zeroDatesCheck**  
**事前チェックレベル: Warning**  
**DATE、DATETIME、および TIMESTAMP のゼロ値**  
MySQL では、DATE、DATETIME、および TIMESTAMP の列でゼロ値の使用に関するより厳格なルールが適用されるようになりました。`NO_ZERO_IN_DATE` および `NO_ZERO_DATE SQL` モードは、今後の MySQL リリースで `strict` モードとマージされるため、`strict` モードと組み合わせて使用することをお勧めします。  
事前チェックの実行時に、データベース接続の `sql_mode` 設定にこれらのモードが含まれていない場合、事前チェックで警告が発生します。ユーザーは、ゼロ値を含む DATE、DATETIME、および TIMESTAMP 値を挿入できる場合があります。ただし、ゼロ値は、将来動作が変化し、正しく機能しない可能性があるため、有効な値に置き換えることを強くお勧めします。これは警告であるため、アップグレードはブロックされませんが、アクションを実行する計画を開始することをお勧めします。  
**出力例:**  

```
{
  "id": "zeroDatesCheck",
  "title": "Zero Date, Datetime, and Timestamp values",
  "status": "OK",
  "description": "Warning: By default zero date/datetime/timestamp values are no longer allowed in MySQL, as of 5.7.8 NO_ZERO_IN_DATE and NO_ZERO_DATE are included in SQL_MODE by default. These modes should be used with strict mode as they will be merged with strict mode in a future release. If you do not include these modes in your SQL_MODE setting, you are able to insert date/datetime/timestamp values that contain zeros. It is strongly advised to replace zero values with valid ones, as they may not work correctly in the future.",
  "documentationLink": "https://lefred.be/content/mysql-8-0-and-wrong-dates/",
  "detectedProblems": [
      {
        "level": "Warning",
        "dbObject": "global.sql_mode",
        "description": "does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates"
      },
      {
        "level": "Warning",
        "dbObject": "session.sql_mode",
        "description": " of 10 session(s) does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates"
      }
  ]
}
```

### 警告を報告する Aurora MySQL の事前チェック
<a name="precheck-descriptions-warnings.aurora"></a>

次の事前チェックは、Aurora MySQL に固有のものです。
+ [auroraUpgradeCheckForRollbackSegmentHistoryLength](#auroraUpgradeCheckForRollbackSegmentHistoryLength)
+ [auroraUpgradeCheckForUncommittedRowModifications](#auroraUpgradeCheckForUncommittedRowModifications)

**auroraUpgradeCheckForRollbackSegmentHistoryLength**  
**事前チェックレベル: Warning**  
**クラスターのロールバックセグメント履歴リストの長さが長いかどうかを確認する**  
[auroraUpgradeCheckForIncompleteXATransactions](#auroraUpgradeCheckForIncompleteXATransactions) で説明されているように、メジャーバージョンアップグレードプロセスの実行中に、Aurora MySQL バージョン 2 DB インスタンスを[クリーンシャットダウン](https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_slow_shutdown)する必要があります。これにより、すべてのトランザクションがコミットまたはロールバックされ、InnoDB がすべての undo ログレコードを消去します。  
DB クラスターのロールバックセグメント履歴リストの長さ (HLL) が長い場合、InnoDB が undo ログレコードの消去を完了するのにかかる時間が長くなり、メジャーバージョンのアップグレードプロセス中にダウンタイムが長くなる可能性があります。事前チェックで DB クラスターの HLL が高いことが検出されると、警告を発生します。これによりアップグレードの進行が妨げられることはありませんが、DB クラスターの HLL を注意深くモニタリングすることをお勧めします。低いレベルに保つと、メジャーバージョンのアップグレードに必要なダウンタイムが短縮されます。HLL のモニタリングの詳細については、「[InnoDB 履歴リストの長さが大幅に増加しました](proactive-insights.history-list.md)」を参照してください。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForRollbackSegmentHistoryLength",
  "title": "Checks if the rollback segment history length for the cluster is high",
  "status": "OK",
  "description": "Rollback Segment History length is greater than 1M. Upgrade may take longer time.",
  "detectedProblems": [
      {
        "level": "Warning",
        "dbObject": "information_schema.innodb_metrics",
        "description": "The InnoDB undo history list length('trx_rseg_history_len') is 82989114. Upgrade may take longer due to purging of undo information for old row versions."
      }
  ]
}
```
事前チェックでは、データベースクラスターの InnoDB undo HLL が長い (82989114) ことが検出されたため、警告が返されます。アップグレードは続行されますが、パージする undo の量によっては、アップグレードプロセスに必要なダウンタイムが延長される可能性があります。  
本番環境でアップグレードを実行する前に、DB クラスターの[オープントランザクション](proactive-insights.history-list.md)を調査し、HLL が管理可能なサイズに保たれていることを確認することをお勧めします。

**auroraUpgradeCheckForUncommittedRowModifications**  
**事前チェックレベル: Warning**  
**コミットされていない行の変更が多数あるかどうかを確認する**  
[auroraUpgradeCheckForIncompleteXATransactions](#auroraUpgradeCheckForIncompleteXATransactions) で説明されているように、メジャーバージョンアップグレードプロセスの実行中に、Aurora MySQL バージョン 2 DB インスタンスを[クリーンシャットダウン](https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_slow_shutdown)する必要があります。これにより、すべてのトランザクションがコミットまたはロールバックされ、InnoDB がすべての undo ログレコードを消去します。  
DB クラスターに多数の行を変更したトランザクションがある場合、クリーンシャットダウンプロセスの一環として、InnoDB がこのトランザクションのロールバックを完了するのにかかる時間を延長できます。事前チェックで、DB クラスターに多数の行が変更された実行時間が長いトランザクションが見つかった場合、警告が発生します。これによりアップグレードの進行が妨げられるわけではありませんが、DB クラスター上のアクティブなトランザクションのサイズを注意深くモニタリングすることをお勧めします。低いレベルに保つと、メジャーバージョンのアップグレードに必要なダウンタイムが短縮されます。  
**出力例:**  

```
{
  "id": "auroraUpgradeCheckForUncommittedRowModifications",
  "title": "Checks if there are many uncommitted modifications to rows",
  "status": "OK",
  "description": "Database contains uncommitted row changes greater than 10M. Upgrade may take longer time.",
  "detectedProblems": [
      {
        "level": "Warning",
        "dbObject": "information_schema.innodb_trx",
        "description": "The database contains 11000000 uncommitted row change(s) in 1 transaction(s). Upgrade may take longer due to transaction rollback."
      }
  ]
},
```
事前チェックでは、DB クラスターに、クリーンシャットダウンプロセス中にロールバックする必要がある、コミットされていない行の変更が 11,000,000 件あるトランザクションが含まれていることが報告されます。アップグレードは続行されますが、アップグレードプロセス中のダウンタイムを減らすため、本番稼働用クラスターでアップグレードを実行する前に、これをモニタリングして調査することをお勧めします。  
ライター DB インスタンスでアクティブなトランザクションを表示するには、[information\$1schema.innodb\$1trx](https://dev.mysql.com/doc/refman/5.7/en/information-schema-innodb-trx-table.html) テーブルを使用します。ライター DB インスタンスの以下のクエリは、DB クラスターの現在のトランザクション、実行時間、状態、変更された行を示しています。  

```
# Example of uncommitted transaction
mysql> SELECT trx_started,
       TIME_TO_SEC(TIMEDIFF(now(), trx_started)) AS seconds_trx_has_been_running,
       trx_mysql_thread_id AS show_processlist_connection_id,
       trx_id,
       trx_state,
       trx_rows_modified AS rows_modified
FROM information_schema.innodb_trx;
+---------------------+------------------------------+--------------------------------+----------+-----------+---------------+
| trx_started         | seconds_trx_has_been_running | show_processlist_connection_id | trx_id   | trx_state | rows_modified |
+---------------------+------------------------------+--------------------------------+----------+-----------+---------------+
| 2024-08-12 18:32:52 |                         1592 |                          20041 | 52866130 | RUNNING   |      11000000 |
+---------------------+------------------------------+--------------------------------+----------+-----------+---------------+
1 row in set (0.01 sec)

# Example of transaction rolling back
mysql> SELECT trx_started,
       TIME_TO_SEC(TIMEDIFF(now(), trx_started)) AS seconds_trx_has_been_running,
       trx_mysql_thread_id AS show_processlist_connection_id,
       trx_id,
       trx_state,
       trx_rows_modified AS rows_modified
FROM information_schema.innodb_trx;
+---------------------+------------------------------+--------------------------------+----------+--------------+---------------+
| trx_started         | seconds_trx_has_been_running | show_processlist_connection_id | trx_id   | trx_state    | rows_modified |
+---------------------+------------------------------+--------------------------------+----------+--------------+---------------+
| 2024-08-12 18:32:52 |                         1719 |                          20041 | 52866130 | ROLLING BACK |      10680479 |
+---------------------+------------------------------+--------------------------------+----------+--------------+---------------+
1 row in set (0.01 sec)
```
トランザクションがコミットまたはロールバックされると、事前チェックは警告を返さなくなります。大規模なトランザクションをロールバックする前に、MySQL ドキュメントとアプリケーションチームに相談してください。トランザクションのサイズによっては、ロールバックの完了までに時間がかかる場合があります。  

```
{
  "id": "auroraUpgradeCheckForUncommittedRowModifications",
  "title": "Checks if there are many uncommitted modifications to rows",
  "status": "OK",
  "detectedProblems": []
},
```
InnoDB トランザクション管理の最適化、および MySQL データベースインスタンスで大規模なトランザクションを実行およびロールバックした場合の潜在的な影響の詳細については、MySQL ドキュメントの「[Optimizing InnoDB Transaction Management](https://dev.mysql.com/doc/refman/5.7/en/optimizing-innodb-transaction-management.html)」を参照してください。

## 注意
<a name="precheck-descriptions-notices"></a>

次の事前チェックは、事前チェックに失敗してもアップグレードを続行できるときに通知を生成します。

**sqlModeFlagCheck**  
**事前チェックレベル: Notice**  
**廃止された `sql_mode` フラグの使用**  
`MAXDB` に加えて、次のその他の `sql_mode` オプションが[削除](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html)されました: `DB2`、`MSSQL`、`MYSQL323`、`MYSQL40`、`ORACLE`、`POSTGRESQL`、`NO_FIELD_OPTIONS`、`NO_KEY_OPTIONS`、`NO_TABLE_OPTIONS`。MySQL 8.0 以降、これらの値を `sql_mode` システム変数に割り当てることはできません。この事前チェックでこれらの `sql_mode` 設定を使用して開いているセッションが見つかった場合は、DB インスタンスと DB クラスターのパラメータグループ、およびクライアントアプリケーションと設定が無効にするよう更新されていることを確認してください。– 詳細については、「[MySQL ドキュメント](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html)」を参照してください。  
**出力例:**  

```
{
  "id": "sqlModeFlagCheck",
  "title": "Usage of obsolete sql_mode flags",
  "status": "OK",
  "detectedProblems": []
}
```
これらの事前チェックの失敗を解決するには、「[maxdbFlagCheck](#maxdbFlagCheck)」を参照してください。

## エラー、警告、または通知
<a name="precheck-descriptions-all"></a>

次の事前チェックは、事前チェックの出力に応じてエラー、警告、または通知を返す場合があります。

**checkTableOutput**  
**事前チェックレベル: Error、Warning、または Notice**  
**`check table x for upgrade` コマンドによって報告された問題**  
Aurora MySQL バージョン 3 へのアップグレードを開始する前に、`check table for upgrade` は DB クラスター内のユーザースキーマの各テーブルで実行されます。この事前チェックは [checkTableMysqlSchema](#checkTableMysqlSchema) とは異なります。  
`check table for upgrade` コマンドは、MySQL の新しいバージョンへのアップグレード中に発生する可能性のある問題がないかテーブルを調べます。アップグレードを試行する前にこのコマンドを実行すると、互換性がない箇所を事前に特定して解決できるため、実際のアップグレードプロセスがよりスムーズになります。  
このコマンドは、次のような各テーブルに対してさまざまなチェックを実行します。  
+ テーブル構造とメタデータがターゲットの MySQL バージョンと互換性があることを確認する
+ テーブルで使用される廃止または削除された機能を確認する
+ データ損失なしでテーブルを適切にアップグレードできることを確認する
他の事前チェックとは異なり、`check table` の出力に応じてエラー、警告、または通知を返すことがあります。この事前チェックでテーブルが返された場合は、アップグレードを開始する前に、それらをリターンコードとメッセージとともに慎重に確認してください。詳細については、MySQL ドキュメントの「[CHECK TABLE Statement](https://dev.mysql.com/doc/refman/5.7/en/check-table.html)」を参照してください。  
ここでは、エラーの例と警告の例を示します。  
**エラーの例:**  

```
{
  "id": "checkTableOutput",
  "title": "Issues reported by 'check table x for upgrade' command",
  "status": "OK",
  "detectedProblems": [
      {
        "level": "Error",
        "dbObject": "test.parent",
        "description": "Table 'test.parent' doesn't exist"
      }
  ]
},
```
事前チェックでは、`test.parent` テーブルが存在しないというエラーが報告されます。  
ライター DB インスタンスの `mysql-error.log` ファイルには、外部キーエラーがあることを示しています。  

```
2024-08-13T15:32:10.676893Z 62 [Warning] InnoDB: Load table `test`.`parent` failed, the table has missing foreign key indexes. Turn off 'foreign_key_checks' and try again.
2024-08-13T15:32:10.676905Z 62 [Warning] InnoDB: Cannot open table test/parent from the internal data dictionary of InnoDB though the .frm file for the table exists.
Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue.
```
ライター DB インスタンスにログインし、`show engine innodb status\G` を実行して、外部キーエラーに関する詳細情報を取得します。  

```
mysql> show engine innodb status\G
*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
=====================================
2024-08-13 15:33:33 0x14ef7b8a1700 INNODB MONITOR OUTPUT
=====================================
.
.
.
------------------------
LATEST FOREIGN KEY ERROR
------------------------
2024-08-13 15:32:10 0x14ef6dbbb700 Error in foreign key constraint of table test/child:
there is no index in referenced table which would contain
the columns as the first columns, or the data types in the
referenced table do not match the ones in table. Constraint:
,
  CONSTRAINT `fk_pname` FOREIGN KEY (`p_name`) REFERENCES `parent` (`name`)
The index in the foreign key in table is p_name_idx
Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html for correct foreign key definition.
.
.
```
`LATEST FOREIGN KEY ERROR` メッセージは、`test.parent` テーブルを参照する `test.child` テーブル内の `fk_pname` 外部キー制約にインデックスの欠落またはデータ型の不一致があることを示します。MySQL ドキュメントの「[FOREIGN KEY Constraints](https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html)」によると、外部キーで参照される列には関連付けられたインデックスが必要であり、親/子列は同じデータ型を使用する必要があります。  
これがインデックスの欠落またはデータ型の不一致に関連しているかどうかを確認するには、データベースにログインし、セッション変数 [foreign\$1key\$1checks](https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html#foreign-key-checks) を一時的に無効にしてテーブル定義を確認します。そうすると、問題の子制約 (`fk_pname`) が `p_name varchar(20) CHARACTER SET latin1 DEFAULT NULL` を使用して親テーブル `name varchar(20) NOT NULL` を参照していることがわかります。親テーブルは `DEFAULT CHARSET=utf8` を使用しますが、子テーブルの `p_name` 列は `latin1` を使用するため、データ型の不一致エラーがスローされます。  

```
mysql> show create table parent\G
ERROR 1146 (42S02): Table 'test.parent' doesn't exist

mysql> show create table child\G
*************************** 1. row ***************************
       Table: child
Create Table: CREATE TABLE `child` (
  `id` int(11) NOT NULL,
  `p_name` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `p_name_idx` (`p_name`),
  CONSTRAINT `fk_pname` FOREIGN KEY (`p_name`) REFERENCES `parent` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> set foreign_key_checks=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show create table parent\G
*************************** 1. row ***************************
       Table: parent
Create Table: CREATE TABLE `parent` (
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> show create table child\G
*************************** 1. row ***************************
       Table: child
Create Table: CREATE TABLE `child` (
  `id` int(11) NOT NULL,
  `p_name` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `p_name_idx` (`p_name`),
  CONSTRAINT `fk_pname` FOREIGN KEY (`p_name`) REFERENCES `parent` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
```
この問題を解決するには、親と同じ文字セットを使用するように子テーブルを変更するか、子テーブルと同じ文字セットを使用するように親を変更します。ここでは、子テーブルが `p_name` 列定義で明示的に `latin1` を使用するため、`ALTER TABLE` を実行して文字セットを `utf8` に変更します。  

```
mysql> alter table child modify p_name varchar(20) character set utf8 DEFAULT NULL;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> flush tables;
Query OK, 0 rows affected (0.01 sec)
```
そうすると、事前チェックに合格し、アップグレードを続行できます。  
**警告の例:**  

```
{
  "id": "checkTableOutput",
  "title": "Issues reported by 'check table x for upgrade' command",
  "status": "OK",
  "detectedProblems": [
      {
        "level": "Warning",
        "dbObject": "test.orders",
        "description": "Trigger test.orders.delete_audit_trigg does not have CREATED attribute."
      }
  ]
}
```
`test.orders` テーブルの `delete_audit_trigg` トリガーに `CREATED` 属性がないため、事前チェックは警告を報告します。MySQL ドキュメントの「[Checking Version Compatibility](https://dev.mysql.com/doc/refman/5.7/en/check-table.html#check-table-version-compatibility)」によると、このメッセージは情報であり、MySQL 5.7.2 より前に作成されたトリガーに対して印刷されます。  
これは警告であるため、アップグレードの進行は妨げられません。ただし、問題を解決する場合は、問題のトリガーを再作成できます。事前チェックは警告なしで成功します。  

```
{
  "id": "checkTableOutput",
  "title": "Issues reported by 'check table x for upgrade' command",
  "status": "OK",
  "detectedProblems": []
},
```

# インプレースアップグレードの実行手順
<a name="AuroraMySQL.Upgrading.Procedure"></a>

[メジャーバージョンの Aurora MySQL インプレースアップグレードの仕組み](AuroraMySQL.Updates.MajorVersionUpgrade.md#AuroraMySQL.Upgrading.Sequence) の背景のマテリアルを確認することをお勧めします。

「[Aurora MySQL クラスターのメジャーバージョンアップグレードの計画](AuroraMySQL.Updates.MajorVersionUpgrade.md#AuroraMySQL.Upgrading.Planning)」の説明に従い、アップグレード前の計画とテストを行います。

## コンソール
<a name="AuroraMySQL.Upgrading.ModifyingDBCluster.CON"></a>

次の例では、`mydbcluster-cluster` DB クラスターを Aurora MySQL バージョン 3.04.1 にアップグレードします。

**Aurora MySQL DB クラスターのメジャーバージョンをアップグレードするには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/) を開きます。

1. 元の DB クラスターでカスタムパラメータグループを使用した場合は、新しいメジャーバージョン互換のパラメータグループを作成します。新しいパラメータグループの設定パラメータに必要な調整を行います。詳細については、「[インプレースアップグレードはクラスターのパラメータグループにどのような影響を与えるか](#AuroraMySQL.Upgrading.ParamGroups)」を参照してください。

1.  ナビゲーションペインで、[**データベース**] を選択します。

1.  リストから、変更する DB クラスターを選択します。

1.  **Modify** を選択します。

1.  **[Version]** (バージョン) で、新しい Aurora MySQL のメジャーバージョンを選択します。

   通常、メジャーバージョンの最新のマイナーバージョンを使用することをお勧めします。ここでは、現在のデフォルトバージョンを選択します。  
![\[Aurora MySQL DB クラスターのバージョン 2 からバージョン 3 へのインプレースアップグレード\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/ams-upgrade-v2-v3.png)

1.  **[Continue]** (続行) をクリックします。

1.  次のページで、アップグレードを実行するタイミングを指定します。[**次の定期メンテナンス期間中**] または [**今すぐ**] を選択します。

1.  (オプション) アップグレード中、RDS コンソールの [**イベント**] ページを定期的に確認します。これにより、アップグレードの進行状況をモニタリングし、問題を特定することができます。アップグレードで問題が発生した場合は、[Aurora MySQL インプレースアップグレードのトラブルシューティング](AuroraMySQL.Upgrading.Troubleshooting.md) を参照してステップを実行してください。

1. この手順のスタート時に、新しいパラメータグループを作成した場合は、アップグレードしたクラスターにカスタムパラメータグループを関連付けます。詳細については、「[インプレースアップグレードはクラスターのパラメータグループにどのような影響を与えるか](#AuroraMySQL.Upgrading.ParamGroups)」を参照してください。
**注記**  
 このステップを実行するには、クラスターを再起動して新しいパラメータグループを適用する必要があります。

1.  (オプション) アップグレード後のテストが完了したら、アップグレードのスタート時に Aurora によって作成された手動スナップショットを削除します。

## AWS CLI
<a name="AuroraMySQL.Upgrading.ModifyingDBCluster.CLI"></a>

Aurora MySQL DB クラスターのメジャーバージョンをアップグレードするには、次の必須パラメータを指定しながら、AWS CLI の [modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html) コマンドを実行します。
+ `--db-cluster-identifier`
+ `--engine-version`
+ `--allow-major-version-upgrade`
+  `--apply-immediately` または `--no-apply-immediately`

クラスターでカスタムパラメータグループを使用する場合は、次のオプションの 1 つ、または両方を含めます。
+ `--db-cluster-parameter-group-name`、クラスターがカスタムクラスターのパラメータグループを使用している場合
+ `--db-instance-parameter-group-name`、クラスター内のインスタンスがカスタム DB のパラメータグループを使用している場合

次の例では、`sample-cluster` DB クラスターを Aurora MySQL バージョン 3.04.1 にアップグレードします。アップグレードは、次のメンテナンスウィンドウを待つことなく、すぐに実行されます。

**Example**  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-cluster \
          --db-cluster-identifier sample-cluster \
          --engine-version 8.0.mysql_aurora.3.04.1 \
          --allow-major-version-upgrade \
          --apply-immediately
```
Windows の場合:  

```
aws rds modify-db-cluster ^
          --db-cluster-identifier sample-cluster ^
          --engine-version 8.0.mysql_aurora.3.04.1 ^
          --allow-major-version-upgrade ^
          --apply-immediately
```
他の CLI `modify-db-cluster` コマンドをと組み合わせて、アップグレードを実行および検証するための自動化されたエンドツーエンドのプロセスを作成できます。詳細な説明と例については、「[Aurora MySQL インプレースアップグレードのチュートリアル](AuroraMySQL.Upgrading.Tutorial.md)」を参照してください。

**注記**  
クラスターが Aurora Global Database の一部である場合、インプレースアップグレードの手順は若干異なります。`modify-db-cluster` の代わりに、[modify-global-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-global-cluster.html) コマンドオペレーションを呼び出します。詳細については、「[グローバルデータベースのインプレースメジャーアップグレード](#AuroraMySQL.Upgrading.GlobalDB)」を参照してください。

## RDS API
<a name="AuroraMySQL.Upgrading.ModifyingDBCluster.API"></a>

Aurora MySQL DB クラスターのメジャーバージョンをアップグレードするには、次の必須パラメータを指定して RDS API の [ModifyDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBCluster.html) オペレーションを使用します。
+ `DBClusterIdentifier`
+ `Engine`
+ `EngineVersion`
+ `AllowMajorVersionUpgrade`
+ `ApplyImmediately` (`true`、または `false` に設定)

**注記**  
クラスターが Aurora Global Database の一部である場合、インプレースアップグレードの手順は若干異なります。 `ModifyDBCluster` の代わりに、[ modifyGlobalCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyGlobalClusterParameterGroup.html) オペレーションを呼び出します。詳細については、「[グローバルデータベースのインプレースメジャーアップグレード](#AuroraMySQL.Upgrading.GlobalDB)」を参照してください。

## インプレースアップグレードはクラスターのパラメータグループにどのような影響を与えるか
<a name="AuroraMySQL.Upgrading.ParamGroups"></a>

Aurora パラメータグループには、MySQL 5.7 または 8.0 と互換性のあるクラスターとは異なる構成設定のセットがあります。インプレースアップグレードを実行する際、アップグレードされたクラスターとそのすべてのインスタンスで、対応するクラスターおよびインスタンスのパラメータグループを使用する必要があります。

クラスターとインスタンスは、デフォルトの 5.7 互換パラメータグループを使用する場合があります。その場合、アップグレードされたクラスターとインスタンスは、デフォルトの 8.0 互換パラメータグループで開始されます。クラスターとインスタンスでカスタムパラメータグループを使用している場合は、対応する、または 8.0 互換のパラメータグループを作成してください。また、アップグレード処理中に必ずそれらを指定してください。

**注記**  
ほとんどのパラメータ設定では、2 つのポイントでカスタムパラメータグループを選択できます。これらは、クラスターの作成時や、パラメータグループをクラスターに関連付ける場合です。  
ただし、デフォルト以外の設定を `lower_case_table_names` パラメータに使用する場合は、事前にこの設定を使用してカスタム パラメータグループを設定する必要があります。その後、スナップショット復元を実行してクラスターを作成する際、パラメータグループを指定します。クラスター作成後の`lower_case_table_names` パラメータへの変更は、影響がありません。  
Aurora MySQL バージョン 2 からバージョン 3 にアップグレードする場合にも、同じ `lower_case_table_names` の設定を使用することをお勧めします。  
Aurora MySQL に基づく Aurora グローバルデータベースでは、`lower_case_table_names` パラメータがオンの場合、Aurora MySQL バージョン 2 からバージョン 3 へのインプレースアップグレードを実行できません。使用できる方法の詳細については、「[メジャーバージョンのアップグレード](aurora-global-database-upgrade.md#aurora-global-database-upgrade.major)」を参照してください。

**重要**  
 アップグレードプロセス中にカスタムパラメータグループを指定した場合は、アップグレード終了後にクラスターを手動で再起動してください。再起動すると、クラスターがカスタムパラメータ設定の使用をスタートできます。

## Aurora MySQL バージョン間のクラスターのプロパティの変更
<a name="AuroraMySQL.Upgrading.Attrs"></a>

Aurora MySQL バージョン 2 からバージョン 3 にアップグレードする場合は、Aurora MySQL クラスターと DB インスタンスのセットアップと管理に使用するアプリケーションやスクリプトを確認してください。

また、5.7 および 8.0 互換クラスターではデフォルトのパラメータグループ名が異なることを考慮して、パラメータグループを操作するコードを変更します。Aurora MySQL バージョン 2 と 3 のクラスターのデフォルトのパラメータグループ名は、それぞれ `default.aurora-mysql5.7` と `default.aurora-mysql8.0` です。

例えば、アップグレード前にクラスターに適用される次のようなコードがあるとします。

```
# Check the default parameter values for MySQL 5.7–compatible clusters.
aws rds describe-db-parameters --db-parameter-group-name default.aurora-mysql5.7 --region us-east-1
```

 クラスターのメジャーバージョンをアップグレードした後、そのコードを次のように変更します。

```
# Check the default parameter values for MySQL 8.0–compatible clusters.
aws rds describe-db-parameters --db-parameter-group-name default.aurora-mysql8.0 --region us-east-1
```

## グローバルデータベースのインプレースメジャーアップグレード
<a name="AuroraMySQL.Upgrading.GlobalDB"></a>

 Aurora Global Database の場合は、グローバルデータベースクラスターをアップグレードします。Aurora は、すべてのクラスターを同時かつ自動的にアップグレードし、すべてのクラスターで、同じエンジンバージョンが実行されることを保証します。これは、システムテーブルやデータファイル形式などの変更が、すべてのセカンダリクラスターに自動的にレプリケートされるためです。

「[メジャーバージョンの Aurora MySQL インプレースアップグレードの仕組み](AuroraMySQL.Updates.MajorVersionUpgrade.md#AuroraMySQL.Upgrading.Sequence)」の手順に従います。アップグレードする対象を指定するときは、そのデータベースに含まれるクラスターの 1 つではなく、グローバルデータベースクラスターを選択してください。

AWS マネジメントコンソール を使用する場合、**[Global database]** (グローバルデータベース) のロールを持つアイテムを選択します。

![\[グローバルデータベースクラスターをアップグレードする\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/aurora-global-databases-major-upgrade-global-cluster.png)


 AWS CLI または RDS API を使用する場合は、[modify-global-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-global-cluster.html) コマンドまたは [ModifyGlobalCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyGlobalCluster.html) オペレーションを呼び出して、アップグレードプロセスをスタートします。`modify-db-cluster` または `ModifyDBCluster` の代わりにこれらのいずれかを使用します。

**注記**  
Aurora グローバルデータベースのメジャーバージョンアップグレードを実行している間、グローバルデータベースクラスターのカスタムパラメータグループを指定することはできません。グローバルクラスターの各リージョンにカスタムパラメータグループを作成します。次に、アップグレード後に手動でリージョンクラスターに適用します。

 AWS CLI を使用して Aurora MySQL グローバルデータベースクラスターのメジャーバージョンをアップグレードするには、以下の必須パラメータを指定して、[modify-global-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-global-cluster.html) コマンドを使用します。
+  `--global-cluster-identifier` 
+  `--engine aurora-mysql` 
+  `--engine-version` 
+  `--allow-major-version-upgrade` 

次の例では、グローバルデータベースクラスターを Aurora MySQL バージョン 2.10.2 にアップグレードします。

**Example**  
Linux、macOS、Unix の場合:  

```
aws rds modify-global-cluster \
          --global-cluster-identifier global_cluster_identifier \
          --engine aurora-mysql \
          --engine-version 5.7.mysql_aurora.2.10.2 \
          --allow-major-version-upgrade
```
Windows の場合:  

```
aws rds modify-global-cluster ^
          --global-cluster-identifier global_cluster_identifier ^
          --engine aurora-mysql ^
          --engine-version 5.7.mysql_aurora.2.10.2 ^
          --allow-major-version-upgrade
```

## バックトラックに関する考慮事項
<a name="AuroraMySQL.Upgrading.Backtrack"></a>

アップグレードしたクラスターでバックトラック機能が有効になっている場合、アップグレードしたクラスターをアップグレード前の時間にバックトラックすることはできません。

# Aurora MySQL インプレースアップグレードのチュートリアル
<a name="AuroraMySQL.Upgrading.Tutorial"></a>

次の Linux の例では、AWS CLI を使用してインプレースアップグレードの一般的なステップを実行する方法を示します。

この最初の例では、2.x バージョンの Aurora MySQL を実行する Aurora DB クラスターを作成します。クラスターには、ライター DB インスタンスとリーダー DB インスタンスが含まれます。`wait db-instance-available` コマンドは、ライター DB インスタンスが利用可能になるまで一時停止します。クラスターをアップグレードする準備ができた時点です。

```
aws rds create-db-cluster --db-cluster-identifier mynewdbcluster --engine aurora-mysql \
  --db-cluster-version 5.7.mysql_aurora.2.11.2
...
aws rds create-db-instance --db-instance-identifier mynewdbcluster-instance1 \
  --db-cluster-identifier mynewdbcluster --db-instance-class db.t4g.medium --engine aurora-mysql
...
aws rds wait db-instance-available --db-instance-identifier mynewdbcluster-instance1
```

クラスターをアップグレードできる Aurora MySQL 3.x バージョンは、クラスターが現在実行している 2.x バージョンと、クラスターがある AWS リージョン によって異なります。`--output text` による初期のコマンドは、使用可能なターゲットバージョンだけを表示させます。2 番目のコマンドは、レスポンスの完全な JSON 出力を表示します。その応答では、`engine` パラメータに使用した `aurora-mysql` 値などの詳細を確認できます。また、3.04.0 へのアップグレードがメジャーバージョンアップグレードであることがわかります。

```
aws rds describe-db-clusters --db-cluster-identifier mynewdbcluster \
  --query '*[].{EngineVersion:EngineVersion}' --output text
5.7.mysql_aurora.2.11.2

aws rds describe-db-engine-versions --engine aurora-mysql --engine-version 5.7.mysql_aurora.2.11.2 \
  --query '*[].[ValidUpgradeTarget]'
...
{
    "Engine": "aurora-mysql",
    "EngineVersion": "8.0.mysql_aurora.3.04.0",
    "Description": "Aurora MySQL 3.04.0 (compatible with MySQL 8.0.28)",
    "AutoUpgrade": false,
    "IsMajorVersionUpgrade": true,
    "SupportedEngineModes": [
        "provisioned"
    ],
    "SupportsParallelQuery": true,
    "SupportsGlobalDatabases": true,
    "SupportsBabelfish": false,
    "SupportsIntegrations": false
},
...
```

この例では、クラスターの有効なアップグレードターゲットではないターゲットバージョン番号が入力された場合に、Aurora がアップグレードを実行しないようにする方法を示しています。Aurora は、`--allow-major-version-upgrade` パラメータを指定しない限り、メジャーバージョンのアップグレードを実行しません。これにより、アプリケーションコードの大規模なテストや変更を必要とする可能性のあるアップグレードを誤って実行することはありません。

```
aws rds modify-db-cluster --db-cluster-identifier mynewdbcluster \
  --engine-version 5.7.mysql_aurora.2.09.2 --apply-immediately
An error occurred (InvalidParameterCombination) when calling the ModifyDBCluster operation: Cannot find upgrade target from 5.7.mysql_aurora.2.11.2 with requested version 5.7.mysql_aurora.2.09.2.

aws rds modify-db-cluster --db-cluster-identifier mynewdbcluster \
  --engine-version 8.0.mysql_aurora.3.04.0 --region us-east-1 --apply-immediately
An error occurred (InvalidParameterCombination) when calling the ModifyDBCluster operation: The AllowMajorVersionUpgrade flag must be present when upgrading to a new major version.

aws rds modify-db-cluster --db-cluster-identifier mynewdbcluster \
  --engine-version 8.0.mysql_aurora.3.04.0 --apply-immediately --allow-major-version-upgrade
{
  "DBClusterIdentifier": "mynewdbcluster",
  "Status": "available",
  "Engine": "aurora-mysql",
  "EngineVersion": "5.7.mysql_aurora.2.11.2"
}
```

 クラスターおよび関連付けられた DB インスタンスのステータスが `upgrading` に変わるまで、しばらく時間がかかります。クラスターおよび DB インスタンスのバージョン番号は、アップグレードが完了したときにのみ変更されます。この場合も、ライター DB インスタンスの `wait db-instance-available` コマンドを使用して、アップグレードが完了するまで待機してから続行します。

```
aws rds describe-db-clusters --db-cluster-identifier mynewdbcluster \
  --query '*[].[Status,EngineVersion]' --output text
upgrading 5.7.mysql_aurora.2.11.2

aws rds describe-db-instances --db-instance-identifier mynewdbcluster-instance1 \
  --query '*[].{DBInstanceIdentifier:DBInstanceIdentifier,DBInstanceStatus:DBInstanceStatus} | [0]'
{
    "DBInstanceIdentifier": "mynewdbcluster-instance1",
    "DBInstanceStatus": "upgrading"
}

aws rds wait db-instance-available --db-instance-identifier mynewdbcluster-instance1
```

 この時点で、クラスターのバージョン番号が、アップグレード用に指定されたバージョン番号と一致します。

```
aws rds describe-db-clusters --db-cluster-identifier mynewdbcluster \
  --query '*[].[EngineVersion]' --output text

8.0.mysql_aurora.3.04.0
```

前の例では、`--apply-immediately` パラメータを指定して即時のアップグレードを実行しました。クラスターがビジー状態ではないと予想される都合の良いときにアップグレードを実行するために、`--no-apply-immediately` パラメータを指定できます。これにより、クラスターの次のメンテナンスウィンドウの表示中にアップグレードがスタートされます。メンテナンスウィンドウでは、メンテナンスオペレーションをスタートできる期間を定義します。長時間実行されるオペレーションは、メンテナンスウィンドウの中で終了しない場合があります。したがって、アップグレードに長時間かかることが予想される場合でも、より大きなメンテナンスウィンドウを定義する必要はありません。

次の例では、初期に Aurora MySQL バージョン 2.11.2 を実行しているクラスターをアップグレードします。`describe-db-engine-versions` 出力では、`False` および `True` 値は `IsMajorVersionUpgrade` プロパティを表します。バージョン 2.11.2 から、他の 2.\$1 バージョンにアップグレードできます。これらのアップグレードはメジャーバージョンアップグレードとはみなされないため、一括アップグレードは必要ありません。インプレースアップグレードは、リストに示されている 3.\$1 バージョンへのアップグレードでのみ利用できます。

```
aws rds describe-db-clusters --db-cluster-identifier mynewdbcluster \
  --query '*[].{EngineVersion:EngineVersion}' --output text
5.7.mysql_aurora.2.11.2

aws rds describe-db-engine-versions --engine aurora-mysql --engine-version 5.7.mysql_aurora.2.10.2 \
  --query '*[].[ValidUpgradeTarget]|[0][0]|[*].[EngineVersion,IsMajorVersionUpgrade]' --output text

5.7.mysql_aurora.2.11.3 False
5.7.mysql_aurora.2.11.4 False
5.7.mysql_aurora.2.11.5 False
5.7.mysql_aurora.2.11.6 False
5.7.mysql_aurora.2.12.0 False
5.7.mysql_aurora.2.12.1 False
5.7.mysql_aurora.2.12.2 False
5.7.mysql_aurora.2.12.3 False
8.0.mysql_aurora.3.04.0 True
8.0.mysql_aurora.3.04.1 True
8.0.mysql_aurora.3.04.2 True
8.0.mysql_aurora.3.04.3 True
8.0.mysql_aurora.3.05.2 True
8.0.mysql_aurora.3.06.0 True
8.0.mysql_aurora.3.06.1 True
8.0.mysql_aurora.3.07.1 True

aws rds modify-db-cluster --db-cluster-identifier mynewdbcluster \
  --engine-version 8.0.mysql_aurora.3.04.0 --no-apply-immediately --allow-major-version-upgrade
...
```

指定されたメンテナンスウィンドウを使用せずにクラスターを作成する場合、Aurora はランダムな曜日を選択します。この場合、`modify-db-cluster` コマンドは月曜日に送信されます。したがって、メンテナンスウィンドウを火曜日の朝に変更します。すべての時刻は UTC タイムゾーンで表されます。`tue:10:00-tue:10:30` 期間は、太平洋標準時の午前 2 時から 2 時 30 分に相当します。メンテナンスウィンドウの変更はすぐに有効になります。

```
aws rds describe-db-clusters --db-cluster-identifier mynewdbcluster --query '*[].[PreferredMaintenanceWindow]'
[
    [
        "sat:08:20-sat:08:50"
    ]
]

aws rds modify-db-cluster --db-cluster-identifier mynewdbcluster --preferred-maintenance-window tue:10:00-tue:10:30"
aws rds describe-db-clusters --db-cluster-identifier mynewdbcluster --query '*[].[PreferredMaintenanceWindow]'
[
    [
        "tue:10:00-tue:10:30"
    ]
]
```

次に、アップグレードによって生成されたイベントのレポートを取得する例を示します。`--duration` 引数は、イベント情報を取得する時間 (分) を表します。デフォルトでは、`describe-events` は過去 1 時間のイベントのみを返すため、この引数が必要です。

```
aws rds describe-events --source-type db-cluster --source-identifier mynewdbcluster --duration 20160
{
    "Events": [
        {
            "SourceIdentifier": "mynewdbcluster",
            "SourceType": "db-cluster",
            "Message": "DB cluster created",
            "EventCategories": [
                "creation"
            ],
            "Date": "2022-11-17T01:24:11.093000+00:00",
            "SourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:mynewdbcluster"
        },
        {
            "SourceIdentifier": "mynewdbcluster",
            "SourceType": "db-cluster",
            "Message": "Upgrade in progress: Performing online pre-upgrade checks.",
            "EventCategories": [
                "maintenance"
            ],
            "Date": "2022-11-18T22:57:08.450000+00:00",
            "SourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:mynewdbcluster"
        },
        {
            "SourceIdentifier": "mynewdbcluster",
            "SourceType": "db-cluster",
            "Message": "Upgrade in progress: Performing offline pre-upgrade checks.",
            "EventCategories": [
                "maintenance"
            ],
            "Date": "2022-11-18T22:57:59.519000+00:00",
            "SourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:mynewdbcluster"
        },
        {
            "SourceIdentifier": "mynewdbcluster",
            "SourceType": "db-cluster",
            "Message": "Upgrade in progress: Creating pre-upgrade snapshot [preupgrade-mynewdbcluster-5-7-mysql-aurora-2-10-2-to-8-0-mysql-aurora-3-02-0-2022-11-18-22-55].",
            "EventCategories": [
                "maintenance"
            ],
            "Date": "2022-11-18T23:00:22.318000+00:00",
            "SourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:mynewdbcluster"
        },
        {
            "SourceIdentifier": "mynewdbcluster",
            "SourceType": "db-cluster",
            "Message": "Upgrade in progress: Cloning volume.",
            "EventCategories": [
                "maintenance"
            ],
            "Date": "2022-11-18T23:01:45.428000+00:00",
            "SourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:mynewdbcluster"
        },
        {
            "SourceIdentifier": "mynewdbcluster",
            "SourceType": "db-cluster",
            "Message": "Upgrade in progress: Purging undo records for old row versions. Records remaining: 164",
            "EventCategories": [
                "maintenance"
            ],
            "Date": "2022-11-18T23:02:25.141000+00:00",
            "SourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:mynewdbcluster"
        },
        {
            "SourceIdentifier": "mynewdbcluster",
            "SourceType": "db-cluster",
            "Message": "Upgrade in progress: Purging undo records for old row versions. Records remaining: 164",
            "EventCategories": [
                "maintenance"
            ],
            "Date": "2022-11-18T23:06:23.036000+00:00",
            "SourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:mynewdbcluster"
        },
        {
            "SourceIdentifier": "mynewdbcluster",
            "SourceType": "db-cluster",
            "Message": "Upgrade in progress: Upgrading database objects.",
            "EventCategories": [
                "maintenance"
            ],
            "Date": "2022-11-18T23:06:48.208000+00:00",
            "SourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:mynewdbcluster"
        },
        {
            "SourceIdentifier": "mynewdbcluster",
            "SourceType": "db-cluster",
            "Message": "Database cluster major version has been upgraded",
            "EventCategories": [
                "maintenance"
            ],
            "Date": "2022-11-18T23:10:28.999000+00:00",
            "SourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:mynewdbcluster"
        }
    ]
}
```

# Aurora MySQL メジャーバージョンアップグレードが失敗する理由を確認する
<a name="AuroraMySQL.Upgrading.failure-events"></a>

[チュートリアル](AuroraMySQL.Upgrading.Tutorial.md)では、Aurora MySQL バージョン 2 からバージョン 3 へのアップグレードに成功しました。ただし、アップグレードが失敗した場合は、必要に応じて、その理由を確認できます。

まず、`describe-events` AWS CLI コマンドを使用して DB クラスターのイベントを表示できます。この例は、過去 10 時間の `mydbcluster` のイベントを示しています。

```
aws rds describe-events \
    --source-type db-cluster \
    --source-identifier mydbcluster \
    --duration 600
```

この例では、アップグレードの事前チェックが失敗しています。

```
{
    "Events": [
        {
            "SourceIdentifier": "mydbcluster",
            "SourceType": "db-cluster",
            "Message": "Database cluster engine version upgrade started.",
            "EventCategories": [
                "maintenance"
            ],
            "Date": "2024-04-11T13:23:22.846000+00:00",
            "SourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster"
        },
        {
            "SourceIdentifier": "mydbcluster",
            "SourceType": "db-cluster",
            "Message": "Database cluster is in a state that cannot be upgraded: Upgrade prechecks failed. For more details, see the  
             upgrade-prechecks.log file. For more information on troubleshooting the cause of the upgrade failure, see 
             https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Upgrading.Troubleshooting.html",
            "EventCategories": [
                "maintenance"
            ],
            "Date": "2024-04-11T13:23:24.373000+00:00",
            "SourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:mydbcluster"
        }
    ]
}
```

問題の正確な原因を診断するには、ライター DB インスタンスのデータベースログを調べます。Aurora MySQL バージョン 3 へのアップグレードが失敗すると、ライターインスタンスに `upgrade-prechecks.log` という名前のログファイルが追加されます。この例では、そのログの存在を検出し、それを調査のためにローカルファイルにダウンロードする方法を示します。

```
aws rds describe-db-log-files --db-instance-identifier mydbcluster-instance \
    --query '*[].[LogFileName]' --output text

error/mysql-error-running.log
error/mysql-error-running.log.2024-04-11.20
error/mysql-error-running.log.2024-04-11.21
error/mysql-error.log
external/mysql-external.log
upgrade-prechecks.log

aws rds download-db-log-file-portion --db-instance-identifier mydbcluster-instance \
    --log-file-name upgrade-prechecks.log \
    --starting-token 0 \
    --output text >upgrade_prechecks.log
```

この `upgrade-prechecks.log` ファイルは JSON 形式です。別の JSON ラッパー内で JSON 出力がエンコードされないように、`--output text` オプションを使用してこのファイルをダウンロードします Aurora MySQL バージョン 3 のアップグレードでは、このログには常に、特定の情報と警告メッセージが含まれます。エラーメッセージは、アップグレードが失敗した場合にのみ含まれます。アップグレードが成功すると、ログファイルはまったく生成されません。

すべてのエラーを集約して関連するオブジェクトや説明のフィールドを表示するには、`upgrade-prechecks.log` ファイルの内容に対して `grep -A 2 '"level": "Error"'` コマンドを実行できます。これにより、各エラー行とその後の 2 行が表示されます。これらの行には、対応するデータベースオブジェクトの名前と、問題の修正方法に関するガイダンスが含まれています。

```
$ cat upgrade-prechecks.log | grep -A 2 '"level": "Error"'

"level": "Error",
"dbObject": "problematic_upgrade.dangling_fulltext_index",
"description": "Table `problematic_upgrade.dangling_fulltext_index` contains dangling FULLTEXT index. Kindly recreate the table before upgrade."
```

この例では、問題のあるテーブルに対して次の SQL コマンドを実行して問題の解決を試みるか、ダングリングインデックスなしでテーブルを再作成することができます。

```
OPTIMIZE TABLE problematic_upgrade.dangling_fulltext_index;
```

次に、アップグレードを再試行します。

# Aurora MySQL インプレースアップグレードのトラブルシューティング
<a name="AuroraMySQL.Upgrading.Troubleshooting"></a>

以下のヒントを使用して、Aurora MySQL インプレースアップグレードに関する問題のトラブルシューティングを行います。これらのヒントは、Aurora Serverless DB クラスターには適用されません。


| インプレースアップグレードがキャンセルされた、または遅い理由 | 効果 | メンテナンス期間内にインプレースアップグレードを完了するためのソリューション | 
| --- | --- | --- | 
| 関連する Aurora クロスリージョンレプリカに対するパッチが未適用 | Aurora はアップグレードをキャンセルします。 | Aurora クロスリージョンレプリカをアップグレードして、もう一度試します。 | 
| クラスターに準備済み状態の XA トランザクションがある | Aurora はアップグレードをキャンセルします。 | 準備済みのすべての XA トランザクションをコミットまたはロールバックします。 | 
| クラスターはデータ定義言語 (DDL) ステートメントを処理しています | Aurora はアップグレードをキャンセルします。 | すべての DDL ステートメントが終了したら、アップグレードを待って実行することをお勧めします。 | 
| クラスターの多くの行で、コミットされていない変更があります | アップグレードには長時間かかる場合があります。 |  アップグレードプロセスは、コミットされていない変更をロールバックします。この条件のインジケータは、`TRX_ROWS_MODIFIED` テーブル内の `INFORMATION_SCHEMA.INNODB_TRX` の値です。 すべての大きなトランザクションがコミットまたはロールバックされた後にのみ、アップグレードを実行することをお勧めします。  | 
| クラスターには多数の UNDO レコードがあります | アップグレードには長時間かかる場合があります。 |  コミットされていないトランザクションが多数の行に影響を与えない場合でも、大量のデータが含まれる可能性があります。例えば、大きな BLOB を挿入する場合などです。Aurora は、この種のトランザクションアクティビティのイベントを自動的に検出または生成しません。この条件のインジケータは、履歴リスト (HLL) の長さです。アップグレードプロセスは、コミットされていない変更をロールバックします。 HLL は、`SHOW ENGINE INNODB STATUS` SQL コマンドからの出力で確認することも、次の SQL クエリを使用して直接確認することもできます。 <pre>SELECT count FROM information_schema.innodb_metrics WHERE name = 'trx_rseg_history_len';</pre> また、Amazon CloudWatch で `RollbackSegmentHistoryListLength` メトリクスをモニタリングすることもできます。 HLL の長さが短くなった後にのみ、アップグレードを実行することをお勧めします。  | 
| クラスターは、大きなバイナリログトランザクションをコミット中です | アップグレードには長時間かかる場合があります。 |  アップグレードプロセスは、バイナリログの変更が適用されるまで待ちます。この期間中にさらに多くのトランザクションまたは DDL ステートメントがスタートされる可能性があり、アップグレードプロセスの速度はさらに低下します。 クラスターがバイナリログレプリケーションの変更を生成するためのビジー状態でない場合に、アップグレードプロセスがスケジュールされます。Aurora は、この条件のイベントを自動的に検出または生成しません。  | 
| ファイルの削除または破損によるスキーマの不一致 | Aurora はアップグレードをキャンセルします。 |  一時テーブルのデフォルトのストレージエンジンを MyISAM から InnoDB に変更します。以下のステップを実行します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Upgrading.Troubleshooting.html)  | 
| マスターユーザーが削除されました | Aurora はアップグレードをキャンセルします。 |   マスターユーザーを削除しないでください。  ただし、何らかの理由でマスターユーザーを削除する必要がある場合は、次の SQL コマンドを使用して復元します。 <pre>CREATE USER 'master_username'@'%' IDENTIFIED BY 'master_user_password' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;<br /><br />GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, <br />LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, <br />TRIGGER, LOAD FROM S3, SELECT INTO S3, INVOKE LAMBDA, INVOKE SAGEMAKER, INVOKE COMPREHEND ON *.* TO 'master_username'@'%' WITH GRANT OPTION;</pre>  | 

アップグレードの事前チェックの失敗を起こす問題のトラブルシューティングの詳細については、以下のブログを参照してください。
+ [Amazon Aurora MySQL バージョン 2 (MySQL 5.7 互換) からバージョン 3 (MySQL 8.0 互換) へのアップグレードチェックリスト、パート 1](https://aws.amazon.com/blogs/database/amazon-aurora-mysql-version-2-with-mysql-5-7-compatibility-to-version-3-with-mysql-8-0-compatibility-upgrade-checklist-part-1/)
+ [Amazon Aurora MySQL バージョン 2 (MySQL 5.7 互換) からバージョン 3 (MySQL 8.0 互換) へのアップグレードチェックリスト、パート 2](https://aws.amazon.com/blogs/database/amazon-aurora-mysql-version-2-with-mysql-5-7-compatibility-to-version-3-with-mysql-8-0-compatibility-upgrade-checklist-part-2/)

 以下のステップを使用して、上記の表の一部の条件に対して独自のチェックを実行できます。これにより、データベースがアップグレードを正常かつ迅速に完了できる状態にあることが分かっているときに、アップグレードをスケジュールすることができます。
+  `XA RECOVER` ステートメントを実行することで、開いている XA トランザクションを確認できます。アップグレードのスタート前に、XA トランザクションをコミットまたはロールバックできます。
+  `SHOW PROCESSLIST` ステートメントを実行し、出力で`CREATE`、`DROP`、`ALTER`、`RENAME`、および `TRUNCATE` ステートメントを探して、DDL ステートメントを確認できます。アップグレードのスタート前に、すべての DDL ステートメントを完了させます。
+  `INFORMATION_SCHEMA.INNODB_TRX` テーブルをクエリすることで、コミットされていない行の総数を確認できます。テーブルには、トランザクションごとに 1 つの行が含まれます。`TRX_ROWS_MODIFIED` 列には、トランザクションによって変更または挿入された行の数が含まれます。
+  InnoDB 履歴リストの長さを確認するには、`SHOW ENGINE INNODB STATUS SQL` ステートメントを実行し、出力で `History list length` を探します。次のクエリを実行して、値を直接確認することもできます。

  ```
  SELECT count FROM information_schema.innodb_metrics WHERE name = 'trx_rseg_history_len';
  ```

   履歴リストの長さは、マルチバージョン同時実行制御 (MVCC) の実装のためにデータベースに保存される UNDO 情報の量に対応します。

# Aurora MySQL バージョン 3 のアップグレード後のクリーンアップ
<a name="AuroraMySQL.mysql80-post-upgrade"></a>

Aurora MySQL バージョン 2 クラスターを Aurora MySQL バージョン 3 にアップグレードした後、次のようなその他のクリーンアップアクションを実行できます。
+ カスタム パラメータグループの新しい MySQL 8.0 互換バージョンを作成します。必要なカスタムパラメータ値を新しいパラメータグループに適用します。
+ CloudWatch アラーム、セットアップスクリプトなどを更新して、インクルーシブな言語変更の影響を受けた名前のメトリクスに、新しい名前を使用します。このようなメトリクスの一覧は、[Aurora MySQL バージョン 3 に対する包括的な言語変更](AuroraMySQL.Compare-v2-v3.md#AuroraMySQL.8.0-inclusive-language) をご覧ください。
+ CloudFormation テンプレートをすべて更新して、包括的な言語の変更によって影響を受けるすべてのコンフィギュレーション パラメータの名前を新しくします。そのようなパラメータのリストについては、[Aurora MySQL バージョン 3 に対する包括的な言語変更](AuroraMySQL.Compare-v2-v3.md#AuroraMySQL.8.0-inclusive-language) を参照してください。

## 空間インデックス
<a name="AuroraMySQL.mysql80-spatial"></a>

Aurora MySQL バージョン 3 にアップグレードした後、空間インデックスに関連するオブジェクトおよびインデックスを削除または再作成する必要があるかどうかをチェックします。MySQL 8.0 より前では、Aurora は空間リソース識別子 (SRID) を含まないインデックスを使用して空間クエリを最適化できました。Aurora MySQL バージョン 3 では、SRID を含む空間インデックスのみを使用します。アップグレード中、Aurora は SRID のない空間インデックスを自動的にドロップし、警告メッセージをデータベースログに出力します。このような警告メッセージが表示された場合は、アップグレード後に SRID を使用して新しい空間インデックスを作成します。MySQL 8.0 での空間関数とデータ型の変更の詳細については、[MySQL リファレンスマニュアル](https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html)の「*MySQL 8.0 での変更*」を参照してください。

# Amazon Aurora MySQL に関するデータベースエンジンの更新と修正
<a name="AuroraMySQL.Updates.RN"></a>

「*Amazon Aurora MySQL 互換エディションのリリースノート*」では、以下の情報を参照できます。
+ [Amazon Aurora MySQL バージョン 3 のデータベースエンジンの更新](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html)
+ [Amazon Aurora MySQL バージョン 2 のデータベースエンジンの更新](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.20Updates.html)
+ [Amazon Aurora MySQL バージョン 1 のデータベースエンジンの更新 (非推奨)](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.11Updates.html)
+ [Aurora MySQL データベースエンジンの更新で修正された MySQL のバグ](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.MySQLBugs.html)
+ [Amazon Aurora MySQL で修正されたセキュリティの脆弱性](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.CVE_list.html)