Google Cloud SQL:在“读取初始通信数据包”时丢失与MySQL服务器的连接

4 投票
2 回答
3991 浏览
提问于 2025-04-18 17:40

我设置了一个默认的django/django-wiki项目。在本地测试时一切正常。但是,当我尝试从本地服务器连接到云数据库时(使用google.appengine.ext.django.backends.rdbms),连接不成功,我觉得可能是认证方面的问题。更重要的是,我无法从生产服务器连接。

我确保没有把本地的MySQLdb放在我的虚拟环境目录里。

在我的app.yaml文件中,我有以下内容:

- name: MySQLdb
  version: "latest"

我的DATABASE设置如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbname',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '/cloudsql/appname:sqlinstance',
        'PORT': '',
    }
}

看起来是正常工作的,或者至少没有抱怨缺少包或mysql导入的问题。我的问题是这样的(从生产日志中获得的,但在django调试输出中也能看到):

File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/MySQLdb-1.2.4b4/MySQLdb/connections.py", line 190, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (2013, "Lost connection to MySQL server at 'reading initial communication packet', system error: 38")

这可能是什么原因造成的呢?这是否意味着已经连接到了某个地方,但没有收到回复?其他帖子似乎提到这是从外部源连接时的问题,但据我所知,这个连接是来自app engine的。

2 个回答

0

根据这个链接,每当一个实例(可以理解为一个运行的程序)出现问题而停止时,它会自动重启。在重启的过程中,它会不断出现这个错误,直到它准备好接受新的请求。

你可以尝试使用一种叫做“指数退避”的方法来处理这个问题。这个问题发生的频率如何?是每次都会出现,还是偶尔才会出现一次?

6

其实,这比我想象的简单多了。我原本以为,用我的谷歌账号创建的云数据库会默认允许我的GAE应用访问。但实际上,这个权限需要手动设置。你需要去开发者控制台 -> 存储 -> 云SQL -> 实例名称 -> 编辑 -> 授权的应用引擎应用。另外,在你创建SQL实例的时候,也可以在高级选项里进行设置。

我只需在框里填上我应用的名字,点击保存,一切就正常运行了。

撰写回答