

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

# RDS for MySQL 的主要版本升級
<a name="USER_UpgradeDBInstance.MySQL.Major"></a>

對於 MySQL 資料庫引擎的主要版本，Amazon RDS 支援以下的就地升級：
+ MySQL 5.7 至 MySQL 8.0
+ MySQL 8.0 至 MySQL 8.4

**注意**  
您只能以最新一代和當代資料庫執行個體類別來建立 MySQL 5.7、8.0 和 8.4 版資料庫執行個體。  
在某些情況下，您會想要將在前代資料庫執行個體類別上執行的資料庫執行個體升級至使用較高 MySQL 引擎版本的資料庫執行個體。在這些情況下，先將資料庫執行個體修改為使用最新一代的資料庫執行個體類別。在您這麼做後，您就可以將資料庫執行個體修改為使用較高的 MySQL 資料庫引擎版本。如需 Amazon RDS 資料庫執行個體類別的相關資訊，請參閱[ 資料庫執行個體類別](Concepts.DBInstanceClass.md)。

**Topics**
+ [MySQL 主要版本升級概觀](#USER_UpgradeDBInstance.MySQL.Major.Overview)
+ [升級的預先檢查](#USER_UpgradeDBInstance.MySQL.Prechecks)
+ [在升級失敗後復原](#USER_UpgradeDBInstance.MySQL.Major.RollbackAfterFailure)

## MySQL 主要版本升級概觀
<a name="USER_UpgradeDBInstance.MySQL.Major.Overview"></a>

主要版本升級 可能包含與現有應用程式回溯不相容的資料庫變更。因此，Amazon RDS 不會自動套用主要版本升級；您必須手動修改資料庫執行個體。我們建議您在將任何升級套用至生產執行個體之前，先進行完整測試。

若要執行主要版本升級，請先執行任何可用的作業系統更新。作業系統完成更新後，請依序升級至各個主要版本，例如，5.7 升級至 8.0，8.0 再升級至 8.4。如需有關升級 RDS for MySQL 多可用區域資料庫叢集的資訊，請參閱 [升級 Amazon RDS 多可用區域資料庫叢集的引擎版本](multi-az-db-clusters-upgrading.md)。2014 年 4 月 24 日以前所建立的 MySQL 資料庫執行個體會顯示可用的作業系統更新，直到套用更新為止。如需作業系統更新的相關資訊，請參閱[將更新套用至資料庫執行個體](USER_UpgradeDBInstance.Maintenance.md#USER_UpgradeDBInstance.OSUpgrades)。

在 MySQL 的主要版本升級期間，Amazon RDS 會視需求執行 MySQL 二進位檔 `mysql_upgrade`，進而升級資料表。此外，在主要版本升級期間，Amazon RDS 還會清空 `slow_log` 與 `general_log` 資料表。若要保留日誌資訊，請在主要版本升級之前儲存日誌內容。

MySQL 主要版本升級通常在大約 10 分鐘內完成。由於資料庫執行個體類別的大小，或因為執行個體未遵循[Amazon RDS 的最佳實務](CHAP_BestPractices.md)中的特定操作準則，有些升級可能會較久。如果您從 Amazon RDS 主控台升級資料庫執行個體，資料庫執行個體的狀態會指出升級何時完成。如果您使用 AWS Command Line Interface (AWS CLI) 升級，請使用 [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) 命令並檢查 `Status`值。

## 升級的預先檢查
<a name="USER_UpgradeDBInstance.MySQL.Prechecks"></a>

Amazon RDS 會在升級之前執行預先檢查，確認是否有不相容的情形。這類不相容會根據要升級的 MySQL 版本而有所不同。

前置檢查所含的部分檢查是隨附於 MySQL 的項目，另一些則是由 Amazon RDS 團隊特別設計。如需 MySQL 提供的前置檢查相關資訊，請參閱[升級檢查程式公用程式](https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-shell-utilities-upgrade.html)。

前置檢查會在系統將資料庫執行個體停止以進行升級前執行，意即前置檢查執行期間不會造成任何停機時間。如果預先檢查找到不相容，Amazon RDS 會在資料庫執行個體停止前自動取消升級。Amazon RDS 也會為不相容產生事件。如需 Amazon RDS 事件的詳細資訊，請參閱[使用 Amazon RDS 事件通知](USER_Events.md)。

Amazon RDS 會在日誌檔 `PrePatchCompatibility.log` 中記錄每個不相容的相關詳細資訊。在多數情況下，日誌項目包含修正不相容的 MySQL 文件連結。如需檢視日誌檔案的詳細資訊，請參閱[檢視並列出資料庫日誌檔案](USER_LogAccess.Procedural.Viewing.md)。

基於預先檢查的特性，這些檢查會分析資料庫中的物件。此分析會耗用資源，並增加升級完成的時間。

**Topics**
+ [從 MySQL 8.0 升級至 8.4 的前置檢查](#USER_UpgradeDBInstance.MySQL.80to84Prechecks)
+ [從 MySQL 5.7 升級到 8.0 的前置檢查](#USER_UpgradeDBInstance.MySQL.57to80Prechecks)

### 從 MySQL 8.0 升級至 8.4 的前置檢查
<a name="USER_UpgradeDBInstance.MySQL.80to84Prechecks"></a>

MySQL 8.4 有許多與 MySQL 8.0 不相容的地方。這些不相容可能會在從 MySQL 8.0 升級至 MySQL 8.4 期間發生問題。因此，您可能需要為資料庫做一些準備，才能順利完成升級。以下是這些不相容問題的一般清單：
+ 資料表不能使用過時的資料類型或函數。
+ 觸發條件不能有遺漏或空白的 DEFINER，或是無效的建立內容。
+ 不能違反關鍵字或保留字的規定。MySQL 8.4 中可能會保留一些先前未保留的關鍵字。

  如需詳細資訊，請參閱 MySQL 文件中的 [Keywords and Reserved Words](https://dev.mysql.com/doc/refman/8.4/en/keywords.html) (關鍵字與保留字)。
+ MySQL 8.0 `mysql` 系統資料庫中的資料表名稱不得與 MySQL 8.4 資料字典所使用的資料表名稱相同。
+ 不能在 `sql_mode` 系統變數設定中定義過時的 SQL 模式。
+ 資料表或預存程序的個別 `ENUM` 或 `SET` 資料欄元素長度皆不得超過 255 個字元，也不能超過 1020 位元組。
+ MySQL 8.0 安裝程式不可使用 MySQL 8.4 未支援的功能。

  如需詳細資訊，請參閱 MySQL 文件中的 [MySQL 8.4 中移除的功能](https://dev.mysql.com/doc/refman/8.4/en/mysql-nutshell.html#mysql-nutshell-removals)。
+ 外部索引鍵的限制條件名稱不得超過 64 個字元。
+ 有關 Unicode 增強支援，請檢閱下列資訊：
  + 請考慮將使用 `utf8mb3` 字元集的物件轉換成使用 `utf8mb4` 字元集，因為 `utf8mb3` 字元集已棄用。
  + `utf8mb4` 目前是 `utf8` 字元集的別名，因此請考慮使用 `utf8` 做為字元集參考，而不是 `utf8mb3`。如果可能，請先將 `utf8` 變更為 `utf8mb4`，然後升級您的資料庫。
  + 由於較舊的用戶端可能會收到 `utf8mb3` 不明的字元集錯誤，在升級資料庫之前，請先升級資料庫用戶端。

  如需詳細資訊，請參閱 MySQL 文件中的 [The utf8mb3 character set (3-byte UTF-8 unicode encoding)](https://dev.mysql.com/doc/refman/8.4/en/charset-unicode-utf8mb3.html)。

  若要變更字元集，您可以手動執行資料庫的備份、還原和複寫。或者，您可以使用 Amazon RDS 藍/綠部署。如需詳細資訊，請參閱[使用 Amazon RDS 藍/綠部署進行資料庫更新](blue-green-deployments.md)。

當您開始從 MySQL 8.0 升級至 8.4 時，Amazon RDS 會自動執行預先檢查，以偵測這些不相容問題。如需升級至 MySQL 8.4 的相關資訊，請參閱 MySQL 文件中的[升級 MySQL](https://dev.mysql.com/doc/refman/8.4/en/upgrading.html)。

系統會強制執行這些前置檢查，您無法選擇略過這些檢查。前置檢查提供以下優勢：
+ 升級期間可避免非預期的停機時間。
+ 出現不相容情況時，Amazon RDS 即會防止系統進行升級，並提供相關日誌讓您了解。如此，您就可以使用這些日誌來減少不相容情況，為資料庫做好升級至 MySQL 8.4 的準備。如需移除不相容的詳細資訊，請參閱 MySQL 文件中的[準備您的安裝進行升級](https://dev.mysql.com/doc/refman/8.4/en/upgrade-prerequisites.html)。

### 從 MySQL 5.7 升級到 8.0 的前置檢查
<a name="USER_UpgradeDBInstance.MySQL.57to80Prechecks"></a>

MySQL 8.0 與 MySQL 5.7 有許多不相容的地方。這些不相容可能會在從 MySQL 5.7 升級至 MySQL 8.0 期間發生問題。因此，您可能需要為資料庫做一些準備，才能順利完成升級。以下是這些不相容問題的一般清單：
+ 資料表不能使用過時的資料類型或函數。
+ 不能有孤立的 \$1.frm 檔案。
+ 觸發條件不能有遺漏或空白的 DEFINER，或是無效的建立內容。
+ 分割資料表所使用的儲存引擎皆需提供原生分割支援。
+ 不能違反關鍵字或保留字的規定。MySQL 8.0 中可能會保留一些先前未保留的關鍵字。

  如需詳細資訊，請參閱 MySQL 文件中的 [Keywords and Reserved Words](https://dev.mysql.com/doc/refman/8.0/en/keywords.html) (關鍵字與保留字)。
+ MySQL 5.7 `mysql` 系統資料庫中的資料表名稱不得與 MySQL 8.0 資料字典所使用的資料表名稱相同。
+ 不能在 `sql_mode` 系統變數設定中定義過時的 SQL 模式。
+ 資料表或預存程序的個別 `ENUM` 或 `SET` 資料欄元素長度皆不得超過 255 個字元，也不能超過 1020 位元組。
+ 升級至 MySQL 8.0.13 或更新版本前，共用 InnoDB 資料表空間中不能存在資料表分割區。
+ MySQL 8.0.12 或較舊版本中的查詢和預存程式皆不得對 `ASC` 子句使用 `DESC` 或 `GROUP BY` 限定詞。
+ MySQL 5.7 安裝程式不能使用 MySQL 8.0 未支援的功能。

  如需詳細資訊，請參閱 MySQL 文件中的 [Features Removed in MySQL 8.0](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html#mysql-nutshell-removals) (MySQL 8.0 中移除的功能)。
+ 外部索引鍵的限制條件名稱不得超過 64 個字元。
+ 有關 Unicode 增強支援，請檢閱下列資訊：
  + 請考慮將使用 `utf8mb3` 字元集的物件轉換成使用 `utf8mb4` 字元集，因為 `utf8mb3` 字元集已棄用。
  + `utf8mb4` 目前是 `utf8` 字元集的別名，因此請考慮使用 `utf8` 做為字元集參考，而不是 `utf8mb3`。如果可能，請先將 `utf8` 變更為 `utf8mb4`，然後升級您的資料庫。
  + 由於較舊的用戶端可能會收到 `utf8mb3` 不明的字元集錯誤，在升級資料庫之前，請先升級資料庫用戶端。

  如需詳細資訊，請參閱 MySQL 文件中的 [The utf8mb3 character set (3-byte UTF-8 unicode encoding)](https://dev.mysql.com/doc/refman/8.4/en/charset-unicode-utf8mb3.html)。

  若要變更字元集，您可以手動執行資料庫的備份、還原和複寫。或者，您可以使用 Amazon RDS 藍/綠部署。如需詳細資訊，請參閱[使用 Amazon RDS 藍/綠部署進行資料庫更新](blue-green-deployments.md)。

當您開始從 MySQL 5.7 升級到 8.0 時，Amazon RDS 會自動執行前置檢查，以偵測這些不相容問題。如需升級至 MySQL 8.0 的相關資訊，請參閱 MySQL 文件中的 [Upgrading MySQL](https://dev.mysql.com/doc/refman/8.0/en/upgrading.html) (升級 MySQL)。

系統會強制執行這些前置檢查，您無法選擇略過這些檢查。前置檢查提供以下優勢：
+ 升級期間可避免非預期的停機時間。
+ 出現不相容情況時，Amazon RDS 即會防止系統進行升級，並提供相關日誌讓您了解。如此，您就可以使用這些日誌來減少不相容情況，為資料庫做好升級至 MySQL 8.0 的準備。如需移除不相容問題的詳細資訊，請參閱 MySQL 文件中的[準備您的安裝進行升級](https://dev.mysql.com/doc/refman/8.0/en/upgrade-prerequisites.html)，以及[升級至 MySQL 8.0？ 這裡是您需要知道的事項...](https://dev.mysql.com/blog-archive/upgrading-to-mysql-8-0-here-is-what-you-need-to-know/)。

## 在升級失敗後復原
<a name="USER_UpgradeDBInstance.MySQL.Major.RollbackAfterFailure"></a>

當您將資料庫執行個體從 MySQL 5.7 版升級至 MySQL 8.0 版，或從 MySQL 8.0 版升級至 8.4 版時，升級可能會失敗。特別是，如果資料字典包含預先檢查未擷取的不相容性，則可能會失敗。在此情況下，資料庫無法在新的 MySQL 8.0 或 8.4 版中成功啟動。此時，Amazon RDS 會轉返升級執行的變更。復原後，MySQL 資料庫執行個體會執行原始版本：
+ MySQL 8.0 版 (從 MySQL 8.4 復原)
+ MySQL 5.7 版 (從 MySQL 8.0 復原)

升級失敗且轉返後，Amazon RDS 會產生具有事件 ID RDS-EVENT-0188 的事件。

通常，之所以升級失敗，是因為資料庫執行個體中的資料庫與目標 MySQL 版本之間的中繼資料存在不相容。升級失敗時，您可以在 `upgradeFailure.log` 檔案中檢視這些不相容性的詳細資訊。請先解決不相容性，然後嘗試再次升級。

在升級嘗試和轉返失敗期間，您的資料庫執行個體會重新啟動。任何擱置的參數變更都會在重新啟動期間套用，並在轉返後持續存在。

如需升級至 MySQL 8.0 的詳細資訊，請參閱 MySQL 文件中的下列主題：
+ [準備進行升級的裝置](https://dev.mysql.com/doc/refman/8.0/en/upgrade-prerequisites.html)
+ [升級至 MySQL 8.0？ 以下是您需要知道的內容.](https://dev.mysql.com/blog-archive/upgrading-to-mysql-8-0-here-is-what-you-need-to-know/)..

如需升級至 MySQL 8.4 的詳細資訊，請參閱 MySQL 文件中的[準備您的安裝進行升級](https://dev.mysql.com/doc/refman/8.4/en/upgrade-prerequisites.html)。