

# MySQL リードレプリカの使用
<a name="USER_MySQL.Replication.ReadReplicas"></a>

以下では、 MySQL の RDS でのリードレプリカの操作に関する特定の情報を確認することができます。リードレプリカと使用手順の概要については、「[DB インスタンスのリードレプリカの操作](USER_ReadRepl.md)」を参照してください。

MySQL リードレプリカの詳細については、以下のトピックを参照してください。
+ [MySQL でのレプリケーションフィルターの設定](USER_MySQL.Replication.ReadReplicas.ReplicationFilters.md)
+ [MySQL での遅延レプリケーションの設定](USER_MySQL.Replication.ReadReplicas.DelayReplication.md)
+ [MySQL でのリードレプリカの更新](USER_MySQL.Replication.ReadReplicas.Updates.md)
+ [MySQL でのマルチ AZ リードレプリカのデプロイの使用](USER_MySQL.Replication.ReadReplicas.MultiAZ.md)
+ [RDS for MySQL でのカスケードリードレプリカの使用](USER_MySQL.Replication.ReadReplicas.Cascading.md)
+ [MySQL リードレプリカのレプリケーションラグのモニタリング](USER_MySQL.Replication.ReadReplicas.Monitor.md)
+ [MySQL リードレプリカでのレプリケーションのスタートと停止](USER_MySQL.Replication.ReadReplicas.StartStop.md)
+ [MySQL リードレプリカに関する問題のトラブルシューティング](USER_ReadRepl.Troubleshooting.md)

## MySQL でのリードレプリカの設定
<a name="USER_MySQL.Replication.ReadReplicas.Configuration"></a>

MySQL DB インスタンスがレプリケーションのソースとして機能するには、ソースの DB インスタンスで自動バックアップを有効にする必要があります。これを行うには、バックアップ保持期間の値を 0 以外の値に設定します。この要件は、別のリードレプリカのソース DB インスタンスであるリードレプリカにも適用されます。自動バックアップは、MySQL の任意のバージョンを実行するリードレプリカでサポートされています。レプリケーションは、MySQL DB インスタンスのバイナリログ座標に基づいて設定できます。

次のバージョンで、グローバルなトランザクション識別子 (GTID) を使用したレプリケーションを設定できます。
+ RDS for MySQL バージョン 5.7.44 以上の 5.7 バージョン
+ RDS for MySQL バージョン 8.0.28 以上の 8.0 バージョン
+ RDS for MySQL バージョン 8.4.3 以上の 8.4 バージョン

詳細については、「[GTID ベースレプリケーションを使用する](mysql-replication-gtid.md)」を参照してください。

同一リージョン内の 1 つの DB インスタンスから、最大 15 個のリードレプリカを作成できます。レプリケーションを効率的に実行するには、各リードレプリカにソース DB インスタンスと同程度のコンピューティングリソースとストレージリソースが必要です。ソースの DB インスタンスをスケールした場合は、リードレプリカもスケールする必要があります。

RDS for MySQL では、リードレプリカのカスケードをサポートしています。リードレプリカのカスケードを設定する方法については、「[RDS for MySQL でのカスケードリードレプリカの使用](USER_MySQL.Replication.ReadReplicas.Cascading.md)」を参照してください。

同じソースの DB インスタンスを参照する複数のリードレプリカの作成や削除の操作は同時に実行できます。その操作を実行するには、ソースインスタンスごとに作成できるリードレプリカを 15 個に制限します。

MySQL DB インスタンスのリードレプリカは、ソース DB インスタンスよりも低い DB エンジンバージョンを使用できません。

### MyISAM を使用する MySQL DB インスタンスを準備する
<a name="USER_MySQL.Replication.ReadReplicas.Configuration-MyISAM-Instances"></a>

MySQL DB インスタンスで MyISAM などの非トランザクションエンジンを使用する場合は、以下のステップに従ってリードレプリカを設定する必要があります。このステップは、リードレプリカとデータの整合性を保つために必要です。すべてのテーブルが InnoDB などのトランザクションエンジンを使用している場合には、このステップは必要ありません。

1. ソース DB インスタンスの非トランザクションテーブルのすべてのデータ操作言語 (DML) とデータ定義言語 (DDL) の操作を停止します。SELECT 記述で実行を続けます。

1. ソース DB インスタンスでテーブルをフラッシュおよびロックします。

1. 以下のセクションのいずれかの方法を使用してリードレプリカを作成します。

