诊断问题

本页面列出了您在使用 Cloud SQL 实例时可能遇到的常见问题,同时介绍了可用于解决这些问题的步骤。另请参阅已知问题问题排查支持页面页面。

查看日志

要查看有关近期操作的信息,您可以查看 Cloud SQL 实例操作日志MySQL 错误日志

实例无响应

如果您的实例停止响应连接或者性能下降,请确保该实例符合操作指南。如果该实例不符合这些指南中的要求,则不在 Cloud SQL SLA 覆盖范围内。

连接问题

请参阅调试连接问题页面或问题排查页面中的连接部分,以获取有关连接问题的帮助。

实例问题

备份

为使备份实现最佳性能,请将表数量保持在合理范围内。

对于其他备份问题,请参阅问题排查页面中的备份部分。

导入和导出

Cloud SQL 中的导入和导出与使用 mysqldump 实用程序相同,只不过在 Cloud SQL 导入/导出功能中,您使用 Cloud Storage 存储桶来转移数据。

导入和导出 Cloud SQL 可能需要很长时间才能完成,具体取决于要处理的数据大小。这可能产生以下影响:

  • 您无法停止长时间运行的 Cloud SQL 实例操作。
  • 针对每个实例,一次只能执行一项导入或导出操作,而长时间运行的导入或导出操作会阻止其他操作,例如每日自动备份。无服务器导出功能使您可以运行其他操作,包括修改实例、导入、故障切换以及取消阻止每日自动备份。

对小批量数据使用 Cloud SQL 导入或导出功能可以缩短每项操作的完成时间。

对于导出,您可以从读取副本执行导出,或使用无服务器导出功能最大限度地降低对数据库性能的影响,并允许在导出时对实例执行其他操作。

导入时还应注意的其他事项:

  • 如果导入操作崩溃,原因可能是出现了内存不足 (OOM) 错误。 如果是这种情况,您可以尝试直接使用 MySQL 命令来添加 --extended-insert=FALSE --complete-insert 参数。这些参数会降低导入速度,但同时也会减少导入所需的内存量。

有关其他导入和导出问题,请参阅问题排查页面中的导入和导出部分。

磁盘空间

如果您的实例达到了允许的最大存储量,则对数据库的写入将失败。如果您删除数据(例如删除表),释放的空间不会反映在实例报告的已用存储空间中。如需了解此行为的说明,请参阅“如何在删除某个表后收回相应空间?”这一常见问题解答。

达到最大存储空间限制还可能会导致实例在重启时卡住。

避免数据损坏

避免生成的列

由于 MySQL 中的一个问题,使用生成的列可能导致数据损坏。如需了解详情,请参见 MySQL 错误 #82736

正常关停

Cloud SQL 关停实例(例如出于维护原因)时,不会向该实例发送新连接,并且现有连接会终止。关停 mysqld 的时间上限为 1 分钟。如果在该时间段内关停未完成,系统会强制停止 mysqld 进程。这可能导致磁盘写入半路中止。

数据库引擎

InnoDB 是 MySQL 实例唯一支持的存储引擎,因为与 MyISAM 等其他 MySQL 存储引擎相比,它在防止表损坏方面的能力更强。

默认情况下,Cloud SQL 数据库表是使用 InnoDB 存储引擎创建的。如果您的 CREATE TABLE 语法包含一个指定 InnoDB 以外的存储引擎的 ENGINE 选项(例如 ENGINE = MyISAM),则表不会被创建,并且您会看到类似于如下示例的错误消息:

ERROR 3161 (HY000): Storage engine MyISAM is disabled (Table creation is disallowed).

您可以通过从 CREATE TABLE 命令中移除 ENGINE = MyISAM 选项来避免此错误。该操作会使用 InnoDB 存储引擎创建表。

对系统表的更改

MySQL 系统表使用包括 mysql 数据库中所有表(例如 mysql.usermysql.db)的 MyISAM 存储引擎。这些表非常容易受到异常关停的影响;对这些表进行更改后,请发出 FLUSH CHANGES 命令。如果出现 MyISAM 损坏,CHECK TABLEREPAIR TABLE 可使表恢复到良好状态(但不会保存数据)。

全局事务标识符 (GTID)

所有 MySQL 实例都自动启用了 GTID。启用 GTID 可防止副本创建和故障切换期间发生数据丢失,并使复制更具可靠性。然而,正如 MySQL 手册中所述,MySQL 会对 GTID 施加某些限制。以下事务性不安全操作不能在启用了 GTID 的 MySQL 服务器上执行:

  • CREATE TABLE ... SELECT 语句;
  • 事务内的 CREATE TEMPORARY TABLE 语句;
  • 同时影响事务性和非事务性表的事务或语句。

