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、任何后续次要版本或最新发布版本。

LIMITORDER BY 子句方面的问题

如果在 MySQL 8.0.32 或更低版本中运行查询时使用 LIMITORDER 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 #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 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 中设置的任何手动分配的数据库标志值仍会应用。建议您保留分配给系统标志的默认值。

后续步骤