我使用的是 Google Cloud SQL 实例(第二代),授权自己的 IP 后可以在本地成功连接到它。我有可以成功从表中检索行的 Go 代码,也有可以成功向表添加行的代码。但是,当我部署应用程序时,该应用程序无法连接到服务器。每当调用 SQL 函数时,服务器都会返回 500 响应。我的应用程序被授权连接到此 SQL 实例:
我正在使用以下 Go 连接代码:
func dialSQL() (*sql.DB, error) {
if appengine.IsDevAppServer() {
return sql.Open("mysql", "root:password@tcp(xxx.xxx.xxx.xxx:3306)/Dbname")
} else {
return sql.Open("mysql", "root@cloudsql(projectid:regionname:instancename)/Dbname")
}
}
已部署版本和本地版本使用相同的代码库,但已部署版本使用 dialSQL()
中的第二个连接字符串功能。
我正在使用这个 Go MySQL 驱动程序:https://github.com/go-sql-driver/mysql
此驱动程序的文档提到了以下用于通过 Google App Engine 连接到 Google Cloud SQL 服务器的连接字符串:user@cloudsql(project-id:instance-name)/dbname
我使用的是projectid:regionname:instancename而不是projectid:instancename,因为这篇文章提到需要包含regionname
: google app engine golang, driver: bad connection
令人困惑的是,Google 的文档还省略了 regionname
: https://cloud.google.com/appengine/docs/go/cloud-sql/reference
我尝试了连接字符串的两种变体。
根据this post ,部署的应用程序将尝试使用 host = localhost 连接到服务器,并根据 this post ,'root'@'localhost' 的密码必须为空。
我在 mysql 控制台中进行了以下查询,以验证用户“root”@“localhost”确实具有空密码:select User, Host, HEX(authentication_string) from mysql.user
。 “root”@“%”用户仍然拥有我在 Google Cloud SQL 实例控制台中指定的密码。
我查看了 possible issue关于 GAE 应用程序和 Cloud SQL Server 的区域,但它们位于同一区域。我还了解到,对于第二代 Google Cloud SQL 服务器,应用程序和服务器的区域允许不同。
我还创建了一个新用户,并尝试使用连接字符串中的新用户用户名连接到实例。这并没有修复错误。
我还尝试添加防火墙规则,但这也没有解决问题:
最后,我转到 Google Cloud Console 的计算引擎部分,并通过 SSH 连接到为我的应用程序的最新实例提供服务的虚拟机。我成功 ping 通 Cloud SQL 服务器的 IP,但是 telnet xxx.xxx.xxx.xxx 3306
时间到。我也跑了lsof -i TCP:3306
和lsof -i | grep 3306
但没有出现任何进程。我还在这个盒子上安装了 mysql 并尝试从那里连接到服务器,但连接失败。
有谁知道可能导致此问题的原因吗?
最佳答案
看起来可能有 an issue与 the Go MySQL driver当已部署的 Google App Engine 应用程序尝试连接到第二代 Google Cloud SQL Server 时。
我创建了第一代 Cloud SQL 实例,并且能够使用已部署的 Google App Engine 应用程序通过以下连接字符串成功连接到服务器:
user@cloudsql(project-id:instance-name)/dbname
不需要区域名称。
关于google-app-engine - 从已部署的应用连接到 Google Cloud SQL 服务器时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39668672/