如何进行“服务器内部错误”的诊断 | OceanBase诊断案例

本文作者:任仲禹,爱可生数据库高级工程师,擅长故障分析和性能优化。

OMS迁移工具具备丰富的功能。但在实际运维场景中,我们可能会遇到各种问题,其中“服务器内部错误”便是一个较为棘手的问题,因为界面上往往缺乏足够的额外信息来帮助我们进行故障排查。那么,在面对这样的报错时,我们应该如何解决呢?

本文将分享一例案例,介绍OMS 关联 OCP时, 报 服务器内部错误 时的诊断过程与思路。

背景信息

涉及的软件版本如下:

  • OMS 402bp2
  • OCP 410

该案例属于实际客户场景触发报错,故障时 OMS 能够正常访问到 OCP ,但是 OMS 白屏界面操作 添加关联 OCP 该步骤时将报错 服务器内部错误 ,如下图所示。

问题诊断

1. 日志分析

由于 OMS 白屏界面除 服务器内部错误 外无其它报错信息帮助诊断问题,所以第一时间准备登到 OMS 容器上查看 OMS-Console 组件日志。

题外话,OMS 界面相关的例如显示问题、点击按钮报错等首选查看 Console 组件日志
  • OMS 容器内日志路径:/home/admin/logs/ghana/Ghana/comon-error.log
  • 过滤 ERROR 关键字

收集到的有效信息是 SQL 执行报错 “插入的数据没有指定 ocp_proxy_host 列或者该字段没有默认值”。

### The error occurred while setting parameters
### SQL: INSERT INTO ocp_info ( id, ocp_domain, ocp_api_user, ocp_api_password, ocp_charset, ocp_version, region, ocp_name) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
### Cause: java.sql.SQLTransientConnectionException: (conn=783124) Field 'ocp_proxy_host' doesn't hava d default value; 

2.元数据库排查

继续沿着上文线索进入 OMS 的 metadb 元数据库中,查询 oms_rm 库下的 ocp_info 表结构,如下图所示。

目前可知 OMS 关联 OCP 时需要向表 ocp_info 中插入一条数据,如果 SQL 执行报错或其它原因就导致了页面触发 服务器内部错误

  • 插入的语句:INSERT INTO ocp_info ( id, ocp_domain, ocp_api_user, ocp_api_password, ocp_charset, ocp_version, region, ocp_name) VALUES ...
  • SQL 执行报错 "Field 'ocp_proxy_host' doesn't have a default value." 的原因是表结构 ocp_info 中字段 ocp_proxy_host 属性是 NOT NULL,并且没有 default 值。
  • 这里的疑问:OMS 为啥下发一条“注定”会执行报错的 SQL ? 难道是 BUG?

排查到这里,咨询 OB 产研得到的反馈是这个 ocp_info 表的 ocp_proxy_host、ocp_proxy_port、ocp_meta_user、ocp_meta_password、ocp_meta_db 字段已经在 OMS 402 版本中被去除了,所以还得继续分析为啥 ocp_info 的表结构不符合预期。

是否是部署的 OMS 402 版本读取了老版本的 metadb 库?

3.OAT 部署排查

沿着安装部署溯源,通过 OAT 排查到该 OMS 是 7月1日 15:39 部署的,如下图。

比对 OMS metadb 中 ocp_info 表的创建日期和该 OMS 集群的部署日期。

查询 oceanbase.__all_virtual_table 表,关注 gmt_create 和 gmt_modified 字段。

发现 ocp_info 表创建更晚于 OMS 创建,所以先排除读取到了老版本的 metadb 库。

继续分析 OAT 的部署流程,在 start_first_batch_oms_container 步骤中发现了 ERROR 信息,如下图。

OAT 部署任务中,start_first_batch_oms_container 步骤记录了 OMS metadb 相关的 DDL init 脚本导入记录。

上图中的报错结合 OMS 容器中( /root/omsflow/meta_init/drc_rm_schema.sql )文件发现 ocp_info 表对应字段的 DROP 操作在 OAT 中显示全部执行失败。

这里的 2 个问题点:

  • 问题 1:为啥 ALTER TABLE ocp_info DROP COLUMN ... 执行失败?
  • 问题 2:SQL 执行失败为啥 OMS 初始化元数据成功,OAT 没有报错?

问题 1

通过排查,DROP Column 失败是因为 DDL 执行的时间点,OMS 所在 metadb Cluster 处于运维状态 (其中一个 OBServer 宕机),导致 DROP Column 的DDL 无法执行,这个不太重要,关键在于 问题 2 OAT 未抛出报错。

问题 2

OAT 中初始化 DDL 调用的 SQL 执行失败了按理应该抛出报错,需要人工介入才是,为啥 OAT 还显示 start_first_batch_oms_container 步骤正常完成呢,这点比较重要得继续排查。

