【SOP 系列 05】报错后如何定位 OceanBase 错误日志

我们知道 OceanBase 是一个分布式的数据库环境,当我们遇到问题需要通过日志去排查的时候,是不是有点困惑,应该去哪台机器上去看日志呢?希望能通过这篇文章来解答这个问题。

把这个问题可以归结为,我们是如何连接 OceanBase 环境的,根据这个分类来一步步决定在哪里找到需要的日志。

1、直连 OBServer 登录

如果是直连 OceanBase 集群,我们直接到直连的这台服务器上根据报错的信息去过滤最新的日志,示例:

[root@observer109 log]# mysql -h172.30.199.109 -P2881 -uroot@test1#ob_test_1 -p'Root123@@Root123' -A -c oceanbase
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (42000): Access denied for user 'root'@'xxx.xxx.xxx.xxx' (using password: YES)

这里我们根据错误码 1045observer.log 里无法搜索到 ret=-1045,遇到类似这样的情况,可以搜索关键字。比如该示例中租户名是 test1,搜索日志如图所示,红色框部分就是我们后续要使用的 trace_id

接着我们根据找到的这个 trace_id 再来过滤一下 observer.log,如下图所示:

从图中我们可以看出,登录失败的原因是把 test1#ob_test1_1 整体当成了租户名,而实际上并没有这样的租户,从侧面也说明我们直连 OBServer 的时候是不能指定集群名的。

2、连接指定的 OBProxy 登录

如果我们没有直连 OBServer,而是连的某个指定的 OBProxy,遇到问题的时候,可以按照以下 3 步来定位日志。

(1)明确访问的 OBProxy 的地址和当前执行的命令,如下图红色标识的部分。

(2)登录到这台 OBProxy,根据执行的命令,检索到 server_iptrace_id,如下图红色标识的部分。

(3)登录到 server_ip 的机器上检索 trace_id

从这个示例中,我们可以看出提示权限不足,是因为该操作只能是在 sys 租户下执行。

3、连接 OBProxy 的 vip 登录

如果我们的环境里有多台 OBProxy,访问的是最靠近用户侧提供的负载均衡的 vip,那么我们无法直接知道到底是访问的哪个 OBProxy,是不是就无解呢?其实 OceanBase 里还有一个 gv$sql_audit 的功能,我们可以通过该视图来确认我们使用的是哪个 OBProxy。

首先解释一下测试环境:

172.30.199.46 是做为连接 OBProxy(VIP 地址)的客户端。

这里因为没有负载均衡,模拟 172.30.199.109 IP 就是 OBProxy(VIP 地址)。

执行的 sql 中 /+* test20220318 */ 做为一个 hint 便于后续我们从 gv$sql_audit 里进行定位,在我们真实的环境里,需要根据实际的 sql 文本特点来过滤。

通过如下的 sql 来查询 gv$sql_audit 视图

字段解释:

  • user_client_ip 表示的是 sql 命令行执行的机器。
  • client_ip 是在 OBProxy 做为客户端去访问 OBServer,即表示 OBProxy 的地址。
  • svr_ip 表示 OBServer 的地址。
  • trace_id 在 OBProxy 和 OBServer上是一致的。

当我们知道了是在哪台 OBProxy 之后,之后的步骤可以参考第二部分介绍的连接指定的 OBProxy 登录的步骤。

4、其他问题定位日志

前面的定位日志,我们可以取巧根据关键来定位。

但是在一些情况:如安装部署的时候报错,建议先在 OBServer 的第一个节点(OBD 里 servers 列表的第一个 IP,OCP 里集群部署的第一个上去找 server)。接下来的问题是由于不清楚通过何关键字来定位,这里直接 vim 倒叙搜索 ERROR 关键字,再根据对应的 traceid 来定位。

'/'是自上而下由左到右进行搜索查找
'?'是自下而上由右到左进行搜索查找

也可以根据 ob_error xxx 查看错误码的含义,我们知道大于等于 4000 的错误码是 OceanBase 特有的,有时候一个错误码可能有多种情况引起,需要查看 ob_error 解析后根据多尝试几个关键字在日志里搜索。

5、注意

如果我们发现确实是报错,但是在所有机器上找了一遍,竟然没有找到日志,此时需要去检查一下 syslog 相关的参数,如果此时 OceanBase 集群可以登录,通过如下方式确认,可以根据实际情况进行调整,保留合适的日志。

show parameters where name 
in ('enable_syslog_recycle','max_syslog_file_count','syslog_level');

如果此时 OceanBase 集群无法登录,通过如下方式确认,后续启动可以使用 -o 加 syslog 对应的参数。

cd ${home_path}/etc
strings observer.config.bin | grep syslog

6、参考

OceanBase 数据库通用问题排查方法:

https://open.oceanbase.com/docs/observer-cn/V3.1.2/10000000000014796

前排

学习了


666

学到了  这个好

学到了

棒棒哒q(≧▽≦q)~