排查 Cloud SQL 问题

本页面包含有关对支持的数据库引擎的 Cloud SQL 问题进行故障排除的提示。其中一些提示仅适用于特定的数据库引擎,而其他提示则适用于所有数据库引擎。

如需了解特定数据库引擎的问题排查提示,请参阅各自的相关页面:

检查您的疑问或问题是否已在以下某个页面中得到解决:

本页面包含以下主题:

备份与恢复

问题 问题排查
您无法查看当前操作的状��。 Google Cloud 控制台仅在操作完成后报告成功或失败,而不会显示警告或其他更新。

运行 gcloud sql operations list 命令以列出给定 Cloud SQL 实例的所有操作。

您想要了解发起按需备份操作的人员。 界面未显示开始操作的用户。

查看日志并按文本进行过滤以查找用户。您可能需要对私密信息使用审核日志。相关日志文件包括:

  • 如果启用了 Cloud Audit Logs,并且您具有查看这些日志的必要权限,那么 cloudaudit.googleapis.com/activity 也可以使用。
实例被删除后,您将无法再备份该实例。

如果您删除实例而没有对数据进行最终备份,则无法恢复数据。但是,如果您恢复实例,Cloud SQL 也会恢复备份。如需详细了解如何恢复已删除的实例,请参阅在删除实例后保留备份。

如果您已完成导出操作,请创建新实例,然后执���导入操作以重新创建数据库。导出数据将写入 Cloud Storage,导入数据从此处进行读取。

自动备份停滞了数小时,无法取消。 备份可能需要很长时间,具体取决于数据库大小。

如果您确实需要取消该操作,可以要求客户服务对实例执行 force restart。

如果 SQL 转储文件中引用的一个或多个用户不存在,恢复操作可能会失败。 在恢复 SQL 转储之前,拥有对象或获得了对转储数据库中的对象权限的所有数据库用户都必须存在于目标数据库中。否则,恢复操作将无法使用原始所有权或权限重新创建对象。

在恢复 SQL 转储之前,先创建数据库用户。

您想要将自动备份的天数从 7 天增加到 30 天,或更长时间。 您可以配置要保留的自动备份的数量。系统会根据配置的保留期限值定期删除自动备份。遗��的是,这也意味着当前可见的备份是所有可以用于恢复的自动备份。

如需无限期地保留备份,您可以创建按需备份,因为它们的删除方式与自动备份不同。按需备份会无限期保留。也就是说,按需备份会一直保留,直到被删除或它们所属的实例被删除为止。由于该类型的备份不会自动删除,因此可能会影响结算。

自动备份失败,但您未收到电子邮件通知。 如需让 Cloud SQL 通知您备份的状态,请配置基于日志的提醒。
实例反复失败,因为它在故障状态和备份恢复状态之间循环。恢复后尝试连接并使用数据库失败。
  • 打开的连接可能过多。造成连接过多的原因可能是由于在连接过程中发生错误,而没有用于清除无效连接的 autovacuum 设置。
  • 如果任何自定义代码使用的重试逻辑不会在几次失败后停止,则可能会发生循环。
  • 流量可能过多。使用连接池和其他最佳连接做法。

可以尝试的操作:

  1. 验证数据库是否是为 autovacuum 设置的。
  2. 检查是否在自定义代码中设置了任何连接重试逻辑。
  3. 关停流量,直到数据库恢复,然后缓慢恢复流量。
您发现执行备份/恢复操作时丢失数据。 表创建为未记录。例如:

CREATE UNLOGGED TABLE ...。

从备份中还原时不包含这些表:

  • 在高可用性实例上,未记录的表的内容无法进行故障切换。
  • 未记录的表在 postgres 崩溃后无法继续存在。
  • 未记录的表不会被复制到读取副本。
  • 在备份还原期间,系统会自动擦除未记录的表。

解决方法是,如果您想要通过备份恢复这些表,请避免使用未记录的表。如果您要从包含未记录的表的数据库进行恢复,则可以将数据库转储到一个文件,并在将转储文件修改为 ALTER TABLE 后将数据重新加载到这些表上的 SET LOGGED。

如果您选择在删除实例时进行最终备份,则无法删除实例。 删除实例时,您需要确认是否要在删除实例之前对实例进行最终备份。如果您使用 final-backup 实例设置启用了最终备份,那么在删除实例时所做的选择必须与您为实例启用最终备份时设置的最终备份实例配置相匹配。如需缓解此问题,请执行以下其中一项操作:
  • 将最终备份值设置为与实例的现有备份配置一致。
  • 删除实例时,将“最终备份”字段留空。如果您将此字段留空,Cloud SQL 会采用实例设置中设置的最终备份配置来执行最终备份并定义其保留期限。
如需查看实例的最终备份实例配置,请参阅查看实例信息。
在成功创建具有最终备份设置的主实例后,无法创建副本实例。 如果您创建的新实例启用了最终备份实例设置,则必须更新最终备份组织政策,以仅将备份配置应用于主实例。 副本实例不支持最终备份。
如需了解详情,请参阅 Cloud SQL 组织政策。

克隆

问题 问题排查
克隆失败并显示 constraints/sql.restrictAuthorizedNetworks 错误。 克隆操作被 Authorized Networks 配置阻止。在 Google Cloud 控制台的“连接”部分中为公共 IP 地址配置了 Authorized Networks,并且出于安全考虑,不允许克隆。

