【问题标题】:Connecting to Google Cloud SQL连接到 Google Cloud SQL
【发布时间】:2014-03-12 17:55:13
【问题描述】:

我已经设置了一个运行良好的 Google Cloud SQL,但是我无法使用文档中提供的任何方法进行连接:

PDO

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

mysql_connect

$conn = mysql_connect(':/cloudsql/hello-php:my-cloudsql-instance', '<username>', '<password>');

mysqli

$sql = new mysqli(null, '<username>', '<password>', null, null, '/cloudsql/hello-php:my-cloudsql-instance');

我可以从 MySQL 工作台远程连接,但每当我尝试使用上述功能从网站尝试时,我都会收到“在‘读取初始通信数据包’时与 MySQL 服务器的连接丢失”——但我通过授权网络授予了 Cloud SQL 访问权限,并且检查给定的IP。我相信这与我不是试图从 Google App Engine 而是从我自己的开发数据库连接这一事实有关。如何从 Google 外部连接!?

更新:我已经通过各种方式验证了我的 IP,但此代码仍然无法正常工作。

$host="173.xxx.xx.xxx" <-- given from Google Developers COnsole
$db_username="root";
$db_pasword="xxxx"; <-- password I set after creating the instance

mysql_connect("$host", "$db_username", "$db_password")or die("cannot connect");

此页面给出错误:

警告:mysql_connect() [function.mysql-connect]:在“读取初始通信数据包”时丢失与 MySQL 服务器的连接,系统错误:第 5 行 /..../connect.php 中的 111 无法连接

当我尝试这个 PDO 连接时,我也得到一个错误:

$dsn = 'mysql:host=173.xxx.xx.xxx;dbname=database_name';
$username = 'root';
$password = 'xxxx';

$dbh = new PDO($dsn, $username, $password);

未捕获的异常“PDOException”,带有消息“SQLSTATE[HY000] [2003] 无法连接到“173.xxx.xx.xxx”(111)上的 MySQL 服务器

【问题讨论】:

    标签: google-app-engine google-cloud-platform google-cloud-sql


    【解决方案1】:

    您无法使用 unix 套接字进行远程连接(只能在本地计算机上使用),您需要通过网络进行连接。

    Google 有一个 brief description 来实现这一点,但基本上归结为,您需要授权要连接的 IP 号码/范围,并使用公共 IP 连接到数据库实例。

    【讨论】:

    • 感谢您的快速回复。那是我最初尝试过的,但仍然给我同样的错误。主机:instance-ip,用户:root,密码:我设置的密码。如果我提交了网站的公共 IP,任何想法为什么会出现该错误?
    • 很奇怪,如果你打开网络从你的 IP 连接,它应该可以工作。你能显示你正在使用的 PDO 连接字符串吗? (请混淆IP和密码,我只是想看看大致的结构)
    • 您的编辑听起来确实像是防火墙问题。你确定你打开了你的IP范围来访问数据库吗? (即答案链接中的第 1 步)
    • 我没有设置范围 - 只是我 ping 我的网站时找到的公共 IP。我应该将其设置为其他内容吗?
    • @user2727128 您应该设置您尝试连接的IPfrom,即您运行客户端的机器,否则CloudSQL 将不允许连接。