Hui*_*Lin 4 connection database-connectivity google-cloud-sql google-cloud-platform
从 3 月 31 日开始,我在 Google Cloud SQL 中遇到以下错误:
读取通信数据包时出错。
我已经使用 Google Cloud SQL 2 年了,但从未遇到过这样的问题。我很担心。
这是详细的错误消息:
textPayload: "2019-04-29T17:21:26.007574Z 203385 [Note] Aborted connection 203385 to db: {db_name} user: {db_username} host: 'cloudsqlproxy~{private ip}' (Got an error reading communication packets)"
Run Code Online (Sandbox Code Playgroud)
虽然此错误消息确实经常在维护期后出现,但这不一定是值得关注的原因,因为这是 MySQL 的已知行为。
关于此问题发生原因的可能解释是:
readTimeoutMySQL 驱动程序中的设置设置得太低。连接尝试失败的原因有很多。网络通信永远无法保证,数据库可能暂时无法响应。确保您的应用程序能够妥善处理断开或不成功的连接。
根据您的情况,此问题的一些可能的解决方法可能是以下之一:
如果问题与高负载有关,您可以使用指数退避来重试连接,以防止同时发送太多连接请求。这里的最佳实践是以指数方式回退连接请求并添加随机回退以避免限制和潜在的实例过载。作为将来缓解此问题的一种方法,建议间隔连接请求以防止过载。不过,根据您连接到 Cloud SQL 的方式,某些 ORM 包默认情况下可能已使用指数退避。
如果问题可能与长期运行的非活动连接的累积有关,您将能够使用show full processlist在数据库上查找高连接Time或连接在哪里Command来
知道这是否是您的情况Sleep。
如果这是您的情况,您将有一些可能的选择:
如果您没有使用连接池,您可以尝试更新客户端应用程序逻辑,以便在操作结束时立即正确关闭连接,或使用连接池来限制连接生命周期。特别是,使用连接池来管理连接计数是理想的。这样,未使用的连接将被回收,并且可以通过使用该参数来限制同时连接请求的数量maximum pool size。
如果您使用连接池,则可以在操作结束时立即将空闲连接返回到池中,并通过调整wait_timeout或interactive_timeout标志值来设置更短的超时。将 CloudSQL wait_timeout标志设置为 600 秒以强制刷新连接。
检查网络和端口连接一次 -
步骤 1. 使用 tcptraceroute 或 netcat 确认端口 3306 上的 TCP 连接。
步骤2.如果[步骤1]成功,则尝试检查使用mysql客户端检查超时/错误是否有任何错误。
当客户端可能突然终止连接时,您可以检查:
如果MySQL客户端或mysqld服务器接收到的数据包大于max_allowed_packet字节,或者客户端接收到数据包太大的消息,那么您可以发送较小的数据包或增加max_allowed_packet客户端和服务器上的标志值。如果存在未使用“开始”和“提交”正确提交的事务,则需要更新客户端应用程序逻辑以正确提交事务。
强烈建议在数据库标志中启用general_log。另一个建议是还启用 Slow_query 数据库标志并输出到文件。另请查看此 GitHub 问题评论,并浏览此处针对此问题提出的其他解决方案列表
| 归档时间: |
|
| 查看次数: |
8329 次 |
| 最近记录: |