阅读 30

OB有问必答 | 参数和变量的区别是什么?

OceanBase 的参数和变量设置方式常让初学者很迷惘,实际掌握其实并不难。下面就为大家展开介绍。

首先说参数和变量的区别。参数(parameter)是 ORACLE 的叫法,变量(variable)是 MySQL 的叫法,在 OceanBase 里这两种概念和修改方法都存在,跟 ORACLE 和 MySQL 基本保持一致。通常集群级别的设置用参数,租户级别的设置用变量。参数查看方式是 show parameters,变量查看方式是 show [global|session] variables 。在参数或变量的定义中,有初步的涵义说明。

第二说作用域。通常参数的作用域是集群级别,变量的作用域是租户级别。参数和变量通常是针对不同的行为做设置。变量的设置在具体的租户里设置,参数的设置在 sys 租户里设置,影响 sys 的行为就是影响这个集群的行为。所以这并不是说参数的值在所有租户都可以见。参数的作用域还可以指定生效的节点。默认是所有节点(就是集群级别了)。同时参数的作用域还可以是租户级别,需要指定组户名。这是 sys 租户里参数设置的特权,可以管理其他租户的参数设置。这种效果跟到租户里去设置这个参数效果是一样的(在具体的租户里设置就不需要指定组户名)。

第三说生效时间。大部分参数的设置是立即生效的,极少数参数修改需要重启节点或集群。变量的设置生效时间则有点复杂,取决于变量的设置方法。比如说是租户全局级别设置、会话级别设置、语句级别设置。如果是全局级别的变量设置,老的会话的变量不会变化,只有新建会话的变量设置才会生效;如果是会话级别的变量设置,该会话里立即生效,但是会话断开重连后,所有变量又读取了全局级别的默认变量设置。语句级别的变量设置主要是以 Hint 形式存在,只影响当前语句并是立即生效。

第四说参数的设置方法。参数的设置通常是通过 alter system set xxx 方式修改,也可以通过节点进程启动时指定(指 OBServer 启动参数 -o 里指定的)。即使启动时指定了参数,后期也是可以修改的。

第五说变量的设置方法。变量的设置方法通常是通过 set [global] xxx 方式修改。大部分变量都可以反复修改,极少数变量属于初始化变量(如字符集),只能在实例初始化的时候指定一次,后期不能再修改。还有一招是在 sys 租户里设置其他租户的变量,方法是 alter tenant xxx set yyyy,这种效果相当于租户全局级别的变量设置。

第六说参数和变量的持久化。参数的修改会写到 sys 租户视图__all_virtual_sys_parameter_stat 中和 OBServer 的参数文件中,下次重启节点时会读取。变量的修改只要是全局级别的修改,都会写到租户的内部视图 __all_sys_variable 中。