OceanBase 里的 schema 是什么?

李博洋

OceanBase 技术部研发工程师。

OceanBase 开源社区里经常会看到一些类似于 “ schema 是什么” 的疑问:

图片

很多同学经常会误以为在 OceanBase 里,schema 只是 database 的同义词,这次分享就从 schema 是什么这个问题稍微展开聊一下。

首先说结论,schema 这个东西在 MySQL( OceanBase 的 MySQL 模式)、Oracle( OceanBase 的 Oracle 模式)、OceanBase 元数据管理模块中的含义不同。

OceanBase MySQL 模式中 schema 的概念

Schema 是 Database 的同义词。SQL 中可以使用 schema 关键字代替 Database 关键字,例如使用 CREATE SCHEMA 代替 CREATE DATABASE 等。

OceanBase Oracle 模式中 schema 的概念

在 OceanBase 的 Oracle 模式中,schema 是指一个用户所拥有的数据库对象的集合,用于权限管理和命名空间隔离,我个人把它理解成一个 “用户空间”。schema 对象是指在某个 schema 中的数据库对象,例如 schema 中的表、视图、索引等;非 schema 对象是指不属于某个 schema 的数据库对象,例如用户、角色、表空间等。

用户在创建时会拥有一个缺省的 schema,其 schema 名就等于用户名。如果有权限的话,用户还可以访问和使用其他的 schema。在访问一个 schema 中的对象时,如果没有指明该对象属于哪一个 schema,系统就会自动给对象加上缺省的 schema 名称。

如果当前 user 拥有访问或修改其他 schema 对象的权限,可以通过 alter session set current_schema = other_schema_name ; 切换到其他 schema 中进行各种操作。

OB 元数据管理模块中 schema 的概念

图片

Oceanbase 元数据管理模块里的 schema 泛指一切需要在集群范围内同步的数据库对象元信息,包括但不限于 table、database、user 等元信息。此外,Oceanbase 的 schema 是多版本的,内存中的 schema 信息在集群范围的同步是最终一致的。

schema 里有什么?

schema 是什么解释完了,在社区里又会看到有人问,schema 是元信息,那么元信息里包含了哪些东西?

图片

上面的回答中其实有个小的疏漏,因为各种数据库对象的元数据信息只会受 DDL 的影响,“预估行数” 属于不受 DDL 的影响,只受 DML 影响的统计信息,所以其实并不是表的元信息,table schema 中也不会对其进行记录。

元信息里具体包含了哪些东西,可以参见 src / share / schema 路径下的代码。例如如果想看 table schema 中记录了哪些 table 的元数据信息,看 ob_table_schema.h 中的 ObTableSchema 及其父类有哪些类成员即可。

图片

DDL 执行过程

上面回答了 schema 是什么、有什么的问题。因为 schema 只会通过 DDL 进行修改,所以这里简单提一下 DDL 的执行过程,方便大家在遇到 DDL 相关问题时进行排查。

DDL 不会被优化器处理,而是作为 command 发送到 RootServer,由 RootServer(下简称 rs ) 进行处理。在 OceanBase 里的执行流程如下:

图片

以一个最常见的建表语句为例:

create table 命令会在 obs 上对建表语句进行 resolve,把建表的信息存到 create_table_arg 中,把 create_table_arg 发 rpc 给 rs ,rs 接下来会来执行如下操作:

  • 检查 obs 在 resolve 时使用的的 schema 版本是否最新(采用乐观锁的方法解决,如果非最新,则对这条 DDL 进行整体重试);

  • 从 __all_sys_stat 里获取一个租户内单调递增的新 table id 

  • 把 create_table_arg 里提供的信息插入到 __all_table_history 等内部表里用于持久化

  • 在 __all_ddl_operation 中记录 ddl 的变更日志(用于增量刷新等场景)

  • publish schema(通知各节点把 schema 刷到内存里)

图片

其他 observer 接收到 RS 发送的 publish schema 的命令之后,就会把内部表中的改动增量加载到内存( schema cache )中,这也就是我们经常听到别人说的 “刷 schema ”。

