我正在尝试连接到我的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;
答案 0 :(得分:3)
来自App Engine的连接将在Cloud SQL中显示host ='localhost'。因此,请确保mysql端的帐户与您尝试连接的帐户一致。
注意:您可以使用“SHOW GRANTS FOR'bookie'@'localhost'”等查询为特定用户授予权限。