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,通过代理建立加密安全连接:
- 在Debian 9的Compute Engine实例中下载并授权代理工具:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy chmod +x cloud_sql_proxy - 启动代理,指定你的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 & - 确保你的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
相关产品推荐
相关产品推荐

