【问题标题】:CloudSQL PDO(unix_socket) problems on Google App EngineGoogle App Engine 上的 CloudSQL PDO(unix_socket) 问题
【发布时间】:2013-11-03 09:16:20
【问题描述】:

我正在尝试从 App Engine 连接到我的 CloudSQL 实例。我设置它的方式是使用静态 IP,我可以使用它从 App Engine 外部(即在我的开发环境中)连接到它。但是,当应用程序在 GAE 中运行时,连接到数据库的唯一方法是使用 unix_socket。我找到的唯一文档是Google's own docs

根据文档,这应该足以连接:

$db = new PDO('mysql:unix_socket=/cloudsql/my-prj:db1;charset=utf8',
   '<username>',
   '<password>'
);

我可以使用通过 CloudSQL 控制台创建的 root 密码以及通过本地 MySQL 客户端创建的其他用户连接到数据库。所以...如果我尝试使用 IP 在 GAE 上连接,它会失败(如文档所述)。但如果我尝试使用 unix_socket=/cloudsql/...,我会收到以下错误:

SQLSTATE[HY000] [1045] Access denied for user 'bookie'@'localhost' (using password: YES)

(当然,用户名是 bookie)。

如果我在 PDO 初始化字符串中包含 host 设置,例如:

$db = new PDO('mysql:host=123.456.789.101;unix_socket=/cloudsql/...');

我得到了这个错误:

SQLSTATE[HY000] [2002] Unable to find the socket transport "tcp" - did you forget to enable it when you configured PHP?

如果你愿意的话,请启发我……


更新和解决方案

正如 Razvan 所提到的,问题在于 root 以及我创建的任何其他用户都没有在 localhost 上获得任何权限。 root 拥有 localhost 的权限,但没有为它设置密码。

两种解决方案:

1) 无需root密码即可连接:

$db = new PDO('mysql:unix_socket=...', 'root', '');

2) 使用 google_sql.py 修复其他用户的权限(或者您可以连接到某些 SQL/MySQL 客户端):

GRANT ALL ON `localhost`.* to bookie;

【问题讨论】:

  • 如果您使用没有密码的用户“root”是否连接?
  • 我试试看。由于我确实通过 cloudsql 控制台为 root 设置了密码,所以我不确定它是否会起作用。但是,由于我还没有尝试过,所以值得一试。
  • 是的,这确实有效。由于我已经通过 cloudsql 控制台为 root 设置了密码,我很困惑为什么这会起作用......所以通过 SQLCmd 回到数据库,我意识到我的用户的权限没有在 localhost 上设置。那成功了。谢谢!

标签: php mysql google-app-engine pdo google-cloud-sql


【解决方案1】:

来自 App Engine 的连接将显示在 Cloud SQL 中,且 host = 'localhost'。因此,请确保 mysql 端的帐户与您尝试连接的帐户一致。

注意:您可以使用“SHOW GRANTS FOR 'bookie'@'localhost'”之类的查询来获取特定用户的权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 2013-07-15
    • 2010-10-03
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多