如果可以,请移除 Cloud SQL 实例中的所有 Authorized Networks 条目。否则,请创建副本(不包含 Authorized Networks 条目)。

错误消息:Failed to create subnetwork. Couldn't find free blocks in allocated IP ranges. Please allocate new ranges for this service provider. Help Token: [help-token-id].

您正尝试使用 Google Cloud 控制台克隆具有专用 IP 地址的实例,但您未指定要使用的已分配 IP 范围,并且未创建具有指定范围的来源实例。因此,克隆的实例是在随机范围内创建的。

使用 gcloud 克隆实例,并为
--allocated-ip-range-name 参数提供值。如需了解详情,请参阅克隆具有专用 IP 的实例。

连接

问题 问题排查
Aborted connection。 可能的问题:
  • 网络不稳定。
  • 没有对 TCP keep-alive 命令的响应(客户端或服务器无响应,可能超载)。
  • 超出了数据库引擎的连接生命周期,服务器终止了该连接。

应用必须能够容忍网络故障并遵循最佳做法,例如连接池和重试。大多数连接池程序会尽可能捕获这些错误。否则,应用必须正常重试或失败。

对于连接重试,我们建议使用以下方法:

  1. 指数退避算法。以指数方式增加每次重试之间的时间间隔。
  2. ���外,���加随机退避时间。

结合使用这些方法有助于减少限制。

错误消息:Login failed for user "" 您可能会在 Microsoft Entra ID 身份验证期间遇到此登录错误。 如需解决此问题,请确保此 Microsoft Entra ID 用户存在 SQL Server 登录名。
专用 IP 实例的网络连接问题 在集成设置过程中,您可能会遇到以下一些问题:
  • 创建 Microsoft Entra ID 登录名的操作缓慢
  • 无法创建 Microsoft Entra ID 登录名
  • 无法使用 Microsoft Entra ID 身份验证连接到实例

如需详细了解如何帮助解决这些问题,请参阅排查 Microsoft Entra ID 集成问题。

FATAL: database 'user' does not exist。 gcloud sql connect --user 仅适用于默认的 postgres 用户。

使用默认用户进行连接,然后更改用户。

您想知道是谁处于连接状态。 登录到数据库并运行以下命令:

SELECT datname,
usename,
application_name as appname,
client_addr,
state,
now() - backend_start as conn_age,
now() - state_change as last_activity_age
FROM pg_stat_activity
WHERE backend_type = 'client backend'
ORDER BY 6 DESC
LIMIT 20
   

创建实例

问题 问题排查
错误消息:The zone or region does not have sufficient resources to handle the request at the moment.

在发出实例创建请求时,所选可用区缺少所请求资源或虚拟机类型的容量。 在请求时,该特定区域位置可能同时存在较高的运营需求。

如需解决此问题,请在其他可用区中重新尝试创建实例,或在一天中的其他时间在收到错误的同一可用区中重新尝试创建实例。

错误消息:Failed to create subnetwork. Couldn't find free blocks in allocated IP ranges. Please allocate new ranges for this service provider。 分配的 IP 范围中没有更多的可用地址。可能存在多种潜在情况:
  • 专用服务连接所分配 IP 地址范围的大小小于 /24。
  • 专用服务连接所分配 IP 地址范围的大小对于 Cloud SQL 实例数量而��太小。
  • 如果在多个区域中创建实例,则分配的 IP 地址范围大小要求将更大。请参阅分配的范围大小。

如需解决此问题,您可以扩展现有已分配的 IP 范围,也可以为专用服务连接分配其他 IP 范围。如需了解详情,请参阅分配 IP 地址范围。

如果您在创建 Cloud SQL 实例时使用 --allocated-ip-range-name 标志,则只能扩大指定的 IP 地址范围。

如果您要分配新范围,请注意分配的范围不会与任何现有的分配范围重叠。

创建新的 IP 地址范围后,使用以下命令更新 VPC 对等互连:

gcloud services vpc-peerings update \
--service=servicenetworking.googleapis.com \
--ranges=OLD_RESERVED_RANGE_NAME,NEW_RESERVED_RANGE_NAME \
--network=VPC_NETWORK \
--project=PROJECT_ID \
--force
    

如果要扩大现有的分配范围,请注意只能扩大分配范围,不能缩减分配范围。例如,如果原始分配范围是 10.0.10.0/24,则新分配范围至少为 10.0.10.0/23。

一般来说,如果从 /24 分配范围开始,对于每个条件(额外的实例类型组、额外的区域),将“/子网掩码位数”递减 1 是一种较好的做法。例如,如果尝试在同一分配范围中创建两个实例类型组,则从 /24 递减到 /23 就足够了。

扩大现有 IP 地址范围后,使用以下命令更新 VPC 对等互连:

gcloud services vpc-peerings update \
--service=servicenetworking.googleapis.com \
--ranges=RESERVED_RANGE_NAME \
--network=VPC_NETWORK \
--project=PROJECT_ID
    
错误消息:Failed to create subnetwork. Router status is temporarily unavailable. Please try again later. Help Token: [token-ID]。 尝试再次创建 Cloud SQL 实例。
错误消息:HTTPError 400: Invalid request: Incorrect Service Networking config for instance: PROJECT_ID:INSTANCE_NAME:SERVICE_NETWORKING_NOT_ENABLED.

使用以下命令启用 Service Networking API,然后尝试再次创建 Cloud SQL 实例。

