

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon RDS 中使用 MySQL 複寫
<a name="USER_MySQL.Replication"></a>

您通常會使用僅供讀取複本來設定 Amazon RDS 資料庫執行個體間的複寫。如需僅供讀取複本的一般資訊，請參閱 [使用資料庫執行個體僅供讀取複本](USER_ReadRepl.md)。如需在 Amazon RDS for MySQL 上使用僅供讀取複本的特定資訊，請參閱[使用 MySQL 僅供讀取複本](USER_MySQL.Replication.ReadReplicas.md)。

對於使用 RDS for MySQL 的複寫，您可以使用全域交易識別碼 (GTID)。如需詳細資訊，請參閱 [使用 GTID 式複寫](mysql-replication-gtid.md)。

您也可以在 RDS for MySQL 資料庫執行個體及 Amazon RDS 外部的 MariaDB 或 MySQL 執行個體之間，設定複寫。如需使用外部來源設定複寫的詳細資訊，請參閱 [使用外部來源執行個體設定二進位日誌檔案位置複寫](MySQL.Procedural.Importing.External.Repl.md)。

對於以上任何複寫選項，您可以使用基於列的複寫、基於陳述式或混合式複寫。基於列的複寫只會複寫 SQL 陳述式所變更的列。基於陳述式的複寫會複寫整個 SQL 陳述式。混合式複寫會盡可能使用基於陳述式的複寫，但是當基於陳述式的複寫有不安全的 SQL 陳述式執行時，則會切換到基於列的複寫。在大多數情況下，建議使用混合式複寫。資料庫執行個體的二進位日誌格式決定複寫是基於列、基於陳述式或混合式。如需有關設定二進位日誌格式的資訊，請參閱[為單一可用區資料庫設定 RDS for MySQL 二進位記錄](USER_LogAccess.MySQL.BinaryFormat.md)。

**注意**  
您可將複寫作業設定為從 Amazon RDS 外部的 MariaDB 或 MySQL 執行個體匯入資料庫，或者設定為將資料庫匯出至這類執行個體。如需詳細資訊，請參閱[以較短的停機時間將資料匯入至 Amazon RDS for MySQL 資料庫](mysql-importing-data-reduced-downtime.md)及[使用複寫從 MySQL 資料庫執行個體匯出資料](MySQL.Procedural.Exporting.NonRDSRepl.md)。

從快照還原資料庫執行個體或執行時間點復原後，您可以在 RDS 主控台檢視來源資料庫中上次復原的 binlog 位置。在**日誌與事件**底下，輸入 **binlog**。binlog 位置會出現在**系統備註**底下。

**Topics**
+ [使用 MySQL 僅供讀取複本](USER_MySQL.Replication.ReadReplicas.md)
+ [使用 GTID 式複寫](mysql-replication-gtid.md)
+ [使用外部來源執行個體設定二進位日誌檔案位置複寫](MySQL.Procedural.Importing.External.Repl.md)
+ [為 Amazon RDS for MySQL 設定多來源複寫](mysql-multi-source-replication.md)

# 使用 MySQL 僅供讀取複本
<a name="USER_MySQL.Replication.ReadReplicas"></a>

