本頁面說明從 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、任何後續子版本或最新版本。
LIMIT 和 ORDER BY 子句的問題
如果在 MySQL 8.0.32 或更早版本中,使用 LIMIT 和 ORDER 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 #95863 和 MySQL 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 ROLE和DROP 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 中手動指派的資料庫旗標值仍會套用。建議保留指派給系統旗標的預設值。