本页面列出了 Cloud SQL for PostgreSQL 的已知问题,以及可以避免这些问题或从这些问题中恢复的方法。
如果您在自己的实例中遇到问题,请确保同时查看诊断问题中的信息。实例连接问题
- SSL/TLS 证书已过期 - 如果您的实例配置为使用 SSL,请前往 Google Cloud 控制台中的“Cloud SQL 实例”页面并打开该实例。打开实例的连接页面,选择安全标签页,并确保您的服务器证书有效。如果证书已过期,您必须添加一个新证书并轮替至该证书。 
- Cloud SQL Auth 代理版本 - 如果您使用 Cloud SQL Auth 代理建立连接,请确保使用的是最新版本。如需了解详情,请参阅保持 Cloud SQL Auth 代理为最新版本。 
- 无权连接 - 如果您尝试连接到该项目中不存在的实例,则错误消息将仅指示您无权访问该实例。 
- 无法创建 Cloud SQL 实例 - 如果您看到 - Failed to create subnetwork. Router status is temporarily unavailable. Please try again later. Help Token: [token-ID]错误消息,请尝试再次创建 Cloud SQL 实例。
- 以下仅适用于默认用户('postgres'): - gcloud sql connect --user- 如果您尝试使用任何其他用户连接此命令,则错误消息会显示 FATAL: database 'user' does not exist。解决方法是使用默认用户('postgres')进行连接,然后使用 - "\c"psql 命令以其他用户身份重新连接。
- 启用 IAM 数据库代理身份验证后,PostgreSQL 连接挂起。 - 当使用 TCP 套接字启动 Cloud SQL 身份验证代理并带有 - -enable_iam_login标志时,PostgreSQL 客户端在 TCP 连接期间会挂起。一种解决方法是在 PostgreSQL 连接字符串中使用- sslmode=disable。例如:- psql "host=127.0.0.1 dbname=postgres user=me@google.com sslmode=disable" - 另一个解决方法是使用 Unix 套接字启动 Cloud SQL Auth 代理。此解决方法会关闭 PostgreSQL SSL 加密,让 Cloud SQL Auth 代理改为执行 SSL 加密。 
管理问题
- 一次只能对实例运行一个长时间运行的 Cloud SQL 导入或导出操作。启动操作时,请确保不需要对实例执行其他操作。此外,启动操作后,您可以取消操作。 - PostgreSQL 在单个事务中导入数据。因此,如果您取消导入操作,则 Cloud SQL 不会保留来自导入的数据。 
数据导入和导出问题
- 如果您的 Cloud SQL 实例使用 PostgreSQL 17,但您的数据库使用 PostgreSQL 16 或更低版本,则您无法使用 Cloud SQL 将这些数据库导入到您的实例中。为此,请使用 Database Migration Service。 
- 如果您使用 Database Migration Service 将 PostgreSQL 17 数据库导入 Cloud SQL,则该数据库会以 PostgreSQL 16 数据库的形式导入。 
- 对于 PostgreSQL 版本 15 及更高版本,如果目标数据库是通过 - template0创建,则导入数据可能会失败,并且您可能会看到- permission denied for schema public错误消息。如需解决此问题,请运行- GRANT ALL ON SCHEMA public TO cloudsqlsuperuserSQL 命令向- cloudsqlsuperuser用户提供公共架构特权。
- 导出许多大型对象会导致实例无响应 - 如果数据库包含许多大型对象 (blob),则导出数据库可能会占用大量内存,从而导致实例无响应。即使 blob 为空,也可能发生这种情况。 
- Cloud SQL 不支持自定义表空间,但支持从自定义表空间迁移到目标实例中的默认表空间 - pg_default。例如,如果您拥有一个名为- dbspace且位于- /home/data的表空间,则迁移后,- dbspace中的所有数据都会迁移到- pg_default。但是,Cloud SQL 将不会在其磁盘上创建名为“dbspace”的表空间。
- 如果您要尝试从大型数据库(例如,具有 500 GB 或更多数据的数据库)导入和导出数据,则导入和导出操作可能需要很长时间才能完成。此外,在导入或导出过程中,您无法执行其他操作(例如备份操作)。提高导入和导出过程性能的一个可能选项是使用 - gcloud或 API 恢复之前的备份。
- Cloud Storage 支持最大 5 TB 的单个对象大小。如果您的数据库大于 5 TB,则导出到 Cloud Storage 的操作会失败。在这种情况下,您需要将导出文件细分为几个较小的部分。
事务日志和磁盘增长
日志每天完全清除一次,不会持续清除。当将日志保留天数配置为与备份数量相同时,可能会丢失一天的记录,具体取决于备份的发生时间。例如,如果日志保留天数设置为 7 天并且备份保留数量设置为七次备份,则意味着将保留六到七天的日志。
我们建议将备份数量设置为日志保留天数至少加 1,以保证日志至少保留指定的最少天数。
与 Cloud Monitoring 或 Cloud Logging 相关的问题
具有以下区域名称的实例在某些上下文中不正确显示,如下所示:
- us-central1显示为- us-central
- europe-west1显示为- europe
- asia-east1显示为- asia
此问题在以下情况下发生:
- Cloud Monitoring 中的提醒
- Metrics Explorer
- Cloud Logging
您可以使用资源元数据标签来缓解 Cloud Monitoring 和 Metrics Explorer 中提醒的问题。使用系统元数据标签 region,而不是 cloudsql_database 受监控的资源标签 region。
与删除 PostgreSQL 数据库相关的问题
当您使用 psql 客户端删除在 Google Cloud 控制台中创建的数据库时,可能会遇到以下错误:
ERROR: must be owner of database [DATABASE_NAME]
这是一个权限错误,因为使用 psql 客户端创建的数据库的所有者没有 Cloud SQL superuser 属性。使用 Google Cloud 控制台创建的数据库归 cloudsqlsuperuser 所有,而使用 psql 客户端创建的数据库归连接到相应数据库的用户所有。由于 Cloud SQL 是一项托管式服务,因此客户无法创建或访问具有 superuser 属性的用户。有关详情,请参阅超级用户限制和特权。
由于存在此限制,使用 Google Cloud 控制台创建的数据库只能使用 Google Cloud 控制台删除,而使用 psql 客户端创建的数据库只能通过以数据库所有者的身份连接来删除。
如需查找数据库的所有者,请使用以下命令:
SELECT d.datname as Name,
pg_catalog.pg_get_userbyid(d.datdba) as Owner
FROM pg_catalog.pg_database d
WHERE d.datname = 'DATABASE_NAME';
替换以下内容:
- DATABASE_NAME:您要查找所有者信息的数据库的名称。
如果您的数据库的所有者是 cloudsqlsuperuser,请使用Google Cloud 控制台删除数据库。如果数据库的所有者是 psql 客户端数据库用户,请以数据库所有者的身份连接,然后运行 DROP DATABASE 命令。