1. `DescribeDBInstances` API オペレーションなどを使用して、リードレプリカの作成の進捗状況を確認します。リードレプリカが使用可能になったら、ソース DB インスタンスのテーブルのロックを解除し、通常のデータベース操作を再開します。

# MySQL でのレプリケーションフィルターの設定
<a name="USER_MySQL.Replication.ReadReplicas.ReplicationFilters"></a>

レプリケーションフィルターを使用して、リードレプリカでレプリケートするデータベースとテーブルを指定できます。レプリケーションフィルターは、データベースとテーブルをレプリケーションに含めることも、レプリケーションから除外することもできます。

レプリケーションフィルターの使用例は以下のとおりです。
+ リードレプリカのサイズを縮小します。レプリケーションフィルタリングを使用すると、リードレプリカで必要のないデータベースとテーブルを除外できます。
+ セキュリティ上の理由から、データベースとテーブルをリードレプリカから除外するため。
+ 異なるリードレプリカで、特定のユースケースごとにさまざまなデータベースとテーブルを複製するため。例えば、分析やシャーディングに特定のリードレプリカを使用できます。
+ 異なる AWS リージョン にリードレプリカがある DB インスタンスで、異なる AWS リージョン に異なるデータベースまたはテーブルを複製する場合。

**注記**  
また、レプリケーションフィルターを使用して、インバウンドのレプリケーショントポロジでレプリカとして設定されているプライマリ MySQL DB インスタンスでレプリケートするデータベースとテーブルを指定することもできます。この設定の詳細については、「[外部のソースインスタンスを使用したバイナリログファイル位置のレプリケーションの設定](MySQL.Procedural.Importing.External.Repl.md)」を参照してください。

