如何进行“服务器内部错误”的诊断 | 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.mzph.cn/news/880687.shtml

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

相关文章

PHP 递归遍历目录

本篇文章主要内容为PHP 两种循环递归遍历目录的示例。 目录 while循环 foreach循环 调用及结果 总结 while循环 应用while循环和opendir、readdir函数处理读取路径下所有文件和目录。 具体代码如下&#xff1a; function getDir($path, $space ) {$dir opendir($path)…

【易上手快捷开发新框架技术】nicegui标签组件lable用法庖丁解牛深度解读和示例源代码IDE运行和调试通过截图为证

传奇开心果微博文系列 序言一、标签组件lable最基本用法示例1.在网页上显示出 Hello World 的标签示例2. 使用 style 参数改变标签样式示例 二、标签组件lable更多用法示例1. 添加按钮动态修改标签文字2. 点击按钮动态改变标签内容、颜色、大小和粗细示例代码3. 添加开关组件动…

PHP“===”的意义

在PHP中&#xff0c; 运算符被称为“恒等比较运算符”&#xff08;Identical Comparison Operator&#xff09;&#xff0c;它用于比较两个变量的值和类型是否完全相同。这个运算符与双等号 &#xff08;等值比较运算符&#xff09;不同&#xff0c;后者在比较时会对两边的值进…

美图AI短片创作工具MOKI全面开放 支持生成配乐、细节修改

人工智能 - Ai工具集 - 集合全球ai人工智能软件的工具箱网站 美图公司近日宣布&#xff0c;其研发的AI短片创作工具MOKI已正式向所有用户开放。这款专注于AI短片创作的工具&#xff0c;提供了包括动画短片、网文短剧等多种类型视频内容的生成能力&#xff0c;致力于为用户带来…

uni-app之旅-day02-分类页面

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言创建cate分支4.1 渲染分类页面的基本结构4.2 获取分类数据4.3 动态渲染左侧的一级分类列表4.4 动态渲染右侧的二级分类列表4.5 动态渲染右侧的三级分类列表4.6 …

linux上,进程管理

命令 ps aux 是一个在 Unix 和类 Unix 系统中非常常用的命令&#xff0c;用于显示当前系统中的运行中的进程信息。这个命令可以提供关于各个进程的详细信息&#xff0c;包括进程ID、CPU 和内存使用率、进程状态、启动时间等。让我们来详细解释一下 ps aux 命令的各个部分&#…

linux-CMake

linux-CMake 1.安装CMake工具2.单个源文件3.多个源文件4.生成库文件5.将源文件组织到不同的目录下6.可执行文件和库文件放置到单独的目录下7.常见的命令 CMake使用。 1.安装CMake工具 sudo apt-get install cmake2.单个源文件 1.先在文件夹里创建两个文件&#xff1a;main.c&…

Vscode超好看的渐变主题插件

样式效果&#xff1a; 插件使用方法&#xff1a; 然后重启&#xff0c;之后会显示vccode损坏&#xff0c;不用理会&#xff0c;因为这个插件是更改了应用内部代码&#xff0c;直接不再显示即可。

cesium实战代码

