本页面介绍了在执行从 Cloud SQL for MySQL 5.7 到 Cloud SQL for MySQL 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 bug #82736。
如需解决此问题,请按以下问题排查建议执行操作:
- 更新到 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 8.0 中使用的查询计划可能与 MySQL 5.7 中使用的查询计划不同。
如需了解详情,请参阅 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 5.7 中创建并升级到 MySQL 8.0 的用户可能无法连接到数据库。在这种情况下,用户可能会收到以下错误消息:
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 中设置的任何手动分配的数据库标志值仍会应用。建议您保留分配给系统标志的默认值。