本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Aurora MySQL 的主要版本升級預先檢查
從一個主要版本升級 MySQL 到另一個主要版本,例如從 MySQL 5.7 到 MySQL 8.0,涉及一些需要仔細規劃和準備的重大架構變更。與主要著重於更新資料庫引擎軟體的次要版本升級,以及在某些情況下的系統資料表不同,主要 MySQL 升級通常會對資料庫存放和管理其中繼資料的方式帶來重大變更。
為了協助您識別這種不相容,從 Aurora MySQL 第 2 版升級至第 3 版時,Aurora 會自動執行升級相容性檢查 (預先檢查),以檢查資料庫叢集中的物件,並識別已知可能會防止升級繼續進行的不相容。如需 Aurora MySQL 預先檢查的詳細資訊,請參閱 Aurora MySQL 的預先檢查描述參考。Aurora 預先檢查會在 Community MySQL 升級檢查程式公用程式
系統會強制執行這些前置檢查,您無法選擇略過這些檢查。前置檢查提供以下優勢:
-
它們可以降低發生升級失敗的可能性,這可能會導致延長停機時間。
-
出現不相容情況時,Amazon Aurora 即會防止系統繼續升級,並提供相關日誌讓您了解。如此,您就可以使用這些日誌來減少不相容情況,為資料庫做好升級至第 3 版 的準備。如需解決不相容問題的詳細資訊,請參閱 MySQL 文件中的準備您的安裝進行升級
,以及 MySQL Server 部落格上的升級至 MySQL 8.0? 這裡是您需要知道的事項... 。 如需升級至 MySQL 8.0 的詳細資訊,請參閱 MySQL 文件中的 Upgrading MySQL
(升級 MySQL)。
預先檢查會在資料庫叢集離線以進行主要版本升級之前執行。如果預先檢查找到不相容,Aurora 會在資料庫執行個體停止前自動取消升級。Aurora 也會為不相容產生事件。如需 Amazon Aurora 事件的詳細資訊,請參閱 使用 Amazon RDS 事件通知。
完成預先檢查後,Aurora 會記錄 upgrade-prechecks.log 檔案中每個不相容的詳細資訊。在多數情況下,日誌項目包含修正不相容的 MySQL 文件連結。如需檢視日誌檔案的詳細資訊,請參閱檢視並列出資料庫日誌檔案。
注意
根據前置檢查的特性,這些檢查作業會分析資料庫中的物件。此分析會耗用資源,並增加升級完成的時間。如需預先檢查效能考量的詳細資訊,請參閱 Aurora MySQL 的預先檢查程序。
內容
Aurora MySQL 的預先檢查程序
如前所述,Aurora MySQL 升級程序涉及在資料庫上執行相容性檢查 (預先檢查),然後才能繼續主要版本升級。
對於就地升級,預先檢查會在寫入器資料庫執行個體上線時對其執行。如果預先檢查成功,升級會繼續進行。如果發現錯誤,則會記錄在 upgrade-prechecks.log 檔案中,並取消升級。再次嘗試升級之前,請先解決 upgrade-prechecks.log 檔案中傳回的任何錯誤。
對於快照還原升級,預先檢查會在還原程序期間執行。如果成功,您的資料庫將升級至新的 Aurora MySQL 版本。如果發現錯誤,則會記錄在 upgrade-prechecks.log 檔案中,並取消升級。再次嘗試升級之前,請先解決 upgrade-prechecks.log 檔案中傳回的任何錯誤。
如需詳細資訊,請參閱尋找 Aurora MySQL 主要版本升級失敗的原因及Aurora MySQL 的預先檢查描述參考。
若要監控預先檢查狀態,您可以在資料庫叢集上檢視下列事件。
| 預先檢查狀態 | 事件訊息 | 動作 |
|---|---|---|
|
已開始 |
升級準備進行中:開始線上升級預先檢查。 |
無 |
|
失敗 |
資料庫叢集處於無法升級的狀態:升級預先檢查失敗。如需詳細資訊,請參閱 upgrade-prechecks.log 檔案。 如需故障診斷升級失敗原因的詳細資訊,請參閱 |
檢閱錯誤的 修正錯誤。 重試升級。 |
|
Succeeded |
升級準備進行中:已完成線上升級預先檢查。 |
預先檢查成功,未傳回錯誤。 檢閱警告和通知的 |
如需檢視事件的詳細資訊,請參閱 檢視 Amazon RDS 事件。
Aurora MySQL 的預先檢查日誌格式
升級相容性檢查 (預先檢查) 完成後,您可以檢閱 upgrade-prechecks.log 檔案。日誌檔案包含每個預先檢查的結果、受影響的物件和修正資訊。
錯誤會封鎖升級。您必須先解決這些錯誤,才能重試升級。
警告和通知較不重要,但仍建議您仔細檢閱,以確保應用程式工作負載沒有相容性問題。盡快解決任何已識別的問題。
日誌檔案的格式如下:
-
targetVersion– Aurora MySQL 升級的 MySQL 相容版本。 -
auroraServerVersion– 執行預先檢查的 Aurora MySQL 版本。 -
auroraTargetVersion– 您要升級的 Aurora MySQL 版本。 -
checksPerformed– 包含已執行的預先檢查清單。 -
id– 正在執行的預先檢查名稱。 -
title– 正在執行的預先檢查描述。 -
status– 這不表示預先檢查成功或失敗,但會顯示預先檢查查詢的狀態:-
OK– 預先檢查查詢已成功執行並完成。 -
ERROR– 預先檢查查詢無法執行。這可能是因為資源限制、意外執行個體重新啟動或相容性預先檢查查詢中斷等問題而發生。如需詳細資訊,請參閱此範例。
-
-
description– 不相容的一般描述,以及如何修正問題。 -
documentationLink– 如適用,此處會記下相關 Aurora MySQL 或 MySQL 文件的連結。如需更多詳細資訊,請參閱 Aurora MySQL 的預先檢查描述參考。 -
detectedProblems– 如果預先檢查傳回錯誤、警告或通知,這會顯示不相容的詳細資訊,以及適用的不相容物件:-
level– 預先檢查偵測到的不相容層級。有效層級如下:-
Error– 您必須先解決不相容的問題,才能繼續升級。 -
Warning– 升級可以繼續,但偵測到已棄用的物件、語法或組態。請仔細檢閱警告,並盡快解決,以避免未來版本發生問題。 -
Notice– 升級可以繼續,但偵測到已棄用的物件、語法或組態。請仔細檢閱通知,並盡快解決,以避免未來版本發生問題。
-
-
dbObject– 偵測到不相容的資料庫物件名稱。 -
description– 不相容的詳細描述,以及如何修正問題。
-
-
errorCount– 偵測到的不相容錯誤數目。這些會封鎖升級。 -
warningCount– 偵測到的不相容警告數量。這些不會封鎖升級,但請盡快解決,以避免未來版本發生問題。 -
noticeCount– 偵測到的不相容通知數量。這些不會封鎖升級,請盡快解決,以避免未來版本發生問題。 -
Summary– 預先檢查相容性錯誤、警告和通知計數的摘要。
Aurora MySQL 的預先檢查日誌輸出範例
下列範例顯示您可能會看到的預先檢查日誌輸出。如需執行中預先檢查的詳細資訊,請參閱 Aurora MySQL 的預先檢查描述參考。
- 預先檢查狀態正常,未偵測到不相容
-
預先檢查查詢已成功完成。未偵測到不相容。
{ "id": "auroraUpgradeCheckIndexLengthLimitOnTinytext", "title": "Check for the tables with indexes defined with prefix length greater than 255 bytes on tiny text columns", "status": "OK", "detectedProblems": [] }, - 預先檢查狀態正常,偵測到錯誤
-
預先檢查查詢已成功完成。偵測到一個錯誤。
{ "id": "auroraUpgradeCheckForPrefixIndexOnGeometryColumns", "title": "Check for geometry columns on prefix indexes", "status": "OK", "description": "Consider dropping the prefix indexes of geometry columns and restart the upgrade.", "detectedProblems": [ { "level": "Error", "dbObject": "test25.sbtest1", "description": "Table `test25`.`sbtest1` has an index `idx_t1` on geometry column/s. Mysql 8.0 does not support this type of index on a geometry column https://dev.mysql.com/worklog/task/?id=11808. To upgrade to MySQL 8.0, Run 'DROP INDEX `idx_t1` ON `test25`.`sbtest1`;" }, } - 預先檢查狀態正常,偵測到警告
-
當預先檢查成功或失敗時,可能會傳回警告。
在這裡,預先檢查查詢已成功完成。偵測到兩個警告。
{ "id": "zeroDatesCheck", "title": "Zero Date, Datetime, and Timestamp values", "status": "OK", "description": "Warning: By default zero date/datetime/timestamp values are no longer allowed in MySQL, as of 5.7.8 NO_ZERO_IN_DATE and NO_ZERO_DATE are included in SQL_MODE by default. These modes should be used with strict mode as they will be merged with strict mode in a future release. If you do not include these modes in your SQL_MODE setting, you are able to insert date/datetime/timestamp values that contain zeros. It is strongly advised to replace zero values with valid ones, as they may not work correctly in the future.", "documentationLink": "https://lefred.be/content/mysql-8-0-and-wrong-dates/", "detectedProblems": [ { "level": "Warning", "dbObject": "global.sql_mode", "description": "does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates" }, { "level": "Warning", "dbObject": "session.sql_mode", "description": " of 10 session(s) does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates" } ] } - 預先檢查狀態錯誤,未回報不相容
-
預先檢查查詢失敗並發生錯誤,因此無法確認不相容。
{ "id": "auroraUpgradeCheckForDatafilePathInconsistency", "title": "Check for inconsistency related to ibd file path.", "status": "ERROR", "description": "Can't connect to MySQL server on 'localhost:3306' (111) at 13/08/2024 12:22:20 UTC. This failure can occur due to low memory available on the instance for executing upgrade prechecks. Please check 'FreeableMemory' Cloudwatch metric to verify the available memory on the instance while executing prechecks. If instance ran out of memory, we recommend to retry the upgrade on a higher instance class." }此失敗可能是因為未預期的執行個體重新啟動,或執行時資料庫上的相容性預先檢查查詢中斷。例如,在較小的資料庫執行個體類別上,當執行個體上的可用記憶體不足時,您可能會遇到這種情況。
您可以使用
FreeableMemoryAmazon CloudWatch 指標,在執行預先檢查時確認執行個體上的可用記憶體。如果執行個體記憶體不足,建議您在較大的資料庫執行個體類別上重試升級。在某些情況下,您可以使用藍/綠部署 這可讓預先檢查和升級在與生產工作負載無關的「綠」資料庫叢集上執行,這也會使用系統資源。如需更多詳細資訊,請參閱 針對 Aurora MySQL 資料庫的記憶體用量問題進行故障診斷。
- 預先檢查摘要,偵測到一個錯誤和三個警告
-
相容性預先檢查也包含來源和目標 Aurora MySQL 版本的資訊,以及預先檢查輸出結束時的錯誤、警告和通知計數摘要。
例如,下列輸出顯示嘗試從 Aurora MySQL 2.11.6 升級到 Aurora MySQL 3.07.1。升級傳回一個錯誤、三個警告,而且沒有通知。由於在傳回錯誤時無法繼續升級,您必須解決 routineSyntaxCheck 相容性問題,然後重試升級。
{ "serverAddress": "/tmp%2Fmysql.sock", "serverVersion": "5.7.12 - MySQL Community Server (GPL)", "targetVersion": "8.0.36", "auroraServerVersion": "2.11.6", "auroraTargetVersion": "3.07.1", "outfilePath": "/rdsdbdata/tmp/PreChecker.log", "checksPerformed": [{ ... output for each individual precheck ... . . { "id": "oldTemporalCheck", "title": "Usage of old temporal type", "status": "OK", "detectedProblems": [] }, { "id": "routinesSyntaxCheck", "title": "MySQL 8.0 syntax check for routine-like objects", "status": "OK", "description": "The following objects did not pass a syntax check with the latest MySQL 8.0 grammar. A common reason is that they reference names that conflict with new reserved keywords. You must update these routine definitions and `quote` any such references before upgrading.", "documentationLink": "https://dev.mysql.com/doc/refman/en/keywords.html", "detectedProblems": [{ "level": "Error", "dbObject": "test.select_res_word", "description": "at line 2,18: unexpected token 'except'" }] }, . . . { "id": "zeroDatesCheck", "title": "Zero Date, Datetime, and Timestamp values", "status": "OK", "description": "Warning: By default zero date/datetime/timestamp values are no longer allowed in MySQL, as of 5.7.8 NO_ZERO_IN_DATE and NO_ZERO_DATE are included in SQL_MODE by default. These modes should be used with strict mode as they will be merged with strict mode in a future release. If you do not include these modes in your SQL_MODE setting, you are able to insert date/datetime/timestamp values that contain zeros. It is strongly advised to replace zero values with valid ones, as they may not work correctly in the future.", "documentationLink": "https://lefred.be/content/mysql-8-0-and-wrong-dates/", "detectedProblems": [{ "level": "Warning", "dbObject": "global.sql_mode", "description": "does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates" }, { "level": "Warning", "dbObject": "session.sql_mode", "description": " of 8 session(s) does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates" } ] }, . . . }], "errorCount": 1, "warningCount": 3, "noticeCount": 0, "Summary": "1 errors were found. Please correct these issues before upgrading to avoid compatibility issues." }
Aurora MySQL 的預先檢查效能
相容性預先檢查會在資料庫執行個體離線以進行升級之前執行,因此在一般情況下,不會在執行時導致資料庫執行個體停機時間。不過,它們可能會影響寫入器資料庫執行個體上執行的應用程式工作負載。預先檢查會透過 information_schema
-
預先檢查持續時間會因資料表、資料欄、常式和限制條件等資料庫物件數量而有所不同。具有大量物件的資料庫叢集可能需要更長的時間來執行。
例如,removedFunctionsCheck 可能需要更長的時間,並根據儲存的物件
數量使用更多資源。 -
對於就地升級,使用較大的資料庫執行個體類別 (例如 db.r5.24xlarge 或 db.r6g.16xlarge) 可以透過使用更多 CPU 協助更快完成升級。您可以在升級後縮減大小。
-
跨多個資料庫對
information_schema的查詢可能會很慢,尤其是在許多物件和較小的資料庫執行個體上。在這種情況下,請考慮使用複製、快照還原或藍/綠部署進行升級。 -
預先檢查資源用量 (CPU、記憶體) 可能會隨著更多物件而增加,導致較小資料庫執行個體上的執行時間更長。在這種情況下,請考慮使用複製、快照還原或藍/綠部署進行測試以進行升級。
如果預先檢查因資源不足而失敗,您可以使用狀態輸出在預先檢查日誌中偵測到此問題:
"status": "ERROR",
如需詳細資訊,請參閱Aurora MySQL 主要版本就地升級的運作方式及規劃 Aurora MySQL 叢集的主要版本升級。
Community MySQL 升級預先檢查摘要
以下是 MySQL 5.7 和 8.0 之間不相容的一般清單:
-
您的 MySQL 5.7 相容資料庫叢集不得使用 MySQL 8.0 中不支援的功能。
如需詳細資訊,請參閱 MySQL 文件中的 Features Removed in MySQL 8.0
(MySQL 8.0 中移除的功能)。 -
不能違反關鍵字或保留字的規定。MySQL 8.0 中可能會保留一些先前未保留的關鍵字。
如需詳細資訊,請參閱 MySQL 文件中的 Keywords and Reserved Words
(關鍵字與保留字)。 -
運用 Unicode 增強支援時,請考慮將使用
utf8mb3字元集的物件轉換成使用utf8mb4字元集,因為utf8mb3字元集已棄用。另外,utf8mb4目前是utf8字元集的別名,因此請考慮使用utf8做為字元集參考,而不是utf8mb3。如需詳細資訊,請參閱 MySQL 文件中的 The utf8mb3 character set (3-byte UTF-8 unicode encoding)
。 -
不得有非預設資料列格式的 InnoDB 資料表。
-
不得有
ZEROFILL或display長度類型屬性。 -
分割資料表所使用的儲存引擎皆需提供原生分割支援。
-
MySQL 5.7
mysql系統資料庫中的資料表名稱不得與 MySQL 8.0 資料字典所使用的資料表名稱相同。 -
資料表不能使用過時的資料類型或函數。
-
外部索引鍵的限制條件名稱不得超過 64 個字元。
-
不能在
sql_mode系統變數設定中定義過時的 SQL 模式。 -
資料表或預存程序的個別
ENUM或SET資料欄元素長度皆不得超過 255 個字元。 -
共用 InnoDB 資料表空間中不能存在資料表分割區。
-
資料表空間資料檔案路徑中不得有循環參考。
-
查詢和預存程式定義皆不得對
ASC子句使用DESC或GROUP BY限定詞。 -
不得移除任何系統變數,且系統變數必須使用 MySQL 8.0 的新預設值。
-
日期、日期時間或時間戳記值不得為零 (
0)。 -
不得有因檔案移除或損毀所導致的結構描述不一致
-
不得有任何包含
FTS字元字串的資料表名稱。 -
不得有任何屬於不同引擎的 InnoDB 資料表。
-
不得有任何資料表或結構描述名稱對 MySQL 5.7 無效。
如需執行中預先檢查的詳細資訊,請參閱 Aurora MySQL 的預先檢查描述參考。
如需升級至 MySQL 8.0 的詳細資訊,請參閱 MySQL 文件中的 Upgrading MySQL
Aurora MySQL 升級預先檢查摘要
從第 2 版升級至第 3 版時,Aurora MySQL 有自己的特定需求,包括下列項目:
-
在檢視、常式、觸發條件和事件中,不得有已棄用的 SQL 語法,例如
SQL_CACHE、SQL_NO_CACHE和QUERY_CACHE。 -
任何沒有
FTS索引的資料表上不得有FTS_DOC_ID欄。 -
InnoDB 資料字典與實際資料表定義之間不得有任何資料欄定義不相符。
-
lower_case_table_names參數設定為1時,所有資料庫和資料表名稱都必須是小寫。 -
事件和觸發條件不能有遺漏或空白的 DEFINER,或是無效的建立內容。
-
資料庫中的所有觸發條件名稱都必須是唯一的。
-
Aurora MySQL 第 3 版不支援 DDL 復原和快速 DDL。資料庫中不得有與這些功能相關的成品。
-
具有
REDUNDANT或COMPACT資料列格式的資料表索引不能大於 767 個位元組。 -
在
tiny文字資料欄上定義的索引字首長度不能超過 255 個位元組。使用utf8mb4字元集時,這會將支援的字首長度限制為 63 個字元。使用
innodb_large_prefix參數在 MySQL 5.7 中允許較大的字首長度。此參數已在 MySQL 8.0 中棄用。 -
mysql.host資料表中不得有任何 InnoDB 中繼資料不一致。 -
系統資料表中不得有任何資料欄資料類型不符。
-
prepared狀態中不得有 XA 交易。 -
檢視中的資料欄名稱不能超過 64 個字元。
-
預存程序中的特殊字元不能不一致。
-
資料表不能有資料檔案路徑不一致。
如需執行中預先檢查的詳細資訊,請參閱 Aurora MySQL 的預先檢查描述參考。