逐个翻阅 start_first_batch_oms_container 任务的调用步骤,发现问题大概出在这一步:

[2023-07-01T15:49:20.785+0800] INFO -  mysql -h 'xxxxx' -P2883 -u 'root@oms_meta#xxxxxx' --password='xxxxxx'   -f -D 'oms_rm' < /root/omsflow/meta_init/drc_rm_schema.sql " 
  • 上文将 DDL init 脚本(drc_rm_schema.sql )导入 OMS 元数据库时,加了 " -f " ,该参数是 mysql 客户端忽略报错的行为。
  • 问题 3: 为啥加了 " -f " 参数会有问题?

问题 3

首先,OAT 只能判断 DDL init 脚本的执行结果,OAT start_first_batch_oms_container 任务中展示的实际是容器里的DDL init 脚本执行的输出 (例如 SQL 的执行是否报错)。

然而,当指定了 " -f " 参数时,将忽略 init 脚本中的 SQL 执行报错。

所以,OAT 获取到 init 脚本执行的报错码是 0,OAT 判断任务正常完成。

# 示例
[root@10-186-58-75 ~]# cat 1.sql
select 11 from bbbb;
select 13,a from renzy.t;
[root@10-186-58-75 ~]# mysql -h10.186.58.75 -P8001 -uroot -proot  -f < 1.sql
ERROR 1046 (3D000) at line 1: No database selected
ERROR 1049 (42000) at line 4: Unknown database 'renzy'
[root@10-186-58-75 ~]# echo $?
0

临时修复

进入 OMS 容器,按 OMS 容器初始化脚本提示(下图所示),单独重新执行【步骤二】OMS 元信息库初始化步骤即可(该步骤幂等性,可反复执行)。

python -m omsflow.scripts.units,oms_init_manager --init-db

结论

  1. 本次案例 OMS 无法关联 OCP (报“服务器内部错误”)是由于要往 OMS 的 metadb 中注册一条信息(insert SQL),而这条 SQL 因为 metadb 中表结构不正确导致执行失败。
  2. 表结构不正确是由于 OAT 安装 OMS 时调用了 oms_init metadb 脚本, oms_init 脚本中导入 SQL 时忽略了报错,导致元数据库表结构和预期不符。
  3. 第 2 条结论笔者已提 OB 官方,产研已确认为缺陷,并反馈将修复在 OMS 421 版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/433242.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五子棋双人对战项目(1)——WebSocket介绍

目录 一、项目介绍 如何实现实时同步对局&#xff1f; 二、WebSocket 1、什么是WebSocket&#xff1f; 2、WebSocket的报文格式 opcode payload len payload data 3、WebSocket握手过程 4、WebSocket代码的简单编写 三、WebSocket 和 HTTP的关系 1、相同点&#xf…

【机器学习案列】基于随机森林和xgboost的二手车价格回归预测

一、项目分析 1.1 项目任务 kaggle二手车价格回归预测项目&#xff0c;目的根据各种属性预测二手车的价格。 1.2 评估准则 评估的标准是均方根误差&#xff1a; 1.3 数据介绍 数据连接https://www.kaggle.com/competitions/playground-series-s4e9/data?selecttrain.csv 其…

Linux相关概念和重要知识点(8)(操作系统、进程的概念)

1.操作系统&#xff08;OS&#xff09; &#xff08;1&#xff09;基本结构的认识 任何计算机系统都包含一个基本的程序集合&#xff0c;用于实现计算机最基本最底层的操作&#xff0c;这个软件称为操作系统。操作系统大部分使用C语言编写&#xff0c;少量使用汇编语言。 从…

即插即用篇 | YOLOv8 引入单头视觉Transformer模块 | CVPR 2024

本改进已同步到YOLO-Magic框架! 最近,高效的视觉Transformer在资源受限的设备上以低延迟表现出了出色的性能。传统上,它们在宏观层面上采用44的Patch嵌入和四阶段结构,而在微观层面上使用多头配置的复杂注意力机制。本文旨在通过内存高效的方式解决各个设计层面的计算冗余问…

[ IDE ] SEGGER Embedded Studio for RISC-V

一、FILE 二、Edit 三、View 四、Search 五、Navigate 六、Project 七、Build 7.1 编译 先选择一个目标类型&#xff0c;再选择编译。 八、Debug​​​​​​​ 九、Target 9.1 烧录代码 十、Tools 10.1 自定义快捷键 点击菜单项&#xff0c;通过Tools –> Options –&g…

软考中级网络工程师选择题

部分参考 软考中级网络工程师全面学习笔记第2版(5万字)配套视频及课件_软考中级网络工程师资料-CSDN博客 1.计算机网络概述 OSI七层模型&#xff1a;物联网淑慧试用 TCP/IP&#xff1a;网网&#xff08;网际层&#xff09;传应 高频考点&#xff1a; 中央处理器CPU 固态硬盘…