gcloud services enable servicenetworking.googleapis.com \
--project=PROJECT_ID
    
错误消息:Failed to create subnetwork. Required 'compute.projects.get' permission for PROJECT_ID。 当您使用专用 IP 地址创建实例时,系统会使用 Service Networking API 即时创建一个服务账号。如果您是最近才启用了 Service Networking API,则服务账号可能无法创建,实例创建会失败。在这种情况下,您必须等待服务账号在整个系统中传播,或使用所需权限手动添加。
错误消息:More than 3 subject alternative names are not allowed. 您尝试使用自定义 SAN 向 Cloud SQL 实例的服务器证书添加三个以上的 DNS 名称。您最多只能为实例添加三个 DNS 名称。
错误消息:Subject alternative names %s is too long. The maximum length is 253 characters. 请确保您要添加到 Cloud SQL 实例的服务器证书中的所有 DNS 名称的字符数不超过 253 个。
错误消息:Subject alternative name %s is invalid.

验证您要添加到 Cloud SQL 实例的服务器证书的 DNS 名称是否符合以下条件:

  • 不包含通配符。
  • 不包含尾随点。
  • DNS 名称符合 RFC 1034 规范。

导出

问题 问题排查
HTTP Error 409: Operation failed because another operation was already in progress. 您的实例已有一项待处理的操作。一次只能执行一项操作。在当前操作完成后尝试您的请求。
HTTP Error 403: The service account does not have the required permissions for the bucket. 确保存储桶已存在,并且 Cloud SQL 实例(正在执行导出)的服务账号具有 Storage Object Creator 角色 (roles/storage.objectCreator) 以允许导出到存储桶。请参阅适用于 Cloud Storage 的 IAM 角色。
CSV 导出成功,但 SQL 导出失败。 CSV 和 SQL 格式的导出方式不同。SQL 格式会导出整个数据库,可能需要较长的时间才能完成。CSV 格式可让您定义要导出的数据库元素。

使用 CSV 导出以仅导出您需要的文件。

导出时间太长。 Cloud SQL 不支持并发同步操作。

使用导出分流。概括来讲,在进行导出分流时,Cloud SQL 会启动一个分流实例来执行导出,而不是在源实例上发起导出。导出分流具有多项优势,包括可提高源实例的性能,以及在导出操作期间取消屏蔽管理操作。使用导出分流时,总延迟时间会增加,因为启动分流实例需要时间。通常,对于规模合理的导出,延迟时间并不明显。但是,如果导出作业足够小,那么您可能会注意到延迟时间有所增加。

创建扩展程序错误。 转储文件包含对不受支持的扩展程序的引用。

修改转储文件以移除引用。

使用 pg_dumpall 时出错。 使用带有 --global 标志的 pg_dumpall 实用程序需要超级用户角色,但 Cloud SQL 不支持此角色。为防止在执行包含用户名的导出操作时发生错误,请同时使用 --no-role-passwords 标志。
导出操作在导出任何内容之前超时,并显示错误消息 Could not receive data from client: Connection reset by peer. 如果 Cloud Storage 在特定时间范围内(通常是大约七分钟内)未收到任何数据,则连接会重置。初始导出查询的运行时间可能过长。

使用 pg_dump 工具执行手动导出。

您希望自动执行导出。 Cloud SQL 不提供自动执行导出的方法。

您可以使用 Cloud Scheduler、Pub/Sub 和 Cloud Run functions 等 Google Cloud产品构建自己的自动导出系统,类似自动备份一文所述。

外部主实例

问题 问题排查
Lost connection to MySQL server during query when dumping table。 来源可能不可用,或者转储包含的数据包过大。

确保外部主实例可供连接。您还可以修改源实例上的 net_read_timeout 和 net_write_timeout 标志的值,以停止出现此错误。如需详细了解这些标志的允许值,请参阅配置数据库标志。

如需详细了解如何使用 mysqldump 标志进行托管式导入迁移,请参阅允许和默认的初始同步标志

初始数据迁移成功,但未复制任何数据。 一个可能的根本原因是源数据库已定义了复制标志,导致部分或所有数据库更改没有被复制。

确保没有以冲突的方式设置 binlog-do-db、binlog-ignore-db、replicate-do-db 或 replicate-ignore-db 等复制标志。

在主实例上运行 show master status 命令以查看当前设置。

初始数据迁移成功,但一段时间后数据复制停止工作。 可以尝试的操作:

  • 在 Google Cloud 控制台的 Cloud Monitoring 部分中查看副本实例的复制指标。
  • MySQL IO 线程或 SQL 线程中的错误可以在 mysql.err log 文件的 Cloud Logging 中找到。
  • 在连接到副本实例时,也可能会发现此错误。 运行 SHOW SLAVE STATUS 命令,并在输出中检查以下字段:
    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error
mysqld check failed: data disk is full。 副本实例的数据磁盘已满。

增加副本实例的磁盘大小。 您可以手动增加磁盘大小或启用存储空间自动扩容功能。

外部副本

问题 问题排查
错误消息:The slave is connecting ... master has purged binary logs containing GTIDs that the slave requires。 主 Cloud SQL 实例具有自动备份和二进制日志,并且启用了时间点恢复,因此它应该具有副本可以捕获的足够的日志。但在这种情况下,虽然存在二进制日志,但副本不知道从哪个行开始读取。

