MySQL 8.4 參考手冊  /  升級 MySQL  /  準備您的安裝以進行升級

3.6 準備您的安裝以進行升級

在升級到最新的 MySQL 8.4 版本之前,請執行以下說明的初步檢查,以確保您目前的 MySQL 8.3 或 MySQL 8.4 伺服器實例已準備好升級。否則,升級程序可能會失敗。

提示

考慮使用 MySQL Shell 升級檢查工具,該工具可讓您驗證 MySQL 伺服器實例是否已準備好升級。您可以選擇要升級的目標 MySQL 伺服器版本,範圍從 MySQL 伺服器 8.0.11 到與目前 MySQL Shell 版本號碼相符的 MySQL 伺服器版本號碼。升級檢查工具會執行與指定目標版本相關的自動檢查,並建議您進行其他相關的手動檢查。升級檢查工具適用於 MySQL 5.7、8.0 和 8.3 的所有 GA 版本。MySQL Shell 的安裝說明可在此處找到 這裡

初步檢查

  1. 不得存在下列問題

    • 不得有使用過時資料類型或函式的表格。

    • 不得有孤立的 .frm 檔案。

    • 觸發程序不得缺少或為空的定義者,或無效的建立內容(由 SHOW TRIGGERSINFORMATION_SCHEMA TRIGGERS 表格顯示的 character_set_clientcollation_connection資料庫校對 屬性所指示)。任何此類觸發程序都必須傾印和還原,以修正問題。

    若要檢查這些問題,請執行此命令

    mysqlcheck -u root -p --all-databases --check-upgrade

    如果 mysqlcheck 報告任何錯誤,請修正這些問題。

  2. 不得有使用不具原生分割支援的儲存引擎的分割表格。若要識別此類表格,請執行此查詢

    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;
  3. 某些關鍵字在 MySQL 8.4 中可能是保留字,這些字詞先前並非保留字。請參閱 第 11.3 節,〈關鍵字和保留字〉。這可能會導致先前用作識別符號的字詞變成不合法。若要修正受影響的陳述式,請使用識別符號引號。請參閱 第 11.2 節,〈結構描述物件名稱〉

  4. 在 MySQL 8.3 mysql 系統資料庫中,不得有與 MySQL 8.4 資料字典使用的表格同名的表格。若要識別具有這些名稱的表格,請執行此查詢

    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)。這也可能需要變更使用受影響表格的應用程式。

  5. 不得有外鍵約束名稱長度超過 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)。

  6. 不得有 sql_mode 系統變數定義的過時 SQL 模式。嘗試使用過時的 SQL 模式會阻止 MySQL 8.4 啟動。應修訂使用過時 SQL 模式的應用程式以避免使用它們。如需在 MySQL 8.4 中移除的 SQL 模式的相關資訊,請參閱 伺服器變更

  7. 不得有明確定義的資料行名稱超過 64 個字元的檢視表(在 MySQL 5.7 中允許最多 255 個字元的資料行名稱)。若要避免升級錯誤,應在升級前變更此類檢視表。目前,識別資料行名稱超過 64 個字元的檢視表的唯一方法是使用 SHOW CREATE VIEW 來檢查檢視表定義。您也可以透過查詢資訊結構描述 VIEWS 表格來檢查檢視表定義。

  8. 不得有個別 ENUMSET 資料行元素超過 255 個字元或 1020 個位元組長度的表格或儲存程序。在 MySQL 8.4 之前,ENUMSET 資料行元素的最大組合長度為 64K。在 MySQL 8.4 中,個別 ENUMSET 資料行元素的最大字元長度為 255 個字元,最大位元組長度為 1020 個位元組。(1020 個位元組的限制支援多位元組字元集)。在升級到 MySQL 8.0 之前,請修改任何超過新限制的 ENUMSET 資料行元素。否則會導致升級失敗並出現錯誤。

  9. 您的 MySQL 8.3 安裝不得使用 MySQL 8.4 不支援的功能。此處的任何變更都必然是特定於安裝的,但下列範例說明要尋找的項目類型

    某些伺服器啟動選項和系統變數已在 MySQL 8.4 中移除。請參閱 MySQL 8.4 中移除的功能,以及 第 1.5 節,〈自 8.0 以來 MySQL 8.4 中新增、棄用或移除的伺服器和狀態變數與選項〉。如果您使用這些選項中的任何一項,則升級需要組態變更。

  10. 如果您打算在升級時將 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 8.4 失敗,伺服器會將所有變更還原至資料目錄。在這種情況下,請移除所有重做日誌檔,並在現有資料目錄上重新啟動 MySQL 8.3 伺服器,以解決錯誤。重做日誌檔(ib_logfile*)預設位於 MySQL 資料目錄中。修復錯誤後,請在再次嘗試升級之前執行慢速關機(透過設定 innodb_fast_shutdown=0)。