排查问题

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

本页面包含以下主题:

备份与恢复

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

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

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

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

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

完全清除实例后,将无法恢复数据。但是,如果恢复实例,则其备份也会被恢复。如需详细了解如何恢复已删除的实例,请参阅恢复备份

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

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

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

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

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

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

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

自动备份失败,但您未收到电子邮件通知。 如需让 Cloud SQL 通知您备份的状态,请配置基于日志的提醒
您无法使用 Transact-SQL RESTORE 命令SQL Server Management Studio (SSMS) 恢复实例。 Cloud SQL 不支持通过 SSMS 恢复实例。如需恢复实例,请运行 gcloud sql import 命令。

克隆

问题 问题排查
克隆失败并显示 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. 另外,增加随机退避时间。

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

创建实例

问题 问题排查
错误消息:Failed to create subnetwork. Router status is temporarily unavailable. Please try again later. Help Token: [token-ID] 尝试再次创建 Cloud SQL 实例。
错误消息:Failed to create subnetwork. Required 'compute.projects.get' permission for PROJECT_ID 当您使用专用 IP 地址创建实例时,系统会使用 Service Networking API 即时创建一个服务账号。如果您是最近才启用了 Service Networking API,则服务账号可能无法创建,实例创建会失败。在这种情况下,您必须等待服务账号在整个系统中传播,或使用所需权限手动添加。

导出

问题 问题排查
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 角色
您希望自动执行导出。 Cloud SQL 不提供自动执行导出的方法。

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

标志

问题 问题排查
Cloud SQL for SQL Server 不支持修改现有实例的时区。

在 Cloud SQL 中,SQL Server 支持为新实例设置时区,但不支持对现有实例的时区进行设置。

在 Cloud SQL for SQL Server 中,您可以使用 AT TIME ZONE 函数执行时间转换等操作。如需了解此函数,请参阅 AT TIME ZONE (Transact-SQL)

高可用性

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

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

导入

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

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

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

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

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

LSN 不匹配 事务日志备份的导入顺序不正确,或者事务日志链已损坏。
按照与备份集表中相同的顺序导入事务日志备份。
StopAt 过早 此错误表示事务日志文件中的第一条日志晚于 StopAt 时间戳。例如,如果事务日志文件中的第一条日志时间为 2023-09-01T12:00:00,且 StopAt 字段的值为 2023-09-01T11:00:00,则 Cloud SQL 会返回此错误。
确保您使用的是正确的 StopAt 时间戳和正确的事务日志文件。

关联的服务器

错误消息 问题排查
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]。这些日志会进行过滤,因为它们可能会引起混乱。
日志文件难以读取。 最好以 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
   

管理实例

问题 问题排查
临时存储使自动存储空间增加。 启用了自动存储空间。

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

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

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

无法删除实例。 您可能会看到错误消息 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 秒的连接,可以避免大多数异常关停,包括来自数据库命令提示符的连接。如果您将这些连接保持打开状态数小时或数天,则关停可能会出现异常情况。

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

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

Stack Exchange 上的此线程介绍了如何查找用户拥有的对象。
某些查询运行速度缓慢。 查询可能会由于多种原因而缓慢运行,主要是由于特定数据库方面。可能会涉及 Cloud SQL 的一个原因是当来源(写入或读取)资源和目的地 (Cloud SQL) 资源位于不同区域时发生网络延迟。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 的实例

复制

问题 问题排查
创建时读取副本未开始复制。 日志文件中可能有更具体的错误信息。在 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 等查询会导致基于行的复制出现复制延迟。

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

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

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