业务侧反馈update更新表报错
“Communications link failure“ 这个报错一般是因为结果集超过了1500行,因为这边有相关限制通过脱敏库跳转到gbase数据库,且查询的结果超过1500行不加limit就会报错。
但是这条sql是update,且跟业务沟通反馈他是直连数据库的不是通过脱敏库跳转。
先排查跟“Communications link failure“报错的参数,看是否是参数的问题。
根据自己了解到的一些案例来看,可能是跟两个参数有关。
wait_timeout(非交互连接超时时间,即 jdbc 连接)
interactive_timeout(交互连接超时时间,即客户端连接)配置,默认是 8 小时,8 小时内都没有访问则访问会被拒绝。
看一下数据库的参数设置
根据参数的值来看跟这两个参数应该没什么关系
此时原厂工程师建议看下有没有gbased或者gclusterd服务重启的情况发生,查看后发现gn节点的gbased没有重启过,gc节点的gcluster服务有重启。而且刚好是此sql执行的时间。发生这种情况基本可以确定是sql的问题。
进一步排查sql,以下sql表与字段已修改。
很简单的sql,将sql内的select语句拿出来单独执行也可以执行成功。
应该是语法的问题
自己建测试表插入几行数据
然后执行与问题sql同样的语法,发现有报错。
HandleRow return error:Scalar sub-query return result more than one row
因为结果集超过1个的报错。
似乎就是因为这个原因,原sql的select结果集是几千。
将结果限制为1个试试。
可以更新
在原sql限制结果为1,发现也可以。
将结果反馈给业务,原来update语句确实会遇到这样的情况,遇到了才会修改。但是这次的报错提示是“Communications link failure“,所以没想到是select的结果是多个的原因。