首批通过分布式安全可靠测评,为关键业务系统打造
SQL 执行过程报错 Connection reset
更新时间:2025-06-17 09:01
问题现象
ODC 执行耗时 SQL 语句时报错
ODC 通过负载均衡(F5、SLB 等)访问 OceanBase 数据库,ODC 执行耗时 SQL 语句在固定间隔(此间隔大约是负载均衡配置的连接保活时间,如 SLB 一般是 15 分钟)会报错。
报错信息:
Connection reset报错信息示例:

使用命令行工具 OBClient 时报错
报错信息:
Lost connection to MySQL server during query报错信息示例:

问题原因
负载均衡产品(包括各种硬件、软件产品,如 F5、阿里云 SLB 等),一般都会提供连接报保活配置,避免因为应用的异常断连导致负载均衡组件内部连接资源无法释放。
ODC 服务端会周期性的检查连接的可用性(使用 select 1 from dual ),检查周期为 5 分钟。如果负载均衡配置的连接保活时间小于 5 分钟,或者某个 SQL 语句的执行时间超过了负载均衡配置的保活时间,连接会被负载均衡组件主动断开。
说明
此问题在 MySQL、Oracle 租户均存在。如果只在 Oracle 模式出现连接中断问题,原因如下:
Oracle 模式下,如果 autocommit=OFF,连接如果无任何新的命令执行,会在 ob_trx_idle_timeout 时间后被 OBServer 中断。ob_trx_idle_timeout 租户变量:事务空闲超时时间,即事务中两条语句之间的执行间隔超过该值时超时。单位:微秒。
解决方法
修改 OBProxy 的连接保活配置,确保
已开启连接保活 client_sock_option_flag_out=2
设置client_tcp_user_timeout 值。推荐设置为 0,或者至少大于 client_tcp_keepintvl 的值。
注意
- 修改 OBProxy 配置需要使用 root@proxysys账号,否则修改无效。
- 如为 OCP 管理的 OBProxy 集群,用户可以通过 OCP 修改 OBProxy 配置。
- 该配置原理:负载均衡节点会根据连接是否有网络包发送判断连接是否有效,如果一个连接在一段时间之内(例如 15 分钟) 无任何网络包,则判定连接失效并主动断开连接。 OBProxy 开启连接保活,5 秒发送一个 keepalive 包,这样负载均衡节点就会认为连接使用是活跃的,不会主动断开连接。
OBProxy 客户端连接 tcp keeplive 的相关参数说明:
参数 说明 client_sock_option_flag_out client 端 socket 选项,bit 1: NO_DELAY, bit 2: KEEP_ALIVE。 client_tcp_keepidle 表示启动 keepalive 时长。 client_tcp_keepintvl 表示启动 keepalive 后,发送一次探活包时长。 client_tcp_keepcnt 表示启动 keepalive 后,未收到响应的探活包数量,此情况表示已断开连接。 client_tcp_user_timeout 等待 TCP 层 ACK 确认信息的超时时长,超过时 OBProxy 会主动断开连接。 注意
此配置项的值应大于 client_tcp_keepintvl 配置项的值,OBProxy 推荐设置为 0,否则在网络状况不佳时(如出现丢包情况)会导致连接被 OBProxy 中断。
使用 OBClient 命令行工具查看当前配置,通过 root@proxysys 账号连接 OBProxy。
-- 查看当前配置 show proxyconfig like 'client_sock_option_flag_out'; show proxyconfig like 'client_tcp%';推荐的配置。
alter proxyconfig set client_sock_option_flag_out=2 alter proxyconfig set client_tcp_keepidle=5 alter proxyconfig set client_tcp_keepintvl=5 alter proxyconfig set client_tcp_keepcnt=5 alter proxyconfig set client_tcp_user_timeout=0