Google Cloud Run无法连接Google Cloud SQL的问题排查求助
Cloud Run连接Cloud SQL MySQL排查指南(针对Java11 Spring Boot/Grails4)
一、Cloud Run自动注入Unix套接字的机制说明
当你在Cloud Run版本配置中添加Cloud SQL连接后,Cloud Run平台会在底层与Cloud SQL的托管代理建立专用通道,自动在容器文件系统中生成路径为/cloudsql/INSTANCE_CONNECTION_NAME的Unix套接字。这个套接字是平台托管的,不需要你在Docker容器中部署cloud-sql-proxy或手动配置IAM凭证——Cloud Run会自动使用服务账号完成身份验证,你只需要确保服务账号拥有Cloud SQL Client角色即可。
二、排查步骤与解决方案
1. 确认Cloud Run基础配置正确性
- 检查Cloud SQL连接配置:确保添加的实例连接名(
PROJECT-ID:REGION:INSTANCE-ID)完全匹配Cloud SQL实例详情页的「实例连接名」,无拼写、大小写或区域错误。 - 核对服务账号权限:Cloud Run使用的服务账号(默认是
PROJECT_NUMBER-compute@developer.gserviceaccount.com)必须拥有Cloud SQL Client角色,否则无法建立连接。
2. 验证JDBC连接配置(适配Grails4+Hikari)
方式一:使用托管Unix套接字
在application.yml中配置数据源:
dataSource: url: jdbc:mysql:///YOUR_DB_NAME?unixSocketPath=/cloudsql/INSTANCE_CONNECTION_NAME driverClassName: com.mysql.cj.jdbc.Driver username: YOUR_DB_USER password: YOUR_DB_PASS pooled: true jmxExport: true hikari: dataSource: cachePrepStmts: true prepStmtCacheSize: 250 prepStmtCacheSqlLimit: 2048 connectionTimeout: 30000 validationTimeout: 5000
注意:JDBC串中
//后留空,无需填写主机和端口,Unix套接字不需要这些信息。
方式二:使用Google Cloud SQL Socket Factory
首先在build.gradle中添加适配Java11的依赖:
implementation 'com.google.cloud.sql:mysql-socket-factory-connector-j-8:1.13.0'
然后修改数据源配置:
dataSource: url: jdbc:mysql:///YOUR_DB_NAME?cloudSqlInstance=INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.mysql.SocketFactory driverClassName: com.mysql.cj.jdbc.Driver username: YOUR_DB_USER password: YOUR_DB_PASS pooled: true jmxExport: true
注:
ipTypes=PUBLIC在Cloud Run环境中通常无需添加,Socket Factory会自动适配平台网络;若Cloud SQL实例禁用公网IP,可添加ipTypes=PRIVATE。
3. 通过Cloud Run日志定位具体错误
在Google Cloud控制台的Cloud Run服务详情页进入「日志」标签,筛选数据库相关条目:
- 若出现
Access denied for user 'xxx'@'xxx':检查数据库用户名密码是否正确,或该用户是否允许Cloud Run网络访问(Cloud SQL用户默认允许所有主机,除非手动限制IP)。 - 若出现
Could not find socket path /cloudsql/xxx:核对实例连接名是否正确,或Cloud Run版本是否已配置Cloud SQL连接。 - 若出现
Connection timeout:检查Cloud SQL实例是否正常运行,或服务账号权限是否缺失。
4. 验证数据库用户权限
确保使用的是Cloud SQL实例中创建的原生数据库用户(而非IAM用户,除非已配置IAM数据库认证),且该用户拥有目标数据库的读写权限。
三、常见误区提醒
- 不要在Docker镜像中部署cloud-sql-proxy:Cloud Run的托管连接已替代手动代理需求,手动部署会引发冲突或额外权限问题。
- 不要混淆实例连接名与实例ID:实例连接名是
项目ID:区域:实例ID的完整格式,不能只写实例ID。
内容的提问来源于stack exchange,提问作者Leon Heyna
相关产品推荐
相关产品推荐