rs 上的 ddl_service 调用 publish_schema () 将新的 schema 版本号广播给所有 obs 实际发生了什么?

rs 自己所在的 obs 直接调用 refresh_schema 。

给每个 alive obs 发送 switch_schema 的命令,参数为最新 schema_version 。

各个 obs 收到指令后,生成一个 ObSchemaRefreshTask 异步刷新任务,通过这行这个任务把自己的 schema 刷到最新。

图片

附另一张图:

  • 图中上面的部分是在执行 DDL,RS 的 DDL service 服务会负责写内部表和通知各 observer 节点把元数据的修改加载到内存的 schema cache 中;

  • 下面的部分是在执行 query 的过程,过程中几乎都会读取内存中 schema cache 的元信息。

图片

一开始客户在社区里提的那个问题中的 GV$OB_SERVER_SCHEMA_INFO 可以理解为每台 ObServer 每个租户已经刷新的最新版本的 schema 的信息,这个视图用户比较关注的 schema 信息是 REFRESHED_SCHEMA_VERSION 、SCHEMA_COUNT 、SCHEMA_SIZE ,其含义如下:

  • REFRESHED_SCHEMA_VERSION :对应租户在对应机器已刷新到的 schema 版本。

  • RECEIVED_SCHEMA_VERSION :对应租户在对应机器已已经接收到的 RS 发过来的最新刷新任务的 schema 版本。

  • SCHEMA_COUNT :对应 schema 版本下,各 schema 对象数目的总和( table 数目 + database 数目 +…)。

  • SCHEMA_SIZE :对应 schema 版本下,各 schema 对象总共所占的内存大小( B )。

obclient> select * from oceanbase.GV$OB_SERVER_SCHEMA_INFO\G*************************** 1. row ***************************                    SVR_IP: 11.158.31.20                  SVR_PORT: 22602                 TENANT_ID: 1002  REFRESHED_SCHEMA_VERSION: 1690109029768968   RECEIVED_SCHEMA_VERSION: 1690113309637344              SCHEMA_COUNT: 1583               SCHEMA_SIZE: 1537240MIN_SSTABLE_SCHEMA_VERSION: -11 row in set (0.01 sec)

DDL 和 schema 的问题排查方法

既然都说了这么多,那就再说下 DDL 和 schema 比较常见的几类问题。这一部分欢迎大家补充更好的排查问题方法。

执行 DDL 语法报错了,我该怎么改语法呢?

客户经常会在试着自己把正在用的数据库上的元数据往 OceanBase 开源版本上倒腾,比如前几天见到一个客户希望把 pg 里的分区表定义放到 OceanBase MySQL 模式的租户下执行下,但是报错了,然后就会认为 OceanBase 不支持分区表。

 

CREATE TABLE value_stream_dashboard_counts ( id bigint NOT NULL, namespace_id bigint NOT NULL, count bigint NOT NULL, metric smallint NOT NULL)PARTITION BY RANGE (id);

图片

我们遇到这种问题应该怎么查 OceanBase MySQL 模式下的对应语法呢?大家一般可能会去查各种各样的 OceanBase 语法文档,但是 OceanBase 语法随着兼容性的逐步完善而日新月异,文档内容其实没办法保证和真实支持的语法强一致(甚至连最终一致都不能保证)。想起师兄和我说的一句话:“文档很喜欢骗人,但是代码从不会说谎”,OceanBase 社区版支持的所有语法其实都写在一个叫 sql_parser_mysql_mode.y 的 yacc 文件里。

看完这个文件里的语法规则,我们就很容易把上面那条 SQL 改成 OceanBase MySQL 模式下可以执行成功的 SQL 。

​​​​​​​

 

CREATE TABLE value_stream_dashboard_counts ( id bigint NOT NULL, namespace_id bigint NOT NULL, count bigint NOT NULL, metric smallint NOT NULL)PARTITION BY RANGE (id)( PARTITION p0 VALUES LESS THAN (100), PARTITION p1 VALUES LESS THAN (200), PARTITION p2 VALUES LESS THAN (300), PARTITION p3 VALUES LESS THAN MAXVALUE);

