2

我正在尝试从 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 初始化字符串中包含主机设置,例如:

$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;
4

1 回答 1

3

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

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

于 2013-11-04T01:22:16.173 回答