Mysql: App Engine 上的 Google Cloud SQL - 连接字符串已过时?

创建于 2016-09-25  ·  35评论  ·  资料来源: go-sql-driver/mysql

问题描述

在此驱动程序的自述文件中,用于连接到 App Engine 上的 Google Cloud SQL 的连接字符串如下所示:

user@cloudsql(project-id:instance-name)/dbname

虽然Google 的 cloudsql 包文档也为您的驱动程序确认了这一点,但 Stack Overflow 上的一些帖子(例如这个帖子)声称需要使用projectid:regionname:instancename而不是projectid:instancename

什么是正确的连接字符串? 这些目前都不起作用。

示例代码

可以在此处找到更详细的帖子: http ://stackoverflow.com/questions/39668672/trouble-connecting-to-google-cloud-sql-server-from-deployed-app

错误日志

每当我调用使用 Cloud SQL 数据库的端点时,我的服务器都会返回 500 响应。 当我从本地提供的应用程序版本连接到服务器时,数据库连接工作正常。

我尝试了各种连接字符串,以下是 Google Cloud Console 中记录的一些错误:

5447 [Warning] 'user' entry 'root<strong i="21">@localhost</strong>' ignored in --skip-name-resolve mode.

5447 [Warning] entry 'root'@'localhost' in mysql.user is ignored because it duplicates entry in mysql.system_user

14409 [Note] Aborted connection 14409 to db: 'User' user: 'root' host: 'xxx.xxx.xxx.xxx' (Got an error reading communication packets)

(连接字符串中没有指定密码,因为文档没有指定需要密码。这篇文章提到当应用程序尝试使用root@localhost连接到服务器时,连接密码必须为空。)

6170 [Note] Access denied for user 'root'@'cloudsqlproxy~xx.xxx.xxx.xx' (using password: NO) 

我还尝试与 root 用户(用户名:newuser)以外的用户连接:

5447 [Warning] 'user' entry 'newuser<strong i="30">@localhost</strong>' ignored in --skip-name-resolve mode.

配置

_驱动程序版本(或 git SHA):_ https://github.com/go-sql-driver/mysql/tree/3654d25ec346ee8ce71a68431025458d52a38ac0

_Go版本:_go版本go1.6.2 linux/amd64

_服务器版本:_ Google Cloud SQL 实例运行 MySQL 5.7

_服务器操作系统:_ 从 Compute Engine 选项卡中,托管我的应用程序最新版本的服务器似乎正在运行 Debian 7.11 (Wheezy)

documentation

最有用的评论

@bagatelli为了澄清,请确保您使用的是此评论中提到的连接字符串格式: http ://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error-

抱歉之前的简短。 我们在 App Engine 上的 Go 生产中使用第二代,没有问题。 只需省略“tlsConfigName”参数,因为 SQL 代理会添加它,但无论哪种方式,他们都报告说现在无论如何都支持 TLS。

所有35条评论

user@cloudsql (project-id:instance-name)/dbname
是旧的。 它仍然有效,因为我仍在使用它。

最近 gae 也开始将数据库分类为区域,因此采用了新格式。 如果您的 cloudsql 被分类到一个区域,您将需要使用新格式

也许这个驱动程序没有正确解析新格式。 这可能是问题

就您而言,您是否正在运行第二代 Cloud SQL 服务器?

没有第一代

我怀疑驱动程序没有解析新格式。 代码可能需要更改,以便它获取第一个冒号之前的内容和第一个冒号之后的内容,而不管新冒号是否存在

目前有一个拉取请求正在更新,请阅读我

感谢您的提醒。 我刚刚对那个 PR 发表了评论。
作为临时解决方法,我将设置第一代服务器,直到驱动程序问题得到解决。

更新:当部署的 Google App Engine 应用程序尝试连接到第二代 Google Cloud SQL Server 时,驱动程序似乎存在问题。

我创建了第一代 Cloud SQL Server,并且能够使用已部署的具有以下连接字符串的 Google App Engine 应用程序成功连接到服务器:

user@cloudsql(project-id:instance-name)/dbname

