2

App Engine から CloudSQL インスタンスに接続しようとしています。私が設定した方法は、App Engine の外部 (つまり、開発環境) から接続するために使用できる静的 IP を使用することです。ただし、アプリが GAE 内で実行される場合、データベースに接続する唯一の方法は unix_socket を使用することです。これについて私が見つけた唯一のドキュメントは、Google 自身の docsです。

ドキュメントによると、これは接続するのに十分なはずです:

$db = new PDO('mysql:unix_socket=/cloudsql/my-prj:db1;charset=utf8',
   '<username>',
   '<password>'
);

CloudSQL コンソールで作成したルート パスワードと、ローカルの MySQL クライアントで作成した追加のユーザーを使用して、データベースに接続できます。SO ... 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 が述べたように、問題は、ルートと私が作成した他のユーザーの両方にlocalhostに対する権限が付与されていないことでした。rootには localhost に対する権限がありましたが、そこにはパスワードが設定されていませんでした。

2 つのソリューション:

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 からの接続は、host = 'localhost' で Cloud SQL に表示されます。そのため、mysql 側のアカウントが、接続しようとしているアカウントと一致していることを確認してください。

注: 「SHOW GRANTS FOR 'bookie'@'localhost'」のようなクエリを使用して、特定のユーザーのアクセス許可を取得できます。

于 2013-11-04T01:22:16.173 に答える