【rabbitmq-server】安装使用介绍

在 1050a 系统下安装 rabbitmq-server 服务以及基本配置;【注】:改方案用于A版统信服务器操作系统 文章目录 功能概述功能介绍一、安装软件包二、启动服务三、验证四、基本配置功能概述 RabbitMQ 是AMQP的实现,高性能的企业消息的新标准。RabbitMQ服务器是一个强大和可扩展…

【Oauth2整合gateway网关实现微服务单点登录】

文章目录 一.什么是单点登录&#xff1f;二.Oauth2整合网关实现微服务单点登录三.时序图四.代码实现思路1.基于OAuth2独立一个认证中心服务出来2.网关微服务3产品微服务4.订单微服务5.开始测试单点登录 一.什么是单点登录&#xff1f; 单点登录&#xff08;Single Sign On&…

鸿蒙界面开发(九):列表布局 (List)

列表布局 当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、音乐列表、购物清单等&#xf…

ArcGIS Desktop使用入门(三)常用工具条——拓扑(下篇:地理数据库拓扑)

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

Labview helper

IMAQ Advanced Setup Learn Geometric Pattern 2 VI 参数说明Curve Extraction Mode (0)指定VI如何识别图像中的曲线。如果您希望VI不对图像中对象的均匀性或图像背景做出任何假设&#xff0c;请将此选项设置为正常。如果您希望VI假定图像中的对象或图像背景由均匀的像素值组成…

【JVM】一篇文章彻底理解JVM的组成,各组件的底层实现逻辑

文章目录 JVM 的主要组成部分类加载器&#xff08;Class Loader&#xff09;1. 加载&#xff08;Loading&#xff09;2. 链接&#xff08;Linking&#xff09;3. 初始化&#xff08;Initialization&#xff09; Execution Engine&#xff08;执行引擎&#xff09;1. 解释器&…

QT开发:详解 Qt 多线程编程核心类 QThread:基本概念与使用方法

1. 引言 在现代应用程序开发中&#xff0c;多线程编程是一个关键技术&#xff0c;能够显著提高程序的效率和响应速度。Qt 是一个跨平台的 C 框架&#xff0c;其中 QThread 类是实现多线程编程的核心类。本文将深入详解 QThread 的基本概念、使用方法及其在实际应用中的重要性。…

对于 Vue CLI 项目如何引入Echarts以及动态获取数据

&#x1f680;个人主页&#xff1a;一颗小谷粒 &#x1f680;所属专栏&#xff1a;Web前端开发 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、数据画卷—Echarts介绍 1.1 什么是Echarts&#xff1f; 1.2 Echarts官网地址 2、Vue CLI 项目…

第十三周:机器学习笔记

第十三周周报 摘要Abstract一、机器学习——Transformer&#xff08;上&#xff09;1. Sequence to Sequence(Seq 2 Seq&#xff0c;序列到序列模型) 的应用2. Transformer的结构2.1 Transformer encoder&#xff08;Transformer 编码器&#xff09; 二、Pytorch学习1. 网络模型…

将图片资源保存到服务器的盘符中

服务类 系统盘符&#xff1a;file-path.disk&#xff08;可能会变&#xff0c;配置配置文件dev中&#xff09;文件根路径&#xff1a;file-path.root-path&#xff08;可能会变&#xff0c;配置配置文件dev中&#xff09;http协议的Nginx的映射前缀&#xff1a;PrefixConstant.…

go解决引入私有包报错“Repository owner does not exist“的两种方式

当你写好引入的私有包,执行go mod tidy报错: Gogs: Repository owner does not exist fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 目前我的两种解决方案: 一、拉群整个…

freeRDP OPenssl

libusb需要下载 我使用的是VS2019编译 所以需要include 与vs2019 在cmake里面修改路径 C:/Users/JPM/source/repos/freeRDP/FreeRDP-stable-2.0/libusb-1.0.24/include/libusb-1.0 C:/Users/JPM/source/repos/freeRDP/FreeRDP-stable-2.0/libusb-1.0.24/VS2019/MS64/static/l…

模形式与态、势、感、知

模形式是数学中一个重要的研究领域&#xff0c;主要出现在数论、代数几何和表示论等多个学科中。模形式可以视为在某种意义上具有“对称性”的函数&#xff0c;这些函数在特定的条件下满足一定的变换性质。具体来说&#xff0c;模形式是定义在上半平面上的复值函数&#xff0c;…

第九节 Opencv自带颜色表操作

知识点&#xff1a;Look Up lTable&#xff08;LUT&#xff09;查找表 了解LUT查找表的作用与用法&#xff0c;代码实现与API介绍 -applyColorMap&#xff08;src,dst,COLORMAP&#xff09; -src表示输入图像 -dst表示输出图像 匹配到的颜色LUT&#xff0c;Opencv支持13种…