执行 DDL 报了不太明确的错,我该怎么排查失败原因呢?

比如,我执行了一条 DDL,它报错了,报错说我的 check 约束里出现了不允许被包含在 check 约束里的表达式,但具体是什么表达式不被允许?是 c1,是 =,是 sysdate(),还是 c1 = sysdate() ?

​​​​​​​

 

obclient> create table t1(c1 int, check (c1 = sysdate()));ERROR 3814 (HY000): An expression of a check constraint contains disallowed function.

先查一下报错语句的 trace_id 。

​​​​​​​

 

select last_trace_id();+------------------------------------+| last_trace_id() |+------------------------------------+| Y584A0B9E1F14-00060127094761A8-0-0 |+------------------------------------+1 row in set (0.00 sec)

那我们就通过 grep Y584A0B9E1F14-00060127094761B0-0-0 observer.log* 去捞下 observer 的日志。

图片

这个 trace 对应的第一条 warning 日志说 :deterministic expr is wrongly specified in CHECK constraint(这条日志其实写的不对,本意应该是 not deterministic expr is wrongly specified in CHECK constraint ),大概意思就是说 check 约束里面有个(非)确定性的表达式,这个是不被允许的。

那么究竟什么表达式是非确定性的表达式呢?这个就需要根据日志里给出的文件和行号 ob_raw_expr_util.cpp:1856 去看一眼代码了,在网页上可以直接跳到具体某个函数的定义里,例如 ObRawExpr::is_non_pure_sys_func_expr 。

这里列出了所有 not deterministic 的表达式,其中就包含我们用到的 sysdate 。

图片

所以我们就可以大概知道 check 约束里的表达式需要保证多次执行都能得到同样的结果吧。像 sysdate 这种输出当前时间的表达式在多个不同的时间执行多次,结果必定是不一样的,所以不允许出现在 check 约束里。这里我们还可以趁机了解下还有哪些表达式属于 not deterministic 的。

执行 DDL 捞不到有用的日志怎么办?

例如我执行了一个创建 database 的 DDL,结果报错了。

​​​​​​​

 

obclient> create database xiaofeng_db;ERROR 4016 (HY000): Internal error
obclient> select last_trace_id();+------------------------------------+| last_trace_id() |+------------------------------------+| Y584A0B9E1F14-00060127094761B4-0-0 |+------------------------------------+1 row in set (0.00 sec)

拿着 trace id 捞日志,grep Y584A0B9E1F14-00060127094761B4-0-0 observer.log*,结果是 rpc error 。

图片

回忆一下刚才说的 DDL 执行过程,DDL arg 会发到 RS 上执行,所以这种情况大概率是在 RS 上执行的时候出了什么幺蛾子,所以我们还需要通过 grep Y584A0B9E1F14-00060127094761B4-0-0 rootservice.log* | vi - 继续 grep 以下 RS 的日志,然后在日志文件里根据错误码 -4016 搜下 ret=-4016  最早出现的地方。

图片

然后我们就可以发现日志里说是在 ob_root_service.cpp 文件的 2887 行报的错,报错原因是:create_database failed, because db_name is forbidden 。这种问题大家先自己根据报错日志里的文件和行号简单分析下原因,如果还是没头绪的话,再找 OceanBase 的技术支持同学协助分析。

翻一下这个文件,哦,原来是是我为了构造在 RS 报错的场景故意在这里加了一个报错的错误码,说只要 create database 的 database_name 叫 xiaofeng_db ,就报错 4016 OB_ERR_UNEXPECTED 。

图片

排查 DDL 和 schema 的问题时忽略 rootservice.log 日志是很常见的情况,曾经亲眼见过很多非常有经验的 OceanBase 内核研发专家不止一次因为这个问题浪费大量时间排查简单一个的小 bug。大家切记这类问题在 observer.log 没线索时,还要去看下 rootservice.log。

刷 schema hang 住了怎么办?

