

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

# 使用 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 (複寫中)*。