什么是系统变量?如何使用系统变量?

2024年 5月 7日 92.3k 0

上一篇博客介绍了配置项的概念和基本用法,配置项能够控制集群或租户的行为方式。而在使用 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 配置项参数

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论