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

news2024/10/21 22:34:13

因为系统变量涉及复杂的工程文件,为防止新增变量操作对软件系统的潜在影响,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));
...
}

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

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

相关文章

面向对象进阶(上)(JAVA笔记第二十二期)

p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解 目录 static修饰符静态变量静态方法 工具类工具类的使用例子第一题第二题 static注意事项继承关系建立继承关系的格式继承的好处及使用场景继承的特点继承体系的设计继承中类的三大要素…

JavaWeb 22.Node.js_简介和安装

有时候,后退原来是向前 —— 24.10.7 一、什么是Node.js Node.js 是一个于 Chrome V8 的 JavaScript 运行时环境,可以使 JavaScript 运行在服务器端。使用 Node.js,可以方便地开发服务器端应用程序,如 Web 应用、API、后端服务&a…

使用Three.js和Force-Directed Graph实现3D知识图谱可视化

先看样式: 在当今信息爆炸的时代,如何有效地组织和展示复杂的知识结构成为一个重要的挑战。3D知识图谱可视化是一种直观、交互性强的方式来呈现知识之间的关系。本文将详细介绍如何使用HTML、JavaScript、Three.js和Force-Directed Graph库来实现一个交互…

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

解决:YOLOv8训练数据集时P、R、mAP等值均为0的问题

文章目录 问题解决1.匹配pytorch与cuda的版本2.使用 Adam 优化器3.加大训练轮数epoch4. 删除data/labels下的train.cache和val.cache 问题 使用YOLOv8训练自己的数据集时,出现P、R、mAP等值均为0的问题 Model summary (fused): 186 layers, 2,685,733 parameters, …

【 Git 】git push 出现报错 fatal: Could not read from remote repository.

git push 出现报错 fatal: Could not read from remote repository. 问题描述解决方案 问题描述 Connection closed by 198.18.0.xx port xx fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.解…

【JavaScript】Javascript基础Day04:函数

Javascript——Day04 01. 函数的基本使用02. 函数的参数以及默认参数03. 匿名函数之函数表达式04. 逻辑中断05. 转换为布尔型 01. 函数的基本使用 02. 函数的参数以及默认参数 注意: 03. 匿名函数之函数表达式 函数:匿名函数/具名函数 为什么这个外部…

【wpf】07 后端验证及令牌码获取步骤

由于在用wpf开发应用程序时,从后端获取数据需要用到 Authorization 授权的Bearer令牌,而这个令牌的获取需要登录后台进行获取,这里登录时还涉及到的验证码的操作,所以在获取过程中,需要对后台系统进行登录并拿到这个Be…

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.6】

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.1-2.3.5】 2.3.6 变量分布可视化 2.3.6.1 单一变量分布可视化 对于 pandas.core.series.Series 类型的变量: index:含义:它表示 Series 对象的索引,也就是每个数据点对…

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐)

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐) 本期是平台君和您分享的第89期内容 2024年8月,安徽华米信息技术及美国的智能手表品牌ZEPP公司在美国对深圳思佰特公司提起诉讼,涉及专利、商标和不正当竞争。 起诉书(来源:RPX网站) 看到这则新闻…

面试官:并发时,故意不加锁会怎么样?

感谢Java面试教程关于并发锁的面试分享 在并发编程中,如果不加锁,可能会导致以下问题: 数据不一致:多个线程同时访问和修改共享资源时,如果没有加锁,可能会导致数据竞争,即一个线程在读取数据…

Maven入门到进阶:构建、依赖与插件管理详解

文章目录 一、Maven介绍1、什么是Maven2、Maven的核心功能 二、Maven核心概念1、坐标GAVP1.1、GroupId1.2、ArtifactId1.3、Version1.3.1、版本号的组成 1.4、Packaging 2、POM、父POM和超级POM2.1、POM (Project Object Model)2.1、父POM(Parent POM)2.…

算法的学习笔记—丑数(牛客JZ49)

😀前言 在程序设计和算法竞赛中,丑数问题是一个经典的动态规划题目。丑数(Ugly Number)定义为只包含质因子 2、3 和 5 的数。举例来说,数字 6(因子为 2 和 3)、数字 8(因子为 2&…

gewechat免费开源微信机器人开发

​聊天机器人,是一种通过自然语言模拟人类进行对话的程序。通常运行在特定的软件平台上,如PC平台或者移动终端设备平台。聊天机器人系统的主要功能是同用户进行基本沟通并自动回复用户有关产品或服务的问题,以实现降低企业客服运营成本、提升…

珊瑚岛风灵月影四十九项修改器:体力不减/生命不减/开启金钱修改

珊瑚岛是一款以模拟经营岛屿为特色的休闲养成游戏。在游戏中,玩家需设法吸引顾客消费。同时,还需投入时间和资源修复遗址,过程中或会遇到技术、资金及文化保护等挑战,增添游戏趣味与深度。 修改器地址: https://downf…

力扣——链表的中间结点(链表)C语言

题目: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 返回中间3这个结点; 返回中4这个结点; 原理: 思路1:利用遍历链表,统…

图文深入理解java的内存分配

本篇图文深入讨论java的内存分配。当然,这里所说的深入,并不是指长篇大论,而是就事论事重点深入介绍java的内存分配原理机制。 在理解java如何为变量或者对象分配内存之前,我们先来了解一个问题:为什么需要分配内存&am…

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑,如何跳过联网激活;由于微软限制必须要联网激活,需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用,Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

今年双十一最值得入手的好物有哪些?双十一值得选购的好物盘点!

在这个全民狂欢的购物盛宴——双十一,每一个角落都弥漫着诱人的优惠与不可错过的精品。从科技潮品到生活必需品,从时尚尖货到家居好物,无数精选商品在这一季集中绽放,等待着慧眼识珠的你将它们带回家,今年的双十一&…

除GOF23种设计模式之简单工厂模式

文章目录 1. 简介2. 代码2.1 抽象类:Course.java2.2 产品A:JavaCourse.java2.3 产品B:PythonCourse.java2.4 工厂:CourseFactory.java2.5 测试:Test.java 3. 心得参考链接(无) 1. 简介 简单工厂模式(Simple Factory Patern):又称…