使用 oceanbase 作为 jumpserver 的数据库,jumpserver 初始化失败

【 使用环境 】测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】
使用 oceanbase 作为 jumpserver 的数据库,jumpserver 初始化失败。
jumpserver 的 报错


经过查看 oceanbase 的日志报错

然后我将上面的语句拆开,分为两句执行,执行成功。

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

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

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

根据您的描述,Jumpserver 在使用 OceanBase 作为数据库时遇到了初始化失败的问题,并且报错信息中提到‘Column not found’以及‘char type length is too long’。这类问题通常与表结构定义不匹配或字符类型长度限制有关。为了进一步定位问题,建议使用 obdiag 工具来收集相关日志信息。

日志采集场景: SQL 执行出错
日志采集命令: obdiag gather scene run --scene=observer.sql_err --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”

请替换上述命令中的 db_connect 参数为您实际的数据库连接信息,并将 trace_id 替换为具体的跟踪 ID(如果有的话)。执行该命令后,请将生成的日志压缩包提供给我们,以便我们能够更准确地分析问题原因。

为了更好地帮助您解决问题,请提供以下信息:

  1. 您使用的 OceanBase 版本是什么?
  2. 能否提供创建表的 SQL 语句或表结构?
  3. 报错的具体上下文是什么?例如,是在执行哪条 SQL 语句时出现了这个错误?
  4. 是否尝试过调整表结构或字段定义来解决这个问题?如有尝试,请分享您的解决方案和结果。

更多信息请查看:

  1. 0001 ~ 3999
  2. 4000 ~ 4499

附上敏捷诊断工具 obdiag 使用帮助链接

麻烦你提供一下ob的版本以及表结构信息和alter table执行的语法 我们测试看看 具体什么问题

1 个赞

ob 的版本:我用 docker 部署的,OceanBase_CE 4.2.1.8


desc terminal_session;
±------------±--------------±-----±-----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------------±--------------±-----±-----±--------±------+
| id | char(32) | NO | PRI | NULL | |
| user | varchar(128) | NO | | NULL | |
| asset | varchar(1024) | NO | | NULL | |
| system_user | varchar(128) | NO | | NULL | |
| login_from | varchar(2) | NO | | NULL | |
| is_finished | tinyint(1) | NO | | NULL | |
| has_replay | tinyint(1) | NO | | NULL | |
| has_command | tinyint(1) | NO | | NULL | |
| date_start | datetime(6) | NO | | NULL | |
| date_end | datetime(6) | YES | | NULL | |
±------------±--------------±-----±-----±--------±------+
10 rows in set (0.002 sec)

obclient [jumpserver]> desc terminal;
±-------------±-------------±-----±-----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±-------------±-------------±-----±-----±--------±------+
| id | char(32) | NO | PRI | NULL | |
| name | varchar(32) | NO | UNI | NULL | |
| remote_addr | varchar(128) | NO | | NULL | |
| ssh_port | int(11) | NO | | NULL | |
| http_port | int(11) | NO | | NULL | |
| is_accepted | tinyint(1) | NO | | NULL | |
| is_deleted | tinyint(1) | NO | | NULL | |
| date_created | datetime(6) | NO | | NULL | |
| comment | longtext | NO | | NULL | |
±-------------±-------------±-----±-----±--------±------+
9 rows in set (0.003 sec)

stmt_query (ob_sql.cpp:222) [1056][T1_L0_G0][T1][YB4204030203-0006226E5405325C-0-0] [lt=25][errcode=-5031] fail to handle text query(stmt=ALTER TABLE terminal_session ADD COLUMN terminal_id char(32) NULL , ADD CONSTRAINT terminal_session_terminal_id_5278f31c_fk_terminal_id FOREIGN KEY (terminal_id) REFERENCES terminal(id), ret=-5031)
上面语句分开执行就可以成功

根据您提供的信息,Jumpserver 在使用 OceanBase 作为数据库时遇到的问题主要集中在执行复合 SQL 语句时出现的错误。具体来说,当尝试在一个事务中添加一个新列并创建外键约束时,OceanBase 返回了一个错误。然而,当将这个复合操作拆分成两个独立的操作(即先添加列再创建外键约束)时,操作可以成功执行。

分析问题原因

从日志信息来看,错误信息 fail to handle text query(stmt=ALTER TABLE ... ADD COLUMN ... ADD CONSTRAINT ..., ret=-5031) 表明在处理复合 SQL 语句时出现了问题。这可能是由于 OceanBase 在处理复合 SQL 语句时存在一些限制或不兼容之处。

解决方案

  1. 拆分复合 SQL 语句
    根据您的描述,将复合 SQL 语句拆分成两个独立的操作可以成功执行。这意味着在当前环境下,这种方式是可行的。您可以考虑在 Jumpserver 的配置或代码中进行相应的调整,确保在执行类似操作时采用拆分的方式。

  2. 检查表结构和字段定义
    检查 terminal_session 表和 terminal 表的结构,确保它们的定义符合预期。您已经提供了这两个表的结构描述,看起来没有明显的不一致之处。

  3. 确认 OceanBase 版本兼容性
    您正在使用的是 OceanBase_CE 4.2.1.8 版本。请确认 Jumpserver 是否支持此版本的 OceanBase,并检查是否有任何已知的兼容性问题。可以查阅 Jumpserver 的官方文档或联系其技术支持团队获取更多信息。

推荐步骤

  1. 确认拆分操作的可行性
    继续使用拆分 SQL 语句的方法来完成初始化过程。这应该是目前最直接有效的解决方案。

  2. 反馈给 Jumpserver 开发团队
    如果拆分 SQL 语句的方法仍然存在问题或者您希望从根本上解决这个问题,建议向 Jumpserver 的开发团队反馈此问题。他们可能会提供更详细的解决方案或修复此问题。

  3. 持续关注更新
    关注 OceanBase 和 Jumpserver 的最新版本更新,看看是否有新的补丁或改进解决了这个问题。

通过以上步骤,您应该能够解决当前遇到的问题,并确保系统的稳定运行。如果您还有其他疑问或需要进一步的帮助,请随时联系我们。

更多信息请查看:

  1. 使用 DBCAT 迁移 OceanBase 表结构到 MySQL 数据库

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

1 个赞

目前是不支持这样的语法的 等待后期版本的迭代 暂时先分开写