obdiag 工具 gather plan_monitor 报No database selected错误

【 使用环境 】测试环境
【 OB or 其他组件 】obdiag 工具
【 使用版本 】3.3.0
【问题描述】使用obdiag 工具 gather plan_monitor 报如下错误

bdcbf6f4-24e7-11feIroot@obocp -]# obdiag gather plan monitor --trace id “YB420A379BE5-00063264B6EDAE65-0-08202-60026f95026
obdiag version: 3.3.0
‘root/.opdrad/config.ymgather plan monitor start …
plan explain> explain extended select count(*) from tl,tlERROOperationalError(1046,‘No database selected’)INARNI[Errno 2] No such file or directory:’./obdiag tabledump result 20250429185134.txt(1054, “Unknown column 'ps STMT ID’in 'field list””)command failed.
please contact 0ceanBase community. e: (1054, “Unknown column 'ps STMT ID’ in 'field list”"Trace I0: e92dcs02-24e7-11f0 a792-6c92bf95026eIf you want to view detailed obdiag logs, please run: obdiag display-trace e92dc502-24e7-11f0-a792-6c92bf95026e[root@obocp #
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

根据文档库中的信息,obdiag gather plan_monitorNo database selected 错误的原因可能是以下几点之一:

  1. 未选择数据库:在执行 SQL 查询时,OceanBase 数据库需要明确当前操作的数据库。如果未选择数据库,则会报 No database selected 错误。

  2. 参数错误obdiag gather plan_monitor 命令的参数可能设置不正确,导致无法正确解析或执行相关 SQL。

以下是具体的解决方法:


1. 确保已选择数据库

在执行 obdiag gather plan_monitor 命令前,确保已经选择了目标数据库。可以通过以下方式确认和选择数据库:

  • 确认当前数据库:登录 OceanBase 数据库后,执行以下命令查看当前使用的数据库。

    SELECT DATABASE();
    

    如果返回值为 NULL,说明当前未选择数据库。

  • 选择数据库:使用 USE 命令选择目标数据库。

    USE your_database_name;
    

2. 检查 trace_id 参数格式

根据文档片段 6 的描述,obdiag gather plan_monitor 的命令格式如下:

obd obdiag gather plan_monitor <deploy name> --trace_id <trace_id>

请确保 --trace_id 参数的值是正确的,并且符合以下要求:

  • trace_id 是一个有效的追踪 ID。
  • <deploy name> 是通过 obd cluster list 查看到的部署名称。

示例命令:

obd obdiag gather plan_monitor my_deploy --trace_id "YB420A379BE5-00063264B6EDAE65-0-08202-60026f95026"

3. 验证 SQL 执行环境

从错误信息中可以看到,plan_monitor 内部尝试执行了以下 SQL:

explain extended select count(*) from tl,tl;

这条 SQL 可能存在问题,例如:

  • 表名 tl 不存在。
  • 当前未选择数据库,导致无法解析表名。

建议:

  • 确认表 tl 是否存在。
  • 在执行 plan_monitor 前,手动测试 SQL 是否可以正常运行。

4. 收集诊断信息

如果上述方法仍无法解决问题,可以使用 obdiag 工具收集更多诊断信息,以便进一步排查问题。参考文档片段 4 的内容,执行以下命令:

obdiag gather scene run --scene=observer.base

总结

根据文档信息,No database selected 错误通常是因为未选择数据库或 SQL 语句存在问题。请按照以下步骤逐一排查:

  1. 确保已选择目标数据库。
  2. 检查 trace_id 参数是否正确。
  3. 验证 SQL 执行环境是否正常。
  4. 使用 obdiag 收集更多诊断信息。

如果问题仍未解决,请提供更多上下文信息(如完整的命令、部署名称等),以便进一步分析。

具体信息可参考以下文档:

  1. 错误码
  2. 0001 ~ 3999
  3. 遇到问题如何向技术支持同学提问
  4. 诊断工具命令组
  5. ob_admin 简介
  6. 使用命令行进行运维

环境为OB 3.2.3 BP9 版本, 租户为Oracle模式,如何指定数据库名?请举个命令例子

在问一下,obdiag gather plan_monitor --trace_id YB420BA2D99B-0005EBBFC45D5A00-0-0 --env “{db_connect=’-hxx -Pxx -uxx -pxx -Dxx’}”

这个env 后面的参数,到底写的是sys租户的连接串,还是业务租户的连接串,如果是业务租户的连接串,业务租户是Oracle模式,如何指定-Dxxx参数?

根据文档库中的信息,以下是针对您的问题的详细解答:


问题 1:在 OB 3.2.3 BP9 版本中,租户为 Oracle 模式时如何指定数据库名?

背景

在 OceanBase 数据库中,Oracle 模式下没有 MySQL 模式的 DATABASE 概念。取而代之的是通过用户和模式(Schema)来管理对象。因此,在连接 Oracle 模式的租户时,不需要显式指定 -D 参数(即数据库名),而是通过用户名和密码直接访问对应的 Schema。

命令示例

假设您需要连接到一个名为 business_tenant 的 Oracle 模式租户,并使用用户 scott 登录:

obclient -h<host> -P<port> -u"scott@business_tenant#cluster_name" -p<password>
  • 参数说明
    • <host>:OBServer 或 OBProxy 的 IP 地址。
    • <port>:OBServer 或 OBProxy 的端口号(默认为 2881 或 2883)。
    • scott:登录的用户名。
    • business_tenant:租户名称。
    • cluster_name:集群名称(如果通过 OBProxy 连接,则需要指定)。
    • <password>:用户的密码。

注意

  • 在 Oracle 模式下,-D 参数通常不需要指定,因为所有对象都属于当前用户的 Schema。
  • 如果需要切换到其他 Schema,请使用 ALTER SESSION SET CURRENT_SCHEMA=<schema_name>; 命令。

问题 2:obdiag gather plan_monitor--env 参数的作用及写法

背景

--env 参数用于指定 obdiag 工具运行时的环境变量,其中 db_connect 是用来定义数据库连接串的。该连接串可以是系统租户(sys)的连接串,也可以是业务租户的连接串,具体取决于诊断场景的需求。

问题拆解

  1. --env 参数是否必须指定系统租户(sys)的连接串?

    • 不一定。--env 参数可以指定系统租户或业务租户的连接串,具体取决于诊断需求。
    • 如果需要分析系统级别的计划监控数据(如全局资源使用情况),则应指定系统租户的连接串。
    • 如果需要分析特定业务租户的计划监控数据,则应指定业务租户的连接串。
  2. 业务租户为 Oracle 模式时,如何指定 -D 参数?

    • 在 Oracle 模式下,-D 参数通常不需要指定,因为所有对象都属于当前用户的 Schema。
    • 如果确实需要指定 -D 参数(例如为了兼容某些工具或脚本),可以将其设置为业务租户的名称。

命令示例

以下是一个完整的 obdiag gather plan_monitor 命令示例,假设业务租户为 Oracle 模式:

obdiag gather plan_monitor --trace_id "YB420BA2D99B-0005EBBFC45D5A00-0-0" \
--env "{db_connect='-h<host> -P<port> -u\"scott@business_tenant#cluster_name\" -p<password>'}"
  • 参数说明
    • <host>:OBServer 或 OBProxy 的 IP 地址。
    • <port>:OBServer 或 OBProxy 的端口号。
    • scott:业务租户的用户名。
    • business_tenant:业务租户的名称。
    • cluster_name:集群名称(如果通过 OBProxy 连接,则需要指定)。
    • <password>:用户的密码。

注意

  • 如果业务租户为 Oracle 模式,-D 参数可以省略,因为所有对象都属于当前用户的 Schema。
  • 如果需要兼容某些工具或脚本,可以将 -D 参数设置为业务租户的名称,例如:
    obdiag gather plan_monitor --trace_id "YB420BA2D99B-0005EBBFC45D5A00-0-0" \
    --env "{db_connect='-h<host> -P<port> -u\"scott@business_tenant#cluster_name\" -p<password> -Dbusiness_tenant'}"
    

总结

  1. 在 Oracle 模式下,-D 参数通常不需要指定,因为所有对象都属于当前用户的 Schema。
  2. obdiag gather plan_monitor--env 参数可以指定系统租户或业务租户的连接串,具体取决于诊断需求。
  3. 如果需要兼容某些工具或脚本,可以将 -D 参数设置为业务租户的名称。

如果您仍有疑问,请提供更多上下文信息(如具体的诊断需求、租户配置等),以便进一步分析。

更多信息请查看:

  1. obcdc 配置项说明
  2. oceanbase.DBA_OB_RSRC_IO_DIRECTIVES
  3. 创建租户
  4. 通过 OBClient 连接 OceanBase 租户
  5. oceanbase.DBA_RSRC_PLAN_DIRECTIVES
  6. 创建 C 示例应用程序
  7. 创建服务
  8. 通过 ODC 图形化开发工具进行 SQL 开发
  9. GORM 连接 OceanBase 数据库示例程序

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

oracle 租户的-D填用户名,不过 obdiag gather plan_monitor在oracle 这块的支持没系统的测试过,可能会有报错出来,如果有问题麻烦到https://github.com/oceanbase/obdiag/issues 提个需求,我们来跟进去处理

您的意思, obdiag gather plan_monitor 只能收集租户为Mysql模式?不能收集租户为Oracle模式?

指定–env参数,报上面的错误Oracle tenant for current client drrver is not supported’

靖顺老师意思是当前obdiag未对oracle租户进行过适配。

obdiag对Oracle租户大概什么能支持,我们生产都是Oracle租户

已反馈

1 个赞