我们知道 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)
这里我们根据错误码 1045 在 observer.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_ip
和 trace_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