Google App Engine上的CloudSQL PDO(unix_socket)问题

时间:2013-11-03 09:16:21

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

我正在尝试连接到我的CloudSQL实例FROM App Engine。我设置的方式是使用静态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初始化字符串中包含主机设置,例如:

$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?

启发我,如果你愿意......


更新&amp;溶液

正如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;

1 个答案:

答案 0 :(得分:3)

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

注意:您可以使用“SHOW GRANTS FOR'bookie'@'localhost'”等查询为特定用户授予权限。