从 GCE 实例中,我从命令行执行以下操作
> mysql -udbase -p -DmyDb -hmyIp
>
> mysql> SELECT account, count(account)
> -> FROM `headers`
> -> where labelIds='["SENT"]'
> -> group by account order by 2 desc limit 0,50;
一旦它开始运行,我就会在另一个 shell 中通过检查进程列表来监控 SQL 命令。我可以看到 SQL、进程 ID 以及执行所需的时间。
经过最后一次测试后,processId 在 1172 秒后从查询变为睡眠状态。
但是,mysql 命令没有收到响应,它只是停留在那里,好像仍在等待来自 CloudSql 的某些响应。
一两分钟后,processID 从进程列表中消失,但 mysql 命令仍然在那里,好像在等待。
经过很长一段时间(超过 2 个小时,甚至放了一夜),我终于得到了:
第 1 行出现错误 2013 (HY000):查询期间与 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,客户端不是应该更早地给出错误吗?
感谢您的帮助。