排查问题

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

本页面包含以下主题:

备份与恢复

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

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

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

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

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

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

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

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

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

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

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

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

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

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

可以尝试的操作:

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

CREATE UNLOGGED TABLE ...

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

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

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

取消导入和导出

问题 问题排查
错误消息:You can't cancel operation [operation-ID] because this operation isn't in progress.

您正尝试取消已完成、失败或取消的导入或导出操作。如果操作正在运行,您可以取消它。

错误消息:You can't cancel operation [operation-ID] because Cloud SQL doesn't support the cancellation of an [operation-type] operation.

Cloud SQL 不支持取消操作,因为其操作类型不是 IMPORTEXPORT

错误消息:The [operation-type] operation isn't cancelled. Wait and retry in a few seconds.

Cloud SQL 目前无法取消导入或导出操作。请过几秒后重试。如果问题仍然存在,请与 Google Cloud 支持团队联系。

克隆

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

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

Certificate verify failed

客户端证书已过期,或证书路径不正确。

通过重新创建证书重新生成证书。

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
   

Hostname/IP does not match certificate's altnames: Host: localhost. is not in the cert's altnames

主机地址与服务器证书备用名称中的地址不匹配。

如果您使用的是具有 verify-full 或其等效功能的 Node.js,请将 DNS 名称用于 servername 参数。您可以使用 openssl 在服务器证书中找到 DNS 名称。例如 openssl x509 -in server-cert.pem -noout -text |grep 'DNS:'

 ssl: {
  rejectUnauthorized: true,
  ca: fs.readFileSync("/path/to/server/CA"),
  servername: 'N-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx.us-central1.sql.goog'
}

创建实例

问题 问题排查
错误消息: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 实例。
错误消息: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 角色
CSV 导出成功,但 SQL 导出失败。 CSV 和 SQL 格式的导出方式不同。SQL 格式会导出整个数据库,可能需要较长的时间才能完成。CSV 格式可让您定义要导出的数据库元素。

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

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

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

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

修改转储文件以移除引用

使用 pg_dumpall 时出错。 使用带有 --global 标志的 pg_dumpall 实用程序需要超级用户角色,但 Cloud SQL for PostgreSQL 不支持此角色。为防止在执行包含用户名的导出操作时发生错误,请同时使用 --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 产品构建自己的自动导出系统,类似自动备份一文所述。

标志

问题 问题排查
您可以为会话设置时区,但当您注销时,该时区将过期。

连接到数据库,并将每个用户或每个数据库的数据库时区设置为所需的时区。

在 Cloud SQL for PostgreSQL 中,您可以指定以下内容。这些设置在会话关闭后会保留下来,就像 .conf 配置一样:

ALTER DATABASE dbname SET TIMEZONE TO 'timezone';
ALTER USER username SET TIMEZONE TO 'timezone';

这些设置仅适用于与数据库的新连接。如需查看时区的更改,请断开与实例的连接,然后重新连接到实例。

高可用性

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

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

导入

问题 问题排查
错误消息:permission denied for schema public 对于 PostgreSQL 版本 15 及更高版本,如果目标数据库是通过 template0 创建,则导入数据可能会失败。如需解决此问题,请运行 GRANT ALL ON SCHEMA public TO cloudsqlsuperuser SQL 命令向 cloudsqlsuperuser 用户提供公共架构特权。
HTTP Error 409: Operation failed because another operation was already in progress 您的实例已有一项待处理的操作。一次只能执行一项操作。在当前操作完成后尝试您的请求。
导入操作花费的时间太长。 过多的有效连接可能会干扰导入操作。

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

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

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

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

导入数据后,数据磁盘的使用量变得很高。

导入数据后,可能会出现预料之外的磁盘使用量。这可能是由于使用了时间点恢复

若要解决此问题,请在导入数据后停用时间点恢复(如果您想删除日志并恢复存储空间)。请注意,减少所占用的存储空间并不会缩小为实例预配的存储空间大小。

错误消息:GRANT stderr: ERROR: must be member of role ROLE_NAME

如果您尝试将上传到 Cloud Storage 中的 SQL 转储文件导入 Cloud SQL 数据库,并且导入作业已运行大约四天,则会显示此错误消息。

ROLE_NAME 是在源 PostgreSQL 数据库中定义的自定义数据库角色。默认的 cloudsqlsuperuser 用户会导入 SQL 转储文件。但是,此用户可能不属于 ROLE_NAME 角色。