不需要区域名称。

解析应该不是问题,驱动程序在括号之间获取所有内容: https ://github.com/go-sql-driver/mysql/blob/master/dsn.go#L282
它仅用于https://github.com/go-sql-driver/mysql/blob/master/driver.go#L65

有cloudsql帐户的人可以下载驱动程序,编辑https://github.com/go-sql-driver/mysql/blob/master/appengine.go#L14并将"appengine/cloudsql"替换为"google.golang.org/appengine/cloudsql" ,用新旧版本试一试,有无区域,报告什么有效? 谢谢!

_伙计们,供参考: _
谷歌提供的连接到第二代的解决方案在这里:
http://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error-with-google-cloud-sql-2nd

Google 发布的文档是(并且可能仍然是)错误的,但正确的解决方案已发布在那里。 我们在生产中使用第二代 Cloud SQL 没有问题。

这个问题有方法解决吗? 绝对不能与 CloudSQL 第二代一起使用。

@bagatelli在你上面看到我的评论

@benguild我在多个地方看到了你的评论。 但是,您假设每个人都在其连接中使用 SSL,但并非每个人都如此。 当然不是我的。 我收到的错误消息是“驱动程序:连接错误”。 由于驱动程序无法正确识别连接参数,甚至无法访问数据库。 我认为问题出在“新 appengine”和“旧 appengine”软件包的混乱中,这导致很多事情发生故障,而 Google 并没有费心正确记录这一变化。

@bagatelli为了澄清,请确保您使用的是此评论中提到的连接字符串格式: http ://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error-

抱歉之前的简短。 我们在 App Engine 上的 Go 生产中使用第二代,没有问题。 只需省略“tlsConfigName”参数,因为 SQL 代理会添加它,但无论哪种方式,他们都报告说现在无论如何都支持 TLS。

@benguild 。 感谢您为帮助我解决所有这些问题所做的一切努力。
您使用的是“新应用引擎”还是“旧应用引擎”? 我刚刚花了一天时间将我所有的代码转换为这个新的噩梦,即新的 appengine 包,正如你可能从我的另一篇文章中知道的那样,我无法再部署我的代码,因此我无法正确测试你上面的建议. 一旦找到部署我的应用程序的解决方案,我会再试一次。
谢谢!

@bagatelli如果您在部署时遇到问题,请尝试将代码拉到 VM 上或使用 Google Cloud Console。

@bagatelli我的意思是......在新机器上尝试它,或者在你注销它绝对与环境无关的事实之前使用他们的云控制台(已经有开发工具)。

由于存在 4 个月大的错误,我目前无法使用 macOS Sierra 进行部署,但我们可以从 VM 进行正常部署。

我敢肯定,完全离开环境对你来说会做更多的工作,所以我至少要确保在完全退出之前排除这种情况。

@pjebs 。 不知道你从哪里得到这个假设,但我没有使用灵活的环境。

@pjebs那是不正确的。 这就是您当前部署到标准的方式。

@pjebs appcfg.py update也可以。

@bagatelli我听到了——我通常倾向于最小化我的第三方依赖项和 API 依赖项,因为你说的是​​真的……谷歌没有义务提供支持,尽管否则他们会冒着名誉风险。

我不确定目前对您来说到底是什么问题(除了使用旧的 API,我认为?),但我为 App Engine 开发的每一个软件我也开发了打算离开 App Engine 如果并在需要时。 例如,对于我与之交互的每个 Google API,我都会编写一个“帮助程序”,用于实际调用方法并向应用程序的其余部分提供自己的方法,以便并且只有在必要时才需要将其调整为新环境,并且 [希望]不会破坏应用程序的其余部分。

对我来说,App Engine 更方便,因为它是一个除了扩展和偏好之外几乎不需要配置的环境,并且提供了一些很棒的 AP​​I。 出现问题时会很烦人,但是如果您遇到诸如您所说的问题,他们确实会提供高级支持?

@pjebs。 据我了解,goapp 只是 appcfg.py 的包装器。 它最终会在某个时候调用 appcfg.py。

