【发布时间】: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