刷 schema hang 住是因为在把内部表的数据加载到内存中的过程中会进行一些 schema 的合法性校验,如果校验失败,就说明持久化在内部表里的元数据信息出问题了,这时 observer 就会 hang 住,什么都干不了。因为一旦元数据都错了,基于错误的元数据无论是执行 DDL、DML,还是执行查询 query ,都是错上加错,很容易产生大量正确性问题。这种情况出现的概率极低,但问题十分严重。

如果执行 DDL hang 住了,并且在 RS 的日志里出现类似于“ Trying so hard to die ” 和 “ schema meta is still not consistent after rebuild ,  need fixing ” 的信息,表明恢复环境需要人工接入去修改 OceanBase 内部表中的错误信息,风险较高,建议及时找 OceanBase 的技术支持同学帮忙排查问题根因及协助你恢复环境。

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

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

相关文章

3月面试华为被刷,准备半年,9月二战华为终于上岸,要个27K不过分吧?

终于二战上岸了,二战华为也并不是说非华为不可,只是觉得心里憋着一口气,这就导致我当时有其他比较好的offer,我也没有去,就是想上岸华为来证明自己,现在也算是如愿了,来跟大伙们分享一下~ 个人情况 我本人…

【STM32】IIC使用中DMA传输时 发送数据总少一个的问题

问题描述 在使用STM32 I2C数据发送过程中,发现每轮实际发送出去的数据总比在DMA配置中设定的传输数据个数要少一个。比方说:DMA配置里设定的传输数据个数是10个,结果发现在总线上只能发出9个,经过进一步发现是少了最后一个数据。…

使用正则表达式在中英文之间添加空格

有时为了排版需要,我们可能需要在文章的中英文之间添加空格,特别是中文中引用了英文单词时,这种情况使用正则表达式整体修订是最明智的做法。首先,推荐使用在线的正则表格式工具:https://regex101.com/ , 该工具非常强…

C++11

全文目录 {}列表初始化initializer_list 声明autodecltype nullptrSTL中一些变化右值引用左值引用和右值引用的区别左值引用与右值引用比较移动构造和移动赋值模板的万能引用和完美转发 类的新功能新的类的成员函数强制生成和删除默认成员函数 可变参数模板emplace 和 insert l…

【pytest】tep环境变量、fixtures、用例三者之间的关系

tep是一款测试工具,在pytest测试框架基础上集成了第三方包,提供项目脚手架,帮助以写Python代码方式,快速实现自动化项目落地。 在tep项目中,自动化测试用例都是放到tests目录下的,每个.py文件相互独立&…

在VSCode上画UML的三个插件

2023年9月2日,周六晚上 因为写代理模式的博客时需要画UML,所以就在网上找了半天, 最后觉得VSCode上的这三个插件比较好用 目录 三个画UML的VSCode插件PlantUMLDraw.io IntegrationUMLet我个人推荐使用PlantUML 三个画UML的VSCode插件 Pla…

blender基本操作

文章目录 引言一、选择二、移动1. xyz轴移动2. xyz平面移动3. 精确移动4. 快捷键移动G 三、旋转四、缩放五、变换1. 变换坐标系2. 变换轴心: 六、吸附七、模式切换八、物体的合并和分离1. 合并2.分离 九、设置父子级关系十、叠加层和快速收藏夹1. 叠加层2. 快速收藏…

配电室电力智能运维云平台

目前电力运维面临的问题和困扰: 配电室安全稳定运行、电能使用高效节能是每个企业关注的问题,然而,由于供用电系统的运行维护又是一项复杂而且专业性很强的工程,如果没有先进的技术手段,靠人工值班、人工操作的运行方…

day30 日期转换

一:Date Date类: 这个类是java.util.Date getTime() : 获取内部维护的long值 Date date new Date(); long time date.getTime(); setTime():按照指定的long值(表示的时间)设置Date表示的时间 time 60*60*24*1000;…

