【问题标题】:Connection Timing Out When Accessing Gcloud MySQL from Python从 Python 访问 Gcloud MySQL 时连接超时
【发布时间】:2021-02-18 18:30:25
【问题描述】:

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

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

到目前为止,我可以通过控制台访问数据库,但我需要能够从我的 python 脚本中进行查询来构建它。当我尝试按原样运行它时,我收到以下错误: OperationalError: (2003, "Can't connect to MySQL server on '34.86.47.192' (timed out)")

这是我正在使用的功能,其中安全敏感信息已加星标:

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()

【问题讨论】:

  • 您是如何获得 GCP 授权的?您是否设置了具有适当权限的服务帐号来运行代理并连接到 Cloud SQL?
  • 顺便说一句,最简单的方法是使用 -credential_file 参数将其传递给 cloud_sql_proxy(它采用服务帐户 json 文件的路径)。该服务帐号需要具有 Cloud SQL Client 角色才能与 Cloud SQL 实例通信。

标签: python mysql gcloud pymysql


【解决方案1】:

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

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

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

【讨论】:

  • 等等...我明白了,现在您已经授权了您的应用程序的 IP 地址(在本例中为 34.xxx.xxx.xxx)并直接从您的应用程序连接到它?请注意,这意味着您不再使用代理,对吗?如果是这种情况,如果您没有使用 SSL,这意味着您正在以未加密的方式连接到您的数据库(除非您正在做其他事情,例如 VPN 或其他东西)。请注意,您正在将未加密的数据发送到您的数据库,除非我错过了您正在执行的另一个步骤?
  • 我使用的是 SSL,所以它不是一个完全未加密的连接。很高兴知道它在技术上并没有使用代理,但就我的目的而言,我只需要能够远程访问数据库并不重要,这个解决方案可以实现这一点
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 如果有帮助,请告诉我。我不熟悉在 Python 中启动进程可能对此产生的影响,所以如果它不起作用,我将进一步调查
  • 是的,我自己手动将它移动到该目录,因为它依赖于 MySQL 可执行文件。我试过使用环回地址,虽然你的建议与谷歌的文档相匹配,但我似乎无法让它工作,我在 Python 中遇到了同样的超时错误。它在代理本身中确实可以正常工作
【解决方案3】:

您是否尝试过从控制台连接 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”。

【讨论】:

  • 当我单独运行它时,它只是说“使用项目余弦...”然后关闭。同时,使用 localhost IP 运行会拒绝访问
猜你喜欢
  • 1970-01-01
  • 2019-11-29
  • 2016-08-13
  • 2017-07-06
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2011-09-04
相关资源
最近更新 更多