数据库在运行期间经常会有各种异常情况出现,比如应用程序错误、数据库连接错误、数据库权限问题、数据库资源问题、网络问题等。在这所有的情况中,有一种就是应用异常,但是错误信息包含 OB 的错误码。
为了帮助大家快速定位这种场景下的问题根源并高效解决,这里总结了一套清晰、实用的应用异常且报错信息包含 OB 错误码报错排查流程。这套流程提供明确的操作步骤,旨在提升问题处理效率,尽可能降低对业务的影响,为日常运维工作提供有力的支持。
下图是应用执行报错且错误信息包含 OB 错误码问题排查流程图。
流程介绍
当遇到应用执行异常且报错信息包含 OB 错误码信息的场景,可以按照该流程进行问题排查。
首先要判断是否可以用 obclient 连接数据库手动复现问题,是的话,可以通过连接后问题复现进行排查;否的话,需要排查程序配置的数据源信息。
- 复现问题进行问题排查
-
使用 obclient 通过 2881 连接 OB 集群。
-
手动执行 SQL 复现问题场景。
-
获取 trace_id。
- Oracle 租户,执行
select last_trace_id() from dual;
- MySQL 租户,执行
select last_trace_id;
- Oracle 租户,执行
-
获取实际执行 SQL 的主机信息。OB 集群一般是多节点部署,可以通过如下 SQL 获取 SQL 实际执行的节点,然后再进行日志过滤。根据
sql_audit
视图查询结果,svr_ip
对应的主机即实际执行该 SQL 主机。- V2.x 版本和 V3.x 版本,执行
select * from oceanbase.gv$sql_audit where trace_id='第二步获取的trace_id';
- V4.x 版本执行
select * from oceanbase.gv$ob_sql_audit where trace_id='第二步获取的trace_id';
- V2.x 版本和 V3.x 版本,执行
-
使用
ssh
命令登录到对应的主机, -
使用
cd
命令进入对应的日志文件夹。命令如下:cd /home/admin/oceanbase/log
。 -
执行如下命令过滤日志中相关信息。
grep "${trace_id}" observer.log
grep "${trace_id}" observer.log.xxxx
-
根据日志中信息,结合日志分析相关问题。更多日志信息,请参考日志概述。如遇日志中信息不明确,可以联系技术支持人员一起排查。
- 排查程序配置的数据源信息,详细信息如果有需要可以咨询相关使用方。
- 根据数据源明确访问链路。
- 明确访问链路包含如下信息的数量和地址。
- obproxy 的数量与地址信息
- OBServer主机的数量与地址信息
- 判断是否经过 obproxy。
-
是。
-
通过 ssh 登录对应的 obproxy 节点。
-
使用 cd 命令进入 obproxy 的日志目录
-
执行如下命令,过滤出错误日志。
grep "错误文本" obproxy_error.log obproxy_error.log.xxx | grep "出错时间点'
-
根据过滤出的日志条目,找出出错的 SQL 所路由的 OB 节点。
然后通过 ssh 登录对应的的 OB 节点进行排查。
-
-
否。
-
通过 ssh 登录对应的的 OB 节点。
-
进入日志目录,命令如下。
cd /home/admin/oceanbase/log
-
执行如下命令,过滤出错误日志。
grep "sending error" observer.log observer.log.xxx | grep "错误码'
-
通过过滤出的日志,获取 trace_id,然后继续使用 trace_id 过滤日志。
grep "trace id" observer.log observer.log.xxx
-
根据日志中信息,结合日志分析相关问题。更多日志信息,请参考日志概述。如遇日志中信息不明确,可以联系技术支持人员一起排查。
-
-
以上为应用异常且包含 OB 错误码的问题排查流程,希望能为日常运维工作提供有力的支持。
典型案例
不区分模式
- MyBatis 使用 OceanBase Connector/J V2.4.10 版本驱动,连接 OceanBase 数据库执行 SQL 报错
-5930 maximum open cursors exceeded
。请参见 应用使用 OceanBase Connector/J V2.x 版本驱动执行 SQL 报错 maximum open cursors exceeded 的原因和解决方法。 - OBServer 出现 force_disconnect 告警。请参见 OBServer 出现 force_disconnect 告警的触发逻辑和原因。
- OceanBase 集群出现 Failed to do check_ack_timeout 告警。请参见 OceanBase 集群出现 Failed to do check_ack_timeout 告警的原因。
- 普通业务租户的普通用户直连 OceanBase 数据库的 2881 端口时遇到报错
ERROR 1040 (08004): Too many connections
。请参见 普通用户连接时遇到报错 ERROR 1040 (08004): Too many connections。 - 在业务频繁建连接断连接场景下,建连接总数达到一定量以后,发生建连接报错 4016。请参见 OceanBase 数据库 V4.x 版本中建连接报错 4016。
MySQL 模式
- 应用执行 insert 出现报错 00918。请参见 应用执行 insert 出现报错 00918。
Oracle 模式
- 通过 OceanBase 数据库中的
DBLink
去访问大数据 LOB 类型时会遇到报错:ORA-00600: internal error code, arguments: -4007, Not supported feature or function
。请参见 使用 DBLink 访问 LOB 类型时遇到报错:-4007, Not supported feature or function 的原因和解决方法。