我正在尝试从 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;