

# Amazon RDS での MariaDB のレプリケーションの使用
<a name="USER_MariaDB.Replication"></a>

リードレプリカは通常、Amazon RDS の DB インスタンス間でレプリケーションを設定するために使用します。リードレプリカの概要については、「[DB インスタンスのリードレプリカの操作](USER_ReadRepl.md)」を参照してください。Amazon RDS for MariaDB でリードレプリカを操作する具体的な方法については、[MariaDB リードレプリカの使用](USER_MariaDB.Replication.ReadReplicas.md) を参照してください。

レプリケーションは、MariaDB DB インスタンスのバイナリログ座標に基づいて設定することもできます。MariaDB インスタンスでは、グローバルトランザクション ID (GTIDs) に基づいてより高度な耐クラッシュ性を提供するレプリケーションを設定できます。詳細については、「[外部ソースインスタンスを使用した GTID ベースのレプリケーションを設定する](MariaDB.Procedural.Replication.GTID.md)」を参照してください。

以下は RDS for MariaDB で使用できる他のレプリケーションオプションです。
+ RDS for MariaDB DB インスタンスと Amazon RDS の外部にある MySQL または MariaDB インスタンスとの間でレプリケーションを設定できます。外部ソースとのレプリケーションの設定については、「[外部のソースインスタンスを使用したバイナリログファイル位置のレプリケーションの設定](MySQL.Procedural.Importing.External.ReplMariaDB.md)」を参照してください。
+ Amazon RDS の外部にある MySQL または MariaDB インスタンスからデータベースをインポートしたり、これらのインスタンスにデータベースをエクスポートしたりするようにレプリケーションを設定できます。詳細については、「[ダウンタイムを短縮して Amazon RDS for MariaDB DB インスタンスにデータをインポートする](mariadb-importing-data-reduced-downtime.md)」および「[レプリケーションを使用した MySQL DB インスタンスからのデータのエクスポート](MySQL.Procedural.Exporting.NonRDSRepl.md)」を参照してください。

これらのどのレプリケーションオプションでも、行ベース、ステートメントベース、または混合レプリケーションが使用できます。行ベースのレプリケーションは、SQL ステートメントの結果として変更された行のみをレプリケートします。ステートメントベースのレプリケーションは、SQL ステートメント全体をレプリケートします。混合レプリケーションは、可能な場合にはステートメントレプリケーションを使用しますが、ステートメントベースのレプリケーションに対して安全でない SQL ステートメントが実行されると、行ベースのレプリケーションに切り替えます。ほとんどの場合には、混合レプリケーションをお勧めします。DB インスタンスのバイナリログ形式は、レプリケーションが行ベース、ステートメントベース、混合のいずれであるかを判断します。バイナリログ形式の設定については、「[MariaDB バイナリログ記録の設定](USER_LogAccess.MariaDB.BinaryFormat.md)」を参照してください。

