从GCE实例,我从命令行执行以下操作
mysql -udbase -p -DmyDb -hmyIp< sql.txt
一旦它运行,我通过检查进程列表来监视另一个shell中的SQL命令。我看到了SQL,processId和执行它所花费的时间。
在最后一次测试之后,processId在1172秒后从Query更改为sleep。
然而,mysql命令没有收到响应,它只是停留在那里,好像还在等待来自CloudSql的一些响应。
一两分钟后,processID从进程列表中消失,仍然存在mysql命令,好像在等待。
经过很长一段时间(30到60分钟),我终于得到了:
错误2013(HY000)第1行:查询期间与MySQL服务器的连接丢失
就像GCE和CloudSQL之间的连接被切断一样,只是客户端没有意识到它。
根据另一篇文章中的建议,我夸大了
中的数字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,客户端是否应该更早地提供错误?
感谢您的帮助。
答案 0 :(得分:1)
The TCP Keepalive needs to be shorter than 10 minutes to make the GCE firewall not forget the connections. Making it larger will defeat that purpose. I would recommend trying the instructions from 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