

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

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

MariaDB 的複寫技術採取非同步，因此，來源資料庫執行個體的 `BinLogDiskUsage` 和僅供讀取複本上的 `ReplicaLag` 預料會偶爾增加。例如，來源資料庫執行個體可同時出現大量寫入操作。相對而言，僅供讀取複本的寫入操作則使用單一 I/O 執行緒序列化，這可能導致來源執行個體和僅供讀取複本之間的延遲。如需 MariaDB 文件中的僅供讀取複本詳細資訊，請造訪[複寫概觀](http://mariadb.com/kb/en/mariadb/replication-overview/)。

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

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

您可以檢視 `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` 參數值小於來源資料庫執行個體的 `max_allowed_packet` 參數值，因而導致複寫錯誤。`max_allowed_packet` 參數是能夠在資料庫參數群組中設定的自訂參數，專用來指定可在資料庫上執行的 DML 程式碼大小上限。在部分案例中，與來源資料庫執行個體建立關聯之資料庫參數群組的 `max_allowed_packet` 參數值，會小於與來源僅供讀取複本建立關聯之資料庫參數群組的 `max_allowed_packet` 參數值。以這些情況而言，複寫程序可能會擲出錯誤 (Packet 大於 max\$1allowed\$1packet 位元組)，並停止複寫作業。您可以透過讓來源和僅供讀取複本使用具有相同 `max_allowed_packet` 參數值的資料庫參數群組，藉此修正錯誤。

可能造成複寫錯誤的其他常見情況包括下列：
+ 寫入僅供讀取複本上的資料表。如果您在僅供讀取複本上建立索引，您需要將 `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) 中所述的步驟。否則，您可以刪除僅供讀取複本，並使用相同的資料庫執行個體識別碼建立執行個體，讓端點與您的舊僅供讀取複本端點保持相同。如果複寫錯誤已修復，`Replication State` (複寫狀態) 會變更為 *replicating (複寫中)*。

在某些情況下，如果程序失敗的期間未排清部分二進位日誌 (binlog) 事件，便無法將 MariaDB 資料庫執行個體的僅供讀取複本切換至次要資料庫。在這種情況下，手動刪除並重新建立僅供讀取複本。如果要降低此情況發生的機率，則可設定以下參數值：`sync_binlog=1` 和 `innodb_flush_log_at_trx_commit=1`。但這些設定可能會降低效能，所以請先測試這些設定所帶來的影響，再於生產環境中實作變更內容。