MariaDB バージョン間のレプリケーションの互換性については、MariaDB ドキュメントの「[レプリケーションの互換性](https://mariadb.com/kb/en/mariadb-vs-mysql-compatibility/#replication-compatibility)」を参照してください。

**Topics**
+ [MariaDB リードレプリカの使用](USER_MariaDB.Replication.ReadReplicas.md)
+ [外部ソースインスタンスを使用した GTID ベースのレプリケーションを設定する](MariaDB.Procedural.Replication.GTID.md)
+ [外部のソースインスタンスを使用したバイナリログファイル位置のレプリケーションの設定](MySQL.Procedural.Importing.External.ReplMariaDB.md)

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

以下では、Amazon RDS for MariaDB でのリードレプリカの使用に関する特定の情報を確認することができます。リードレプリカと使用手順の概要については、「[DB インスタンスのリードレプリカの操作](USER_ReadRepl.md)」を参照してください。
+ [MariaDB を使用したレプリケーションフィルターの設定](USER_MariaDB.Replication.ReadReplicas.ReplicationFilters.md)
+ [MariaDB での遅延レプリケーションの設定](USER_MariaDB.Replication.ReadReplicas.DelayReplication.md)
+ [MariaDB でのリードレプリカの更新](USER_MariaDB.Replication.ReadReplicas.Updates.md)
+ [MariaDB でのマルチ AZ リードレプリカのデプロイの使用](USER_MariaDB.Replication.ReadReplicas.MultiAZ.md)
+ [RDS for MariaDB でのカスケードリードレプリカの使用](USER_MariaDB.Replication.ReadReplicas.Cascading.md)
+ [MariaDB リードレプリカのモニタリング](USER_MariaDB.Replication.ReadReplicas.Monitor.md)
+ [MariaDB リードレプリカでのレプリケーションの開始と停止](USER_MariaDB.Replication.ReadReplicas.StartStop.md)
+ [MariaDB リードレプリカの問題のトラブルシューティング](USER_ReadRepl.Troubleshooting.MariaDB.md)

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

MariaDB DB インスタンスがレプリケーションソースとして機能するには、バックアップ保持期間を 0 以外の値に設定することにより、ソース DB インスタンスで自動バックアップを有効にしてください。この要件は、別のリードレプリカのソース DB インスタンスであるリードレプリカにも適用されます。

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

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

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

# MariaDB を使用したレプリケーションフィルターの設定
<a name="USER_MariaDB.Replication.ReadReplicas.ReplicationFilters"></a>

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

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

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

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

## RDS for MariaDB のレプリケーションフィルターパラメータの設定
<a name="USER_MariaDB.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` パラメータが設定されている場合、このパラメータは評価されません。

パラメータは、記載されている順序に沿って評価されます。これらのパラメータの詳細な仕組みについては、[MariaDB のドキュメント](https://mariadb.com/kb/en/replication-filters/#replication-filters-for-replication-slaves)を参照してください。

デフォルトでは、これらの各パラメータの値は空です。各リードレプリカで、これらのパラメータを使用してレプリケーションフィルターを設定、変更、削除することができます。これらのパラメータの 1 つを設定する場合は、各フィルターを他のフィルターとコンマで区切ります。

`%` および `_` パラメータで `replicate-wild-do-table` および `replicate-wild-ignore-table` ワイルドカードの文字を使用できます。`%` ワイルドカードは任意の文字数と一致し、`_` ワイルドカードは 1 文字のみと一致します。

ソース DB インスタンスのバイナリログ形式は、データ変更のレコードを決定するため、レプリケーションでは重要です。`binlog_format` パラメータの設定により、レプリケーションが行ベースかステートメントベースかが決まります。詳細については、「[MariaDB バイナリログ記録の設定](USER_LogAccess.MariaDB.BinaryFormat.md)」を参照してください。

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

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

RDS for MariaDB のレプリケーションフィルターには、次の制限が適用されます。
+ 各レプリケーションフィルターのパラメータには、2,000 文字といった制限があります。
+ レプリケーションフィルターでは、カンマはサポートされていません。
+ MariaDB `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 MariaDB バージョン 10.2 では、レプリケーションフィルターはサポートされていません。

## RDS for MariaDB のレプリケーションフィルターの例
<a name="USER_MariaDB.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-mariadb)
+ [Including tables in replication](#rep-filter-in-tables-mariadb)
+ [Including tables in replication with wildcard characters](#rep-filter-in-tables-wildcards-mariadb)
+ [Escaping wildcard characters in names](#rep-filter-escape-wildcards-mariadb)
+ [Excluding databases from replication](#rep-filter-ex-dbs-mariadb)
+ [Excluding tables from replication](#rep-filter-ex-tables-mariadb)
+ [Excluding tables from replication using wildcard characters](#rep-filter-ex-tables-wildcards-mariadb)<a name="rep-filter-in-dbs-mariadb"></a>

**Example レプリケーションにデータベースを含める**  
次の例では、レプリケーションに `mydb1` データベースと `mydb2` データベースが含まれています。リードレプリカに対して `replicate-do-db` を設定すると、パラメータで指定されたデータベースだけがレプリケートされます。  
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-mariadb"></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-mariadb"></a>

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

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myparametergroup \
  --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"
```
Windows の場合:  

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myparametergroup ^
  --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"
```<a name="rep-filter-escape-wildcards-mariadb"></a>

**Example 名前のワイルドカード文字のエスケープ**  
次の例は、エスケープ文字 `\` を使用して、名前の一部であるワイルドカードの文字をエスケープする方法を示しています。  
データベース `mydb1` には `my_table` で始まる複数のテーブル名があり、これらのテーブルをレプリケーションに含めることを想定しています。テーブル名には、ワイルドカードの文字でもあるアンダースコアが含まれているため、この例ではテーブル名のアンダースコアをエスケープしています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myparametergroup \
  --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "my\_table%", "ApplyMethod":"immediate"}]"
```
Windows の場合:  

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myparametergroup ^
  --parameters "[{"ParameterName": "replicate-wild-do-table", "ParameterValue": "my\_table%", "ApplyMethod":"immediate"}]"
```<a name="rep-filter-ex-dbs-mariadb"></a>

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

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myparametergroup \
  --parameters "[{"ParameterName": "replicate-ignore-db", "ParameterValue": "mydb1,mydb2", "ApplyMethod":"immediate"}]"
```
Windows の場合:  

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myparametergroup ^
  --parameters "[{"ParameterName": "replicate-ignore-db", "ParameterValue": "mydb1,mydb2", "ApplyMethod":"immediate"}]"
```<a name="rep-filter-ex-tables-mariadb"></a>

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

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myparametergroup \
  --parameters "[{"ParameterName": "replicate-ignore-table", "ParameterValue": "mydb1.table1,mydb1.table2", "ApplyMethod":"immediate"}]"
```
Windows の場合:  

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myparametergroup ^
  --parameters "[{"ParameterName": "replicate-ignore-table", "ParameterValue": "mydb1.table1,mydb1.table2", "ApplyMethod":"immediate"}]"
```<a name="rep-filter-ex-tables-wildcards-mariadb"></a>

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

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myparametergroup \
  --parameters "[{"ParameterName": "replicate-wild-ignore-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"
```
Windows の場合:  

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myparametergroup ^
  --parameters "[{"ParameterName": "replicate-wild-ignore-table", "ParameterValue": "mydb.orders%,mydb.returns%", "ApplyMethod":"immediate"}]"
```

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

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

  手順については、「[Amazon RDS のDB パラメータグループのパラメータ値の表示](USER_WorkingWithParamGroups.Viewing.md)」を参照してください。
+ MariaDB クライアントで、リードレプリカに接続し、`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) を参照してください。
**注記**  
MariaDB の旧バージョンは、`SHOW SLAVE STATUS` ではなく `SHOW REPLICA STATUS` を使用していました。10.5 より前の MariaDB バージョンを使用している場合は、`SHOW SLAVE STATUS` を使用します。

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

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

  レプリケーションを停止するには、[mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) ストアドプロシージャを使用します。
+ 「[リードレプリカをスタンドアロン DB インスタンスに昇格させる](USER_ReadRepl.Promote.md)」の手順を使用してリードレプリカを新しいソースの DB インスタンスに昇格させます。

**注記**  
遅延レプリケーションは MariaDB 10.6 以降でサポートされています。
遅延レプリケーションを設定するには、ストアドプロシージャを使用します。遅延レプリケーションを AWS マネジメントコンソール、AWS CLI、または Amazon RDS API で設定することはできません。
遅延レプリケーションの設定でグローバルなトランザクション識別子 (GTID) に基づくレプリケーションを使用できます。

**Topics**
+ [リードレプリカ作成時の遅延レプリケーションの設定](#USER_MariaDB.Replication.ReadReplicas.DelayReplication.ReplicaCreation)
+ [既存のリードレプリカの遅延レプリケーションの変更](#USER_MariaDB.Replication.ReadReplicas.DelayReplication.ExistingReplica)
+ [リードレプリカの昇格](#USER_MariaDB.Replication.ReadReplicas.DelayReplication.Promote)

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

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

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

1. MariaDB クライアントを使用して、マスターユーザーとしてリードレプリカのソースとなる MariaDB 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_MariaDB.Replication.ReadReplicas.DelayReplication.ExistingReplica"></a>

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

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

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

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_MariaDB.Replication.ReadReplicas.DelayReplication.Promote"></a>

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

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

リードレプリカは読み取りクエリをサポートするように設計されていますが、ときどき更新が必要になることがあります。例えば、インデックスを追加して、レプリカにアクセスする特定のタイプのクエリを高速化する必要が生じることがあります。更新を有効にするには、リードレプリカの DB パラメータグループで `read_only` パラメータを **0** に設定します。

# MariaDB でのマルチ AZ リードレプリカのデプロイの使用
<a name="USER_MariaDB.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 MariaDB でのカスケードリードレプリカの使用
<a name="USER_MariaDB.Replication.ReadReplicas.Cascading"></a>

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

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

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

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

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

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

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

# MariaDB リードレプリカのモニタリング
<a name="USER_MariaDB.Replication.ReadReplicas.Monitor"></a>

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

**注記**  
MariaDB の旧バージョンは、`SHOW SLAVE STATUS` ではなく `SHOW REPLICA STATUS` を使用していました。10.5 より前の MariaDB バージョンを使用している場合は、`SHOW SLAVE STATUS` を使用します。

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

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

# MariaDB リードレプリカでのレプリケーションの開始と停止
<a name="USER_MariaDB.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 MariaDB DB インスタンスにデータをインポートする](mariadb-importing-data-reduced-downtime.md)」および「[レプリケーションを使用した MySQL DB インスタンスからのデータのエクスポート](MySQL.Procedural.Exporting.NonRDSRepl.md)」を参照してください。

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

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

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

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

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

[`Replication Error`] フィールドを参照することで、MariaDB エンジンによりスローされた関連エラーの詳細を確認できます。リードレプリカのステータスを示すイベントが生成されます（[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)」を参照してください。MariaDB エラーメッセージが返された場合、『[MariaDB のエラーメッセージドキュメント](http://mariadb.com/kb/en/mariadb/mariadb-error-codes/)』でエラーを確認してください。

レプリケーションエラーを引き起こす一般的な問題は、リードレプリカの `max_allowed_packet` パラメータの値がソース DB インスタンスの `max_allowed_packet` パラメータより小さいことです。`max_allowed_packet` パラメータは、DB パラメータグループに設定できるカスタムパラメータで、データベースで実行できる DML コードの最大サイズを指定するために使用されます。場合によっては、ソースの DB インスタンスに関連付けらている DB パラメータグループの `max_allowed_packet` パラメータの値が、ソースのリードレプリカに関連付けられている DB パラメータグループの `max_allowed_packet` パラメータの値より小さいことがあります。このような場合、レプリケーションプロセスからエラー (パケットが 'max\$1allowed\$1packet' バイトを超える) がスローされ、レプリケーションが停止することがあります。ソースとリードレプリカで同じ `max_allowed_packet` パラメータ値を持つ DB パラメータグループが使用されるように設定することにより、エラーを修正できます。

レプリケーションエラーを引き起こす可能性があります他の一般的な状況は次のとおりです。
+ リードレプリカのテーブルに書き込んでいる。リードレプリカでインデックスを作成する場合、`read_only` パラメータを **0** に設定してインデックスを作成する必要があります。リードレプリカのテーブルに書き込んだ場合、レプリケーションが中断する可能性があります。
+ MyISAM. などの非トランザクションストレージエンジンを使用している。リードレプリカにはトランザクションストレージエンジンが必要です。レプリケーションは、MariaDB 上の 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`] は *[レプリケーション中]* に変化します。

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

# 外部ソースインスタンスを使用した GTID ベースのレプリケーションを設定する
<a name="MariaDB.Procedural.Replication.GTID"></a>

バージョン 10.0.24 以降の外部 MariaDB インスタンスから RDS for MariaDB DB インスタンスへのグローバルなトランザクション識別子 (GTID) に基づいてレプリケーションを設定できます。Amazon RDS で外部ソースインスタンスとレプリカをセットアップする場合は、次のガイドラインに従ってください。
+ レプリカである RDS for MariaDB の DB インスタンスのフェイルオーバーイベントをモニタリングします。フェイルオーバーが発生すると、レプリカである DB インスタンスが、新しいホスト上に別のネットワークアドレスで再作成されます。フェイルオーバーイベントをモニタリングする方法については、「[Amazon RDS イベント通知の操作](USER_Events.md)」を参照してください。
+ ソースインスタンスのバイナリログ (binlog) は、それらがレプリカに適用されていることを確認するまで保持します。このメンテナンスによって、障害発生時にソースインスタンスを復元できます。
+ Amazon RDS にある MariaDB DB インスタンスの自動バックアップを有効にします。自動バックアップを有効にすると、ソースインスタンスとレプリカを再同期する必要がある場合に、特定の時点にレプリカを復元できます。バックアップとポイントインタイム復元の詳細については、「[データのバックアップ、復元、エクスポート](CHAP_CommonTasks.BackupRestore.md)」を参照してください。

**注記**  
MariaDB DB インスタンスでレプリケーションを開始するために必要なアクセス権限は限定されており、Amazon RDS マスターユーザーは利用できません。このため、Amazon RDS の [mysql.rds\$1set\$1external\$1master\$1gtid](mysql_rds_set_external_master_gtid.md) コマンドと [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) コマンドを使用して、ライブデータベースと RDS for MariaDB データベースとのレプリケーションを設定する必要があります。

外部のソースインスタンスと Amazon RDS 上の MariaDB DB インスタンス間でレプリケーションを開始するには、次の手順に従います。<a name="MariaDB.Procedural.Importing.External.Repl.Procedure"></a>

**レプリケーションを開始するには**

1. ソース MariaDB インスタンスを読み取り専用にします。

   ```
   mysql> FLUSH TABLES WITH READ LOCK;
   mysql> SET GLOBAL read_only = ON;
   ```

1. 外部 MariaDB インスタンスの現在の GTID を取得します。`mysql` または選択したクエリエディタを使用して `SELECT @@gtid_current_pos;` を実行することで、取得できます。

   GTID は、`<domain-id>-<server-id>-<sequence-id>` の形式となります。一般的な GTID は **0-1234510749-1728** のようになります。GTID とコンポーネントパートの詳細については、MariaDB ドキュメントの「[グローバルトランザクション ID](http://mariadb.com/kb/en/mariadb/global-transaction-id/)」を参照してください。

1. `mysqldump` を使用して、外部 MariaDB インスタンスから MariaDB DB インスタンスにデータベースをコピーします。非常に大きなデータベースでは、「[ダウンタイムを短縮して Amazon RDS for MariaDB DB インスタンスにデータをインポートする](mariadb-importing-data-reduced-downtime.md)」の手順を使用することが必要になる場合があります。

   Linux、macOS、Unix の場合:

   ```
   mysqldump \
       --databases database_name \
       --single-transaction \
       --compress \
       --order-by-primary \
       -u local_user \
       -plocal_password | mysql \
           --host=hostname \
           --port=3306 \
           -u RDS_user_name \
           -pRDS_password
   ```

   Windows の場合:

   ```
   mysqldump ^
       --databases database_name ^
       --single-transaction ^
       --compress ^
       --order-by-primary \
       -u local_user \
       -plocal_password | mysql ^
           --host=hostname ^
           --port=3306 ^
           -u RDS_user_name ^
           -pRDS_password
   ```
**注記**  
`-p` オプションと入力するパスワードの間にスペースがないことを確認します。  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

   `--host` コマンドで、`--user (-u)`、`--port`、`-p`、`mysql` オプションを使用して、MariaDB DB インスタンスに接続するためのホスト名、ユーザー名、ポート、パスワードを指定します。ホスト名は MariaDB DB インスタンスのエンドポイントの DNS 名 (例: `myinstance.123456789012.us-east-1.rds.amazonaws.com`) です。エンドポイントの値は、Amazon RDS マネジメントコンソールのインスタンスの詳細で確認できます。

1. もう一度ソース MariaDB インスタンスを書き込み可能にします。

   ```
   mysql> SET GLOBAL read_only = OFF;
   mysql> UNLOCK TABLES;
   ```

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

   以下の条件が満たされると、IP アドレスが変更される場合があります。
   + 外部ソースインスタンスと DB インスタンス間の通信にパブリック IP アドレスを使用している。
   + 外部ソースインスタンスが停止して再起動した。

   これらの条件が満たされている場合は、追加する前に IP アドレスを確認してください。

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

   ```
   host db_instance_endpoint
   ```

   ホスト名は MariaDB DB インスタンスのエンドポイントの DNS 名です。

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

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

1. 外部の MariaDB インスタンスについて、`REPLICATION CLIENT` と `REPLICATION SLAVE` の特権をレプリケーションユーザーに付与します。例えば、すべてのデータベースに対する `REPLICATION CLIENT` および `REPLICATION SLAVE` 権限を "`repl_user`" ユーザーに付与するには、以下のコマンドを実行します。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com';
   ```

1. MariaDB DB インスタンスをレプリカにします。MariaDB DB インスタンスにマスターユーザーとして接続し、[mysql.rds\$1set\$1external\$1master\$1gtid](mysql_rds_set_external_master_gtid.md) コマンドを使用して、外部の MariaDB データベースをレプリケーションソースインスタンスとして指定します。ステップ 2 で決定した GTID を使用します。以下に例を示します。

   ```
   CALL mysql.rds_set_external_master_gtid ('mymasterserver.mydomain.com', 3306, 'repl_user', 'password', 'GTID', 1);
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

1. MariaDB DB インスタンスで、[mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) コマンドを実行してレプリケーションを開始します。

   ```
   CALL mysql.rds_start_replication; 
   ```

# 外部のソースインスタンスを使用したバイナリログファイル位置のレプリケーションの設定
<a name="MySQL.Procedural.Importing.External.ReplMariaDB"></a>

バイナリログファイルのレプリケーションを使用して、RDS for MySQLまたは MariaDB DB インスタンスと Amazon RDS の外部にある MySQL または MariaDB インスタンスとの間でレプリケーションを設定できます。

**Topics**
+ [開始する前に](#MySQL.Procedural.Importing.External.Repl.BeforeYouBegin)
+ [外部のソースインスタンスを使用したバイナリログファイル位置のレプリケーションの設定](#MySQL.Procedural.Importing.External.Repl.Procedure)

## 開始する前に
<a name="MySQL.Procedural.Importing.External.Repl.BeforeYouBegin"></a>

レプリケートされたトランザクションのバイナリログファイルの位置を使用して、レプリケーションを設定できます。

Amazon RDS DB インスタンスでレプリケーションをスタートするために必要なアクセス権限は限定されており、Amazon RDS マスターユーザーは利用できません。そのため、Amazon RDS の [mysql.rds\$1set\$1external\$1master (RDS for MariaDB および RDS for MySQL メジャーバージョン 8.0 以前)](mysql-stored-proc-replicating.md#mysql_rds_set_external_master) または [mysql.rds\$1set\$1external\$1source (RDS for MySQL メジャーバージョン 8.4 以降)](mysql-stored-proc-replicating.md#mysql_rds_set_external_source)、および [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) コマンドを使用して、ライブデータベースと Amazon RDS のデータベースのレプリケーションを設定する必要があります。

MySQL または MariaDB データベースにバイナリログ形式を設定するには、`binlog_format` パラメータを更新します。DB インスタンスがデフォルト DB インスタンスパラメータグループを使用している場合、新しい DB パラメータグループを作成して `binlog_format` パラメータを変更します。MariaDB および MySQL 8.0 以前のバージョンでは、`binlog_format` のデフォルトは `MIXED` です。ただし、特定バイナリログ (binlog) 形式が必要な場合は `binlog_format` を `ROW` または `STATEMENT` に設定する必要もあります。変更を適用するには、DB インスタンスを再起動します。MySQL 8.4 以降のバージョンでは、`binlog_format` のデフォルトは `ROW` です。

`binlog_format` パラメータの設定については、[シングル AZ データベースの RDS for MySQL バイナリログの設定](USER_LogAccess.MySQL.BinaryFormat.md) を参照してください。さまざまな MySQL レプリケーションタイプの詳細については、MySQL ドキュメントの「[ステートメントベースおよび行ベースレプリケーションのメリットとデメリット](https://dev.mysql.com/doc/refman/8.0/en/replication-sbr-rbr.html)」を参照してください。

## 外部のソースインスタンスを使用したバイナリログファイル位置のレプリケーションの設定
<a name="MySQL.Procedural.Importing.External.Repl.Procedure"></a>

Amazon RDS で外部ソースインスタンスとレプリカをセットアップする場合は、次のガイドラインに従ってください。
+ レプリカである Amazon RDS DB インスタンスのフェイルオーバーのイベントをモニタリングします。フェイルオーバーが発生すると、レプリカである DB インスタンスが、新しいホスト上に別のネットワークアドレスで再作成されます。フェイルオーバーイベントをモニタリングする方法については、「[Amazon RDS イベント通知の操作](USER_Events.md)」を参照してください。
+ ソースインスタンスのバイナリログがレプリカに適用されたことを確認するまで、これらのバイナリログを保持します。このメンテナンスによって、障害発生時にソースインスタンスを復元できます。
+ Amazon RDS DB インスタンスにある自動バックアップを有効にします。自動バックアップを有効にすると、ソースインスタンスとレプリカを再同期する必要がある場合に、特定の時点にレプリカを復元できます。バックアップと特定の時点への復元の詳細については、「[データのバックアップ、復元、エクスポート](CHAP_CommonTasks.BackupRestore.md)」を参照してください。

**外部ソースインスタンスを使用してバイナリログファイルのレプリケーションを設定するには**

1. ソース MySQL または MariaDB インスタンスを読み取り専用にします。

   ```
   mysql> FLUSH TABLES WITH READ LOCK;
   mysql> SET GLOBAL read_only = ON;
   ```

1. ソース MySQL または MariaDB インスタンスで `SHOW MASTER STATUS` コマンドを実行して、binlog の場所を特定します。

   次の例のような出力を受け取ります。

   ```
   File                        Position  
   ------------------------------------
    mysql-bin-changelog.000031      107   
   ------------------------------------
   ```

1. `mysqldump` を使用して、外部のインスタンスから Amazon RDS DB インスタンスにデータベースをコピーします。非常に大きなデータベースでは、「[ダウンタイムを短縮して Amazon RDS for MySQL データベースにデータをインポートする](mysql-importing-data-reduced-downtime.md)」の手順を使用することが必要になる場合があります。

   Linux、macOS、Unix の場合:

   ```
   mysqldump --databases database_name \
       --single-transaction \
       --compress \
       --order-by-primary \
       -u local_user \
       -plocal_password | mysql \
           --host=hostname \
           --port=3306 \
           -u RDS_user_name \
           -pRDS_password
   ```

   Windows の場合:

   ```
   mysqldump --databases database_name ^
       --single-transaction ^
       --compress ^
       --order-by-primary ^
       -u local_user ^
       -plocal_password | mysql ^
           --host=hostname ^
           --port=3306 ^
           -u RDS_user_name ^
           -pRDS_password
   ```
**注記**  
`-p` オプションと入力するパスワードの間にスペースがないことを確認します。

   Amazon RDS DB インスタンスに接続するためのホスト名、ユーザー名、ポート、およびパスワードを指定するには、`--host` コマンドで `--user (-u)`、`--port`、`-p` および `mysql` オプションを使用します。ホスト名は、Amazon RDS DB インスタンスのエンドポイントのドメインネームサービス (DNS) 名 (例: `myinstance.123456789012.us-east-1.rds.amazonaws.com`) です。エンドポイントの値は、AWS マネジメントコンソール のインスタンスの詳細で確認できます。

1. もう一度ソース MySQL または MariaDB インスタンスを書き込み可能にします。

   ```
   mysql> SET GLOBAL read_only = OFF;
   mysql> UNLOCK TABLES;
   ```

   レプリケーションで使用するバックアップの作成の詳細については、[MySQL ドキュメント](https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-backups-read-only.html)を参照してください。

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

   以下の条件が満たされると、IP アドレスが変更される場合があります。
   + 外部ソースインスタンスと DB インスタンス間の通信にパブリック IP アドレスを使用している。
   + 外部ソースインスタンスが停止して再起動した。

   これらの条件が満たされている場合は、追加する前に IP アドレスを確認してください。

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

   ```
   host db_instance_endpoint
   ```

   ホスト名は Amazon RDS DB インスタンスのエンドポイントの DNS 名です。

1. 選択したクライアントを使用して、外部のインスタンスに接続し、レプリケーションに使用される ユーザーを作成します。このアカウントをレプリケーション専用に使用し、セキュリティを強化するためドメインに制限します。以下に例を示します。

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

1. 外部の インスタンスについて、`REPLICATION CLIENT` と `REPLICATION SLAVE` の特権をレプリケーションユーザーに付与します。例えば、すべてのデータベースに対する `REPLICATION CLIENT` および `REPLICATION SLAVE` 権限を "`repl_user`" ユーザーに付与するには、以下のコマンドを実行します。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com';
   ```

1. Amazon RDS DB インスタンスをレプリカにします。これを行うには、まず、マスターユーザーとして Amazon RDS の DB インスタンスに接続します。次に、[mysql.rds\$1set\$1external\$1source (RDS for MySQL メジャーバージョン 8.4 以降)](mysql-stored-proc-replicating.md#mysql_rds_set_external_source) または [mysql.rds\$1set\$1external\$1master (RDS for MariaDB および RDS for MySQL メジャーバージョン 8.0 以前)](mysql-stored-proc-replicating.md#mysql_rds_set_external_master) のコマンドを使用して、外部の MySQL または MariaDB データベースをソースインスタンスとして指定します。ステップ 2 で特定したマスターログファイル名とマスターログの場所を使用します。次のコマンドはその例です。

   **MySQL 8.4**

   ```
   CALL mysql.rds_set_external_source ('mysourceserver.mydomain.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 1);
   ```

   **MariaDB と MySQL 8.0 および 5.7**

   ```
   CALL mysql.rds_set_external_master ('mymasterserver.mydomain.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 1);
   ```
**注記**  
RDS for MySQL では、代わりに [mysql.rds\$1set\$1external\$1source\$1with\$1delay (RDS for MySQL メジャーバージョン 8.4 以降)](mysql-stored-proc-replicating.md#mysql_rds_set_external_source_with_delay) または [mysql.rds\$1set\$1external\$1master\$1with\$1delay (RDS for MariaDB および RDS for MySQL メジャーバージョン 8.0 以前)](mysql-stored-proc-replicating.md#mysql_rds_set_external_master_with_delay) のストアドプロシージャを実行することで、遅延レプリケーションを使用するよう選択できます。RDS for MySQL で遅延レプリケーションを使用する 1 つの理由は、[mysql.rds\$1start\$1replication\$1until](mysql-stored-proc-replicating.md#mysql_rds_start_replication_until) ストアドプロシージャで災害対策を有効にするためです。現在、RDS for MariaDB では遅延レプリケーションはサポートされていますが、`mysql.rds_start_replication_until` プロシージャはサポートされていません。

1. Amazon RDS DB インスタンスで、[mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) コマンドを実行してレプリケーションをスタートします。

   ```
   CALL mysql.rds_start_replication;
   ```