如果您使用事务性不安全的事务,则会看到类似以下示例的错误消息:

 Exception: SQLSTATE[HY000]: General error: 1786
 CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.

使用触发器和存储的函数

如果实例启用了二进制日志记录,并且您需要使用触发器或存储的函数,请确保实例的 log_bin_trust_function_creators 标志已设置为 on

暂停状态

Cloud SQL 可能会因下列各种原因而暂停实例,包括:

  • 结算问题

    例如,如果项目的结算账号所用的信用卡已过期,该实例可能会暂停。您可以通过转到 Google Cloud 控制台结算页面、选择项目并查看项目所用的结算账号信息,来检查项目的结算信息。解决结算问题后,实例将在几小时内恢复为可运行状态。

  • Cloud Key Management Service 的密钥问题

    例如,如果用于加密 Cloud SQL 实例中的用户数据的 Cloud KMS 密钥版本不存在,密钥的访问权限已被撤消,或者密钥已被停用或删除。如需了解详情,请参阅使用客户管理的加密密钥 (CMEK)

  • 法律问题

    例如,违反 Google Cloud 使用限制政策可能会导致实例被暂停。如需了解详情,请参阅 Google Cloud 服务条款中的“暂停和移除”。

  • 操作问题

    例如,如果某个实例陷于崩溃循环之中(在启动时或刚启动后就崩溃),则 Cloud SQL 可能会暂停该实例。

实例暂停后,您可以继续查看有关它的信息,或者删除该实例(如果暂停是由结算问题触发)。

拥有白金级、黄金级或白银级支持套餐的 Cloud SQL 用户可就已暂停的实例直接与我们的支持团队联系。所有用户都可以使用上述指导信息以及 google-cloud-sql 论坛。

性能

概览

Cloud SQL 支持对性能要求高的工作负载 - 最高可支持 60000 IOPS,且不会产生额外的 I/O 成本。IOPS 和吞吐量性能取决于磁盘大小、实例的 vCPU 数量和 I/O 块大小等诸多因素。

实例的性能还取决于所选存储类型和工作负载。

详细了解以下内容:

启用查询日志

要优化查询性能,您可以向实例添加数据库标志 --log_output='FILE'--slow_query_log=on,从而将 Cloud SQL 配置为对慢速查询进行日志记录。 这样您便可以使用 Google Cloud Console 中的日志查看器阅读日志输出内容。请注意,您需要支付 Google Cloud Observability 日志记录费用

请勿将 log_output 设置为 TABLE。否则,可能导致关于使用标志的提示中所述的连接问题。

如需了解如何使用 Cloud Logging 和 Monitoring 记录和监控 Cloud SQL for MySQL 慢查询,您可以参阅此教程

启用锁监控

InnoDB 监控提供有关 InnoDB 存储引擎内部状态的信息,您可使用这些信息来优化性能。

使用 MySQL 客户端访问实例,并获取按需监控输出:

SHOW ENGINE INNODB STATUS\G

有关监控输出中各部分的说明,请参阅 InnoDB 标准监控和锁监控输出

您可启用 InnoDB 监控,以便将输出定期生成为文件或表(此时性能会降低)。如需了解详情,请参阅启用 InnoDB 监控

使用性能架构

MySQL 性能架构是一项用于在较低级别监控 MySQL 服务器执行的功能。如需使用 performance_schema 中生成的统计信息,最方便的方式是通过 MySQL Workbench 效果报告功能。

保持合理数量的数据库表

数据库表会消耗系统资源。数量大可能影响实例性能和可用性,并导致实例损失 SLA 覆盖率。了解详情

一般性能提示

. 对于速度缓慢的数据库插入、更新或删除操作,请考虑以下操作:
  • 检查写入者和数据库的位置;长距离发送数据会导致延迟。

