在上一篇博客,配置项的定义及使用方法,详细阐述了配置项的概念及其基本应用方式,这些配置项能够调控集群或租户的行为方式。然而,在实际使用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 中新增配置项,包括配置项的代码实现也会有详细讲解,欢迎大家持续关注。