当前位置: 首页 > news >正文

如何在OceanBase中新增系统变量及应用实践

因为系统变量涉及复杂的工程文件,为防止新增变量操作对软件系统的潜在影响,OceanBase为多数开发者设计了一套高效的编程框架。此框架允许开发者在新增及使用系统变量时,仅需专注于变量定义的细节。具体来说,通过运行一个Python脚本,开发者可以自动化地生成新增系统变量所需的代码,极大地简化了操作过程。

本文以一个案例,说明如何在OceanBase中新增一个系统变量,以及如何进行应用。

系统变量(variables)

生效范围:global(租户隔离)/session(会话级隔离)

案例:

ob_query_timeout 用于设置对SQL语句进行DML操作的超时时间,单位是微秒。

系统变量的生成

如何去为OB新增一个系统变量

需要注意的点1.修改/src/share/system_variables/ob_system_variable_init.json,并执行/src/share/system_variables/gen_ob_sys_variables.py即可。 下图就是ob_system_variable_init.json中的一个变量对应json对象。

2.系统变量的id应该保证单调递增3.无法废弃系统变量 (只增不删)4.修改ob_system_variable_init.json文件,哪怕是改了info,实际都等价于修改了upgrade_pre.py,是需要推版本号的。

ob_system_variable_init.json涉及到的字段

base_value 和 default_value

这里存在两个value,一个是default_value, 一个是base_value。第一次申请新增变量时,两个值是相同的,如果后面新版本需要修改默认值时,只需要修改default_value即可,base_value仅作为基线不会再被修改。

data_type 变量的数据类型,包括int、uint、varchar、enum、bool。

on_check_and_convert_func

对此变量的校验方法,需要在ob_system_variable.cpp中去实现对这个变量的校验与转换。

例:

"ob_query_timeout": {"id": 10005,"name": "ob_query_timeout","default_value": "10000000","base_value": "10000000","data_type": "int","info": "Query timeout in microsecond(us)","flags": "GLOBAL | SESSION | NEED_SERIALIZE","on_check_and_convert_func": "ObSysVarOnCheckFuncs::check_and_convert_timeout_too_large","publish_version": "","info_cn": "","background_cn": "","ref_url": ""
}//ObSysVarOnCheckFuncs::check_and_convert_timeout_too_large 将对ob_query_timeout进行限制

enum_names

限制该变量的可选项

例子:enum_names 限制了mysql租户还是oracle租户类型

"ob_compatibility_mode": {"id": 10030,"name": "ob_compatibility_mode","default_value": "0","base_value": "0","data_type": "enum","info": "What DBMS is OceanBase compatible with? MYSQL means it behaves like MySQL while ORACLE means it behaves like Oracle.","flags": "GLOBAL | SESSION | READONLY | WITH_UPGRADE | NEED_SERIALIZE","enum_names": ["MYSQL","ORACLE"],"publish_version": "","info_cn": "","background_cn": "","ref_url": ""
},

flags

变量的标记,记录这个变量的特性。

GLOBAL 租户全局生效
SESSION sesssion生效
NEED_SERIALIZE 需要序列化到远端(涉及远程、分布式执行计划)
INFLUENCE_PLAN 变量的改变是否清空相关的Plan cache。
INVISIBLE 隐藏变量
READONLY 变量只读,不可更改
SESSION_READONLY session级别只读,global级别可更改
WITH_UPGRADE 只有ob_compatibility_mode有此flag,用来区别其他READONLY的变量。
NULL  只有字符类型相关的变量才具有的flag,作用未知。
生成新增系统变量

执行gen_ob_sys_variables.py后,如下的工程文件发生了变化。受影响的工程文件如下图所示,这些文件会被底层一套复杂的分布式session管理模块所调用。

重新编译后,show variables可以看到成功添加了新的变量。

系统变量的使用

变量的调用是 基于ObBasicSessionInfo这个类实现的,需要为其实现一个方法,以便其他逻辑通过session对象获取系统变量。

ObBasicSessionInfo存储系统变量及其相关变量,并存储远程执行SQL任务时需要序列化到远端的状态信息,例如上面提到的ob_query_timeout这个需要序列化的变量。