**Topics**
+ [RDS for MySQL のレプリケーションフィルターパラメータの設定](#USER_MySQL.Replication.ReadReplicas.ReplicationFilters.Configuring)
+ [RDS for MySQL のレプリケーションフィルターの制限](#USER_MySQL.Replication.ReadReplicas.ReplicationFilters.Limitations)
+ [RDS for MySQL のレプリケーションフィルターの例](#USER_MySQL.Replication.ReadReplicas.ReplicationFilters.Examples)
+ [リードレプリカのレプリケーションフィルターを表示する](#USER_MySQL.Replication.ReadReplicas.ReplicationFilters.Viewing)

## RDS for MySQL のレプリケーションフィルターパラメータの設定
<a name="USER_MySQL.Replication.ReadReplicas.ReplicationFilters.Configuring"></a>

レプリケーションフィルターを構成するには、リードレプリカに次のレプリケーションフィルターのパラメータを設定します。
+ `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 データベースの RDS for MySQL バイナリログの設定](USER_LogAccess.MySQL.BinaryFormat.md)」を参照してください。

**注記**  
ソース DB インスタンスの `binlog_format` 設定に関係なく、すべてのデータ定義言語 (DDL) ステートメントはステートメントとして複製されます。

## RDS for MySQL のレプリケーションフィルターの制限
<a name="USER_MySQL.Replication.ReadReplicas.ReplicationFilters.Limitations"></a>

RDS for MySQL のレプリケーションフィルターには、次の制限が適用されます。
+ 各レプリケーションフィルターのパラメータには、2,000 文字といった制限があります。
+ レプリケーションフィルターでは、パラメータ値としてカンマはサポートされていません。パラメータのリストでは、カンマは値の区切り文字としてのみ使用できます。例えば、`ParameterValue='`a,b`'`\$1 はサポートされていませんが、`ParameterValue='a,b'` はサポートされています。
+ MySQL `--binlog-do-db` とバイナリログフィルターの `--binlog-ignore-db` オプションはサポートされていません。
+ レプリケーションフィルタリングは、XA トランザクションをサポートしていません。

  詳細については、MySQL ドキュメントの「[Restrictions on XA Transactions](https://dev.mysql.com/doc/refman/8.0/en/xa-restrictions.html)」を参照してください。

## RDS for MySQL のレプリケーションフィルターの例
<a name="USER_MySQL.Replication.ReadReplicas.ReplicationFilters.Examples"></a>

リードレプリカのレプリケーションフィルタリングを構成するには、リードレプリカに関連付けられているパラメータグループのレプリケーションフィルタリングパラメータを変更します。

**注記**  
デフォルトのパラメータグループを変更することはできません。リードレプリカがデフォルトのパラメータグループを使用している場合は、新しいパラメータグループを作成してリードレプリカに関連付けます。DB パラメータグループの詳細については、「[Amazon RDS のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。

AWS マネジメントコンソール、AWS CLI、または RDS API を使用して、パラメータグループのパラメータを設定できます。パラメータの設定の詳細については、「[Amazon RDS の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。パラメータグループにパラメータを設定すると、そのパラメータグループに関連付けられているすべての DB インスタンスでパラメータ設定を使用します。パラメータグループにレプリケーションフィルターのパラメータを設定する場合は、パラメータグループがリードレプリカにのみ関連付けられていることを確認してください。ソース DB インスタンスのレプリケーションフィルターのパラメータは空のままにします。

次の例では、AWS CLI を使用してパラメータを設定します。これらの例では、CLI コマンドが完了した直後にパラメータの変更が行われるように `ApplyMethod` を `immediate` に設定しています。リードレプリカの再起動後に保留中の変更を適用する場合は、`ApplyMethod` を `pending-reboot` に設定します。

以下の例では、レプリケーションフィルターを設定します。
+ [Including databases in replication](#rep-filter-in-dbs-mysql)
+ [Including tables in replication](#rep-filter-in-tables-mysql)
+ [Including tables in replication with wildcard characters](#rep-filter-in-tables-wildcards-mysql)
+ [Excluding databases from replication](#rep-filter-ex-dbs-mysql)
+ [Excluding tables from replication](#rep-filter-ex-tables-mysql)
+ [Excluding tables from replication using wildcard characters](#rep-filter-ex-tables-wildcards-mysql)<a name="rep-filter-in-dbs-mysql"></a>

**Example レプリケーションにデータベースを含める**  
次の例では、レプリケーションに `mydb1` データベースと `mydb2` データベースを含めています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-do-db,ParameterValue='mydb1,mydb2',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-do-db,ParameterValue='mydb1,mydb2',ApplyMethod=immediate"
```<a name="rep-filter-in-tables-mysql"></a>

**Example レプリケーションにテーブルを含める**  
次の例では、データベース `mydb1` の `table1` テーブルと `table2` テーブルをレプリケーションに含めています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-do-table,ParameterValue='mydb1.table1,mydb1.table2',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-do-table,ParameterValue='mydb1.table1,mydb1.table2',ApplyMethod=immediate"
```<a name="rep-filter-in-tables-wildcards-mysql"></a>

**Example ワイルドカードの文字を使用してレプリケーションにテーブルを含める**  
次の例では、データベース `mydb` の `order` および `return` で始まる名前のテーブルをレプリケーションに含めています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-wild-do-table,ParameterValue='mydb.order%,mydb.return%',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-wild-do-table,ParameterValue='mydb.order%,mydb.return%',ApplyMethod=immediate"
```<a name="rep-filter-ex-dbs-mysql"></a>

**Example レプリケーションからデータベースを除外する**  
次の例では、`mydb5` データベースと `mydb6` データベースをレプリケーションから除外しています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-ignore-db,ParameterValue='mydb5,mydb6',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-ignore-db,ParameterValue='mydb5,mydb6',ApplyMethod=immediate"
```<a name="rep-filter-ex-tables-mysql"></a>

**Example レプリケーションからテーブルを除外する**  
次の例では、データベース `mydb5` のテーブル `table1` とデータベース `mydb6` の `table2` をレプリケーションから除外しています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-ignore-table,ParameterValue='mydb5.table1,mydb6.table2',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-ignore-table,ParameterValue='mydb5.table1,mydb6.table2',ApplyMethod=immediate"
```<a name="rep-filter-ex-tables-wildcards-mysql"></a>

**Example ワイルドカードの文字を使用したレプリケーションからテーブルを除外する**  
次の例では、データベース `mydb7` の `order` および `return` で始まる名前のテーブルをレプリケーションから除外しています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myparametergroup \
  --parameters "ParameterName=replicate-wild-ignore-table,ParameterValue='mydb7.order%,mydb7.return%',ApplyMethod=immediate"
```
Windows の場合:  

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myparametergroup ^
  --parameters "ParameterName=replicate-wild-ignore-table,ParameterValue='mydb7.order%,mydb7.return%',ApplyMethod=immediate"
```

## リードレプリカのレプリケーションフィルターを表示する
<a name="USER_MySQL.Replication.ReadReplicas.ReplicationFilters.Viewing"></a>

リードレプリカのレプリケーションフィルターは、次の方法で表示できます。
+ リードレプリカに関連付けられているパラメータグループのレプリケーションフィルタリングパラメータの設定を確認してください。

  手順については、「[Amazon RDS のDB パラメータグループのパラメータ値の表示](USER_WorkingWithParamGroups.Viewing.md)」を参照してください。
+ MySQL クライアントで、リードレプリカに接続し、`SHOW REPLICA STATUS` ステートメントを実行します。

  出力の次のフィールドには、リードレプリカのレプリケーションフィルターが表示されます。
  + `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) を参照してください。

# MySQL での遅延レプリケーションの設定
<a name="USER_MySQL.Replication.ReadReplicas.DelayReplication"></a>

遅延レプリケーションは、災害対策用の戦略として使用できます。遅延レプリケーションでは、ソースからリードレプリカへのレプリケーションを遅延させる最小時間を秒数で指定します。障害発生時 (意図しないテーブルの削除など) には、以下のステップを実行して障害から早急に復旧します。
+ 障害を起こした変更がリードレプリカに送られる前に、リードレプリカへのレプリケーションを停止します。

  レプリケーションを停止するには、[mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) ストアドプロシージャを使用します。
+ レプリケーションをスタートし、レプリケーションがログファイルの場所で自動的に停止するように指定します。

  障害発生の直前の場所を指定するには、[mysql.rds\$1start\$1replication\$1until](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until) ストアドプロシージャを使用します。
+ 「[リードレプリカをスタンドアロン DB インスタンスに昇格させる](USER_ReadRepl.Promote.md)」の手順を使用してリードレプリカを新しい出典の DB インスタンスに昇格させます。

**注記**  
RDS for MySQL 8.4 の場合、遅延レプリケーションは MySQL 8.4.3 以降でサポートされています。RDS for MySQL 8.0 の場合、遅延レプリケーションは MySQL 8.0.28 以降でサポートされています。RDS for MySQL 5.7 の場合、遅延レプリケーションは MySQL 5.7.44 以降でサポートされています。
遅延レプリケーションを設定するには、ストアドプロシージャを使用します。遅延レプリケーションを AWS マネジメントコンソール、AWS CLI、または Amazon RDS API で設定することはできません。
次のバージョンの遅延レプリケーションの設定で、グローバルなトランザクション識別子 (GTID) に基づくレプリケーションを使用できます。  
RDS for MySQL バージョン 5.7.44 以上の 5.7 バージョン
RDS for MySQL バージョン 8.0.28 以上の 8.0 バージョン
RDS for MySQL バージョン 8.4.3 以上の 8.4 バージョン
GTID ベースのレプリケーションを使用する場合は、[mysql.rds\$1start\$1replication\$1until\$1gtid ](mysql-stored-proc-gtid.md#mysql_rds_start_replication_until_gtid) ストアドプロシージャの代わりに、[mysql.rds\$1start\$1replication\$1until](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until) ストアドプロシージャを実行します。GTID ベースのレプリケーションの詳細については、「[GTID ベースレプリケーションを使用する](mysql-replication-gtid.md)」を参照してください。

**Topics**
+ [リードレプリカ作成時の遅延レプリケーションの設定](#USER_MySQL.Replication.ReadReplicas.DelayReplication.ReplicaCreation)
+ [既存のリードレプリカの遅延レプリケーションの変更](#USER_MySQL.Replication.ReadReplicas.DelayReplication.ExistingReplica)
+ [リードレプリカへのレプリケーションを停止する場所の設定](#USER_MySQL.Replication.ReadReplicas.DelayReplication.StartUntil)
+ [リードレプリカの昇格](#USER_MySQL.Replication.ReadReplicas.DelayReplication.Promote)

## リードレプリカ作成時の遅延レプリケーションの設定
<a name="USER_MySQL.Replication.ReadReplicas.DelayReplication.ReplicaCreation"></a>

DB インスタンスから今後作成するリードレプリカの遅延レプリケーションを設定するには、[mysql.rds\$1set\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_set_configuration) パラメータを指定して `target delay` ストアドプロシージャを実行します。

**リードレプリカの作成時に遅延レプリケーションを設定するには**

1. MySQL クライアントを使用し、マスターユーザーとして、リードレプリカのソースとなる MySQL DB インスタンスに接続します。

1. [mysql.rds\$1set\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_set_configuration) パラメータを指定して `target delay` ストアドプロシージャを実行します。

   例えば、現在の DB インスタンスから作成されるリードレプリカへのレプリケーションを少なくとも 1 時間 (3600 秒) 遅延させるように指定するには、次のストアドプロシージャを実行します。

   ```
   call mysql.rds_set_configuration('target delay', 3600);
   ```
**注記**  
このストアドプロシージャを実行すると、AWS CLI または Amazon RDS API を使用して作成したリードレプリカには、指定した秒数で遅延するレプリケーションが設定されます。

## 既存のリードレプリカの遅延レプリケーションの変更
<a name="USER_MySQL.Replication.ReadReplicas.DelayReplication.ExistingReplica"></a>

既存のリードレプリカの遅延レプリケーションを変更するには、[mysql.rds\$1set\$1source\$1delay](mysql-stored-proc-replicating.md#mysql_rds_set_source_delay) ストアドプロシージャを実行します。

**既存のリードレプリカの遅延レプリケーションを変更するには**

1. MySQL クライアントを使用して、マスターユーザーとしてリードレプリカに接続します。

1. レプリケーションを停止するには、[mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) ストアドプロシージャを使用します。

1. [mysql.rds\$1set\$1source\$1delay](mysql-stored-proc-replicating.md#mysql_rds_set_source_delay) ストアドプロシージャを実行します。

   例えば、リードレプリカへのレプリケーションを少なくとも 1 時間 (3600 秒) 遅延させるように指定するには、次のストアドプロシージャを実行します。

   ```
   call mysql.rds_set_source_delay(3600);
   ```

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

## リードレプリカへのレプリケーションを停止する場所の設定
<a name="USER_MySQL.Replication.ReadReplicas.DelayReplication.StartUntil"></a>

リードレプリカへのレプリケーションが停止したら、[mysql.rds\$1start\$1replication\$1until](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until) ストアドプロシージャを使用してレプリケーションをスタートしてバイナリログファイルの指定した位置で停止できます。

**リードレプリカへのレプリケーションをスタートして指定の位置でレプリケーションを停止するには**

1. MySQL クライアントを使用して、マスターユーザーとしてソース MySQL DB インスタンスに接続します。

1. [mysql.rds\$1start\$1replication\$1until](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` が生成されます。

## リードレプリカの昇格
<a name="USER_MySQL.Replication.ReadReplicas.DelayReplication.Promote"></a>

レプリケーションが停止したら、災害対策シナリオでリードレプリカを新しいソース DB インスタンスに昇格させます。リードレプリカの昇格については、「[リードレプリカをスタンドアロン DB インスタンスに昇格させる](USER_ReadRepl.Promote.md)」を参照してください。

# MySQL でのリードレプリカの更新
<a name="USER_MySQL.Replication.ReadReplicas.Updates"></a>

リードレプリカは読み取りクエリをサポートするように設計されていますが、ときどき更新が必要になることがあります。例えば、インデックスを追加して、レプリカにアクセスする特定のタイプのクエリを最適化する必要が生じることがあります。

ただし、リードレプリカの DB パラメータグループで `read_only` パラメータを `0` に設定することにより、更新を有効にすることはできますが、リードレプリカとソースの DB インスタンスの互換性がなくなると問題が発生する可能性があるため、それは推奨できません。メンテナンス作業には、ブルー/グリーンデプロイを使用することをおすすめします。詳細については、「[データベースの更新にブルー/グリーンデプロイを使用する](blue-green-deployments.md)」を参照してください。

リードレプリカで読み取り専用を無効にする場合は、できるだけ早く `read_only` パラメータの値を `1` に戻してください。

# MySQL でのマルチ AZ リードレプリカのデプロイの使用
<a name="USER_MySQL.Replication.ReadReplicas.MultiAZ"></a>

リードレプリカは、シングル AZ DB インスタンス配置からもマルチ AZ DB インスタンス配置からも作成できます。重要なデータの耐久性の高いと可用性を高めるにはマルチ AZ 配置を使用しますが、読み取り専用クエリを処理するためにマルチ AZ セカンダリを使用することはできません。代わりに、トラフィックの多いマルチ AZ DB インスタンスのリードレプリカを作成して、読み取り専用クエリをオフロードできます。マルチ AZ 配置のソースのインスタンスがセカンダリにフェイルオーバーすると、関連付けられているすべてのリードレプリカが (プライマリから) セカンダリをレプリケーションのソースとして使用するように自動的に切り替わります。詳細については、「[Amazon RDS でのマルチ AZ 配置の設定と管理](Concepts.MultiAZ.md)」を参照してください。

リードレプリカは、マルチ AZ DB インスタンスとして作成できます。Amazon RDS では、レプリカのフェイルオーバーをサポートするため、別のアベイラビリティーゾーンにレプリカのスタンバイを作成します。リードレプリカは、ソースのデータベースがマルチ AZ DB インスタンスであるかどうかに関係なく、マルチ AZ DB インスタンスとして作成できます。

# RDS for MySQL でのカスケードリードレプリカの使用
<a name="USER_MySQL.Replication.ReadReplicas.Cascading"></a>

RDS for MySQL では、リードレプリカのカスケードをサポートしています。*カスケードリードレプリカ*により、ソースの RDS for MySQL DB インスタンスにオーバーヘッドを追加せずに読み取りをスケーリングできます。

カスケードリードレプリカを使用すると、RDS for MySQL DB インスタンスは、チェーン内の最初のリードレプリカにデータを送信します。その後、そのリードレプリカは、チェーン内の 2 番目のレプリカにデータを送信し、その動作が順に続いていきます。その結果、チェーン内のすべてのリードレプリカに RDS for MySQL DB インスタンスの更新が送信されますが、ソース DB インスタンスでのオーバーヘッドは発生しません。

ソースの RDS for MySQL DB インスタンスから、チェーン内にリードレプリカを 3 層まで作成できます。例えば、RDS for MySQL DB インスタンス、`mysql-main` があるとします。以下の操作を行うことができます。
+ `mysql-main` で開始し、チェーン内に最初のリードレプリカ、`read-replica-1` を作成します。
+ 次に、`read-replica-1` で、チェーン内に次のリードレプリカ、`read-replica-2` を作成します。
+ 最後に、`read-replica-2` で、チェーン内に 3 番目のリードレプリカ、`read-replica-3` を作成します。

`mysql-main` の層では、この 3 番目のカスケードリードレプリカに続く、別のリードレプリカを作成することはできません。一連の完全なインスタンス (RDS for MySQL のソース DB インスタンスから、この層の最後のカスケードリードレプリカまで) は、最大 4 つの DB インスタンスで構成できます。

リードレプリカのカスケードを設定するには、RDS for MySQL DB インスタンスで自動バックアップを有効にします。リードレプリカで自動バックアップを有効にするには、まずリードレプリカを作成し、次に自動バックアップを有効にするようにリードレプリカを変更します。詳細については、「[リードレプリカの作成](USER_ReadRepl.Create.md)」を参照してください。

他のリードレプリカと同様に、カスケードの一部となっているリードレプリカを昇格できます。リードレプリカのチェーン内でリードレプリカを昇格させると、そのレプリカはチェーンから削除されます。例えば、`mysql-main` DB インスタンスのワークロードの一部を、経理部のみが使用する新しいインスタンスに移動するとします。この例では、3 つのリードレプリカから成るチェーンがあると仮定し、`read-replica-2` を昇格させることにします。チェーンは以下のような影響を受けます。
+ 昇格する `read-replica-2` は、レプリケーションチェーンから削除されます。
  + このリードレプリカは、完全な読み取り/書き込み DB インスタンスになります。
  + 昇格前と同じように、`read-replica-3` へのレプリケーションを継続します。
+ `mysql-main` は、`read-replica-1` へのレプリケーションを継続します。

リードレプリカの昇格についての詳細は、「[リードレプリカをスタンドアロン DB インスタンスに昇格させる](USER_ReadRepl.Promote.md)」を参照してください。

# MySQL リードレプリカのレプリケーションラグのモニタリング
<a name="USER_MySQL.Replication.ReadReplicas.Monitor"></a>

MySQL のリードレプリカでは、Amazon CloudWatch で Amazon RDS の `ReplicaLag` メトリクスを確認することでレプリケーションの遅延をモニタリングできます。`ReplicaLag` メトリクスには、`Seconds_Behind_Master` コマンドの `SHOW REPLICA STATUS` フィールドの値が報告されます。

MySQL のレプリケーション遅延の一般的な原因は以下のとおりです。
+ ネットワークが停止している。
+ リードレプリカとインデックスが異なるテーブルに書き込んでいる。リードレプリカで、`read_only` パラメータが `0` に設定されている場合、リードレプリカとソースの DB インスタンスの互換性がなくなると、レプリケーションが中断する可能性があります。リードレプリカのメンテナンスタスクを実行したら、`read_only` パラメータは `1` に戻すことをお勧めします。
+ MyISAM などの非トランザクションストレージエンジンを使用している。レプリケーションは、MySQL 上の InnoDB ストレージエンジンでのみサポートされます。

`ReplicaLag` メトリックが 0 に達すると、レプリカがソース DB インスタンスに追いついています。`ReplicaLag` メトリクスにより -1 が返された場合、レプリケーションは現在アクティブではありません。`ReplicaLag`​ = -1 は `Seconds_Behind_Master` = `NULL` と同等です。

# MySQL リードレプリカでのレプリケーションのスタートと停止
<a name="USER_MySQL.Replication.ReadReplicas.StartStop"></a>

システムのストアドプロシージャ [mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) および [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) を呼び出すことにより、Amazon RDS DB インスタンスでレプリケーションプロセスを停止して再スタートすることができます。これは、大きいインデックスの作成など、長時間実行されている操作の 2 つの Amazon RDS インスタンス間でレプリケーションするときに実行できます。レプリケーションは、データベースをインポートまたはエクスポートするときに停止してスタートする必要もあります。詳細については、「[ダウンタイムを短縮して Amazon RDS for MySQL データベースにデータをインポートする](mysql-importing-data-reduced-downtime.md)」および「[レプリケーションを使用した MySQL DB インスタンスからのデータのエクスポート](MySQL.Procedural.Exporting.NonRDSRepl.md)」を参照してください。

レプリケーションを手動で停止するかレプリケーションエラーで停止してから連続して 30 日を超えると、Amazon RDS はソースの DB インスタンスとすべてのリードレプリカの間のレプリケーションを終了します。これは、ソース DB インスタンスでの所要ストレージの増大と長期間のフェイルオーバーを防ぐためです。リードレプリカの DB インスタンスは引き続き使用できます。ただし、レプリケーションが終了されるとリードレプリカに必要なバイナリログがソースの DB インスタンスから削除されるため、レプリケーションを再開することはできません。レプリケーションを再度行うには、ソースの DB インスタンスの新しいリードレプリカを作成します。

# MySQL リードレプリカに関する問題のトラブルシューティング
<a name="USER_ReadRepl.Troubleshooting"></a>

MySQL DB インスタンスでは、リードレプリカとソース DB インスタンスの間のレプリケーションエラーやデータの不整合 (またはその両方) がリードレプリカで発生する場合があります。この問題は、リードレプリカまたはソースの DB インスタンスの障害時に、一部のバイナリログ (binlog) イベントまたは InnoDB redo ログがフラッシュされない場合に発生します。その場合、リードレプリカを手動で削除して作成し直します。次のパラメータ値 (`sync_binlog=1`、`innodb_flush_log_at_trx_commit=1`) を設定することで、これが発生する可能性を減らすことができます。これらの設定によりパフォーマンスが低下することがあるため、本稼働環境で変更を実装する前に影響をテストしてください。

**警告**  
ソース DB インスタンスに関連付けられたパラメータグループでは、パラメータ値 `sync_binlog=1` および `innodb_flush_log_at_trx_commit=1` を保持することをお勧めします。これらのパラメータは動的です。これらの設定を使用しない場合、ソース DB インスタンスで再起動する可能性のある操作を実行する前に、これらの値を一時的に設定することをお勧めします。該当する操作には、再起動、フェイルオーバーによる再起動、データベースバージョンのアップグレード、DB インスタンスクラスまたはそのストレージの変更が含まれますが、これらに限定されません。同じ推奨事項が、ソース DB インスタンスの新しいリードレプリカを作成する場合にも適用されます。  
このガイダンスに従わない場合、リードレプリカとソースの DB インスタンス間のレプリケーションエラーやデータの不整合 (またはその両方) がリードレプリカで発生するリスクが高くなります。

MySQL のレプリケーションテクノロジーは非同期です。非同期であるため、ソースの DB インスタンスの `BinLogDiskUsage` やリードレプリカの `ReplicaLag` が増加する場合があります。例えば、ソース DB インスタンスへの大量の書き込みオペレーションは並行して実行できます。一方、リードレプリカへの書き込みオペレーションは単一の I/O スレッドでシリアルで行われるため、ソースのインスタンスとリードレプリカの間で遅延が発生する場合があります。読み取り専用レプリカの詳細については、MySQL ドキュメントの「[レプリケーション実装の詳細](https://dev.mysql.com/doc/refman/8.0/en/replication-implementation-details.html)」を参照してください。

ソースの DB インスタンスに対する更新とそれに続くリードレプリカに対する更新の間の遅延を低減するには、次のいくつかの方法があります。
+ ストレージサイズと DB インスタンスクラスがソース DB インスタンスと同程度となるようにリードレプリカのサイズを決定します。
+ ソース DB インスタンスとリードレプリカにより使用される DB パラメータグループのパラメータ設定に互換性を確保します。詳細と例については、このセクションの後方にある `max_allowed_packet` パラメータの説明を参照してください。

Amazon RDS は、リードレプリカのレプリケーションの状態をモニタリングし、何らかの理由でレプリケーションが停止した場合はリードレプリカのインスタンスの `Replication State` フィールドを `Error` に更新します。これには、リードレプリカで実行された DML クエリがソースの DB インスタンスで行われた更新と競合した場合などがあります。

`Replication Error`フィールドを参照することで、MySQL エンジンによりスローされた関連するエラーの詳細を確認できます。リードレプリカのステータスを示すイベントが生成されます ([RDS-EVENT-0045](USER_Events.Messages.md#RDS-EVENT-0045)、[RDS-EVENT-0046](USER_Events.Messages.md#RDS-EVENT-0046)、[RDS-EVENT-0047](USER_Events.Messages.md#RDS-EVENT-0047) など)。イベントについてとイベントへのサブスクライブの詳細については、「[Amazon RDS イベント通知の操作](USER_Events.md)」を参照してください。MySQL のエラーメッセージが返された場合は、[MySQL のエラーメッセージのドキュメント](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html)でエラー番号を確認してください。

レプリケーションエラーを引き起こす一般的な問題は、リードレプリカの `max_allowed_packet` パラメータの値がソース DB インスタンスの `max_allowed_packet` パラメータより小さいことです。`max_allowed_packet` パラメータは、DB パラメータグループで設定できるカスタムパラメータです。`max_allowed_packet` は、データベースで実行できる DML コードの最大サイズを指定するために使用します。場合によっては、リードレプリカに関連付けらている DB パラメータグループの `max_allowed_packet` の値が、ソース DB インスタンスに関連付けられている DB パラメータグループの `max_allowed_packet` の値より小さいことがあります。このような場合、レプリケーションプロセスは `Packet bigger than 'max_allowed_packet' bytes` エラーをスローし、レプリケーションを停止する可能性があります。このエラーを修正するには、ソース DB インスタンスとリードレプリカの DB パラメータグループで `max_allowed_packet` パラメータに同じ値を使用します。

レプリケーションエラーを引き起こす可能性があります他の一般的な状況は次のとおりです。
+ リードレプリカのテーブルに書き込んでいる。場合によっては、リードレプリカにソースの DB インスタンスのインデックスとは異なるインデックスを作成することがあります。その場合は、`read_only` パラメータを `0` に設定してインデックスを作成してください。リードレプリカのテーブルに書き込む場合、リードレプリカとソースの DB インスタンスの互換性がなくなると、レプリケーションが中断する可能性があります。リードレプリカのメンテナンスタスクを実行したら、`read_only` パラメータは `1` に戻すことをお勧めします。
+  MyISAM などの非トランザクションストレージエンジンを使用している。リードレプリカにはトランザクションストレージエンジンが必要です。レプリケーションは、MySQL 上の InnoDB ストレージエンジンでのみサポートされます。
+  `SYSDATE()` など、安全でない非決定的クエリを使用している。詳細については、「[バイナリロギングでの安全および安全でないステートメントの判断](https://dev.mysql.com/doc/refman/8.0/en/replication-rbr-safe-unsafe.html)」を参照してください。

エラーを安全にスキップできると判断した場合、「[RDS for MySQL の現在のレプリケーションエラーのスキップ](Appendix.MySQL.CommonDBATasks.SkipError.md)」セクションで説明されているステップに従うことができます。そうでない場合は、まずリードレプリカを削除します。その上で、同じ DB インスタンス識別子を使用してインスタンスを作成することで、エンドポイントを前のリードレプリカと同じままにすることができます。レプリケーションエラーが解決すると、[`Replication State`] は *[レプリケーション中]* に変化します。