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

OceanBase 配置项系统变量实现及应用详解(2):系统变量的定义及使用场景

在上一篇博客,配置项的定义及使用方法,详细阐述了配置项的概念及其基本应用方式,这些配置项能够调控集群或租户的行为方式。然而,在实际使用OceanBase的过程中,我们有时仅希望针对当前会话调整某些行为特性,且在关闭会话连接后,这些调整不会影响后续的使用。此时,我们就需要借助“系统变量”来实现这一目标。

系统变量和配置项有一些相似之处,但是生效范围和实现方式却有所差异。本期博客将会介绍“系统变量”的概念和用法,帮助大家理解和使用“系统变量”。

什么是系统变量?

变量(variable)的概念来源于 MySQL,在 OceanBase 中,为了与编程语言中的“变量”概念区分开,将这类控制数据库行为的变量称作“系统变量”。

在与数据库建立会话(session)连接后,可以通过修改一些变量来控制租户的行为和SQL命令的执行方式,这些变量就是“系统变量”。

系统变量示例:

// 是否自动提交事务
autocommit = false
// 查询超时时间,单位:微秒(us)
ob_query_timeout = 10000000
// 是否记录历史sql命令
ob_enable_sql_audit = true

系统变量分为全局(global)级别和会话(session)级别,global级别也可以视作租户级别,仅在当前租户范围内生效;session级别仅在当前会话中生效,session级别变量优先级高于global级别变量。

全局级别的系统变量(global变量),在修改之后不会立即生效,但之后新建的会话都会使用该变量的新值;会话级别的系统变量(session变量),在修改会立即生效,但之后新建的会话都会使用该变量的旧值。可以理解为global变量直接写到磁盘,而session变量只写到缓存且不持久化。

global变量会利用schema机制进行持久化(以内部表的形式存储),而不是像配置项一样直接写到文件;session变量不会持久化,无论是断开连接还是重启observer,都会导致session变量失效。

查询系统变量

系统变量可以通过“show variables”命令查询,也可以通过内部表或视图进行查询。

通过“show variables”命令查询系统变量

  • 查询当前租户的 global 变量

show global variables like '%xxx%';

select @@global.xxx;

  • 查询当前会话的 session 变量

show variables like '%xxx%';

select @@xxx;

select @@session.xxx;

通过内部表和视图查询系统变量

global变量和session变量存在于不同的表中,通过执行“select * from xxx; ”命令即可查询所有系统变量,增加where参数也可查找指定变量。

  • __all_sys_variable

当前租户的global级别变量。

  • __all_virtual_sys_variable

所有租户的global级别变量,基于 __all_sys_variable 进行查询。

  • __tenant_virtual_global_variable

当前租户的global级别变量,“show global variables”命令查询的虚拟表。

  • __tenant_virtual_session_variable

当前租户的session级别变量,“show variables”命令查询的虚拟表。

  • CDB_OB_SYS_VARIABLES

所有租户的global级别变量,即 __all_virtual_sys_variable 的视图。

  • INFORMATION_SCHEMA.GLOBAL_VARIABLES

当前租户的global级别变量,基于 __tenant_virtual_global_variable 进行查询。

  • INFORMATION_SCHEMA.SESSION_VARIABLES

当前租户的session级别变量,查询结果比 __tenant_virtual_session_variable 更加全面。

修改系统变量

系统变量可以通过"set xxx=xx"命令进行修改。注意不要修改相关内部表或视图,因为这样做并不能真正地修改变量的值,还会带来一些潜在的问题。

  • 修改当前租户的 global 变量

set global ob_max_read_stale_time = 5000000;

set @@global.ob_max_read_stale_time = 5000000;

  • 修改当前会话的 session 变量

set ob_max_read_stale_time = 5000000;

set @@ob_max_read_stale_time = 5000000;

set @@session.ob_max_read_stale_time = 5000000;

配置项对比系统变量

集群配置项和租户配置项的行为是类似的,这里合并在一列中进行说明,global变量和session变量的行为差异较大,所以分开说明。