@bagatelli当然,给我发一封电子邮件。 没问题

@benguild 。 我终于设法部署了我的应用程序,但仍然没有运气连接到 CloudSQL。
我已经更新了我的整个应用程序以使用“新的 appengine”包,并在 mysql-driver 包的“appengine.go”中将 clousql 的导入设置为 google.golang.org/appengine/clousql。
然后,我从 CloudSQL 控制面板创建了一个客户端证书,并使用 RegisterTLSConfig 相应地更新我的代码,如驱动程序文档中所述,提供 tls 配置作为参数,如您在 stackoverflow 上的帖子中所述。 我的 url 连接如下所示:

root:password@cloudsql (instance-connection-name-copyed-from-cloud-console)/myDatabase?tls=customTls

仍然没有运气。 错误:

驱动程序:连接不良

@arnehormann 。 这从您上面的帖子中回答了您的问题。

@bagatelli在没有 TLS 的情况下尝试。

@benguild 。 尝试不使用 tls。 没有运气。

驱动程序:连接不良

@pjebs 。 不确定您是否完全理解这里的问题。 驱动程序甚至没有到达数据库。 我确实了解您上面提到的内容在生产环境中可能是正确的,但我什至无法建立与数据库的单个连接,因此在我的情况下,上述内容根本不适用。

@bagatelli我要做的就是像我一样在 Stack Overflow 上发帖,并用以下标签标记它: google-cloud-sql ...我希望 Google 的某个人应该做出回应。

如果您遇到此问题,那么他们希望将其编入索引以供遇到相同问题的其他人使用。 一旦解决,请在此处回复问题的链接。

很可能它仍然与您的实施有关,因为就像我说的人们在生产中使用第二代并且它已经超出测试版。

@bagatelli您是否记得在 Cloud Console 中关闭实例的“需要 TLS”设置?

感谢@benguild@pjebs 。 如果我找到原因,将在 SO 上发布并在此处提供更新。

@benguild 。 我在 Cloud Console 中看不到任何提及 TLS 的内容

我认为您的意思是“仅允许 SSL 连接”。 如果这就是你所说的,那么是的,它已经关闭了。

好的,伙计们,我找到了问题所在。 它既不是驱动程序,也不是我的应用程序或 CloudSQL。 我正在部署应用程序的项目是多年前通过旧的开发人员控制台创建的。
在 Cloud Console 的访问控制选项卡中,有一个标签显示“此项目中的应用:所有已授权”。 并且在创建项目时,它还会创建默认的 appengine 和计算引擎帐户。 问题是这个特定项目没有两个默认帐户,并且很确定这就是问题所在。 可能发生的情况是 Google 在将 appengine 迁移到使用 IAM 和 Admin 管理访问帐户的云控制台时没有创建这些帐户。
我假设是因为当我注意到缺少默认帐户时,我创建了一个新项目和一个新的云 sql 数据库,并将完全相同的代码部署到这个新项目上,_voila_...一切正常。
@benguild @pjebs非常感谢您帮助我解决这个问题的所有努力。
@benguild我已经删除了我们之前对话中所有不相关的评论,因为我认为我们在与 AppEngine/Google 相关的同一页面上。 稍后将向您发送一封电子邮件。
我已经在 StackOverflow 上发布了这个问题,并将用这个发现来回答它,这样其他有同样问题的人可能会从中受益。
http://stackoverflow.com/questions/40020782/connect-to-google-sql-cloud-2nd-generation-with-go-on-appengine

再次感谢!

是的,如果 App Engine 无权访问 SQL 实例,那么您就会遇到问题。 👍🏻

由 #485 修复

我只能说谢谢@benguild ! 在 500 个打开的 chrome 标签和 5 小时的谷歌搜索之后,你帮助我停止用头撞键盘! 哈利路亚!!!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

pedromorgan picture pedromorgan  ·  6评论

julienschmidt picture julienschmidt  ·  7评论

xuewindy picture xuewindy  ·  3评论

BSick7 picture BSick7  ·  8评论

lunemec picture lunemec  ·  7评论