代码中有一点bug还没改 cesium地球 地形+地形 <html lang="en"><head><style>.cesium-animation-rectButton .cesium-animation-buttonGlow {filter: url(#animation_blurred); }.cesium-animation-rectButton .cesium-animation-buttonMain {fil…

Win32打开UWP应用

最近无意间发现Windows里一个神奇的文件夹。 shell:appsfolder 运行打开 这个文件夹后&#xff0c;你可以看到本机安装的所有应用程序。 我觉得这个挺方便的&#xff0c;所以做了一个简单的appFolderDialog包给C#用 项目地址&#xff1a;https://github.com/TianXiaTech/App…

React Native、Uni-app、Flutter优缺点对比

React Native、Uni-app、Flutter作为三种主流的跨平台开发框架&#xff0c;各自具有独特的优缺点。以下是对这三种框架的优缺点进行的详细对比&#xff1a; React Native 优点&#xff1a; 社区生态丰富&#xff1a;背靠Facebook&#xff0c;拥有庞大的社区支持和丰富的组件…

基于单片机的多路温度检测系统

**单片机设计介绍&#xff0c;基于单片机CAN总线的多路温度检测系统设计 文章目录 前言概要功能设计设计思路 软件设计效果图 程序设计程序 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探…

总结拓展十一:S4 HANA和ECC区别

第一节 S/4 HANA系统简介 SAP系统的产品线 R/1版本——主要财务模块R/3版本——基本实现全模块ECC6.0——2005年推出&#xff08;ECC是2004年推出&#xff09;HANA——数据库产品——属于内存数据库BW on HANA——HANA与数据分析相结合 拓展&#xff1a; 数据库类型&#x…

【如何在Linux系统本地快速部署Leanote蚂蚁笔记】

文章目录 前言1. 安装Docker2. Docker本地部署Leanote蚂蚁笔记3. 安装cpolar内网穿透4. 固定Leanote蚂蚁笔记公网地址 前言 本篇文章主要介绍如何在Linux系统本地快速部署Leanote蚂蚁笔记&#xff0c;并且结合cpolar内网穿透实现公网远程访问本地笔记编辑并制作个人博客等。 …

外卖点餐小程序源码系统 单店多门店自助切换 带完整的安装代码包以及搭建部署教程

系统概述 本外卖点餐小程序源码系统旨在帮助餐饮企业和商家快速搭建一个功能完善的在线外卖平台。系统支持单店与多门店的灵活切换&#xff0c;方便商家根据自身业务需求进行管理和运营。同时&#xff0c;系统还提供了丰富的营销工具和数据分析功能&#xff0c;助力商家实现精…

元数据驱动的设想

本文永久更新地址: 1.背景 针对相似结构的表单&#xff0c;为了提高ui自动化编写效率&#xff0c;减少以减少重复工作&#xff0c;设想是否可以设计一个针对neoUI2.0通过元数据驱动的方式适应不同业务对象的测试框架 2.设计元数据模型 - 字段名 - 字段类型 - 是否必填 -是…

双端搭建个人博客

1. 准备工作 确保你的两个虚拟机都安装了以下软件: 虚拟机1(Web服务器): Apache2, PHP虚拟机2(数据库服务器): MariaDB2. 安装步骤 虚拟机1(Web服务器) 安装Apache2和PHP 更新系统包列表: sudo apt update安装Apache2: sudo apt install apache2 -y安装PHP及其Apac…

【高中数学/对数/指数】已知函数f(x)=e^x-ln(x+m),求证m<=2时,证明f(x)>0

【问题】 已知函数f(x)e^x-ln(xm),求证m<2时&#xff0c;证明f(x)>0 &#xff08;2013年高考全国卷II理科第21题&#xff09; 【出处】 《高中数学解题思维策略》P30 例2-11 杨林军编著 【解答】 对于ye^x,总有e^x>x1 (x0时去等) 对于yln(xm),总有yxm-1>ln(…

动手学深度学习(李沐)PyTorch 第 3 章 线性神经网络

3.1 线性回归 线性回归是对n维输入的加权&#xff0c;外加偏差 线性回归可以看作是单层神经网络 回归问题中最常用的损失函数是平方误差函数。 平方误差可以定义为以下公式&#xff1a; 常数1/2不会带来本质的差别&#xff0c;但这样在形式上稍微简单一些 &#xff08;因为当…

《C++》解密--单链表

目录 一、概念与结构 二、实现单链表 三、链表的分类 四、单链表算法题 一、概念与结构 1、节点 结点的组成主要有&#xff1a;当前结点要保存的数据和保存下一个节点的地址&#xff08;指针变量&#xff09; 图中指针变量plist保存的是第一个结点的地址&#xff0c;我们称p…