使用正确的标志设置创建一个新的转储文件,并使用该文件配置外部副本

  1. 通过 Compute Engine 实例连接到您的 mysql 客户端。
  2. 运行 mysqldump 并使用 --master-data=1 和 --flush-privileges 标志。

    重要提示:请勿添加 --set-gtid-purged=OFF 标志。

    了解详情。

  3. 确保刚创建的转储文件包含 SET @@GLOBAL.GTID_PURGED='...' 行。
  4. 将转储文件上传到 Cloud Storage 存储桶,然后使用转储文件配置副本。

标志

问题 问题排查

高可用性

问题 问题排查
找不到手动故障切换的指标。 只有自动故障切换会纳入指标。
Cloud SQL 实例资源(CPU 和 RAM)使用率接近 100%,导致高可用性实例发生故障。 实例机器大小对于负载而言过小。

对实例进行修改以升级为更大的机器,从而获得更多 CPU 和内存。

导入

问题 问题排查
HTTP Error 409: Operation failed because another operation was already in progress。 您的实例已有一项待处理的操作。一次只能执行一项操作。在当前操作完成后尝试您的请求。
导入操作花费的时间太长。 过多的有效连接可能会干扰导入操作。

关闭未使用的操作。检查 Cloud SQL 实例的 CPU 和内存用量,以确保有大量的可用资源。确保将最多资源用于导入操作的最佳方法是在开始执行操作之前重启实例。

重启后,系统会执行以下操作:

  • 关闭所有连接。
  • 结束任何可能正在消耗资源的任务。
如果转储文件中引用的一个或多个用户不存在,导入操作可能会失败。 在导入转储文件之前,拥有对象或获得了对转储数据库中的对象权限的所有数据库用户都必须存在于目标数据库中。否则,导入操作将无法使用原始所有权或权限重新创建对象。

在导入之前,先创建数据库用户。

导入操作因表不存在而失败。 表可以与其他表有外键依赖关系,根据操作的顺序,其中一个或多个表可能在导入操作期间还不存在。

可以尝试的操作:

在转储文件的开头添加以下行:

SET FOREIGN_KEY_CHECKS=0;
  

此外,请在转储文件的末尾添加以下行:

SET FOREIGN_KEY_CHECKS=1;
  

这些设置会在导入操作执行期间停用数据完整性检查,并在加载数据后重新激活数据完整性检查。这不会影响数据库中数据的完整性,因为数据在创建转储文件期间已经过验证。

与 Vertex AI 集成

问题 问题排查
错误消息:Google ML Integration API is not supported on shared core instance. Please upsize your machine type. 如果您为实例的机器类型选择了共享核心,则无法在 Cloud SQL 中启用 Vertex AI 集成。将机器类型升级到专用核心。如需了解详情,请参阅机器类型。
错误消息:Google ML Integration is unsupported for this maintenance version. Please follow https://cloud.google.com/sql/docs/mysql/self-service-maintenance to update the maintenance version of the instance. 如需在 Cloud SQL 中启用 Vertex AI 集成,实例的维护版本必须为 R20240130 或更高版本。如需将实例升级到此版本,请参阅自助维护。
错误消息:Cannot invoke ml_predict_row if 'cloudsql.enable_google_ml_integration' is off. cloudsql.enable_google_ml_integration 数据库标志已关闭。Cloud SQL 无法与 Vertex AI 集成。

如需启用此标志,请使用 gcloud sql instances patch 命令:

gcloud sql instances patch INSTANCE_NAME --database-flags cloudsql.enable_google_ml_integration=on

将 INSTANCE_NAME 替换为 Cloud SQL 主实例的名称。
错误消息:Failed to connect to remote host: Connection refused. Cloud SQL 与 Vertex AI 之间的集成未启用。如需启用此集成,请使用 gcloud sql instances patch 命令:

gcloud sql instances patch INSTANCE_NAME
--enable-google-ml-integration


将 INSTANCE_NAME 替换为 Cloud SQL 主实例的名称。
错误消息:Vertex AI API has not been used in project PROJECT_ID before or it is disabled. Enable it by visiting /apis/api/aiplatform.googleapis.com/overview?project=PROJECT_ID then retry. 未启用 Vertex AI API。如需详细了解如何启用此 API,请参阅启用数据库与 Vertex AI 的集成。
错误消息:Permission 'aiplatform.endpoints.predict' denied on resource. 系统未向 Cloud SQL 实例所在项目的 Cloud SQL 服务账号添加 Vertex AI 权限。如需详细了解如何向该服务账号添加这些权限,请参阅授予 Cloud SQL 服务账号访问 Vertex AI 的 Identity and Access Management (IAM) 权限。
错误消息:Publisher Model `projects/PROJECT_ID/locations/REGION_NAME/publishers/google/models/MODEL_NAME` not found. Vertex AI 中不存在机器学习模型或 LLM。
错误消息:Resource exhausted: grpc: received message larger than max. Cloud SQL 传递�� Vertex AI 的请求大小超过 gRPC 限制(每个请求 4 MB)。
错误消息:Cloud SQL attempts to send a request to Vertex AI. However, the instance is in the %s region, but the Vertex AI endpoint is in the %s region. Make sure the instance and endpoint are in the same region. Cloud SQL 尝试向 Vertex AI 发送请求。但是,实例位于一个区域,而 Vertex AI 端点位于其他区域。如需解决此问题,实例和端点必须位于同一区域。
错误消息:The Vertex AI endpoint isn't formatted properly. Vertex AI 端点的格式不正确。如需了解详情,请参阅使用专用端点进行在线预测。
错误消息:Quota exceeded for aiplatform.googleapis.com/online_prediction_requests_per_base_model with base model: textembedding-gecko. Cloud SQL 传递给 Vertex AI 的请求数超过了每个项目每个模型每个区域每分钟 1,500 个请求的限制。

