从 Python 访问 Gcloud MySQL 时连接超时

Connection Timing Out When Accessing Gcloud MySQL from Python

我有一个 python 应用程序,我正在尝试访问 Google 云服务上的 MySQL 数据库。

我一直在关注此 set up guide 以通过外部应用程序 (Python) 进行连接,并且我正在使用 pymysql 包。我正在尝试通过代理连接,并且已经通过 gcloud auth 从控制台登录验证了我的连接。

截至目前,我可以通过控制台访问数据库,但我需要能够从我的 python 脚本进行查询以构建它。当我按原样尝试 运行 时,出现以下错误: OperationalError:(2003,“无法连接到‘34.86.47.192’上的 MySQL 服务器(超时)”)

这是我正在使用的函数,安全敏感信息已加星标:

def uploadData():
    # cd to the directory with the MySQL exe
    os.chdir('C:\Program Files\MySQL\MySQL Server 8.0\bin')  
    # Invoke the proxy 
    subprocess.call('start cloud_sql_proxy_x64.exe -instances=trans-cosine-289719:us-east4:compuweather', shell=True)
    # Create connection    
    # I have also tried host = '127.0.0.1' for localhost here
    conn = pymysql.connect(host='34.86.47.192',
                                 user='root',
                                 password='*******',
                                 db='gribdata')
    try:
        c = conn.cursor()
        # Use the right databse
        db_query = 'use gribdata'
        c.execute(db_query)
        query = 'SELECT * FROM clients'
        c.execute(query)
        result = c.fetchall()
        print(result)
    except Error as e:
        print(e)
    finally:
        conn.close()

您是否尝试过从控制台连接 CloudSQL?连接后,您应该会在控制台中收到一条消息,显示“正在侦听 127.0.0.1:3306”。您的连接命令应该是

"cloud_sql_proxy_x64.exe -instances=trans-cosine-289719:us-east4:compuweather=tcp:3306"

尝试从控制台连接云代理并尝试创建与 pymysql 的连接。使用“127.0.0.1”。

是的,这个的文档非常有限,但您想要做的是 运行 从它的托管 IP 获取它并配置对您服务器上的外部 IP 地址的访问。所以你想使用那个 IP (34.xxx.xxx.xxx) 而不是环回 127 本地主机 IP。

要使其正常工作,您需要转到“连接”选项卡并在 Gcloud 中添加一个新连接。确保选中 public 地址框,IP 正确,完成后保存。

一些 Gcloud 工程师提供了一些出色的细节 here。看起来有些源文档已经过时了,这是现在连接的方式。

首先,确认 Cloud SQL 代理确实安装在您期望的目录中。 Cloud SQL 代理不是 MySQL 服务器的一部分,因此您不应该在 C:\Program Files\MySQL\MySQL Server 8.0\bin 中找到它,至少在默认情况下是这样。相反,云 SQL 代理是由 Google 提供的工具,它只是一个 .exe 文件,可以存储在您希望的任何目录中。有关如何下载代理的说明,您可以查看 docs

云 SQL 代理在云 SQL 实例和您的计算机之间创建安全 link。它所做的是将您机器中的本地端口转发到 Cloud SQL 实例。因此,如果您使用代理,您应该使用的主机 IP 是 127.0.0.1

conn = pymysql.connect(host='127.0.0.1',
                             user='root',
                             password='*******',
                             db='gribdata')

当使用 TCP 套接字启动 Cloud SQL Proxy 时,您应该在启动命令的末尾添加要将 Cloud SQL 的流量转发到的端口 =tcp:3306

subprocess.call('start cloud_sql_proxy_x64.exe -instances=trans-cosine-289719:us-east4:compuweather=tcp:3306', shell=True)