使用go-sql-driver连接GCP托管MySQL时遭登录拒绝(云代理方式)
问题:使用go-sql-driver连接GCP托管MySQL时登录被拒绝
我通过跳板机做本地端口转发到GCP托管的MySQL实例,使用go-sql-driver连接时,能成功建立连接,但执行查询时始终返回登录拒绝错误。使用常规用户名/密码时,代码在GCP和本地数据库都能正常工作,但用gcloud sql generate-login-token生成的认证令牌就不行——而这个令牌在IntelliJ、DBeaver等数据库工具中可以正常登录。
代码示例
package main import ( "database/sql" "fmt" "log" "os" "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql" ) func connectTCPSocket() (*sql.DB, error) { mustGetenv := func(k string) string { v := os.Getenv(k) if v == "" { log.Fatalf("Fatal Error in connect_tcp.go: %s environment variable not set.", k) } return v } c := mysql.Config{ User: mustGetenv("DB_USER"), Passwd: mustGetenv("DB_PASS"), Net: "tcp", Addr: mustGetenv("INSTANCE_HOST") + ":" + mustGetenv("DB_PORT"), DBName: mustGetenv("DB_NAME"), ParseTime: true, // demo option AllowNativePasswords: true, AllowOldPasswords: true, AllowCleartextPasswords: true, } dbPool, err := sql.Open("mysql", c.FormatDSN()) if err != nil { return nil, fmt.Errorf("sql.Open: %w", err) } // ... return dbPool, nil } func main() { fmt.Println("Starting") db, err := connectTCPSocket() if err != nil { log.Fatal(err) } // fmt.Println(db) rows, err2 := db.Query("Select field1 from table") if err2 != nil { log.Fatal(err2) } }
错误信息
Access denied for user ‘user’@‘ipaddress’ (using password: YES)
环境与配置补充
- 使用
gcloud compute ssh cloudsql-jump而非gcloud shell - 端口转发命令:
gcloud compute ssh cloudsql-jump --project projectName --zone us-east4-c --internal-ip -- -L 1234:1.0.0.1:3306 - 认证令牌通过
gcloud sql generate-login-token生成 - INSTANCE_HOST设为
localhost,DB_PORT设为1234(对应端口转发配置) - IntelliJ中使用
jdbc:mysql://localhost:1234结合上述令牌可正常连接 - 代码运行完整输出:
Starting 2025/03/27 06:42:47 Error 1045 (28000): Access denied for user 'user'@'10.0.0.1' (using password: YES)
寻求解决该登录拒绝问题的建议。
内容的提问来源于stack exchange,提问作者sherring
相关产品推荐
相关产品推荐