关联的服务器

错误消息 问题排查
Msg 7411, Level 16, State 1, Line 25

Server 'LINKED_SERVER_NAME' is not configured for DATA ACCESS.
DataAccess 选项已停用。运行以下命令以启用数据访问权限:
EXEC sp_serveroption
    @server='LINKED_SERVER_NAME',
    @optname='data access',
    @optvalue='TRUE'

将 LINKED_SERVER_NAME 替换为关联服务器的名称。

Access to the remote server is denied because no login-mapping exists. (Microsoft SQL Server, Error: 7416) 如果您在建立加密连接时遇到该问题,则需要在访问关联的服务器时尝试以其他方式提供用户 ID。要执行此操作,请运行以下命令:
EXEC master.dbo.sp_addlinkedserver
   @server = N'LINKED_SERVER_NAME',
   @srvproduct= N'',
   @provider= N'SQLNCLI',
   @datasrc= N'TARGET_SERVER_ID',
   @provstr= N'Encrypt=yes;TrustServerCertificate=yes;User ID=USER_ID'

替换以下内容:

  • 将 LINKED_SERVER_NAME 替换为关联服务器的名称。
  • 将 TARGET_SERVER_ID 替换为目标服务器的名称,或目标服务器的 IP 地址和端口号。
  • 将 USER_ID 替换为登录用户。

日志记录

问题 问题排查
未找到审核日志。 只有当操作是经过身份验证的用户进行的 API 调用(用于创建、修改或读取用户创建的数据),或者操作访问配置文件或资源元数据时,才会写入数据访问日志。
在日志中找不到操作信息。 您想要详细了解某项操作。

例如,用户已被删除,但您找不到谁执行了此操作。日志显示操作已开始,但未提供任何更多信息。您必须为要记录的详细个人身份信息 (PII) 等启用审核日志记录。

某些日志是从 Cloud SQL for SQL Server 实例的 error.log 日志进行过滤。 过滤后的日志包括不带时间戳的 AD 日志,以及 Login failed for user 'x'. Reason: Token-based server access validation failed with an infrastructure error. Login lacks connect endpoint permission. [CLIENT: 127.0.0.1]。这些日志会进行过滤,因为它们可能会引起混乱。
Logging 占用了大量磁盘空间。 有三种类型的日志文件占用磁盘空间:重做日志、常规日志和二进制日志。

连接到数据库并运行以下命令以获取每种类型的详细信息:

SHOW VARIABLES LIKE 'innodb_log_file%';