【力扣每日一题】2023.9.4 序列化和反序列化二叉搜索树

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一棵搜索二叉树,要我们将这棵二叉树转变为字符串,同时我们需要根据字符串再变回二叉树,具体…

Linux之虚拟主机功能

目录 虚拟主机功能 概述 基于 IP 地址的虚拟主机 原理 案例 --- 增加多个IP地址,实现基于不同IP地址的虚拟主机功能 基于端口号的虚拟主机 原理 案例 --- 基于不同端口号的虚拟主机 基于域名的虚拟主机 原理 域名解析 案例 --- 使用2个域名建立虚拟主机网…

Mysql 高阶语句

高阶语句 对 MySQL 数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理; 例如只取 10 条数据、对查询结果进行排序或分组等,来获取想要有用的数据 无非还是对于MySQL —— 增、删、改、查 的操作 升降序 SELECT…

基于单片机的万年历温度无线传输控制系统系统

一、系统方案 本设计采用DS1302采集年月日时分秒,DS18B20采集温度值,按键设置温度报警上下限,实际测量温度低于下限或高于上限,蜂鸣器报警,同时将测量温度上传到蓝牙助手。 二、硬件设计 原理图如下: 三…

R语言图形的组合( par(),layout(),par(fig()) )

引入d.class进行画图 > d.class<-read.csv("D://class.csv",header T) > attach(d.class) > opar<-par(no.readonly TRUE)非常简单的数据&#xff0c;需要可自取 链接&#xff1a;https://pan.baidu.com/s/1zNx5z9JsaaRqFueRgGY3mQ 提取码&#x…

3D开发工具HOOPS Publish如何快速创建交互式3D PDF文档?

HOOPS Publish是一款功能强大的SDK&#xff0c;可以创作丰富的工程数据并将模型文件导出为各种行业标准格式&#xff0c;包括PDF、STEP、JT和3MF。HOOPS Publish核心的3D数据模型是经过ISO认证的PRC格式(ISO 14739-1:2014)&#xff0c;它为装配树、拓扑和几何、产品制造信息和视…

Seata1.5.2+Nacos分布式事务环境搭建详解

文章目录 一、下载seata server二、配置application.yml三、初始Mysql数据库四、导入初始配置到nacos五、启动测试 本文以seata-server-1.5.2&#xff0c;以配置中心、注册中心使用Nacos&#xff0c;store.modedb&#xff08;mysql&#xff09;为例进行操作。 Seata简介及入门参…

[深度学习]1. 深度学习知识点汇总

本文记录了我在学习深度学习的过程中遇到过的不懂的知识点&#xff0c;为了方便翻阅&#xff0c;故将其发表于此&#xff0c;随时更新&#xff0c;供大家参考。 深度学习常见知识点 1. 测试精度和训练精度 在深度学习中&#xff0c;测试精度和训练精度是两个重要的指标&#…

【zip密码】zip压缩包删除密码方法

Zip压缩包设置设置了密码&#xff0c;想要删除密码&#xff0c;除了将压缩包解压出来之后再将文件压缩为不带密码的压缩文件以外&#xff0c;还有一种删除密码的方法。设置方法如下&#xff1a; 右键点击zip文件&#xff0c;找到打开方式&#xff0c;以Windows资源管理器方式打…

VBA技术资料MF52:VBA_在Excel中突出显示前 10 个值

【分享成果&#xff0c;随喜正能量】一言之善&#xff0c;重于千金。善良不分大小&#xff0c;有时候你以为的一句话&#xff0c;小小的举手之劳&#xff0c;也可能就是别人的救赎&#xff01;不要吝啬你的善良&#xff0c;因为你永远不知道那小小的善良能给多少人带来光明。。…

【 ARMv9 Cluster BUS QoS 配置】

文章目录 ARM Cluster QoS ARM Cluster QoS QoS&#xff08;Quality of Service&#xff0c;服务质量&#xff09;在 ARM 架构中&#xff0c;主要指的是一种机制&#xff0c;它可以控制和管理系统资源&#xff08;如内存、总线带宽等&#xff09;的使用&#xff0c;以满足各种…