我正在使用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 Server: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'的密码必须为null。
我在我的mysql控制台中进行了以下查询,以验证用户'root'@'localhost'确实有一个空密码:select User, Host, HEX(authentication_string) from mysql.user
。 'root'@'%'用户仍然拥有我在Google Cloud SQL实例控制台中指定的密码。
我查看了有关GAE应用和Cloud SQL服务器区域的possible issue,但它们位于同一区域。我还了解到,对于第二代Google Cloud SQL服务器,应用程序和服务器的区域可以不同。
我还创建了一个新用户,并尝试使用连接字符串中的新用户的用户名连接到该实例。这并没有解决错误。
我还尝试添加防火墙规则,但这也没有解决问题:
最后,我访问了Google云端控制台的计算引擎部分,并通过SSH连接到为我的应用的最新实例提供服务的VM。我成功地ping了Cloud SQL服务器的IP,但是telnet xxx.xxx.xxx.xxx 3306
超时了。我还运行了lsof -i TCP:3306
和lsof -i | grep 3306
,但没有出现任何进程。我还在这个盒子上安装了mysql,并尝试从那里连接到服务器,但是连接失败了。
有谁知道可能导致此问题的原因?
答案 0 :(得分:2)
当部署的Google App Engine应用程序尝试连接到 第二代 Google Cloud时,看起来an issue可能会the Go MySQL driver SQL Server。
我创建了 第一代 Cloud SQL实例,并且我能够使用已部署的Google App Engine应用程序使用此连接字符串成功连接到服务器:
user@cloudsql(project-id:instance-name)/dbname
不需要地区名称。
答案 1 :(得分:0)
谷歌提供的连接到第二代的解决方案在这里: "TLS requested but server does not support TLS" error with Google Cloud SQL (2nd generation) from Google App Engine?
Google发布的文档(可能仍然是)错误,但正确的解决方案已发布在那里。 我们在生产中使用第二代Cloud SQL而没有问题。