SELECT ROUND(SUM(LENGTH(argument)/POW(1024,2),2)
AS GB from mysql.general_log;

SHOW BINARY LOGS;
    
日志文件难以读取。 最好以 json 或文本形式查看日志。您可以使用 gcloud logging read 命令以及 Linux 后处理命令来下载日志。

如需将日志下载为 JSON,请执行以下操作:

gcloud logging read \
"resource.type=cloudsql_database \
AND logName=projects/PROJECT_ID \
/logs/cloudsql.googleapis.com%2FLOG_NAME" \
--format json \
--project=PROJECT_ID \
--freshness="1d" \
> downloaded-log.json
    

如需将日志下载为 TEXT,请执行以下操作:

gcloud logging read \
"resource.type=cloudsql_database \
AND logName=projects/PROJECT_ID \
/logs/cloudsql.googleapis.com%2FLOG_NAME" \
--format json \
--project=PROJECT_ID \
--freshness="1d"| jq -rnc --stream 'fromstream(1|truncate_stream(inputs)) \
| .textPayload' \
--order=asc
> downloaded-log.txt
   
在 PostgreSQL 日志中找不到查询日志。 您需要启用 pgaudit 标志。
  1. 从终端连接到您的数据库:
    gcloud sql connect INSTANCE_NAME
          
  2. 运行以下命令以创建扩展程序:
    CREATE EXTENSION pgaudit;
          
  3. 退出数据库,然后从终端运行以下命令:
    gcloud sql instances patch INSTANCE_NAME \
    --database-flags=cloudsql.enable_pgaudit=on,pgaudit.log=all
         

管理实例

问题 问题排查
重启 MySQL 后性能下降。 Cloud SQL 允许在 InnoDB 缓冲区池中缓存数据。 但是,重启后,此缓存始终为空,并且所有读取操作都需要往返后端才能获取数据。因此,在缓存被填满之前,查询可能比预期慢。
崩溃恢复速度缓慢。 可能已累积大型 general_log。 您可以通过阻止累积大型 general_log 来缩短崩溃恢复时间。如果启用了 general_log,请截断表并仅在短时间内启用 general_log。

您可以通过连接到数据库并运行以下查询来了解常规日志的大小:

SELECT ROUND(SUM(LENGTH(argument)/POW(1024,2)),2) from mysql.general_log;
您想要了解哪些内容占满了存储空间。 例如,您发现数据库仅使用了 3 GB,但存储空间却显示使用了 14 GB。表未占用的大多数空间都被二进制日志和/或临时文件占用了。

可以尝试的操作:

  • 您可以在 MySQL 命令行界面中使用以下命令检查二进制日志占用的存储空间: SHOW BINARY LOGS;
  • 临时表可能还占用了大量存储空间。要检查临时空间用量,请使用以下命令:SELECT * FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME='innodb_temporary'\G。
  • 使用以下命令可检查重做日志大小:SHOW VARIABLES LIKE 'innodb_log_file%';
  • 您可以借助以下命令检查 general_log(如果已启用)的大小:SELECT ROUND(SUM(LENGTH(argument)/POW(1024,2)),2) AS GB from mysql.general_log;
  • 如果需要,您可使用 API 截断日志表。如需了解详情,请参阅 instances.truncateLog 参考页面。
  • 详细了解如何设置和配置慢查询日志。
查询被阻止。 查询可能锁定 MySQL 数据库,导致所有后续查询被阻止/超时。

连接到数据库并执行以下查询:

SHOW PROCESSLIST。

列表中的第一项可能是占用锁的项,后续项正在等待获取该锁。

SHOW INNODB STATUS 查询可能也会有帮助。

您无法手动删除二进制日志。 无法手动删除二进制日志。 二进制日志会连同其相关联的自动备份自动删除,通常是大约七天后删除。
您想要查找有关临时文件的信息。 名为 ibtmp1 的文件用于存储临时数据。此文件在数据库重启时重置。 如需查找有关临时文件使用情况的信息,请连接到数据库并执行以下查询:

SELECT * FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME='innodb_temporary'\G

您想要了解表的大小。 此信息可以在数据库中找到。

连接到数据库并执行以下查询:

SELECT TABLE_SCHEMA, TABLE_NAME, sum(DATA_LENGTH+INDEX_LENGTH)/pow(1024,2) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA NOT IN ('PERFORMANCE_SCHEMA','INFORMATION_SCHEMA','SYS','MYSQL') GROUP BY TABLE_SCHEMA, TABLE_NAME;

mysqld 收到了信号 11。 尝试重构查询,使其不会创建过多的连接。如果没有解决问题,请与客户服务联系。信号 11 通常表示 MySQL 软件问题。

InnoDB: page_cleaner: 1000ms intended loop took 5215ms. The settings might not be optimal. 页面清理线程无法跟上实例上的更改速率。 页面清理线程每秒扫描缓冲池一次,以将脏页从缓冲池刷入磁盘。您看到的警告表明它有许多脏页要刷入,并且将一批脏页刷入磁盘需要的时间超过了一秒。

如有可能,对实例进行分片。使用多个较小的 Cloud SQL 实例要优于使用一个大型实例。

您想了解当前正在运行的查询。 连接到数据库并运行以下查询:

SELECT datname, username, application_name as appname, client_addr, state, now() - backend_start as conn_age, now() - xact_start as xact_age, now() - query_start as query_age, now() - state_change as last_activity_age, wait_event_type, wait_event, query FROM pg_stat_activity WHERE state <> 'idle' ORDER BY 8 DESC LIMIT 20;

您想了解特定字段使用的单位。 连接到数据库并运行以下查询(使用您自己的 FIELD_NAME):

SELECT name, setting, unit FROM pg_settings WHERE name = 'FIELD_NAME'。

您想要查找数据库设置的当前值。 连接到数据库并运行以下查询(使用您自己的 SETTING_NAME):

SHOW SETTING_NAME;

运行 SHOW ALL; 以查看所有设置。

您想要停止被屏蔽的后台进程。 用户需要具备 pg_signal_backend 角色。

运行以下命令:

  1.       GRANT pg_signal_backend TO USERNAME;
          
  2. 找到被封锁或卡住的进程 ID:
          SELECT pid, username, state, query FROM pg_stat_activity;
          
  3. 使用以下命令停止正在运行的进程或空闲进程:
          SELECT pg_cancel_backend(pid)
                FROM pg_stat_activity
                WHERE username = 'USERNAME';
          
          
          SELECT pg_terminate_backend(pid)
                FROM pg_stat_activity
                WHERE username = 'USERNAME';
          
          
实例即将消耗 100% 的交易 ID。 您的内部监控服务警告实例即将消耗 100% 的事务 ID。您需要避免事务封装,这可以阻止写入。

Autovacuum 作业可能会被屏蔽,或者无法及时回收事务 ID 以跟上工作负载。

为避免因事务封装问题而导致服务中断,您可以查看这些自服务的提示以了解如何处理 TXID 封装。

如需了解常规调整建议,请参阅对 PostgreSQL 的 Vacuum 操作进行优化、监控和问题排查。

临时存储使自动存储空间增加。 启用了自动存储空间。

重启会删除临时文件,但不会减少存储空间。只有客户服务才能重置实例大小。

数据被自动删除。 很有可能是某个脚本正在您的环境中的某个位置运行。

查看删除时间点前后的日志,看看是否有在信息中心或其他自动化进程中运行的恶意脚本。

无法删除实例。 您可能会看到错误消息 ERROR: (gcloud.sql.instances.delete) HTTP Error 409: The instance or operation is not in an appropriate state to handle the request,或者实例可能具有 INSTANCE_RISKY_FLAG_CONFIG 标志状态。

以下是一些可能的原因:

  • 另一项操作正在进行中。 Cloud SQL 操作不会并发运行。等待其他操作完成。
  • 只要使用至少一个 beta 标志,就会触发 INSTANCE_RISKY_FLAG_CONFIG 警告。移除存在风险的标志设置并重启实例。
实例因临时数据大小较大而停滞。 系统可以一次创建多个临时表,具体取决于查询和负载。

遗憾的是,除了重启该服务,没有其他任何方法能缩小 ibtmp1 文件。

一种缓解方法是使用 ROW_FORMAT=COMPRESSED 标志创建临时表,这会将临时表存储在临时文件目录下的单表文件表空间中。但是,这样做的缺点是为每个临时表创建和移除单表文件表空间会降低性能。

升级过程中出现严重错误。 日志可能会显示更多信息,但在任何情况下都可能需要客户服务来强制重新创建实例。
实例在磁盘空间用尽后重启时停滞。 未启用存储空间自动扩容功能。

如果实例的存储空间不足,并且未启用存储空间自动扩容功能,则实例将进入离线状态。为避免此问题,您可以对实例进行修改,以启用存储空间自动扩容功能。

本地主实例停滞。 Google Cloud 无法帮助处理非 Cloud SQL 实例。
重启时关停速度缓慢。 实例关停时,任何未在 60 秒内终止的未完成连接都会导致关停异常。

通过使用持续时间少于 60 秒的连接,可以避免大多数异常关停,包括来自数据库命令提示符的连接。如果您将这些连接保持打开状态数小时或数天,则关停可能会出现异常情况。

无法删除用户。 用户在数据库中可能有依赖于该用户的对象。您需要删除这些对象或将其重新分配给其他用户。

确定哪些对象依赖于该用户,然后删除这些对象或将其重新分配给其他用户。

某些查询运行速度缓慢。 查询可能会由于多种原因而缓慢运行,主要是由于特定数据库方��。可能会涉及 Cloud SQL 的一个原因是当来源(写入或读取)资源和目的地 (Cloud SQL) 资源位于不同区域时发生网络延迟。

请参阅一般性能提示,具体而言:

对于缓慢的数据库插入、更新或删除操作,请考虑以下事项:

  • 检查写入者和数据库的位置;长距离发送数据会导致延迟。
  • 检查读取者和数据库的位置;相对于写入性能,延迟对读取性能的影响更大。

为了缩短延迟时间,建议您在同一区域中查找来源资源和目的地资源。

表明内存不足,但监控图表未显示。 实例可能会失败并报告 Out of memory,但 Google Cloud 控制台或 Cloud Monitoring 图表似乎显示仍然剩余内存。

除了工作负载以外,其他因素(例如活跃连接和内部开销进程的数量)可能也会影响内存使用量。这些指标不一定会反映在监控图表中。

确保该实例的开销足以满足您的工作负载和一些额外开销。

恢复已删除的实例。 删除某个实例时,该实例上的所有数据(包括备份)都会永久丢失。

如需保留数据,请在删除实例之前将数据导出到 Cloud Storage。

Cloud SQL Admin 角色具有删除实例的权限。为防止意外删除,请仅在需要时授予此角色。

您想要重命名现有 Cloud SQL 实例。 不支持重命名现有实例。

可采用其他方法通过创建新实例来实现此目标。

  • 您可以克隆要重命名的实例,并为克隆的实例设置新名称。这样一来,您无需手动导入数据即可创建新实例。与创建新实例时一样,克隆的实例具有新的 IP 地址。
  • 您可以将实例中的数据导出到 Cloud Storage 存储桶,使用所需的新名称创建一个新实例,然后将数据导入到新实例。

在这两种情况下,您都可以在操作完成后删除旧实例。建议您使用克隆路由,因为它不会影响性能,并且您无需重新进行任何实例配置设置(例如标志、机器类型、存储空间大小和内存)。

删除实例时出错。 如果为实例启用了删除保护,请确认您计划删除该实例。然后,先停用删除保护,再删除该实例。

Private Service Connect

问题 问题排查
实例的服务连接不接受 Private Service Connect 端点。
  1. 检查端点的状态。

    gcloud

    如需检查状态,请使用
    gcloud compute forwarding-rules describe 命令。

    gcloud compute forwarding-rules describe ENDPOINT_NAME \
    --project=PROJECT_ID \
    --region=REGION_NAME \
    | grep pscConnectionStatus

    进行以下替换:

    • ENDPOINT_NAME:端点的名称
    • PROJECT_ID:包含端点的 Google Cloud 项目的 ID 或编号。
    • REGION_NAME:端点的区域名称

    REST

    在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:包含 Private Service Connect 端点的 Google Cloud 项目的 ID 或编号
    • REGION_NAME:区域的名称
    • ENDPOINT_NAME:端点的名称

    HTTP 方法和网址:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/forwardingRules/ENDPOINT_NAME

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

    {
      "kind": "compute#forwardingRule",
      "id": "ENDPOINT_ID",
      "creationTimestamp": "2024-05-09T12:03:21.383-07:00",
      "name": "ENDPOINT_NAME",
      "region": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME",
      "IPAddress": "IP_ADDRESS",
      "target": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/serviceAttachments/SERVICE_ATTACHMENT_NAME",
      "selfLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_NAME/forwardingRules/ENDPOINT_NAME",
      "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/default",
      "serviceDirectoryRegistrations": [
        {
          "namespace": "goog-psc-default"
        }
      ],
      "networkTier": "PREMIUM",
      "labelFingerprint": "LABEL_FINGERPRINT_ID",
      "fingerprint": "FINGERPRINT_ID",
      "pscConnectionId": "CONNECTION_ID",
      "pscConnectionStatus": "ACCEPTED",
      "allowPscGlobalAccess": true
    }
    
  2. 验证端点状态是否为 ACCEPTED。如果状态为 PENDING,则表示实例不允许包含该端点的 Google Cloud 项目。确保允许在其中创建端点的网络项目。如需了解详情,请参阅修改启用了 Private Service Connect 的实例。
ERROR: (gcloud.compute.forwarding-rules.create) Could not fetch resource: The resource 'projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME' was not found 为 Private Service Connect 端点预留静态内部 IP 地址时,可能会出现此错误消息。 确保指定的子网存在于 URI 指定的项目中。如果您想在服务项目中创建端点,但使用共享 VPC 网络中的子网,则需要按 URI 指定子网,并在 URI 中使用宿主项目的 ID。 如需了解详情,请参阅手动创建端点。
ERROR: (gcloud.compute.forwarding-rules.create) Could not fetch resource: - The resource 'projects/PROJECT_ID/global/networks/NETWORK_NAME' was not found 手动创建 Private Service Connect 端点时,可能会出现此错误消息。 确保指定的网络存在于 URI 指定的项目中。如果您想在服务项目中创建端点,但使用共享 VPC 网络,则需要按 URI 指定网络,并在 URI 中使用宿主项目的 ID。 如需了解详情,请参阅手动创建端点。
Invalid consumer network status for PSC auto connection。

使用方网络未正确配置或根本未配置,因此没有可连接的端点。如需连接到端点,您需要检查端点的状态,并先修复错误,然后再次���试连接。
如需检查端点的状态,请参阅检索端点。 端点的状态可以是以下其中一种:

  • CONNECTION_POLICY_MISSING:使用方网络上没有匹配的服务连接政策。服务连接政策按网络和区域进行配置。如需重新配置网络,请参阅更新服务连接政策。
  • CONSUMER_INSTANCE_PROJECT_NOT_ALLOWLISTED:存在匹配的服务连接政策,但服务实例未配置为允许连接到此实例。如需重新配置服务连接政策,请参阅更新服务连接政策。
  • POLICY_LIMIT_REACHED:服务连接政策已达到其端点限制。如需解决此问题,您需要更新服务连接政策,以提高端点限制。

No permission to create a service connection policy。

您没有创建服务连接政策所需的权限。如需创建服务连接政策,您需要 Compute Network Admin IAM 角色。如需了解详情,请参阅角色和权限。

使用 Private Service Connect 出站连接时,网络连接无法接受来自 Private Service Connect 接口的连接。

如果您的外部网络无法接受来自 Private Service Connect 接口的连接,则可能是您的网络连接上的连接政策未正确配置。

网络连接需要配置为自动接受所有连接,或者使用接受的连接列表手动配置。 如需了解详情,请参阅连接政策。

使用以下命令验证网络连接中接受的连接:

      gcloud compute network-attachments describe default
      --region=REGION_ID
如果 Private Service Connect 接口不在接受列表中,请更新您的网络连接。如需了解详情,请参阅管理网络连接。

复制

问题 问题排查
创建时只读副本未开始复制。 日志文件中可能有更具体的错误信息。在 Cloud Logging 中查看日志以找到实际错误。
无法创建只读副本 - invalidFlagValue 错误 请求中的某个标志无效。它可能是您明确提供的标志,也可能是设置为默认值的标志。

首先,检查 max_connections 标志的值是否大于或等于主实例上的值。

如果 max_connections 标志设置正确,请在 Cloud Logging 中检查日志以找出实际错误。

无法创建只读副本 - 未知错误。 日志文件中可能有更具体的错误信息。在 Cloud Logging 中查看日志以找到实际错误。

如果错误为 set Service Networking service account as servicenetworking.serviceAgent role on consumer project,则停用 Service Networking API,然后重新启用。此操作会���建继续执行该过程所需的服务账号。

磁盘已满。 主实例磁盘大小可能在副本创建期间变满。 修改主实例以将其升级为更大的磁盘。
副本实例占用的内存过多。 副本使用临时内存来缓存经常请求的读取操作,这可能会导致其占用的内存多于主实例。

重启副本实例以收回临时内存空间。

已停止复制。 已达到存储空间上限,且未启用存储空间自动扩容功能。

修改实例以启用 automatic storage increase。

复制延迟一直很高。 写入负载过高,副本无法处理。当副本上的 SQL 线程无法与 IO 线程保持同步时,会发生复制延迟。某些类型的查询和工作负载会导致指定架构出现暂时性或永久性的高复制延迟。下面列出了复制延迟的部分常见原因:
  • 对副本的查询速度较慢。找到这些查询并进行修复。
  • 所有表都必须具有唯一键/主键。每次更新此类没有唯一键/主键的表都会导致对副本进行全表扫描。
  • 由于大量更新堆积在副本上,因此 DELETE ... WHERE field < 50000000 等查询会导致基于行的复制出现复制延迟。

以下是一些可行的解决方案:

  • 修改实例以增加副本的大小。
  • 减少数据库的负载。
  • 将读取流量发送到只读副本。
  • 将表编入索引。
  • 识别并修复速度缓慢的写入查询。
  • 重新创建副本。
副本创建失败并超时。 主实例上长时间运行的未提交事务可能会导致只读副本创建失败。

停止所有正在运行的查询后重新创建副本。