如需解决此问题,请完成以下步骤:

  1. 在要导入 SQL 转储文件的目标数据库中创建 ROLE_NAME 角色。
  2. 请勿使用 cloudsqlsuperuser 用户导入该文件。相反,请在目标数据库中指定具有 ROLE_NAME 角色的用户。如需指定用户,请运行以下命令:

    gcloud sql import sql INSTANCE URI [--async]
    [--database=DATABASE, -d DATABASE] [--user=USER] [GCLOUD_WIDE_FLAG …]

与 Vertex AI 集成

问题 问题排查
错误消息:Google ML integration API is supported only on Postgres version 12 or above. 如需在 Cloud SQL 中启用 Vertex AI 集成,您必须拥有 Cloud SQL for PostgreSQL 数据库版本 12 或更高版本。如需将数据库升级到此版本,请参阅就地升级数据库主要版本
错误消息: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/postgres/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 权限。如需详细了解如何向该服务账号添加这些权限,请参阅启用数据库与 Vertex AI 的集成
错误消息: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 个请求的限制。

日志记录

问题 问题排查
Logging 会占用 Cloud SQL 实例上的大量 CPU 和内存。 Logging 需要进行调整。

log_statement 标志可以设置为“none”,logging_collector 标志可以设置为“off”。如果仍在进行日志记录,则可能存在其他与日志相关的标志可以调整。您可以修改实例来改动这些标志。

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

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

日志文件难以读取。 最好以 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
         

管理实例

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

SELECT datname, usename, 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, usename, state, query FROM pg_stat_activity;
          
  3. 使用以下命令停止正在运行的进程或空闲进程:
          SELECT pg_cancel_backend(pid)
                FROM pg_stat_activity
                WHERE usename = 'USERNAME';
          
          
          SELECT pg_terminate_backend(pid)
                FROM pg_stat_activity
                WHERE usename = '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 秒的连接,可以避免大多数异常关停,包括来自数据库命令提示符的连接。如果您将这些连接保持打开状态数小时或数天,则关停可能会出现异常情况。

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

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

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,然后重新启用。此操作会创建继续执行该过程所需的服务账号。

磁盘已满。 主实例磁盘大小可能在副本创建期间变满。 修改主实例以将其升级为更大的磁盘。
磁盘空间显著增加。 未主动用于跟踪数据的槽会使 PostgreSQL 无限期地保留在 WAL 分段中,从而导致磁盘空间无限增大。如果您使用 Cloud SQL 中的逻辑复制和解码功能,则系统会自动创建和丢弃复制槽。可通过查询 pg_replication_slots 系统视图并过滤 active 列检测到未使用的复制槽。您可以使用 pg_drop_replication_slot 命令丢弃未使用的槽以移除 WAL 分段。
副本实例占用的内存过多。 副本使用临时内存来缓存经常请求的读取操作,这可能会导致其占用的内存多于主实例。

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

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

修改实例以启用 automatic storage increase

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

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

  • 修改实例以增加副本的大小。
  • 减少数据库的负载。
  • 将读取流量发送到读取副本。
  • 将表编入索引。
  • 识别并修复速度缓慢的写入查询。
  • 重新创建副本。
在 PostgreSQL 9.6 中重建索引时出错。 您会收到来自 PostgreSQL 的错误,告知您需要重新构建特定索引。此操作只能在主实例上完成。如果您创建新的副本实例,则很快就会再次遇到同样的错误。在低于 10 的 PostgreSQL 版本中,哈希索引不会传播到副本

如果必须使用哈希索引,请升级到 PostgreSQL 10+。否则,如果您还想使用副本,请不要在 PostgreSQL 9.6 中使用哈希索引。

主实例上的查询始终运行。 创建副本后,查询 SELECT * from pg_stat_activity where state = 'active' and pid = XXXX and username = 'cloudsqlreplica' 应在主实例上连续运行。
副本创建失败并超时。 主实例上长时间运行的未提交事务可能会导致只读副本创建失败。

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

如果主实例和副本具有不同的 vCPU 大小,则可能存在查询性能问题,因为查询优化器会考虑 vCPU 大小。

如需解决此问题,请完成以下步骤:

  1. 启用 log_duration 标志并将 log_statement 参数设置为 ddl。这样一来,您就可以同时获得针对数据库的查询和运行时间。不过,根据您的工作负载,这可能会导致性能问题。
  2. 在主实例和只读副本上,针对查询运行 explain analyze
  3. 比较查询计划并检查差异。

如果是特定查询,请修改此查询。例如,您可以更改联接的顺序,以查看是否可以获得更好的性能。