对比项系统配置项系统变量(global级别)系统变量(session级别)
生效范围分为集群级和租户级租户当前session
生效方式动态生效:edit_level 为 dynamic_effective
重启生效:edit_level 为 static_effective
设置 global 级别的变量对当前 session 无效,需要建立新的 session 才会生效。设置 session 级别的变量仅对当前 Session 有效,对其他 session 无效。
修改方式通过启动参数修改: ./bin/observer -o xxx='xx';
通过 SQL 语句修改: alter system set xxx='xx';
通过持久化配置文件修改(不推荐)
仅支持通过 SQL 语句修改,示例如下:
set global xxx = xx;
仅支持通过 SQL 语句修改,示例如下:
set xxx = xx;
持久化持久化到内部表与配置文件,可以在 {install_path}/etc/observer.config.bin 与 {install_path}/etc/observer.config.bin.history 文件中找到配置项。利用schema的机制持久化不会持久化
生命周期与observer进程生命周期相同与租户生命周期相同与session生命周期相同
查询方式使用 show parameters 语句查询:
show parameters like '%xxx%';
使用 show global variables 命令查询:
show global variables like 'xxx'; 
查询视图:
select * from information_schema.global_variables where variable_name = 'xxx';
使用 show variables 命令查询:
show variables like 'xxx';
查询视图: 
select * from information_schema.session_variables where variable_name = 'xxx';

小结

本期博客介绍了系统变量的概念和用法,并与配置项进行了对比,至此就可以很容易地区分配置项和系统变量了。系统变量更加灵活,它可以控制当前会话的各种行为,并且不影响其他会话,跟配置项结合使用可以起到 1+1>2 的效果。

看到这里,不知道有没有同学已经跃跃欲试,也想尝试自己定义一个配置项或系统变量呢?在下一期博客中,将会介绍如何在 OceanBase 中新增配置项,包括配置项的代码实现也会有详细讲解,欢迎大家持续关注。

参考文档

  1. 配置项和系统变量概述
  2. 系统变量总览
  3. OB有问必答 | 参数和变量的区别是什么?
  4. 调整 OceanBase 配置项参数


 

http://www.lryc.cn/news/398759.html

相关文章:

  • 本地部署,去除动漫图像背景Anime Remove Background
  • wireshark与tcpdump使用
  • 【密码学】密码学中的四种攻击方式和两种攻击手段
  • 网络层的角色与重要性:互联网通信的关键
  • Transformer模型:WordEmbedding实现
  • 如何压缩pdf文件大小,怎么压缩pdf文件大小
  • Spring Boot集成Atomix快速入门Demo
  • Go语言map并发安全,互斥锁和读写锁谁更优?
  • Java多线程性能调优
  • MacOS 通过Docker安装宝塔面板搭建PHP开发环境
  • Unity发布webgl之后修改StreamingAssets 内的配置文件读取到的还是之前的配置文件的解决方案
  • 离线语音识别芯片在智能生活中的应用
  • 替换:show-overflow-tooltip=“true“ ,使用插槽tooltip,达到内容可复制
  • 219.贪心算法:柠檬水找零(力扣)
  • 通过 Azure OpenAI 服务使用 GPT-35-Turbo and GPT-4(win版)
  • MySQL 面试真题(带答案)
  • 《A++ 敏捷开发》- 10 二八原则
  • Spring Boot 框架知识汇总
  • 国产麒麟、uos在线编辑word文件并控制编辑区域(局部编辑)
  • Go:基本变量与数据类型
  • 计算器原生js
  • 怎样将aac转换mp3格式?推荐四个aac转MP3的方法
  • MongoDB - 查询操作符:比较查询、逻辑查询、元素查询、数组查询
  • html5——CSS高级选择器
  • Python-数据爬取(爬虫)
  • 虚幻引擎ue5如何调节物体锚点
  • Xcode持续集成之道:自动化构建与部署的精粹
  • Java高频面试基础知识点整理13
  • css画半圆画圆弧
  • LeetCode HOT100(四)字串