系统变量、配置项、用户变量,在数据库中有啥区别?
首先为大家推荐这个 OceanBase 开源负责人老纪的公众号,会持续更新和 OceanBase 相关的各种技术内容。欢迎感兴趣的朋友们关注!
> 大家可能都了解甚至使用过 OceanBase、MySQL 等数据库,先不看下面的内容,看看你能不能想清楚数据库中 “系统变量”、“用户变量” 和 “配置项” 三者的区别。 > > 如果想不太清楚,推荐阅读本文,并通过在线平台进行一下相关实验。 >
背景
之前一直在用 OceanBase 数据库中的 “配置项” 和 “系统变量”,但是始终没能把这两者的区别彻底弄清楚。正好最近很多读者在社区咨询,因此在这里给大家做个详细分享。
为了解释的更清楚,在下面的标题中,我会把:
- “系统变量” 称为 “租户系统变量”
- “用户变量” 称为 “用户自定义变量”。
边学边练,效果拔群
《租户信息查询》实验地址:https://www.oceanbase.com/demo/query-tenant-info
本实验会为大家介绍如何使用 OceanBase 数据库查询当前租户、系统参数、系统变量和 Unit 分布等基础元信息。强烈推荐大家来点击上面的链接来亲手实践一把!
租户系统变量和配置项
OceanBase 数据库提供了 “系统变量” 和 “配置项” 两种不同的参数来对数据库的行为进行配置,使之能够符合业务的要求。
有很多用户可能还不了解系统变量和配置项的影响范围,例如某个参数的设置,是会影响整个集群,还是影响当前租户,亦或是只影响当前 session。所以先抛开用户变量,先说说这两个更常见和常用的东西。
租户系统变量
OceanBase 的系统变量都是组户级的,也就是只对当前的租户生效。所以系统变量又可以被称作:租户系统变量。
设置系统变量时,又可以通过增加 Global 关键字或者 Session 关键字,来设置对应系统变量为全局级别或者会话级别,以调整系统变量在租户内的生效范围:
- 全局变量:表示 Global 级别的修改,数据库同一租户内的不同用户共享一个全局变量。全局变量的修改不会随会话的退出而失效。此外,全局变量修改后,对当前已打开的 Session 不生效,需要重新建立 Session 才能生效。
- 会话变量:表示 Session 级别的修改,Session 变量的修改仅对当前 Session 生效。当新的客户端连接到数据库后,数据库会复制全局变量来自动生成对应连接上的 Session 变量。
-- 执行 show variables; 可以看到全量系统变量 obclient [test]> show variables like 'ob_query_timeout'; +------------------+----------+ | Variable_name | Value | +------------------+----------+ | ob_query_timeout | 10000000 | +------------------+----------+ 1 row in set (0.004 sec) -- 修改 global 级别的系统变量 obclient [test]> set global ob_query_timeout = 20000000; Query OK, 0 rows affected (0.004 sec) -- 全局变量修改后,对当前已打开的 session 不生效,需要重新建立 session 才能生效。 obclient [test]> show variables like 'ob_query_timeout'; +------------------+----------+ | Variable_name | Value | +------------------+----------+ | ob_query_timeout | 10000000 | +------------------+----------+ 1 row in set (0.003 sec) -- 不加 global 或者 session 关键字,默认修改的是 session 级别的系统变量 obclient [test]> set ob_query_timeout = 20000000; Query OK, 0 rows affected (0.001 sec) obclient [test]> show variables like 'ob_query_timeout'; +------------------+----------+ | Variable_name | Value | +------------------+----------+ | ob_query_timeout | 20000000 | +------------------+----------+ 1 row in set (0.001 sec)
配置项
OceanBase 数据库的配置项分为集群级配置项和租户级配置项。
- 集群级配置项:指适用于整个 OceanBase 数据库集群的配置选项,它们具有全局性质,用于配置整个集群的基本信息、性能参数、安全选项等等。这些配置项通常包括数据备份和恢复、负载均衡等方面的配置选项。集群级配置项通常是在集群启动时进行配置,配置后不轻易修改。
- 租户级配置项:指适用于租户级别的配置选项,它们是针对单个租户或多个租户的配置选项。用于对单个租户或多个租户进行特定的配置和优化。这些配置项通常包括存储引擎参数、SQL 执行策略、访问控制等方面的配置选项。租户级配置项通常可以在租户创建和管理时进行配置,可以随时根据需要进行修改。
查询某个配置项为集群级别还是租户级别的方法如下:
obclient [test]> SHOW PARAMETERS; -- 展示所有配置项 obclient [test]> SHOW PARAMETERS like 'cpu_quota_concurrency'\G *************************** 1. row *************************** zone: zone1 svr_type: observer svr_ip: 11.158.31.20 svr_port: 22602 name: cpu_quota_concurrency data_type: NULL value: 4 info: max allowed concurrency for 1 CPU quota. Range: [1,20] section: TENANT scope: TENANT source: DEFAULT edit_level: DYNAMIC_EFFECTIVE 1 row in set (0.004 sec) obclient [test]> SHOW PARAMETERS like 'max_string_print_length'\G *************************** 1. row *************************** zone: zone1 svr_type: observer svr_ip: 11.158.31.20 svr_port: 22602 name: max_string_print_length data_type: NULL value: 500 info: truncate very long string when printing to log file. Range:[0,] section: OBSERVER scope: CLUSTER source: DEFAULT edit_level: DYNAMIC_EFFECTIVE 1 row in set (0.005 sec)
scope 列对应的值为 CLUSTER 表示该配置项的生效范围为整个集群;如果 scope 列对应的值为 TENANT,则表示该配置项的生效范围为当前租户。
edit_level 列对应的值为 DYNAMIC_EFFECTIVE 时表示修改后立即生效,为 STATIC_EFFECTIVE 时则表示需要在重启 OBServer 节点后生效。
注意:
上述的查询结果中有一个比较容易和 scope 混淆的 section 列,值可能为:LOAD_BALANCE、DAILY_MERGE、RPC、TRANS、LOCATION_CACHE 等等,甚至可能为 TENANT 或者 OBSERVER(上面的示例就专门展示了这种情况)。这个 section 仅仅是一个 tag,只有标签性质,表示这个配置项和哪个模块相关,不代表配置项的生效范围,大家切记要将 scope 和 section 列的含义区分开!
尤其是要注意类似于 TENANT 或者 OBSERVER 这种 tag,估计研发同学在写标签的时候实在不知道相应的配置项该归为哪个模块更合适了,就直接偷懒把标签打成了 TENANT 或者 OBSERVER,但这个标签并不代表对当前 tenant 或者当前 session 直连的某个 OBServer 生效。
最后附上一个配置项与系统变量的对比:
对比项 | 配置项 | 系统变量 |
---|---|---|
生效范围 | 分为集群、Zone、机器和租户。 | 分为租户的 Global 或 Session 级别。 |
生效方式 | 动态生效:edit_level 为 dynamic_effective 重启生效:edit_level 为 static_effective | 设置 Session 级别的变量仅对当前 Session 有效,对其他 Session 无效。 设置 Global 级别的变量对当前 Session 无效,需要重新登录建立新的 Session 才会生效。 |
修改方式 | 支持通过 SQL 语句修改,示例: Alter SYSTEM SET schema_history_expire_time='1h';支持通过启动参数修改,示例: cd /home/admin/oceanbase && ./bin/observer -o "schema_history_expire_time='1h'"; | 仅支持通过 SQL 语句修改,示例如下:MySQL 模式 SET ob_query_timeout = 20000000; SET GLOBAL ob_query_timeout = 20000000; |
查询方式 | 可以使用 SHOW PARAMETERS 语句查询。示例:SHOW PARAMETERS LIKE 'schema_history_expire_time'; | 可以使用 SHOW [GLOBAL] VARIABLES 语句查询。示例如下:SHOW VARIABLES LIKE 'ob_query_timeout'; SHOW GLOBAL VARIABLES LIKE 'ob_query_timeout'; |
持久化 | 持久化到内部表与配置文件,可以在 /home/admin/oceanbase/etc/observer.config.bin 与 /home/admin/oceanbase/etc/observer.config.bin.history 文件中查询该配置项。 | 仅 Global 级别的变量会持久化,Session 级别的变量不会进行持久化。 |
生命周期 | 长,从进程启动到退出。 | 短,需要租户的 Schema 创建成功以后才生效。 |
用户自定义变量
发帖者提问中的 “用户变量” 其实就是“用户自定义变量”,一般会出现在 PL 的存储过程和匿名块之类的地方。
obclient [test]> SET @v3 = 789; Query OK, 0 rows affected (0.002 sec) obclient> SHOW PROXYSESSION VARIABLES\G *************************** 1. row *************************** variable_name: ob_proxy_global_variables_version value: 0 info: changed sys var modified_type: cold modified vars sys_variable_flag: && invisible && session_scope && readonly *************************** 2. row *************************** variable_name: ob_proxy_user_privilege value: 246286188216318 info: changed sys var modified_type: cold modified vars sys_variable_flag: && invisible && session_scope && readonly *************************** 3. row *************************** variable_name: ob_capability_flag value: 4062023 info: changed sys var modified_type: cold modified vars sys_variable_flag: && invisible && session_scope && readonly *************************** 4. row *************************** variable_name: ob_enable_transmission_checksum value: 1 info: changed sys var modified_type: cold modified vars sys_variable_flag: && global_scope && session_scope *************************** 5. row *************************** variable_name: _nlj_batching_enabled value: 1 info: changed sys var modified_type: cold modified vars sys_variable_flag: && invisible && global_scope && session_scope *************************** 6. row *************************** variable_name: _min_cluster_version value: '4.3.5.1' info: user var modified_type: cold modified vars sys_variable_flag: *************************** 7. row *************************** variable_name: v3 value: 789 info: user var modified_type: cold modified vars sys_variable_flag: 7 rows in set (0.05 sec) obclient [test]> select concat('abc', @v3); +--------------------+ | concat('abc', @v3) | +--------------------+ | abc789 | +--------------------+ 1 row in set (0.002 sec) obclient [test]> select power(@v3, 2); +---------------+ | power(@v3, 2) | +---------------+ | 622521 | +---------------+ 1 row in set (0.002 sec)
帖子中的链接里说的执行 SHOW PROXYSESSION VARIABLES 可以展示出来的用户变量,就是上面例子中用户自定义的 @v3 了。
用户自定义变量在一般情况下的使用频率不会太高,所以就偷懒贴一个 官方文档的链接 供大家学习参考了~
What's more ?
OceanBase 官网的文档中心日渐完善,最后也在这里推荐大家多多尝试自主在官网搜索和解决各类问题~
> 本文由博客一文多发平台 OpenWrite 发布!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开鸿 Bot 如何点燃大鸿蒙生态“星火”?——深开鸿的一站式开发实践
2025年一季度后,鸿蒙系统的装机量突破 10 亿台,在这个具有里程碑意义的生态爆发节点背后,一场关于技术生态的暗战正在展开。 尽管鸿蒙的分布式架构被视为万物互联时代的技术标杆,但开发生态上仍面临硬件适配复杂、开发门槛高、工具不够完善等现实瓶颈。甚至开发者还需要多准备一台电脑用于开发鸿蒙应用——传统上,开源鸿蒙应用的开发需要在两台设备、两套系统上完成,比如开发者在基于 Windows 的电脑上开发完成后,需要将其导出至鸿蒙设备上,才能看到运行效果,如果要做调整,则要回到 Windows 环境中修改,再反复导出、验证,耗时耗力。 这也折射出开源鸿蒙的深层困境:作为全球增速最快的操作系统之一,其生态扩张正从“技术攻坚期”迈入“商业落地期”,但缺乏从开发工具到产业落地的完整链路支撑。 深开鸿近期推出的开鸿 Bot 系列产品,正试图以“软硬一体开发套件+全栈工具链”破局,其战略意图直指生态建设的核心痛点。但这场技术突围远不止于系统本身——如何让开发者更高效地融入生态,将技术势能转化为产业动能,成为破局关键。而开鸿 Bot 的这场实验,或许正在定义下一代开源鸿蒙操作系统的开发范式。 用一台设备,...
- 下一篇
传统企业如何玩转平台工程?2 个运维靠它管 50 + 应用
来自用户分享 在某事业单位做了五年运维,我和同事两个人管着十几人开发团队,还有 8 家厂商的外采系统(加起来有 30 多个应用)。两年前领导拍板上 K8s,我们熬夜搭集群、配 Jenkins 流水线,本以为能告别传统部署,结果掉进了新坑:每天 80% 时间都耗在敲 Kubectl 命令上,部署应用、调资源、查日志成了家常便饭。我们的开发团队里只有个别人懂 K8s,改完代码总得来找我们运维部署。厂商更离谱,供应商坚持要 ssh 进服务器改配置。 现状:K8s 用成了运维专属工具 我们的现状是: 流水线是 Jenkins+Shell 脚本,开发提交代码后,自动触发构建自动部署,但每次来新的项目或者部署新的服务就要重新搭建流水线。 运维成了 K8s 翻译官,开发提需求得先翻译成 K8s 术语,比如我想加个前端服务 = Deployment+Service+Ingress。 为什么不用 PaaS 容器平台? 起初拒绝 PaaS 容器平台有两个执念: 习惯了命令行:觉得敲 Kubectl 比点鼠标快,YAML 配置出错了直接 vim 修改更直接。 担心开发越权:怕开放 PaaS 平台后,开发误删...
相关文章
文章评论
共有0条评论来说两句吧...