接下來，您可以找到在 RDS for MySQL 上使用僅供讀取複本的特定資訊。如需僅供讀取複本的一般資訊及使用說明，請參閱 [使用資料庫執行個體僅供讀取複本](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 處理多可用區域僅供讀取複本的部署](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 資料庫執行個體可做為複製來源之前，請務必在來源資料庫執行個體上啟用自動備份。若要這麼做，請將備份保留期設定為 0 以外的值。若僅供讀取複本能讓其他僅供讀取複本做為來源資料庫執行個體，則亦適用此要求。執行 MySQL 任一版本的僅供讀取複本皆支援自動備份。您可以根據二進位日誌座標來設定複寫作業，以供 MySQL 資料庫執行個體使用。

您可以在下列版本上使用全域交易識別符 (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)。

您可以從相同區域內的一個資料庫執行個體建立至多 15 個僅供讀取複本。若希望複寫作業順利運作，每個僅供讀取複本具備的運算和儲存資源數量應與來源資料庫執行個體相同。若您擴展來源資料庫執行個體，也要擴展僅供讀取複本。

RDS for MySQL 支援階層式僅供讀取複本。若要了解如何設定階層式僅供讀取複本，請參閱 [搭配 RDS for MySQL 使用階層式僅供讀取複本](USER_MySQL.Replication.ReadReplicas.Cascading.md)。

您可以同時執行多個僅供讀取複本建立，並刪除參考相同來源資料庫執行個體的動作。執行這些動作時，請將每個來源執行個體的僅供讀取複本數目限制在 15 個之內。

MySQL 資料庫執行個體的僅供讀取複本不能使用低於其來源資料庫執行個體的資料庫引擎版本。

### 準備使用 MyISAM 的 MySQL 資料庫執行個體
<a name="USER_MySQL.Replication.ReadReplicas.Configuration-MyISAM-Instances"></a>

如果 MySQL 資料庫執行個體採用 MyISAM 等非交易儲存引擎，便需要執行下列步驟，藉以成功設定僅供讀取複本。請務必遵循以下步驟，才能確保僅供讀取複本的資料複本一致。然而，如果所有資料表均採用 InnoDB 等交易儲存引擎，就不需要進行這些步驟。

1. 在來源資料庫執行個體的非交易資料表上，停止所有資料處理語言 (DML) 和資料定義語言 (DDL) 操作，接著等候停止作業完成。SELECT 陳述式可以繼續執行。

1. 清空並鎖定來源資料庫執行個體中的資料表。

1. 使用以下各節的其中一種方法來建立僅供讀取複本。

1. 透過 `DescribeDBInstances` API 操作等方式，檢查僅供讀取複本的建立進度。僅供讀取複本可供使用時，請解除鎖定來源資料庫執行個體的資料表，並恢復資料庫正常操作。

# 使用 MySQL 設定複寫篩選條件
<a name="USER_MySQL.Replication.ReadReplicas.ReplicationFilters"></a>

您可以使用複寫篩選條件來指定要與僅供讀取複本一起複寫的資料庫和資料表。複寫篩選條件可以包含複寫中的資料庫和資料表，或將其排除在複寫之外。

下列是複寫篩選條件的一些應用案例：
+ 要縮小僅供讀取複本的大小。使用複寫篩選，您可以排除僅供讀取複本不需要的資料庫和資料表。
+ 基於安全考量，要將資料庫和資料表從僅供讀取複本中排除。
+ 為不同僅供讀取複本的特定應用案例複寫不同的資料庫和資料表。例如，您可以使用特定僅供讀取複本進行分析或分區。
+ 對於在不同的 中具有僅供讀取複本的資料庫執行個體 AWS 區域， 會在不同的 中複寫不同的資料庫或資料表 AWS 區域。

**注意**  
您也可以使用複寫篩選條件來指定要與主要 MySQL 資料庫執行個體 (設定為輸入複寫拓撲中的複寫) 一起複寫的資料庫和資料表。如需此組態的詳細資訊，請參閱「[使用外部來源執行個體設定二進位日誌檔案位置複寫](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 文件：
+ 如需一般資訊，請參閱[複本伺服器選項和變數](https://dev.mysql.com/doc/refman/8.0/en/replication-options-replica.html)。
+ 如需有關如何評估資料庫複寫篩選參數的資訊，請參閱[評估資料庫層級複寫和二進位日誌記錄選項](https://dev.mysql.com/doc/refman/8.0/en/replication-rules-db-options.html)。
+ 如需如何評估資料表複寫篩選參數的詳細資訊，請參閱[評估資料表層級複寫選項](https://dev.mysql.com/doc/refman/8.0/en/replication-rules-table-options.html)。

根據預設，這些參數中的每個參數都有一個空值。在每個僅供讀取複本上，您可以使用這些參數來設定、變更和刪除複寫篩選條件。當您設定其中一個參數時，請使用逗號將每個篩選條件與其他篩選條件分隔。

您可以在 `%` 和 `_` 參數中使用 `replicate-wild-do-table` 和 `replicate-wild-ignore-table` 萬用字元。`%` 萬用字元等同於任意數目的字元，而 `_` 萬用字元只會等同於一個字元。

來源資料庫執行個體的二進位記錄格式對複寫非常重要，因為它會決定資料變更的記錄。`binlog_format` 參數的設定會決定複寫是以資料列為基礎還是以陳述式為基礎。如需詳細資訊，請參閱 [為單一可用區資料庫設定 RDS for MySQL 二進位記錄](USER_LogAccess.MySQL.BinaryFormat.md)。

**注意**  
無論來源資料庫執行個體上的 `binlog_format` 設定為何，所有資料定義語言 (DDL) 陳述式都會複寫為陳述式。

## RDS for MySQL 的複寫篩選限制
<a name="USER_MySQL.Replication.ReadReplicas.ReplicationFilters.Limitations"></a>

下列限制適用於 RDS for MySQL 的複寫篩選：
+ 每個複寫篩選參數都有 2,000 個字元的限制。
+ 參數值的複寫篩選條件中不支援逗號。在參數清單中，逗號只能做為值分隔符號。例如，不支援 `ParameterValue='`a,b`'`，但支援 `ParameterValue='a,b'`。
+ 不支援用於二進位日誌篩選的 MySQL `--binlog-do-db` 和 `--binlog-ignore-db` 選項。
+ 複寫篩選不支援 XA 交易。

  如需詳細資訊，請參閱 MySQL 文件中的 [XA 交易的限制](https://dev.mysql.com/doc/refman/8.0/en/xa-restrictions.html)。

## RDS for MySQL 的複寫篩選範例
<a name="USER_MySQL.Replication.ReadReplicas.ReplicationFilters.Examples"></a>

若要設定僅供讀取複本的複寫篩選，請修改與僅供讀取複本關聯之參數群組中的複寫篩選參數。

**注意**  
您無法修改預設參數群組。如果僅供讀取複本使用預設參數群組，請建立新的參數群組，並將它與僅供讀取複本建立關聯。如需資料庫參數群組的詳細資訊，請參閱[Amazon RDS 的參數群組](USER_WorkingWithParamGroups.md)。

您可以使用 AWS 管理主控台 AWS CLI或 RDS API 在參數群組中設定參數。如需有關設定參數的詳細資訊，請參閱 [修改 Amazon RDS 中的資料庫參數群組中的參數](USER_WorkingWithParamGroups.Modifying.md)。當您在參數群組中設定參數時，與參數群組關聯的所有資料庫執行個體都會使用參數設定。如果您在參數群組中設定複寫篩選參數，請確定參數群組僅與僅供讀取複本相關聯。將來源資料庫執行個體的複寫篩選參數保留空白。

下列範例會使用 AWS CLI設定參數。這些範例將 `ApplyMethod` 設定為 `immediate`，以便在 CLI 命令完成後立即發生參數變更。如果您想要在僅供讀取複本重新啟動後套用擱置變更，請將設定 `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 在複寫中包含資料表**  
下列範例包含複寫資料庫 `table1` 中的 `table2` 和 `mydb1` 資料表。  
針對 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 使用萬用字元在複寫中包含資料表**  
下列範例包含複寫時在資料庫 `order` 中名稱開頭為 `return` 和 `mydb` 的資料表。  
針對 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 使用萬用字元從複寫中排除資料表**  
下列範例會從複寫中排除資料庫 `order` 中名稱開頭為 `return` 和 `mydb7` 的資料表。  
針對 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 中檢視資料庫參數群組的參數值](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 文件中的[檢查複寫狀態](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) 預存程式，藉此在發生損毀前指定日誌檔案位置。
+ 若要將僅供讀取複本提升為新的來源資料庫執行個體，請參照[提升僅供讀取複本為獨立的資料庫執行個體](USER_ReadRepl.Promote.md)中的指示。

**注意**  
在 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>

若要為任何未來從資料庫執行個體建立的僅供讀取複本設定延遲複寫，請利用 [mysql.rds\$1set\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_set_configuration) 參數來執行 `target delay` 預存程序。

**在僅供讀取複本建立期間設定延遲複寫**

1. 透過 MySQL 用戶端，以主要使用者的身分連接至 MySQL 資料庫執行個體，該執行個體將成為僅供讀取複本的來源。

1. 利用 [mysql.rds\$1set\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_set_configuration) 參數來執行 `target delay` 預存程序。

   例如，您可以執行下列預存程序，藉此設定複寫至少會延遲一小時 (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) 預存程序。

   例如，您可以執行下列預存程序，藉此設定複寫至少會延遲一小時 (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 資料庫執行個體。

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>

使用災難復原功能時，您可以參照中的指示，在複寫作業停止後將僅供讀取複本提升為新的來源資料庫執行個體。如需提升僅供讀取複本的相關資訊，請參閱 [提升僅供讀取複本為獨立的資料庫執行個體](USER_ReadRepl.Promote.md)。

# 使用 MySQL 更新僅供讀取複本
<a name="USER_MySQL.Replication.ReadReplicas.Updates"></a>

僅供讀取複本專門用來支援讀取查詢，但建議您不定期進行更新。例如，您可能需要新增索引，將特定查詢類型存取複本的速度最佳化。

雖然您可以透過在資料庫參數群組中，針對讀取複本將 `read_only` 參數設為 `0` 來啟用更新，但我們建議您不要這樣做，因為這樣可能會在讀取複本與來源資料庫執行個體不相容的情況下造成問題。對於維護操作，建議您使用藍/綠部署。如需詳細資訊，請參閱[使用藍/綠部署進行資料庫更新](blue-green-deployments.md)。

如果您停用僅供讀取複本的唯讀功能，請盡快將 `read_only` 參數的值恢復為 `1`。

# 使用 MySQL 處理多可用區域僅供讀取複本的部署
<a name="USER_MySQL.Replication.ReadReplicas.MultiAZ"></a>

您可以從單一可用區域或多可用區域的資料庫執行個體部署建立僅供讀取複本。您可使用異地同步備份部署來改善重要資料的耐用性和可用性，但無法使用異地同步備份部署來處理僅供讀取的查詢。反之，您可從高流量的多可用區域資料庫執行個體建立僅供讀取複本，藉此卸載僅供讀取的查詢。若異地同步備份部署的來源執行個體容錯移轉為次要，任何相關聯的僅供讀取複本會自動將複寫作業來源切換成次要 (現為主要)。如需詳細資訊，請參閱 [設定及管理 Amazon RDS 的多可用區域部署](Concepts.MultiAZ.md)。

您可以建立僅供讀取複本並用作多可用區域資料庫執行個體。Amazon RDS 會在另一個可用區域中建立您的複本的待命複本，以獲得該複本的容錯移轉支援。建立您的僅供讀取複本做為多可用區域資料庫執行個體，與來源資料庫是否為多可用區域資料庫執行個體無關。

# 搭配 RDS for MySQL 使用階層式僅供讀取複本
<a name="USER_MySQL.Replication.ReadReplicas.Cascading"></a>

RDS for MySQL 支援階層式僅供讀取複本。利用*階層式僅供讀取複本*，您可以擴展讀取，無須增加來源 RDS for MySQL 資料庫執行個體的額外負荷。

利用階層式僅供讀取複本，您的 RDS for MySQL 資料庫執行個體會將資料傳送至鏈結中的第一個僅供讀取複本。之後，該僅供讀取複本會將資料傳送至鏈結中的第二個複本，依此類推。最終結果是鏈結中的所有僅供讀取複本皆具有來自 RDS for MySQL 資料庫執行個體的變更，但並無僅在來源資料庫執行個體上的額外負荷。

您可從來源 RDS for MySQL 資料庫執行個體的鏈結中建立一系列最多三個僅供讀取複本。例如，假設您有一個 RDS for MySQL 資料庫執行個體 `mysql-main`。您可以執行下列作業：
+ 從 `mysql-main` 開始，建立鏈結中的第一個僅供讀取複本 `read-replica-1`。
+ 接下來，從 `read-replica-1`，建立鏈結中的下一個僅供讀取複本 `read-replica-2`。
+ 最後，從 `read-replica-2`，建立鏈結中的第三個僅供讀取複本 `read-replica-3`。

除了 `mysql-main` 系列中的第三個階層式僅供讀取複本之外，您無法建立另一個僅供讀取複本。從 RDS for MySQL 來源資料庫執行個體至一系列階層式僅供讀取複本尾端的完整執行個體系列最多可包含四個資料庫執行個體。

若要使階層式僅供讀取複本可以運作，每個來源 RDS for MySQL 資料庫執行個體都必須開啟自動備份。若要在僅供讀取複本上開啟自動備份，首先建立該僅供讀取複本，然後修改該複本來開啟自動備份。如需詳細資訊，請參閱 [建立僅供讀取複本](USER_ReadRepl.Create.md)。

與任何僅供讀取複本一樣，您可提升作為階層式一部分的僅供讀取複本。從僅供讀取複本鏈結中提升僅供讀取複本將會從鏈結中移除該僅供讀取複本。例如，假設您想要將部分工作負載從 `mysql-main` 資料庫執行個體移至新的執行個體，僅供會計部門使用。假設範例中的三個僅供讀取複本鏈結，您決定提升 `read-replica-2`。該鏈或受到下列影響：
+ 提升 `read-replica-2` 會將其從複寫鏈結中移除。
  + 其現在是一個完整的讀取/寫入資料庫執行個體。
  + 這會持續複寫至 `read-replica-3`，就像在提升之前所做的一樣。
+ 您的 `mysql-main` 會持續複寫至 `read-replica-1`。

如需提升僅供讀取複本的相關詳細資訊，請參閱 [提升僅供讀取複本為獨立的資料庫執行個體](USER_ReadRepl.Promote.md)。

# 監控 MySQL 僅供讀取複本的複寫延遲
<a name="USER_MySQL.Replication.ReadReplicas.Monitor"></a>

若為 MySQL 僅供讀取複本，則可以檢視 Amazon RDS `ReplicaLag` 指標，進而監控 Amazon CloudWatch 中的複寫延遲。`ReplicaLag` 指標會回報 `Seconds_Behind_Master` 命令的 `SHOW REPLICA STATUS` 欄位值。

MySQL 複寫延遲的常見原因如下：
+ 網路停機。
+ 在僅供讀取複本上寫入的資料表有不同索引。僅供讀取複本上的 `read_only` 參數設為 `0` 時，若僅供讀取複本與來源資料庫執行個體變得不相容，則複寫可能會中斷。在僅供讀取複本上執行維護作業後，建議您將 `read_only` 參數設回 `1`。
+ 使用非交易儲存引擎 (例如 MyISAM)。複寫功能僅支援 MySQL 上的 InnoDB 儲存引擎。

當 `ReplicaLag` 指標到達 0，複本即已跟上來源資料庫執行個體。如果 `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 資料庫執行個體的複寫程序。針對長時間操作 (如建立大型索引) 在兩個 Amazon RDS 執行個體間進行複寫時，即可採取此操作。匯入或匯出資料庫時，也必須停止並啟動複寫作業。如需詳細資訊，請參閱[以較短的停機時間將資料匯入至 Amazon RDS for MySQL 資料庫](mysql-importing-data-reduced-downtime.md)及[使用複寫從 MySQL 資料庫執行個體匯出資料](MySQL.Procedural.Exporting.NonRDSRepl.md)。

若複寫作業停止連續超過 30 天 (不論手動停止或由於複寫錯誤)，Amazon RDS 會終止來源資料庫執行個體和所有僅供讀取複本間的複寫作業。這樣做的原因在於，避免來源資料庫執行個體的儲存需求增加以及長期容錯移轉。僅供讀取複本資料庫執行個體仍可供使用。然而，無法恢復複寫作業，因為在複寫作業終止後，僅供讀取複本所需的二進位日誌已從來源資料庫執行個體刪除。您可建立新的僅供讀取複本供來源資料庫執行個體使用，以重新建立複寫作業。

# 對 MySQL 僅供讀取複本問題進行故障診斷
<a name="USER_ReadRepl.Troubleshooting"></a>

使用 MySQL DB 時，僅供讀取複本偶爾會出現複寫錯誤，或僅供讀取複本和來源資料庫執行個體間出現資料不一致的情況 (或兩者同時發生)。若您在僅供讀取複本或來源資料庫執行個體失敗的期間，沒有清空部分二進位日誌 (binlog) 事件或 InnoDB 重做日誌，就會出現上述問題。在這種情況下，手動刪除並重新建立僅供讀取複本。如果要降低此情況發生的機率，則可設定以下參數值：`sync_binlog=1` 和 `innodb_flush_log_at_trx_commit=1`。但這些設定可能會降低效能，所以請先測試這些設定所帶來的影響，再於生產環境中實作變更內容。

**警告**  
在與來源資料庫執行個體相關聯的參數群組中，建議保留以下參數值：`sync_binlog=1` 和 `innodb_flush_log_at_trx_commit=1`。這些參數是動態參數。如果您不想使用這些設定，建議在對來源資料庫執行個體執行任何可能導致重新啟動的操作之前，暫時設定這些值。這些操作包括但不限於重新啟動、透過容錯移轉重新啟動、升級資料庫版本，以及變更資料庫執行個體類或其儲存體。這些建議同樣適用於為來源資料庫執行個體建立新的僅供讀取複本時。  
若未遵循此指南的說明操作，會增加僅供讀取複本出現複寫錯誤，或僅供讀取複本和來源資料庫執行個體間出現資料不一致的情況 (或兩者同時發生) 的風險。

MySQL 採用非同步複寫技術，因此，來源資料庫執行個體的 `BinLogDiskUsage` 和僅供讀取複本上的 `ReplicaLag` 預料會偶爾增加。例如，來源資料庫執行個體可同時出現大量寫入操作。相對而言，僅供讀取複本的寫入操作則使用單一輸入/輸出執行緒序列化，這可能導致來源執行個體和僅供讀取複本之間的延遲。如需唯讀複本的詳細資訊，請參閱 MySQL 文件中的[複寫實作詳細資訊](https://dev.mysql.com/doc/refman/8.0/en/replication-implementation-details.html)。

您可執行下列動作，減少來源資料庫執行個體的更新與僅供讀取複本的後續更新間的延遲：
+ 將僅供讀取複本的儲存體大小和資料庫執行個體類別大小，設定為等同於來源資料庫執行個體。
+ 確保來源資料庫執行個體和僅供讀取複本所使用之資料庫參數群組中的參數設定相容。如需詳細資訊和範例，請參閱本節稍後討論的 `max_allowed_packet` 參數。

Amazon RDS 會監控複寫您的僅供讀取複本的狀態，並在複寫因任何原因停止時，將僅供讀取複本執行個體上的 `Replication State` (複寫狀態) 欄位更新為 `Error` (錯誤)。一個可能的範例為，僅供讀取複本上執行的 DML 查詢，與來源資料庫執行個體的更新相衝突。

您可以檢視 `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` 參數值小於來源資料庫執行個體的 `max_allowed_packet` 參數值，因而導致複寫錯誤。`max_allowed_packet` 參數是您可以在資料庫參數群組中設定的自訂參數。您可以使用 `max_allowed_packet` 以指定可以在資料庫上執行的 DML 程式碼的大小上限。在部分案例中，與僅供讀取複本建立關聯之資料庫參數群組中的 `max_allowed_packet` 值，會小於與來源資料庫執行個體建立關聯之資料庫參數群組中的 `max_allowed_packet` 值。在這些情況下，複寫程序可能會擲回錯誤 `Packet bigger than 'max_allowed_packet' bytes` 並停止複寫。若要修正錯誤，可讓來源資料庫執行個體和僅供讀取複本使用具有相同 `max_allowed_packet` 參數值的資料庫參數群組。

可能造成複寫錯誤的其他常見情況包括下列：
+ 寫入僅供讀取複本上的資料表。在某些情況下，您可能會在僅供讀取複本上建立與來源資料庫執行個體索引不同的索引。如果您這樣做，請將 `read_only` 參數設定為 `0` 以建立索引。當寫入僅供讀取複本上的資料表時，若僅供讀取複本與來源資料庫執行個體變得不相容，則複寫可能會中斷。在僅供讀取複本上執行維護作業後，建議您將 `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)中所述的步驟。否則，您可以先刪除僅供讀取複本。您可以使用的相同資料庫執行個體識別符建立執行個體，使得端點可與您的舊僅供讀取複本端點保持相同。如果複寫錯誤已修復，`Replication State` (複寫狀態) 會變更為 *replicating (複寫中)*。

# 使用 GTID 式複寫
<a name="mysql-replication-gtid"></a>

接下來，您可以了解如何在 Amazon RDS for MySQL 資料庫執行個體間 搭配使用全域交易識別符 (GTID) 與二進位日誌 (binlog) 複寫。

如果您是使用 binlog 複寫，且不熟悉如何在 MySQL 使用 GTID 式複寫，則可參閱 MySQL 文件中的[使用全域交易識別符的複寫](https://dev.mysql.com/doc/refman/5.7/en/replication-gtids.html)。

下列版本支援 GTID 式複寫：
+ 所有 RDS for MySQL 8.4 版本
+ 所有 RDS for MySQL 8.0 版本
+ 所有 RDS for MySQL 5.7 版本

複寫組態中的所有 MySQL 資料庫執行個體都必須符合此版本要求。

**Topics**
+ [全域交易識別碼 (GTID) 的概觀](#mysql-replication-gtid.overview)
+ [GTID 式複寫的參數](#mysql-replication-gtid.parameters)
+ [為 RDS for MySQL 的新僅供讀取複本啟用 GTID 式複寫](mysql-replication-gtid.configuring-new-read-replicas.md)
+ [為 RDS for MySQL 的現有僅供讀取複本啟用 GTID 式複寫](mysql-replication-gtid.configuring-existing-read-replicas.md)
+ [為具備僅供讀取複本的 MySQL 資料庫執行個體停用 GTID 式複寫](mysql-replication-gtid.disabling.md)

## 全域交易識別碼 (GTID) 的概觀
<a name="mysql-replication-gtid.overview"></a>

「全域交易識別符 (GTID)」**是系統為遞交的 MySQL 交易所產生的唯一識別符。GTID 能讓 binlog 複寫的操作更簡單，也更容易進行故障診斷。

進行 binlog 複寫作業時，MySQL 會使用兩種不同類型的交易：
+ GTID 交易** – 透過 GTID 識別的交易。
+ 匿名交易** – 未指派 GTID 的交易。

在複寫組態中，全部的資料庫執行個體都有各自不同的 GTID。GTID 可簡化複寫組態，因為使用時不需要參照日誌檔案位置。GTID 也使得追蹤複寫的交易更容易，而且可決定來源執行個體和複本是否一致。

您可使用 GTID 式複寫來複寫 RDS for MySQL 僅供讀取複本的資料。您可在建立新的僅供讀取複本時設定 GTID 式複寫，也可轉換現有的僅供讀取複本以使用 GTID 式複寫。

如果是 RDS for MySQL，您也可以在延遲的複寫組態中使用 GTID 式複寫。如需詳細資訊，請參閱 [透過 MySQL 設定延遲複寫](USER_MySQL.Replication.ReadReplicas.DelayReplication.md)。

## GTID 式複寫的參數
<a name="mysql-replication-gtid.parameters"></a>

使用以下參數來設定 GTID 式複寫。


| 參數 | 有效值 | 描述 | 
| --- | --- | --- | 
|  `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 式複寫時，您可以使用下列設定來配置資料庫執行個體或僅供讀取複本的參數群組：
+ `ON` 和 `ON_PERMISSIVE` 僅適用於從 RDS 資料庫執行個體的傳出複寫作業。這兩個值都會導致 RDS 資料庫執行個體使用 GTID 以供複寫的交易使用。`ON` 要求目標資料庫也使用 GTID 式複寫。`ON_PERMISSIVE` 使 GTID 式複寫可在目標資料庫上選用。
+ 若設定 `OFF_PERMISSIVE`，表示 RDS 資料庫執行個體可接受來源資料庫的傳入複寫作業。無論來源資料庫是否使用 GTID 式複寫，皆可進行。
+ 若設定 `OFF`，表示唯有來源資料庫未使用 GTID 式複寫的情況下，RDS 資料庫執行個體才能接受來自該資料庫的傳入複寫作業。

如需參數群組的詳細資訊，請參閱[Amazon RDS 的參數群組](USER_WorkingWithParamGroups.md)。

# 為 RDS for MySQL 的新僅供讀取複本啟用 GTID 式複寫
<a name="mysql-replication-gtid.configuring-new-read-replicas"></a>

當 RDS for MySQL 資料庫執行個體的 GTID 式複寫處於啟用狀態時，系統會自動為資料庫執行個體的僅供讀取複本設定 GTID 式複寫。

**為新的僅供讀取複本啟用 GTID 式複寫**

1. 確定與資料庫執行個體有關的參數群組有下列參數設定：
   + `gtid_mode` – `ON` 或 `ON_PERMISSIVE`
   + `enforce_gtid_consistency` – `ON`

   如需使用參數群組設定組態參數的詳細資訊，請參閱[Amazon RDS 的參數群組](USER_WorkingWithParamGroups.md)。

1. 如果已變更資料庫執行個體的參數群組，請重新啟動資料庫執行個體。如需如何進行的詳細資訊，請參閱 [在資料庫執行個體](USER_RebootInstance.md)。

1.  建立資料庫執行個體的一個或多個僅供讀取複本。如需如何進行的詳細資訊，請參閱 [建立僅供讀取複本](USER_ReadRepl.Create.md)。

Amazon RDS嘗試使用 `MASTER_AUTO_POSITION`，在 MySQL 資料庫執行個體與僅供讀取複本之間建立 GTID 式複寫。如果嘗試失敗，Amazon RDS 會使用日誌檔案位置進行僅供讀取複本的複寫。如需 `MASTER_AUTO_POSITION` 的詳細資訊，請參閱 [GTID 自動定位功能](https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-auto-positioning.html)。

# 為 RDS for MySQL 的現有僅供讀取複本啟用 GTID 式複寫
<a name="mysql-replication-gtid.configuring-existing-read-replicas"></a>

如果現有的 MySQL 資料庫執行個體具備僅供讀取複本，且並未使用 GTID 式複寫，則您可設定資料庫執行個體和僅供讀取複本間的 GTID 式複寫。

**為現有的僅供讀取複本啟用 GTID 式複寫**

1. 如果資料庫執行個體或任何僅供讀取複本正在使用低於 8.0.26 版的 RDS for MySQL 8.0 版，請將資料庫執行個體或僅供讀取複本升級為 8.0.26 版或更新的 MySQL 8.0 版本。所有 RDS for MySQL 8.4 版和 5.7 版都支援 GTID 式複寫。

   如需詳細資訊，請參閱[RDS for MySQL 資料庫引擎的升級](USER_UpgradeDBInstance.MySQL.md)。

1. (選用) 重設 GTID 參數，並測試資料庫執行個體和僅供讀取複本的行為：

   1. 確定與資料庫執行個體和每個僅供讀取複本相關聯的參數群組有設定為 `enforce_gtid_consistency` 的 `WARN` 參數。

      如需使用參數群組設定組態參數的詳細資訊，請參閱[Amazon RDS 的參數群組](USER_WorkingWithParamGroups.md)。

   1. 如果已變更資料庫執行個體的參數群組，請重新啟動資料庫執行個體。如果已變更僅供讀取複本的參數群組，請重新啟動僅供讀取複本。

      如需詳細資訊，請參閱 [在資料庫執行個體](USER_RebootInstance.md)。

   1. 對於一般的工作負載執行資料庫執行個體和僅供讀取複本，並監視日誌檔案。

      如果您看見 GTID 不相容交易的警告，請調整應用程式，以便僅使用 GTID 相容功能。確定資料庫執行個體未產生與 GTID 不相容交易的任何警告，再進行下一個步驟。

1. 對於允許匿名交易的 GTID 式複寫重設 GTID 參數，直到僅供讀取複本處理全部的參數為止。

   1. 確定與資料庫執行個體有關的參數群組和每個僅供讀取複本有下列參數設定：
      + `gtid_mode` – `ON_PERMISSIVE`
      + `enforce_gtid_consistency` – `ON`

   1. 如果已變更資料庫執行個體的參數群組，請重新啟動資料庫執行個體。如果已變更僅供讀取複本的參數群組，請重新啟動僅供讀取複本。

1. 等候全部的匿名交易完成複寫。若要檢查這些是否已複寫，請執行下列動作：

   1. 對於來源資料庫執行個體執行下列陳述式。

      **MySQL 8.4**

      ```
      SHOW BINARY LOG STATUS;
      ```

      **MySQL 5.7 和 8.0**

      ```
      SHOW MASTER STATUS;
      ```

      請注意 `File` 和 `Position` 欄中的值。

   1. 對於每個僅供讀取複本，在上一個步驟中使用來源執行個體的檔案和位置資訊來執行下列查詢。

      ```
      SELECT MASTER_POS_WAIT('file', position);
      ```

      例如，如果檔案名稱是 `mysql-bin-changelog.000031`，而且位置是 `107`，則執行下列陳述式。

      ```
      SELECT MASTER_POS_WAIT('mysql-bin-changelog.000031', 107);
      ```

      如果僅供讀取複本已超過指定的位置，會立即傳回查詢。否則，該函式會等候一段時間。所有僅供讀取複本的查詢傳回時，繼續進行下一個步驟。

1. 僅重設 GTID 式複寫的 GTID 參數。

   1. 確定與資料庫執行個體有關的參數群組和每個僅供讀取複本有下列參數設定：
      + `gtid_mode` – `ON`
      + `enforce_gtid_consistency` – `ON`

   1. 重新啟動資料庫執行個體和每個僅供讀取複本。

1. 在每個僅供讀取複本上，執行下列程序。

   **MySQL 8.4 和更新的主要版本**

   ```
   CALL mysql.rds_set_source_auto_position(1);
   ```

   **MySQL 8.0 和更低的主要版本**

   ```
   CALL mysql.rds_set_master_auto_position(1);
   ```

# 為具備僅供讀取複本的 MySQL 資料庫執行個體停用 GTID 式複寫
<a name="mysql-replication-gtid.disabling"></a>

您可以為 具備僅供讀取複本的 MySQL 資料庫執行個體停用 GTID 式複寫。

**為 具備僅供讀取複本的 MySQL 資料庫執行個體停用 GTID 式複寫**

1. 在每個僅供讀取複本，執行下列程序：

   **MySQL 8.4 和更新的主要版本**

   ```
   CALL mysql.rds_set_source_auto_position(0);
   ```

   **MySQL 8.0 和更低的主要版本**

   ```
   CALL mysql.rds_set_master_auto_position(0);
   ```

1. 將 `gtid_mode` 重設為 `ON_PERMISSIVE`。

   1. 確定與 MySQL 資料庫執行個體和每個僅供讀取複本關聯的參數群組將 `gtid_mode` 設定為 `ON_PERMISSIVE`。

      如需使用參數群組設定組態參數的詳細資訊，請參閱[Amazon RDS 的參數群組](USER_WorkingWithParamGroups.md)。

   1. 重新啟動 MySQL 資料庫執行個體和每個僅供讀取複本。如需重新啟動的詳細資訊，請參閱[在資料庫執行個體](USER_RebootInstance.md)。

1. 將 `gtid_mode` 重設為 `OFF_PERMISSIVE`。

   1. 確定與 MySQL 資料庫執行個體和每個僅供讀取複本關聯的參數群組將 `gtid_mode` 設定為 `OFF_PERMISSIVE`。

   1. 重新啟動 MySQL 資料庫執行個體和每個僅供讀取複本。

1. 等待系統將全部的 GTID 交易套用至所有僅供讀取複本。若要檢查這些設定是否已套用，請執行下列步驟：

   1. 在 MySQL 資料庫執行個體執行下列命令：

      **MySQL 8.4**

      ```
      SHOW BINARY LOG STATUS
      ```

      **MySQL 5.7 和 8.0**

      ```
      SHOW MASTER STATUS
      ```

      輸出內容應會與下列輸入類似。

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

      請注意輸出中的檔案和位置。

   1. 對於每個僅供讀取複本，在上一步中使用來源執行個體的檔案和位置資訊來執行下列查詢：

      **MySQL 8.4 和 MySQL 8.0.26 及更新的 MySQL 8.0 版本**

      ```
      SELECT SOURCE_POS_WAIT('file', position);
      ```

      **MySQL 5.7**

      ```
      SELECT MASTER_POS_WAIT('file', position);
      ```

      例如，如果檔案名稱是 `mysql-bin-changelog.000031`，而且位置是 `107`，則執行下列陳述式：

      **MySQL 8.4 和 MySQL 8.0.26 及更新的 MySQL 8.0 版本**

      ```
      SELECT SOURCE_POS_WAIT('mysql-bin-changelog.000031', 107);
      ```

      **MySQL 5.7**

      ```
      SELECT MASTER_POS_WAIT('mysql-bin-changelog.000031', 107);
      ```

1. 重設 GTID 參數，以停用 GTID 式複寫。

   1. 確定與 MySQL 資料庫執行個體有關的參數群組和每個僅供讀取複本有下列參數設定：
      + `gtid_mode` – `OFF`
      + `enforce_gtid_consistency` – `OFF`

   1. 重新啟動 MySQL 資料庫執行個體和每個僅供讀取複本。

# 使用外部來源執行個體設定二進位日誌檔案位置複寫
<a name="MySQL.Procedural.Importing.External.Repl"></a>

您可使用二進位日誌檔案複寫，在 RDS for MySQL 或 MariaDB 資料庫執行個體，以及位於 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 資料庫執行個體上啟動複寫功能所需的許可有其限制，不供 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` 參數。如果資料庫執行個體使用預設的資料庫執行個體參數群組，請建立新的資料庫參數群組以修改 `binlog_format` 參數。在 MariaDB 和 MySQL 8.0 和較低版本中，`binlog_format` 預設為 `MIXED`。不過，如果需要特定的二進位日誌 (binlog) 格式，也可以將 `binlog_format` 設定為 `ROW` 或 `STATEMENT`。重新啟動資料庫執行個體，讓變更生效。在 MySQL 8.4 和更高版本中，`binlog_format` 預設為 `ROW`。

如需有關設定 `binlog_format` 參數的資訊，請參閱[為單一可用區資料庫設定 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 資料庫執行個體 (您的複本) 的容錯移轉事件。若發生容錯移轉，資料庫執行個體 (您的複本) 可能會以不同的網路地址，在新主機上重新建立。如需如何監控容錯移轉事件的資訊，請參閱[使用 Amazon RDS 事件通知](USER_Events.md)。
+ 直到您已驗證二進位日誌已套用至複本前，都要將二進位日誌保存在來源執行個體上。如此一來，發生故障時，這種維護可確保您能夠還原來源執行個體。
+ 開啟 Amazon RDS 資料庫執行個體的自動備份功能。如果您需要重新同步來源執行個體與複本，開啟自動備份功能可確保您能夠將複本還原至特定時間點。如需備份和 point-in-time 恢復的相關資訊，請參閱 [備份、還原和匯出資料](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` 命令，以確定二進位日誌的位置。

   您會獲得類似下列範例的輸出。

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

1. 使用 `mysqldump`，從外部執行個體將資料庫複製到 Amazon RDS 資料庫執行個體。如果是非常大型的資料庫，您可能需要使用 [以較短的停機時間將資料匯入至 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 資料庫執行個體的主機名稱、使用者名稱、連接埠和密碼，請使用 `--host` 命令中的 `--user (-u)`、`--port`、`-p` 和 `mysql` 選項。主機名稱是 Amazon RDS 資料庫執行個體端點的網域名稱服務 (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 資料庫執行個體的虛擬私有雲端 (VPC) 安全群組。如需有關修改 VPC 安全群組的詳細資訊，請參閱《Amazon Virtual Private Cloud 使用者指南》**中的 [VPC 安全群組](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。

   IP 地址會在滿足下列條件時變更：
   + 您使用公有 IP 地址供外部來源執行個體和資料庫執行個體通訊。
   + 外部來源執行個體停止後又重新啟動。

   如果符合這些條件，請先驗證 IP 地址再新增它。

   您可能還需要設定本機網路，以允許從 Amazon RDS 資料庫執行個體的 IP 地址建立連線。如此，您的本機網路就能與外部 MySQL 或 MariaDB 執行個體進行通訊。若要尋找 Amazon RDS 資料庫執行個體的 IP 地址，請使用 `host` 命令。

   ```
   host db_instance_endpoint
   ```

   主機名稱是 Amazon RDS 資料庫執行個體端點的 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 資料庫執行個體設為複本。若要執行此操作，請先以主要使用者身分連線至 Amazon RDS 資料庫執行個體。使用 [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 上，使用延遲複寫的原因之一，是為了透過 [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 資料庫執行個體上發出 [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) 命令，啟動複寫作業。

   ```
   CALL mysql.rds_start_replication;
   ```

# 為 Amazon RDS for MySQL 設定多來源複寫
<a name="mysql-multi-source-replication"></a>

透過多來源複寫，您可以將 Amazon RDS for MySQL 資料庫執行個體設定為從多個 RDS for MySQL 來源資料庫執行個體接收二進位日誌事件的複本。執行下列引擎版本的 RDS for MySQL 資料庫執行個體支援多來源複寫：
+ 所有 MySQL 8.4 版
+ 8.0.35 和更高的次要版本
+ 5.7.44 及更高次要版本

如需 MySQL 多來源複寫的相關資訊，請參閱 MySQL 文件中的 [MySQL 多來源複寫](https://dev.mysql.com/doc/refman/8.0/en/replication-multi-source.html)。MySQL 文件包含此功能的詳細資訊，而本主題說明如何在 RDS for MySQL 資料庫執行個體上設定和管理多來源複寫通道。

## 多來源複寫的使用案例
<a name="mysql-multi-source-replication-benefits"></a>

以下是在 RDS for MySQL 上使用多來源複寫的適當案例：
+ 需要將個別資料庫執行個體上的多個碎片合併或結合為單一碎片的應用程式。
+ 需要從合併自多個來源的資料產生報告的應用程式。
+ 為分佈於多個 RDS for MySQL 資料庫執行個體之間的資料建立合併長期備份的需求。

## 多來源複寫的先決條件
<a name="mysql-multi-source-replication-prerequisites"></a>

設定多來源複寫之前，必須符合下列先決條件。
+ 確定每個來源 RDS for MySQL 資料庫執行個體都已啟用自動備份。啟用自動備份時，會啟用二進位記錄。若要了解如何啟用自動備份，請參閱 [啟用自動備份](USER_WorkingWithAutomatedBackups.Enabling.md)。
+ 為了避免複寫錯誤，建議您封鎖對來源資料庫執行個體的寫入操作。您可以在連接至 RDS for MySQL 來源資料庫執行個體的自訂參數群組中，將 `read-only` 參數設定為 `ON`。您可以使用 AWS 管理主控台 或 AWS CLI 建立新的自訂參數群組，或修改現有的參數群組。如需詳細資訊，請參閱[在 Amazon RDS 中建立資料庫參數群組](USER_WorkingWithParamGroups.Creating.md)及[修改 Amazon RDS 中的資料庫參數群組中的參數](USER_WorkingWithParamGroups.Modifying.md)。
+ 對於每個來源資料庫執行個體，將執行個體的 IP 位址新增至多來源資料庫執行個體的 Amazon Virtual Private Cloud (VPC) 安全群組。若要識別來源資料庫執行個體的 IP 位址，您可以執行命令 `dig RDS Endpoint`。在與目的地多來源資料庫執行個體相同的 VPC 中，從 Amazon EC2 執行個體執行 命令。
+ 對於每個來源資料庫執行個體，使用用戶端連線至資料庫執行個體，並建立具有複寫所需權限的資料庫使用者，如下列範例所示。

  ```
  CREATE USER 'repl_user' IDENTIFIED BY 'password';
  GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user';
  ```
**注意**  
從 MySQL 8.4 開始，`REPLICATION SLAVE` 權限已棄用，並取代為 `REPLICATION REPLICA`。對於 MySQL 8.4 和更新版本，請改用下列語法：  

  ```
  CREATE USER 'repl_user' IDENTIFIED BY 'password';
  GRANT REPLICATION CLIENT, REPLICATION REPLICA ON *.* TO 'repl_user';
  ```

## 在 RDS for MySQL 資料庫執行個體上設定多來源複寫通道
<a name="mysql-multi-source-replication-configuring-channels"></a>

設定多來源複寫通道與設定單一來源複寫相似。對於多來源複寫，您必須先在來源執行個體上開啟二進位記錄。然後，將資料從來源匯入至多來源複本。然後，您可以使用二進位日誌座標或使用 GTID 自動定位，從每個來源啟動複寫。

若要將 RDS for MySQL 資料庫執行個體設定為兩個或更多 RDS for MySQL 資料庫執行個體的多來源複本，請執行下列步驟。

**Topics**
+ [步驟 1：將資料從來源資料庫執行個體匯入至多來源複本](#mysql-multi-source-replication-import)
+ [步驟 2：開始從來源資料庫執行個體複寫到多來源複本](#mysql-multi-source-replication-setting-up-start-replication-other)

### 步驟 1：將資料從來源資料庫執行個體匯入至多來源複本
<a name="mysql-multi-source-replication-import"></a>

在每個來源資料庫執行個體上執行下列步驟。

將資料從來源匯入至多來源複本之前，請先執行 `SHOW MASTER STATUS` 命令以確認目前的二進位日誌檔案和位置。請記下這些詳細資訊，以供後續步驟使用。在此範例輸出中，檔案為 `mysql-bin-changelog.000031`，位置為 `107`。

**注意**  
從 MySQL 8.4 開始，`SHOW MASTER STATUS` 命令已棄用，並取代為 `SHOW BINARY LOG STATUS`。對於 MySQL 8.4 和更新版本，請改用 `SHOW BINARY LOG STATUS`。

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

現在，使用 `mysqldump` 將資料庫從來源資料庫執行個體複製到多來源複本，如下列範例所示。

```
mysqldump --databases database_name \
 --single-transaction \
 --compress \
 --order-by-primary \
 -u RDS_user_name \
 -p RDS_password \
 --host=RDS Endpoint | mysql \
 --host=RDS Endpoint \
 --port=3306 \
 -u RDS_user_name \
-p RDS_password
```

複製資料庫之後，您可以在來源資料庫執行個體上將唯讀參數設定為 `OFF`。

### 步驟 2：開始從來源資料庫執行個體複寫到多來源複本
<a name="mysql-multi-source-replication-setting-up-start-replication-other"></a>

對於每個來源資料庫執行個體，使用管理使用者憑證連線至執行個體，並執行以下兩個預存程序。這些預存程序會在通道上設定複寫，並啟動複寫。此範例使用上一個步驟中範例輸出的 binlog 檔案名稱和位置。

```
CALL mysql.rds_set_external_source_for_channel('mysourcehost.example.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 1, 'channel_1');
CALL mysql.rds_start_replication_for_channel('channel_1');
```

如需有關使用這些預存程序與其他程序來設定和管理複寫通道的詳細資訊，請參閱 [管理多來源複寫](mysql-stored-proc-multi-source-replication.md)。

## 對多來源複寫使用篩選條件
<a name="mysql-multi-source-replication-filters"></a>

您可以使用複寫篩選條件，指定要以多來源複本複寫的資料庫和資料表。複寫篩選條件可以包含複寫中的資料庫和資料表，或將其排除在複寫之外。如需複寫群組的詳細資訊，請參閱 [使用 MySQL 設定複寫篩選條件](USER_MySQL.Replication.ReadReplicas.ReplicationFilters.md)。

透過多來源複寫，您可以全域設定複寫篩選條件，或是在通道層級設定。通道層級篩選僅適用於執行 8.0 版或 8.4 版的支援資料庫執行個體。下列範例說明如何全域設定篩選條件，或是在通道層級設定。

請注意下列有關於在多來源複寫中篩選的需求和行為：
+ 通道名稱兩側必須要有反引號 (``)。
+ 如果您變更了參數群組中的複寫篩選條件，則具有更新的所有通道都會重新啟動多來源複本的 `sql_thread`，以動態套用變更。如果更新涉及全域篩選條件，則所有處於執行中狀態的複寫通道都會重新啟動。
+ 所有全域篩選條件都會在任何通道特定篩選條件之前套用。
+ 如果全域套用篩選條件，並且在通道層級套用，則只會套用通道層級篩選條件。例如，如果篩選條件是 `replicate_ignore_db="db1,`channel_22`:db2"`，則設定為 `db1` 的 `replicate_ignore_db` 會套用至 `channel_22` 以外的所有通道，且只有 `channel_22` 會忽略來自 `db2` 的變更。

範例 1：設定全域篩選條件

在下列範例中，`temp_data` 資料庫會排除在每個通道的複寫外。

針對 Linux、macOS 或 Unix：

```
aws rds modify-db-parameter-group \
--db-parameter-group-name myparametergroup \
--parameters "ParameterName=replicate-ignore-db,ParameterValue='temp_data',ApplyMethod=immediate"
```

範例 2：設定通道層級篩選條件

在下列範例中，來自 `sample22` 資料庫的變更只會包含在通道 `channel_22` 中。同樣地，來自 `sample99` 資料庫的變更只會包含在通道 `channel_99` 中。

針對 Linux、macOS 或 Unix：

```
aws rds modify-db-parameter-group \
--db-parameter-group-name myparametergroup \
--parameters "ParameterName=replicate-do-db,ParameterValue='\`channel_22\`:sample22,\`channel_99\`:sample99',ApplyMethod=immediate"
```

## 監控多來源複寫通道
<a name="mysql-multi-source-replication-monitoring"></a>

您可以使用下列方法監控多來源複本中的個別通道：
+ 若要監控所有通道或特定通道的狀態，請連線至多來源複本，並執行 `SHOW REPLICA STATUS` 或 `SHOW REPLICA STATUS FOR CHANNEL 'channel_name'` 命令。如需詳細資訊，請參閱 MySQL 文件中的[檢查複寫狀態](https://dev.mysql.com/doc/refman/8.0/en/replication-administration-status.html)。
+ 若要在複寫通道啟動、停止或移除時接收通知，請使用 RDS 事件通知。如需詳細資訊，請參閱[使用 Amazon RDS 事件通知](USER_Events.md)。
+ 若要監控特定通道的延遲，請檢查其 `ReplicationChannelLag` 指標。在此指標中，具有 60 秒 (1 分鐘) 期間的資料點可供使用 15 天。若要尋找通道的複寫通道延遲，請使用執行個體識別符和複寫通道名稱。若要在延遲超過特定閾值時接收通知，您可以設定 CloudWatch 警示。如需詳細資訊，請參閱[使用 Amazon CloudWatch 監控 Amazon RDS 指標](monitoring-cloudwatch.md)。

## 多來源複寫的考量和最佳實務
<a name="mysql-multi-source-replication-considerations"></a>

在 RDS for MySQL 上使用多來源複寫之前，請檢閱下列考量事項和最佳實務：
+ 確定設定為多來源複本的資料庫執行個體有足夠的資源 (例如輸送量、記憶體、CPU 和 IOPS) 可處理來自多個來源執行個體的工作負載。
+ 定期監控多來源複本上的資源使用率，並調整儲存體或執行個體組態，以順利處理工作負載且不會造成資源負擔。
+ 您可以在多來源複本上設定多執行緒複寫，方法是將系統變數 `replica_parallel_workers` 設定為大於 `0` 的值。在此情況下，配置給每個通道的執行緒數目就是此變數的值，加上一個用來管理套用者執行緒的協調器執行緒。
+ 適當設定複寫篩選條件以避免衝突。若要將整個資料庫複寫到複本上的另一個資料庫，您可以使用 `--replicate-rewrite-db` 選項。例如，您可以將資料庫 A 中的所有資料表複寫到複本執行個體上的資料庫 B。當所有來源執行個體使用相同的結構描述命名慣例時，此方法會很有幫助。如需 `--replicate-rewrite-db` 選項的相關資訊，請參閱 MySQL 文件中的[複寫伺服器選項和變數](https://dev.mysql.com/doc/refman/8.0/en/replication-options-replica.html)。
+ 若要避免發生複寫錯誤，請避免寫入複本。建議您在多來源複本上啟用 `read_only` 參數，以封鎖寫入操作。這樣做有助於消除因寫入操作衝突而導致的複寫問題。
+ 若要提高讀取操作 (例如，在多來源複本上執行的排序和高負載聯結) 的效能，請考慮使用 RDS Optimized Reads。此功能有助於處理相依於大型暫存資料表或排序檔案的查詢。如需詳細資訊，請參閱[使用 Amazon RDS Optimized Reads 改善 RDS for MySQL 的查詢效能](rds-optimized-reads.md)。
+ 若要將複寫延遲降至最低，並改善多來源複本的效能，請考慮啟用最佳化寫入。如需詳細資訊，請參閱[使用 RDS Optimized Writes 改善 MySQL 的寫入效能](rds-optimized-writes.md)。
+ 一次在一個通道上執行管理操作 (例如變更組態)，並避免從多個連線對多個通道執行變更。這類做法可能會導致複寫操作發生衝突。例如，從多個連線同時執行 `rds_skip_repl_error_for_channel` 和 `rds_start_replication_for_channel` 程序，可能會導致在非預期的通道上略過事件。
+ 您可以在多來源複寫執行個體上啟用備份，並將資料從該執行個體匯出至 Amazon S3 儲存貯體，以長期存放資料。不過，也請務必在個別來源執行個體上設定具有適當保留的備份。如需將快照資料匯出至 Amazon S3 的詳細資訊，請參閱 [為 Amazon RDS 將資料庫快照資料匯出至 Amazon S3](USER_ExportSnapshot.md)。
+ 若要將讀取工作負載分佈在多來源複本上，您可以從多來源複本建立僅供讀取複本。您可以 AWS 區域 根據您應用程式的需求，在不同的 中尋找這些僅供讀取複本。如需僅供讀取複本的詳細資訊，請參閱 [使用 MySQL 僅供讀取複本](USER_MySQL.Replication.ReadReplicas.md)。

## RDS for MySQL 上的多來源複寫限制
<a name="mysql-multi-source-replication-limitations"></a>

下列限制適用於 RDS for MySQL 的多來源複寫：
+ 目前，RDS for MySQL 支援為多來源複本設定最多 15 個通道。
+ 僅供讀取複本執行個體無法設定為多來源複本。
+ 若要在執行引擎 5.7 版的 RDS for MySQL 上設定多來源複寫，必須在複本執行個體上啟用效能結構描述。在執行引擎 8.0 或 8.4 版的 RDS for MySQL 上，可以選擇啟用效能結構描述。
+ 對於執行引擎 5.7 版的 RDS for MySQL，複寫篩選條件會套用至所有複寫通道。對於執行引擎 8.0 或 8.4 版的 RDS for MySQL，您可以設定套用至所有複寫通道或個別通道的篩選條件。
+ 還原 RDS 快照或執行時間點還原 (PITR)，並不會還原多來源複本通道組態。
+ 當您建立多來源複本的僅供讀取複本時，它只會從多來源執行個體複寫資料。它不會還原任何通道組態。
+ MySQL 不支援為每個通道設定不同數量的平行工作者。每個通道會根據 `replica_parallel_workers` 值取得相同數量的平行工作者。

如果您的多來源複寫目標是多可用區域資料庫叢集，則適用下列額外的限制：
+ 必須先為來源 RDS for MySQL 執行個體設定通道，才能對該執行個體進行任何寫入。
+ 每個來源 RDS for MySQL 執行個體都必須已啟用 GTID 式複寫。
+ 資料庫叢集上的容錯移轉事件會移除多來源複寫組態。要還原該組態，必須重複執行組態步驟。