我有一个奇怪的,反复发生但不是常数的错误,我得到“2013,'在查询过程中失去与MySQL服务器的连接'”。这些是前提:
Python应用程序每小时运行大约15-20分钟,然后停止(由cron每小时安排)
该应用程序位于GCE n1-highcpu-2实例上,数据库位于带有每个包定价计划的D1上,以及以下mysql标志
max_allowed_packet 1073741824 slow_query_log on log_output TABLE log_queries_not_using_indexes on
数据库仅由此应用程序和此应用程序访问,因此使用情况相同,每小时约20分钟,其他40分钟则没有任何内容
它做的第一个查询是
SELECT users.user_id, users.access_token, users.access_token_secret, users.screen_name, metadata.last_id FROM users LEFT OUTER JOIN metadata ON users.user_id = metadata.user_id WHERE users.enabled = 1
上面的查询连接两个表,每个表大约700行,没有索引
在此查询之后(运行没有问题需要0.2秒)应用程序启动没有任何问题
查看日志我看到每次出现此错误时,查询开始与错误之间的间隔为15分钟。
我还启用了慢查询日志,这些查询的注册方式如下:
start_time: 2014-10-27 13:19:04
query_time: 00:00:00
lock_time: 00:00:00
rows_sent: 760
rows_examined: 1514
db: foobar
last_insert_id: 0
insert_id: 0
server_id: 1234567
sql_text: ...
有什么想法吗?
答案 0 :(得分:1)
如果您的连接闲置15分钟,您可能会看到GCE断开您的空闲TCP连接,如https://cloud.google.com/compute/docs/troubleshooting#communicatewithinternet所述。尝试该页面建议的解决方法:
sudo /sbin/sysctl -w net.ipv4.tcp_keepalive_time=60 net.ipv4.tcp_keepalive_intvl=60 net.ipv4.tcp_keepalive_probes=5
(您可能需要将此配置放入/etc/sysctl.conf以使其永久化)