在繼續閱讀本文之前,大家不妨先思考一下,數據庫中“系統變量”、“用戶變量”以及“配置項”這三者之間有何不同。如果感到有些模糊,那么本文將是您理清這些概念的好幫手。
很多用戶在使用OceanBase數據庫中的“配置項”和“系統變量”,但可能未能完全理解它們之間的區別。在社區論壇里,也看到一個帖子,該帖子詢問“系統變量”與“用戶變量”有何不同,還提及了“用戶變量”。
下面有不少熱心用戶積極回復,但感覺完全講清楚兩者區別的并不多,有一些同學還把 “配置項” 也摻進來一起討論。所以想趁機搞明白這三者之間的區別,在這里分享給大家。為了解釋的更清楚,在下面的標題中,我會把 “系統變量” 稱為 “租戶系統變量”,把 “用戶變量” 成為 “用戶自定義變量”。
租戶系統變量和配置項
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: zone1svr_type: observersvr_ip: 11.158.31.20svr_port: 22602name: cpu_quota_concurrencydata_type: NULLvalue: 4info: max allowed concurrency for 1 CPU quota. Range: [1,20]section: TENANTscope: TENANTsource: 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: zone1svr_type: observersvr_ip: 11.158.31.20svr_port: 22602name: max_string_print_lengthdata_type: NULLvalue: 500info: truncate very long string when printing to log file. Range:[0,]section: OBSERVERscope: CLUSTERsource: 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 [test]> SHOW PROXYSESSION VARIABLES;
+-----------------------------------+--------------+-----------------+--------------------+--------------------------------------------+
| variable_name | value | info | modified_type | sys_variable_flag |
+-----------------------------------+--------------+-----------------+--------------------+--------------------------------------------+
| ob_proxy_global_variables_version | 0 | changed sys var | cold modified vars | && invisible && session_scope && readonly |
| ob_proxy_user_privilege | 133009965054 | changed sys var | cold modified vars | && invisible && session_scope && readonly |
| ob_capability_flag | 916295 | changed sys var | cold modified vars | && invisible && session_scope && readonly |
| ob_enable_transmission_checksum | 1 | changed sys var | cold modified vars | && global_scope && session_scope |
| _min_cluster_version | '4.2.1.2' | user var | cold modified vars | |
| v3 | 789 | user var | cold modified vars | |
+-----------------------------------+--------------+-----------------+--------------------+--------------------------------------------+
6 rows in set (0.001 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 了。用戶自定義變量在一般情況下的使用頻率不會太高,所以就偷懶貼一個?官方文檔的鏈接?供大家學習參考啦~
參考文檔
OceanBase 官網的文檔中心日漸完善,最后也在這里推薦大家自主在官網搜索和解決各類問題~
文檔中心 - 配置項和系統變量概述
文檔中心 - 用戶自定義變量
OceanBase 云數據庫現已支持免費試用,現在申請,體驗分布式數據庫帶來全新體驗吧 ~