在升級到最新的 MySQL 9.0 版本之前,請先執行以下所述的初步檢查,以確保您目前的 MySQL 8.4 或 MySQL 8.4 伺服器執行個體已準備好進行升級。否則,升級過程可能會失敗。
考慮使用MySQL Shell 升級檢查器公用程式,讓您可以驗證 MySQL 伺服器執行個體是否已準備好進行升級。您可以選擇您計劃升級的目標 MySQL 伺服器版本,範圍從 MySQL 伺服器 8.0.11 到符合目前 MySQL Shell 版本號碼的 MySQL 伺服器版本號碼。升級檢查器公用程式會執行與指定目標版本相關的自動檢查,並建議您手動進行其他相關檢查。升級檢查器適用於 MySQL 5.7、8.0 和 8.3 的所有 GA 版本。MySQL Shell 的安裝說明可在此處找到 這裡。
初步檢查
不得存在以下問題
不得有使用過時資料類型或函數的資料表。
不得有孤立的
.frm
檔案。觸發程序不得有遺失或空白的定義者,或無效的建立內容(由
SHOW TRIGGERS
或INFORMATION_SCHEMA
TRIGGERS
資料表顯示的character_set_client
、collation_connection
、Database Collation
屬性所指示)。任何此類觸發程序都必須先傾印然後還原以修正問題。
若要檢查這些問題,請執行此命令
mysqlcheck -u root -p --all-databases --check-upgrade
如果 mysqlcheck 報告任何錯誤,請修正問題。
不得有使用不支援原生分割的儲存引擎的分割資料表。若要識別此類資料表,請執行此查詢
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';
查詢報告的任何資料表都必須變更為使用
InnoDB
或設為非分割。若要將資料表儲存引擎變更為InnoDB
,請執行此陳述式ALTER TABLE table_name ENGINE = INNODB;
如需將
MyISAM
資料表轉換為InnoDB
的相關資訊,請參閱章節 17.6.1.5,「將資料表從 MyISAM 轉換為 InnoDB」。若要將分割資料表設為非分割,請執行此陳述式
ALTER TABLE table_name REMOVE PARTITIONING;
某些關鍵字在 MySQL 9.0 中可能會是保留字,而先前並非保留字。請參閱 章節 11.3,「關鍵字和保留字」。這可能會導致先前用作識別碼的字詞變成非法。若要修正受影響的陳述式,請使用識別碼引號。請參閱 章節 11.2,「結構描述物件名稱」。
在 MySQL 8.4
mysql
系統資料庫中,不得有與 MySQL 9.0 資料字典使用的資料表名稱相同的資料表。若要識別具有這些名稱的資料表,請執行此查詢SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE LOWER(TABLE_SCHEMA) = 'mysql' AND LOWER(TABLE_NAME) IN ( 'catalogs', 'character_sets', 'check_constraints', 'collations', 'column_statistics', 'column_type_elements', 'columns', 'dd_properties', 'events', 'foreign_key_column_usage', 'foreign_keys', 'index_column_usage', 'index_partitions', 'index_stats', 'indexes', 'parameter_type_elements', 'parameters', 'resource_groups', 'routines', 'schemata', 'st_spatial_reference_systems', 'table_partition_values', 'table_partitions', 'table_stats', 'tables', 'tablespace_files', 'tablespaces', 'triggers', 'view_routine_usage', 'view_table_usage' );
查詢報告的任何資料表都必須捨棄或重新命名 (使用
RENAME TABLE
)。這也可能需要變更使用受影響資料表的應用程式。不得有外鍵約束名稱長度超過 64 個字元的資料表。請使用此查詢來識別具有過長約束名稱的資料表
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME IN (SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1), INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'_ibfk_')-1) FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN WHERE LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64);
對於約束名稱超過 64 個字元的資料表,請捨棄約束,然後使用不超過 64 個字元的約束名稱重新新增 (使用
ALTER TABLE
)。不得有
sql_mode
系統變數定義的過時 SQL 模式。嘗試使用過時的 SQL 模式會阻止 MySQL 9.0 啟動。應修改使用過時 SQL 模式的應用程式,以避免使用這些模式。如需 MySQL 9.0 中移除的 SQL 模式的相關資訊,請參閱伺服器變更。不得有明確定義的欄名稱超過 64 個字元的檢視表(在 MySQL 5.7 中允許欄名稱最多 255 個字元的檢視表)。為避免升級錯誤,應在升級之前修改此類檢視表。目前,識別欄名稱超過 64 個字元的檢視表的唯一方法是使用
SHOW CREATE VIEW
檢查檢視表定義。您也可以查詢 Information SchemaVIEWS
資料表來檢查檢視表定義。不得有任何個別
ENUM
或SET
欄元素超過 255 個字元或 1020 個位元組的資料表或預存程序。在 MySQL 9.0 之前,ENUM
或SET
欄元素的最大組合長度為 64K。在 MySQL 9.0 中,個別ENUM
或SET
欄元素的最大字元長度為 255 個字元,最大位元組長度為 1020 個位元組。(1020 個位元組的限制支援多位元組字元集)。在升級到 MySQL 8.0 之前,請修改任何超過新限制的ENUM
或SET
欄元素。否則會導致升級失敗並出現錯誤。您的 MySQL 8.4 安裝不得使用 MySQL 9.0 不支援的功能。此處的任何變更都必須是安裝特定的,但以下範例說明了要尋找的內容
某些伺服器啟動選項和系統變數已在 MySQL 9.0 中移除。請參閱MySQL 9.0 中移除的功能,以及章節 1.5,「自 8.4 以來在 MySQL 9.0 中新增、棄用或移除的伺服器和狀態變數與選項」。如果您使用其中任何一個,則升級需要進行組態變更。
如果您打算在升級時將
lower_case_table_names
設定變更為 1,請確保結構描述和資料表名稱在升級之前都是小寫。否則,可能會因為結構描述或資料表名稱字母大小寫不符而發生失敗。您可以使用以下查詢來檢查包含大寫字元的結構描述和資料表名稱mysql> select TABLE_NAME, if(sha(TABLE_NAME) !=sha(lower(TABLE_NAME)),'Yes','No') as UpperCase from information_schema.tables;
如果
lower_case_table_names=1
,升級程序會檢查資料表和結構描述名稱,以確保所有字元都是小寫。如果發現資料表或結構描述名稱包含大寫字元,升級程序將失敗並出現錯誤。注意不建議在升級時變更
lower_case_table_names
設定。
如果因為上述任何問題導致 MySQL 9.0 升級失敗,伺服器會將資料目錄的所有變更還原。在這種情況下,請移除所有重做日誌檔案,並在現有的資料目錄上重新啟動 MySQL 8.4 伺服器以解決錯誤。重做日誌檔案(ib_logfile*
)預設位於 MySQL 資料目錄中。修復錯誤後,在再次嘗試升級之前,請執行慢速關機(透過設定 innodb_fast_shutdown=0
)。