ObSQLSessionInfo是ObBasicSessionInfo的一个子类,存储其他状态信息,如prepared statment相关信息等。

使用的话需要在ObBasicSessionInfo中定义一个获取变量的方法,例:

class ObBasicSessionInfo
{ ...public:int get_query_timeout(int64_t &query_timeout) const{query_timeout = sys_vars_cache_.get_ob_query_timeout();return common::OB_SUCCESS;}......int ObBasicSessionInfo::get_enable_parallel_dml(bool &v) const{return get_bool_sys_var(SYS_VAR__ENABLE_PARALLEL_DML, v);}...
}

get_query_timeout这个方法内的sys_vars_cache有一个成员对象SysVarsCacheData,它是ObBasicSessionInfo的内部缓存以提升性能,部分经常被使用到的变量就会加入到缓存中,如ob_query_timeout,该变量会提前初始化到内存中。而大部分的系统变量还是基于sys_vars_存储的,如get_enable_parallel_dml这个方法底层还是从sys_vars_中获取变量。

class ObBasicSessionInfo
{ 
​    ...class SysVarsCache{...public:SysVarsCacheData inc_data_;...}...private:SysVarsCache sys_vars_cache_;...private:share::ObBasicSysVar *sys_vars_[share::ObSysVarFactory::ALL_SYS_VARS_COUNT];...
}
调用变量例子:
int ObMPQuery::process()
{
...
ObSQLSessionInfo &session = *sess;
...
else if (OB_FAIL(session.get_query_timeout(query_timeout))) {
LOG_WARN("fail to get query timeout", K_(sql), K(ret));
...
}

相关文章:

如何在OceanBase中新增系统变量及应用实践

因为系统变量涉及复杂的工程文件,为防止新增变量操作对软件系统的潜在影响,OceanBase为多数开发者设计了一套高效的编程框架。此框架允许开发者在新增及使用系统变量时,仅需专注于变量定义的细节。具体来说,通过运行一个Python脚本…...

Olap数据处理

一、OLAP 是什么 1. OLAP的定义 OLAP(Online Analytical Processing,联机分析处理)是一种软件技术,它主要专注于复杂的分析操作,帮助分析人员、管理人员或执行人员从多角度对信息进行快速、一致、交互地存取&#xf…...

Tailwind Starter Kit 一款极简的前端快速启动模板

Tailwind Starter Kit 是基于TailwindCSS实现的一款开源的、使用简单的极简模板扩展。会用Tailwincss就可以快速入手使用。Tailwind Starter Kit 是免费开源的。它不会在原始的TailwindCSS框架中更改或添加任何CSS。它具有多个HTML元素,并附带了ReactJS、Vue和Angul…...

物联网智能家居环境监测系统

作为物联网工程专业的学生,做一个智能家居非常重要,大家是这个专业的同学可以了解一下,不是这个专业的同学也可以了解一下,毕设可以参考哦。 稍微简单的了解(仅对代码可以自己写的同学) 对于一个零基础的物…...

观测云 AI 助手上线:智能运维,从此触手可及!

在当前的云原生时代,运维的复杂性和数据的爆炸式增长给企业带来了前所未有的挑战。为了帮助企业高效应对这些挑战,观测云自豪地推出了 AI 助手——智能化的运维助手,让每位用户都能轻松驾驭复杂的可观测性场景。 01 你身边的 PE 助手&#x…...

案例分析:拒绝服务攻击引发的网络调优之旅

在信息安全领域,拒绝服务攻击(DoS)与分布式拒绝服务攻击(DDoS)已成为企业面临的重要挑战之一。这些类型的攻击不仅能够导致服务中断,还可能对公司的声誉及财务状况产生不利影响。本文旨在通过一个案例来深入…...

Spring Boot Web框架:智慧社区设计新思路

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…...

从 Hadoop 迁移到数据 Lakehouse 的架构师指南

从 Hadoop 到数据湖仓一体架构的演变代表了数据基础架构的重大飞跃。虽然 Hadoop 曾经以其强大的批处理能力统治着大数据领域,但如今的组织正在寻求更敏捷、更具成本效益和现代化的解决方案。尤其是当他们越来越多地开始实施 AI 计划时。根本没有办法让 Hadoop 为 A…...

Python基础——类与对象

类与对象的理解: 在程序中我们将类看作是设计图纸,对象则是根据这个图纸生产的产品。面向对象编程就是使用对象编程,在类中我们定义成员属性和方法。 来看下面这个例子,创建student类,定义对象并对属性赋值。 class S…...

知乎广告怎么做?知乎种树推广怎么收费?

作为国内领先的知识分享平台,知乎以其高质量的内容和精准的用户群体,成为了品牌营销的新蓝海。云衔科技正式推出知乎信息流广告和知广告开户及代运营服务,旨在为企业提供一站式的营销解决方案。 一、知乎广告怎么做? 1.明确广告…...

【设计模式】Python 设计模式之建造者模式(Builder Pattern)详解

Python 设计模式之建造者模式(Builder Pattern)详解 在软件开发中,创建复杂对象往往需要多个步骤,而这些步骤之间的顺序、配置可能有多种变化。为了解决这个问题,建造者模式(Builder Pattern)应…...

微软常用运行库合集 Microsoft Visual C++ Redistributable 2023.11.13

微软常用系统运行库 Microsoft Visual C Redistributable(简称:MSVC,VB/VC,系统运行库)是Windows操作系统应用程序的基础类型库组件。此版微软常用运行库合集整合Visual C 组件安装包运行库所有版本,提供图…...

[机器视觉]basler相机使用SN编号打开相机和采集

背景分析 在项目中是用basler相机采图时,一般用的比较多的遍历相机,然后使用CreateFirstDevice这个函数获取相机,有些时候可能需要同时连接多个相机,这里一般是遍历后,再循环打开相机,根据打开相机的SN号确…...

C#使用实体类Entity Framework Core操作mysql入门:从数据库反向生成模型2 处理连接字符串

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

Go语言基础学习(Go安装配置、基础语法)·

一、简介及安装教程 1、为什么学习Go? 简单好记的关键词和语法;更高的效率;生态强大;语法检查严格,安全性高;严格的依赖管理, go mod 命令;强大的编译检查、严格的编码规范和完整的…...

高德开放平台API调用实战指南

本文 一、地图展示1.1 地图初始化与展示1.2 自定义标记 二、路线规划2.1 驾车路线规划2.2 步行路线规划 三、定位服务3.1 使用JavaScript API进行定位3.2 IP定位 四、实时交通信息查询4.1 获取实时交通路况 五、智能调度引擎总结 一、地图展示 地图展示是开发基于地理信息系统…...

文档太大LLM处理不过来?这10种LangChain分割技术帮你搞定!

前言 RAG(检索增强生成)是一种创建基于大语言模型(LLM)应用的高效方式。它有助于生成对用户查询的准确回答。为了创建一个基于 RAG 的应用程序,我们需要执行一些操作,例如文档加载、将大文档拆分为多个小块…...

TikTok广告账号被封?常见原因及解决方法分享

TikTok广告投放往往会给我们的账号带来高效曝光和精准流量,但同时许多用户也面临着一个困扰——广告账号被封禁的问题。将在此文一起商讨TikTok广告账号被封禁的原因,分析平台的具体规定,提供解决问题的应对策略,帮助大家有效规避…...

maven聚合ssm

如果没有写过ssm项目请移步SSM后端框架搭建(有图有真相)-CSDN博客 数据库准备 create table user (id int (11),uid varchar (60),name varchar (60),age int (11),sex varchar (12) ); insert into user (id, uid, name, age, sex) values(10,202409…...

网络通信与并发编程(二)基于tcp的套接字、基于udp的套接字、粘包现象

基于tcp的套接字 文章目录 基于tcp的套接字一、套接字的工作流程二、基于tcp的套接字通信三、基于udp的套接字通信四、粘包现象 一、套接字的工作流程 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 ​ 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

大话软工笔记—需求分析概述

需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

AspectJ 在 Android 中的完整使用指南

一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

docker 部署发现spring.profiles.active 问题

报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【网络安全】开源系统getshell漏洞挖掘

审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...