天天看點

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 中。