来自 GCE 实例的 CloudSQL ERROR 2013

CloudSQL ERROR 2013 from GCE instance

在 GCE 实例中,我从命令行执行以下命令

mysql -udbase -p -DmyDb -hmyIp < sql.txt

一旦它获得 运行,我通过检查进程列表在另一个 shell 中监视 SQL 命令。我看到 SQL、processId 和执行时间。

最后一次测试后,processId 在 1172 秒后从 Query 变为睡眠。

然而,mysql命令没有收到响应,它只是停留在那里,好像还在等待来自 CloudSql 的响应。

一两分钟后,processID从进程列表中消失,mysql命令还在,好像在等待

经过很长一段时间(30 到 60 分钟),我终于得到:

第 1 行的错误 2013 (HY000):查询期间与 MySQL 服务器失去连接

就好像GCE和CloudSQL的连接断开了,只是客户端没有意识到。

根据另一个 post 中的建议,我夸大了

中的数字

sudo /sbin/sysctl -w net.ipv4.tcp_keepalive_time=1800 net.ipv4.tcp_keepalive_intvl=1800 net.ipv4.tcp_keepalive_probes=50

但这似乎唯一能做的就是延长查询完成与客户端最终断开连接之间的时间。

如果应用net_read_timeout,客户不应该更早地给出错误吗?

感谢您的帮助。

TCP Keepalive需要小于10分钟才能让GCE防火墙不会忘记连接。让它变大会破坏这个目的。我建议尝试 Connecting to Google Cloud SQL from Google Compute Engine:

中的说明
# Display the current tcp_keepalive_time value.
$ cat /proc/sys/net/ipv4/tcp_keepalive_time

# Set tcp_keepalive_time to 60 seconds and make it permanent across reboots.
$ echo 'net.ipv4.tcp_keepalive_time = 60' | sudo tee -a /etc/sysctl.conf

# Apply the change.
$ sudo /sbin/sysctl --load=/etc/sysctl.conf

# Display the tcp_keepalive_time value to verify the change was applied.
$ cat /proc/sys/net/ipv4/tcp_keepalive_time