如果数据库选择操作缓慢,请注意以下事项:

  • 缓存对于读取性能非常重要。请比较您的数据集大小与实例的 RAM 大小。理想情况下,整个数据集不超过实例的 RAM 大小的 70%。在这种情况下,查询不会受到 IO 性能限制。否则,请考虑增加实例 RAM 的大小。
  • 如果您的工作负载包含要占用大量 CPU 的查询(排序、正则表达式、其他复杂函数),则您的实例可能受到限制;此时请增加 vCPU 的数量。
  • 检查读取者和数据库的位置;相对于写入性能,延迟对读取性能的影响更大。
  • 探索非 Cloud SQL 特定的性能改进方式,例如添加适当的索引、减少扫描的数据以及避免额外的往返。
  • 如果您发现执行查询时性能欠佳,请使用 EXPLAIN。EXPLAIN 是您添加到其他语句(如 SELECT)中的语句,它会返回 MySQL 如何执行该语句的相关信息。它与 SELECT、DELETE、INSERT、REPLACE 和 UPDATE 搭配使用。例如 EXPLAIN SELECT * FROM myTable;

    使用 EXPLAIN 来确定您可在何处:

    • 将索引添加到表,以提高查询性能。例如,请确保用作 JOIN 键的每个字段在两个表上都具有索引。

    • 改进 ORDER BY 操作。如果 EXPLAIN 在输出的 Extra 列中显示“Using temporary; Using filesort”,则中间结果将存储在一个随后会进行排序的文件中,这通常会导致性能欠佳。这种情况下,请执行以下步骤之一:

      • 如果可能,使用索引,而不要使用排序。如需了解详情,请参阅 ORDER BY 优化

      • 增加查询会话的 sort_buffer_size 变量的大小。

      • 通过仅将列声明为所需的大小来减少每行使用的 RAM。

    问题排查

    对于其他 Cloud SQL 问题,请参阅问题排查页面。

    错误消息

    如需了解具体的 API 错误消息,请参阅错误消息参考页面。

    排查客户管理的加密密钥 (CMEK) 问题

    由于 Cloud KMS 错误以及缺少角色或权限,Cloud SQL 管理员操作(例如创建、克隆或更新)可能会失败。常见的失败原因如下:缺少 Cloud KMS 密钥版本;Cloud KMS 密钥版本已被停用或被销毁;IAM 权限不足,无法访问 Cloud KMS 密钥版本;或者 Cloud KMS 密钥版本与 Cloud SQL 实例位于不同的区域。请使用以下问题排查表来诊断和解决常见问题。

    CMEK 问题排查表

    错误… 可能的问题… 请尝试以下操作…
    找不到各项产品和项目的服务账号 服务账号名称不正确。 确保您已为正确的用户项目创建了服务账号。

    转到“服务账号”页面

    无法向服务账号授予访问权限 用户账号无权授予对此密钥版本的访问权限。 为您的用户或服务账号添加 Organization Administrator 角色。

    转至 IAM 账号页面

    Cloud KMS 密钥版本已被销毁 密钥版本已被销毁。 如果密钥版本遭到销毁,您就无法使用该版本来加密或解密数据。
    Cloud KMS 密钥版本已停用 密钥版本已停用。 重新启用 Cloud KMS 密钥版本。

    转到“加密密钥”页面

    权限不足,无法使用 Cloud KMS 密钥 您用于对 Cloud SQL 实例运行操作的用户或服务账号缺少 cloudkms.cryptoKeyEncrypterDecrypter 角色,或 Cloud KMS 密钥版本不存在。 在托管密钥的 Google Cloud 项目中,为您的用户或服务账号添加 cloudkms.cryptoKeyEncrypterDecrypter 角色。

    转至 IAM 账号页面


    如果您已向您的账号授予此角色,请参阅创建密钥以了解如何创建新的密钥版本。请参阅备注。
    找不到 Cloud KMS 密钥 密钥版本不存在。 创建新的密钥版本。请参阅创建密钥。 请参阅备注。
    Cloud SQL 实例和 Cloud KMS 密钥版本位于不同区域 Cloud KMS 密钥版本和 Cloud SQL 实例必须位于同一区域。如果 Cloud KMS 密钥版本位于全球区域或多区域中,则密钥不起作用。 在要创建实例的同一区域中创建密钥版本。请参阅创建密钥。请参阅备注。
    Cloud KMS 密钥版本已恢复,但实例仍处于暂停状态。 密钥版本已停用或未授予适当的权限。 重新启用密钥版本,并在托管密钥的 Google Cloud 项目中向您的用户或服务账号授予 cloudkms.cryptoKeyEncrypterDecrypter 角色。

    重新加密问题排查表

    错误… 可能的问题… 请尝试以下操作…
    CMEK 资源重新加密失败,因为 Cloud KMS 密钥无法访问。请确保已启用主密钥版本,且已正确授予权限。 密钥版本已停用或未授予适当的权限。

    重新启用 Cloud KMS 密钥版本:

    进入“加密密钥”页面

    在托管密钥的 Google Cloud 项目中,确认已向您的用户或服务账号授予 cloudkms.cryptoKeyEncrypterDecrypter 角色:

    转至 IAM 账号页面

    由于服务器内部错误,CMEK 资源重新加密失败。请稍后重试 服务器内部错误。 重试重新加密。如需了解详情,请参阅重新加密现有的启用了 CMEK 的实例或副本