本页面列出了您在使用 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.user
和 mysql.db
)的 MyISAM 存储引擎。这些表非常容易受到异常关停的影响;对这些表进行更改后,请发出 FLUSH CHANGES
命令。如果出现 MyISAM 损坏,CHECK TABLE
和 REPAIR 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 的数量。
如果您发现执行查询时性能欠佳,请使用 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 角色。
|
Cloud KMS 密钥版本已被销毁 | 密钥版本已被销毁。 | 如果密钥版本遭到销毁,您就无法使用该版本来加密或解密数据。 |
Cloud KMS 密钥版本已停用 | 密钥版本已停用。 | 重新启用 Cloud KMS 密钥版本。 |
权限不足,无法使用 Cloud KMS 密钥 | 您用于对 Cloud SQL 实例运行操作的用户或服务账号缺少 cloudkms.cryptoKeyEncrypterDecrypter 角色,或 Cloud KMS 密钥版本不存在。 |
在托管密钥的 Google Cloud 项目中,为您的用户或服务账号添加 cloudkms.cryptoKeyEncrypterDecrypter 角色。
如果您已向您的账号授予此角色,请参阅创建密钥以了解如何创建新的密钥版本。请参阅备注。 |
找不到 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 项目中,确认已向您的用户或服务账号授予 |
由于服务器内部错误,CMEK 资源重新加密失败。请稍后重试 | 服务器内部错误。 | 重试重新加密。如需了解详情,请参阅重新加密现有的启用了 CMEK 的实例或副本 |