本文介绍如何排查 server 断连接问题。
断开连接的常见原因
协议层异常 发送报文时遇到发生一些非预期的错误,server 将会发生主动断开连接。
事务异常 包括 rollback 失败或 commit 失败。
Query 异常 已输出行数据,但 server 内部发生错误。
Processor 发生异常 获取 processor 为空。
处理 processor 发生异常。初始化变量时发生异常。
session is killed。
删除租户 比如在删除租户后,如果 proxy 错误地路由请求到本机,导致 query 发现 session is killed,导致断连接。
杀事务。
主动 kill session。
断开连接的排查步骤
使用断开连接的 conn id 找到客户端(OBProxy、Connector/JDBC、OBCI)连接到服务器的 sess_id(也可能称为 thread_id)。
在服务器日志中使用 sess_id 搜索与断开连接相关的 observer 日志信息。
grep "kill and revert session" observer.log* | grep <sess_id>使用日志中的 trace_id 搜索 observer 日志,找到报告错误代码 -5066 的开始位置,以确定断开连接的原因。
grep <trace_id> observer.log*如果原因为上述异常情况,保存日志信息、环境信息和 trace_id 并联系 OceanBase 技术支持协助处理。
如何查找 conn_id
当 Query 异常时通常会报出 -5066 错误码,在 observer 日志中可以根据 trace_id 来查找。
日志信息如下。
observer.log.20230705172820016:[2023-07-05 17:26:35.988048] WDIAG [SQL] stmt_query (ob_sql.cpp:210) [61238][T1004_L0_G0][T1004][xxxxx-xxxxx-xxxxx-xxxxx] [lt=9][errcode=-5066] fail to handle text query(stmt=INSERT INTO test VALUES (SLEEP(1)), ret=-5066)
这里表示 session interrupt。随后搜索 connection close 来找到 sessid,如以下示例日志中的信息。
observer.log.20230705172820016:[2023-07-05 17:26:36.091289] INFO [RPC.OBMYSQL] destroy (obsm_conn_callback.cpp:223) [52261][sql_nio1][T0][Y0-0000000000000000-0-0] [lt=27] connection close(sessid=3221585899, ...)
在这个示例中,3221585899 即为 conn id 值。
适用版本
OceanBase 数据库所有版本。