MySQL 8.0 次要版本中的已知问题

本页面介绍了在执行从 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 中设置的任何手动分配的数据库标志值仍会应用。建议您保留分配给系统标志的默认值。

后续步骤