我正试图从App Engine连接到我的CloudSQL实例。我设置它的方式是使用一个静态IP,我可以使用它从外部应用程序引擎(即,在我的开发环境中)连接到它。但是,当应用程序在GAE中运行时,连接到数据库的唯一方法是使用unix_socket。我在上面找到的唯一文档是Google's own docs。
根据文档,这应该足以连接:
$db = new PDO('mysql:unix_socket=/cloudsql/my-prj:db1;charset=utf8',
'<username>',
'<password>'
);
我可以使用通过CloudSQL控制台创建的根密码连接到数据库,也可以使用通过本地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?
启发我,如果你愿意。。。
更新解决方案
正如Razvan所提到的,问题是根用户和我创建的任何其他用户都没有被授予本地主机上的任何权限。根用户在本地主机上有权限,但没有为其设置密码。
两种解决方案:
1)没有根用户密码的连接:
$db = new PDO('mysql:unix_socket=...', 'root', '');
2)使用google_sql.py修复其他用户的权限(也可以连接到某些sql/MySQL客户端):
GRANT ALL ON `localhost`.* to bookie;
最佳答案
来自App Engine的连接将显示在Cloud SQL中,主机为“localhost”。因此,确保mysql端的帐户与您尝试连接的帐户一致。
注意:您可以使用诸如“SHOW GRANTS for‘bookie’@‘localhost’”之类的查询为特定用户设置权限。
关于php - Google App Engine上的CloudSQL PDO(unix_socket)问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19751416/