You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Compute Engine无法连接Cloud SQL,本地及App Engine可正常连接

问题解决:Compute Engine连接Cloud SQL MySQL报错SQLSTATE[HY000] [2002] No such file or directory

报错SQLSTATE[HY000] [2002] No such file or directory的核心原因是你的Compute Engine实例中不存在/cloudsql/aaaa:us-central1:aaaa-sql这个Unix套接字文件。

App Engine标准环境会自动挂载/cloudsql/目录到对应的Cloud SQL实例,因此你的套接字连接代码能正常工作;本地环境要么是用了TCP/IP连接,要么是手动运行了Cloud SQL代理创建了该套接字,所以也能正常连接。


方案一:使用Cloud SQL Auth Proxy(推荐,安全合规)

这是Google官方推荐的连接方式,无需暴露Cloud SQL公网IP,通过代理建立加密安全连接:

  1. 在Debian 9的Compute Engine实例中下载并授权代理工具:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    chmod +x cloud_sql_proxy
    
  2. 启动代理,指定你的Cloud SQL实例连接名,自动创建/cloudsql目录下的套接字:
    ./cloud_sql_proxy -instances=aaaa:us-central1:aaaa-sql=tcp:3306 -dir=/cloudsql &
    
    若需要后台持久运行,可使用nohup:
    nohup ./cloud_sql_proxy -instances=aaaa:us-central1:aaaa-sql=tcp:3306 -dir=/cloudsql > proxy.log 2>&1 &
    
  3. 确保你的Compute Engine实例的服务账号拥有Cloud SQL Client角色权限,否则代理无法完成身份认证。

启动代理后,你的现有连接代码无需任何修改即可正常工作。


方案二:改用TCP/IP连接(快速测试)

既然你已经将Compute Engine的IP添加到Cloud SQL的允许连接列表,直接修改代码使用TCP连接即可:

// MySQL Settings:
$dbuser='xxx';
$dbpassword='yyy';
$dbname='zzz';
$dbhost = '你的Cloud SQL实例公网IP'; // 若实例与CE在同一VPC,也可使用私有IP
$_SESSION['db_source'] = 'mysql:host='.$dbhost.';port=3306;dbname='.$dbname;

try {
    $db = new PDO($_SESSION['db_source'], $dbuser, $dbpassword);
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $db->setAttribute( PDO::ATTR_EMULATE_PREPARES, TRUE );
} catch (PDOException $e) {
    $error_message = $e->getMessage();
    include('errors/db_error.php');
    exit;
}

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:33:12