Google Cloud SQL:在“读取初始通信数据包”时丢失与MySQL服务器的连接
我设置了一个默认的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实例的时候,也可以在高级选项里进行设置。
我只需在框里填上我应用的名字,点击保存,一切就正常运行了。