MySQL 8.0 子版本中的已知問題

本頁面說明從 MySQL 適用的 Cloud SQL 5.7 升級至 MySQL 適用的 Cloud SQL 8.0 後,可能會遇到的已知問題和不相容情況。

如要進一步瞭解主要版本升級,請參閱「就地升級主要資料庫版本」。如要進一步瞭解錯誤記錄,請參閱「查看錯誤記錄」。

效能問題

以下各節將說明已知的效能問題。

SELECT DISTINCT 查詢相關問題

如果在 MySQL 8.0.18 至 MySQL 8.0.20 中使用 SELECT DISTINCT 查詢,效能可能會降低。與 MySQL 5.7 相比,查詢執行時間可能需要三倍。

詳情請參閱 MySQL Bug #99593

如要解決這個問題,請按照下列疑難排解建議操作:

  • 更新至 MySQL 8.0.21、任何後續子版本或最新版本。
  • 如果使用 MySQL 8.0.18 至 MySQL 8.0.20,請將 internal_tmp_mem_storage_engine 資料庫旗標的值更新為 memory
        SET SESSION internal_tmp_mem_storage_engine='memory' ;
      

GROUP BY 查詢相關問題

如果在 MySQL 8.0.36 或更早版本中使用 SELECT... GROUP BY 查詢,效能可能會降低,查詢執行時間也會增加。

如果查詢使用 TempTable 引擎,可能會發生這種情況。

詳情請參閱 MySQL 錯誤 #107700

如要解決這個問題,請按照下列建議排解問題:

  • 更新至 MySQL 8.0.37、之後的任何子版本,或最新版本。
  • 如果使用 MySQL 8.0.36 或更早版本,請更新 internal_tmp_mem_storage_engine 資料庫旗標,改用記憶體引擎,而非暫時性資料表引擎:
        SET SESSION internal_tmp_mem_storage_engine='memory' ;
      

執行緒並行程度較低時的問題

如果是在 MySQL 8.0.22 以上版本中建立執行個體,且支援並行執行緒較少的用戶端應用程式,可能會發生效能問題,查詢執行時間也會增加。

MySQL 8.0.22 導入了 innodb_log_writer_threads 標記,可提升高並行系統的效能。這項標記預設為啟用。如果您在 MySQL 8.0.22 以上版本中建立的執行個體支援低並行執行緒的用戶端應用程式,建議停用 innodb_log_writer_threads 旗標。

詳情請參閱 MySQL Bug #93734

JOINS 相關問題

如果您在 MySQL 8.0.29 至 MySQL 8.0.32 版本的執行個體中使用 JOIN 查詢搭配 eq_ref 檢視畫面,可能會遇到嚴重的效能問題。

詳情請參閱 MySQL Bug #109361

如要解決這個問題,請更新至 MySQL 8.0.33、任何後續子版本或最新版本。

LIMITORDER BY 子句的問題

如果在 MySQL 8.0.32 或更早版本中,使用 LIMITORDER BY 子句執行查詢,可能會遇到效能問題。在某些情況下,與 MySQL 5.7 相比,MySQL 8.0 可能會對相同查詢使用不同的查詢計畫。

詳情請參閱「MySQL 8.0.33 的變更」。

如要解決這個問題,請更新至 MySQL 8.0.33、任何後續子版本或最新版本。

MySQL 8.0 中的記憶體流失問題

下列章節將說明 MySQL 8.0 以上版本中的已知記憶體洩漏問題。 這些問題也可能影響執行個體效能。

範圍查詢導致的記憶體流失

如果在執行個體中使用範圍最佳化工具,且執行個體搭載 MySQL 8.0.16 至 MySQL 8.0.28,則程式碼檔案和函式 memory/sql/THD::main_mem_root 可能會耗用大量記憶體。這可能會導致執行個體記憶體不足 (OOM)。

詳情請參閱 MySQL Bug #105331

如要解決這個問題,請更新至 MySQL 8.0.29、之後的任何次要版本,或是最新版本。

與預存程序相關的記憶體流失

如果您在 MySQL 8.0.27 至 8.0.31 版本的執行個體中,於預存程序執行查詢,則查詢可能會耗用 memory/sql/sp_head::execute_mem_root 程式碼檔案和函式下的大量記憶體。

詳情請參閱 MySQL Bug #107327

如要解決這個問題,請更新至 MySQL 8.0.32、任何後續子版本或最新版本。

使用 SELECT 存取檢視區塊時導致的記憶體流失

如果您在 MySQL 8.0.35 或更早版本中使用 SELECT 查詢,且應用程式使用大量檢視呼叫,則可能會發生明顯的記憶體洩漏問題。

此外,如果 DEFINER 檢視區塊設為 root@'%' 或衍生自 cloudsqlsuperuser 角色的使用者,可能會發生記憶體洩漏問題。這是因為 cloudsqlsuperuser 角色具有部分撤銷權限。

詳情請參閱 MySQL Bug #103133

如要解決這個問題,請按照下列疑難排解建議操作:

  • 更新至 MySQL 8.0.36、之後的任何子版本,或最新版本。
  • 如果使用 MySQL 8.0.35 或更早版本,請為DEFINER檢視畫面使用個別使用者,特別是沒有部分撤銷權限的使用者。如果必須使用 root@'%' 使用者或 cloudsqlsuperuser 角色,請確保只將這些角色用於管理程序,而非應用程式查詢。如果記憶體洩漏問題持續發生,請務必升級至 MySQL 8.0.36、後續任何子版本或最新版本。

複製問題

下節說明複寫相關的已知問題。

平行複製相關問題

如果多執行緒副本啟用 slave_preserve_commit_order 元件,並使用平行複製功能,且執行個體用於高寫入工作負載,則執行個體作業可能會因死結和累積的複製延遲時間而無限期暫停。

MySQL 8.0.27 至 MySQL 8.0.32 之間會發生這個問題。

詳情請參閱 MySQL Bug #95863MySQL Bug #103636

如要解決這個問題,請按照下列建議排解問題:

  • 更新至 MySQL 8.0.33、任何後續子版本或最新版本。
  • 停用平行複製功能,有助於確認問題原因,然後安排適當的升級時間。雖然停用平行複製功能可以暫時解決問題,但我們不建議將此做為長期解決方案。

權限問題

下列各節將討論與權限相關的已知問題。

權限變更

MySQL 已變更 MySQL 8.0 中的安全性和帳戶管理系統

升級至 MySQL 8.0 後,在 MySQL 5.7 中建立的使用者可能不會具備與在 MySQL 8.0 中建立的使用者相同的權限和存取權。因此,在下列情況下,MySQL 5.7 中建立的使用者可能會收到存取遭拒的錯誤訊息:

  • 從 MySQL 5.7 升級的使用者可能沒有 CREATE ROLEDROP ROLE 權限,因為這些權限在 MySQL 5.7 中不存在。
  • 從 MySQL 5.7 升級的使用者可能無法執行 KILL 指令,因為現在需要 CONNECTION_ADMIN 權限才能在 MySQL 8.0 中運作。

如要瞭解詳情,請參閱 MySQL 8.0 中可用的所有權限

錯誤訊息範例如下:

    ERROR 1227 (42000): Access denied; you need (at least one of) the GRANT OPTION privilege(s) for this operation
  

您無法直接將任何更新後的權限指派給現有使用者。 如要解決這個問題,請在升級後,由具備 GRANT OPTION 權限的管理員重設使用者權限,完成主要版本升級。

詳情請參閱「就地升級資料庫主要版本」。

權限變更導致「存取遭拒」錯誤

在升級至 MySQL 8.0 的 MySQL 5.7 中建立的使用者,可能因權限問題而無法連線至資料庫。在這種情況下,使用者可能會收到下列錯誤訊息:

    Access denied for user 'USER_NAME'@'%' to database 'MY_DATABASE_NAME' ;
  

Mysql 8.0.16 導入 partial_revokes 資料庫旗標,並預設啟用,因此可以部分撤銷使用者權限

如果 MySQL 5.7 中建立的使用者是使用萬用字元定義,這些使用者可能無法連線至資料庫。MySQL 8.0.16 以上版本不再支援萬用字元。這表示 MySQL 無法找到資料庫和使用者的完全相符項目,因此升級時可能會遺漏部分現有的權限指派。

這個問題會影響 MySQL 8.0.16 以上版本。

詳情請參閱「設定資料庫旗標」和「安全性與帳戶管理」。

如要解決這個問題,管理員必須在 MySQL 8.0 中手動指派權限給使用者。

MySQL 5.7 和 MySQL 8.0 之間的標記值變更

從 MySQL 5.7 升級至 MySQL 8.0 時,由於版本間的預設值有所變更,部分資料庫旗標值可能會隨之變更。這種行為可能會導致效能問題。

詳情請參閱「MySQL 8.0 中的新預設值」。

如要解決這個問題,請確認升級至 MySQL 8.0 以上版本後,MySQL 5.7 中手動指派的資料庫旗標值仍會套用。建議保留指派給系統旗標的預設值。

後續步驟