概述
租戶的概念類似於傳統數據庫的數據庫實例。租戶下可以建立數據庫,在租戶的數據庫下可以建立表。
支持租戶級別的轉儲、租戶級別的分區主切換和租戶級別的擴容縮容
支持兩種類型租戶
-
MySQL 租戶
-
Oracle 租戶
OceanBase 集群初始內置了一個系統租戶 sys, 可以用來管理 OceanBase 集群。
新建租戶
只有用 root 用戶連接到 sys 租戶(root@sys
)才能執行 CREATE TENANT
命令去創建租戶。創建新租戶后,可以指定創建租戶的類型和白名單。
語法
CREATE TENANT [IF NOT EXISTS] tenantname
[tenant_characteristic_list] [opt_set_sys_var]
tenant_characteristic_list:
tenant_characteristic [, tenant_characteristic...]
tenant_characteristic:
COMMENT 'string'
|{CHARACTER SET | CHARSET} [=] charsetname
|COLLATE [=] collationname
|REPLICA_NUM [=] num
|ZONE_LIST [=] (zone [, zone…])
|PRIMARY_ZONE [=] zone
|DEFAULT TABLEGROUP [=] {NULL | tablegroup}
|RESOURCE_POOL_LIST [=](poolname [, poolname…])
|LOGONLY_REPLICA_NUM [=] num
|LOCALITY [=] 'locality description'
opt_set_sys_var:
{ SET | SET VARIABLES | VARIABLES } system_var_name = expr [,system_var_name = expr] ...
說明
- 如果要創建的租戶名已存在,並且沒有指定
IF NOT EXISTS
,則會出現錯誤。 - 租戶名的合法性和變量名一致,最長 30 個字符,字符只能是大小寫英文字母、數字和下划線,而且必須以字母或下划線開頭,並且不能是 OceanBase 數據庫的關鍵字。
- 在租戶下可以指定資源池。
RESOURCE_POOL_LIST
為創建租戶時的必填項。CREATE TENANT
命令中的RESOURCE_POOL_LIST
中,暫時僅支持一個資源池。
示例
配置說明
primary_zone
指該租戶的表的分區 Leader 所在的 Zone ,例如,primary_zone ='zone1; zone2, zone3'
表示該租戶的表的分區 Leader 在zone1
上, 這時通過分號來分隔。zone2
和zone3
通過逗號分割,表示zone2
和zone3
是同一優先級,但是比zone1
優先級低。primary_zone
設置時,其值可以為RANDOM
(必須大寫),表示隨機選擇最高優先級內的任一一個 Zone 作為 Primary Zone。
創建mysql租戶
創建名為
test_tenant
的一個 3 副本的 MySQL 租戶(創建新租戶默認是 MySQL 租戶)
CREATE TENANT IF NOT EXISTS test_tenant charset='utf8mb4', replica_num=3, zone_list=('zone1','zone2','zone3'), primary_zone='zone1;zone2,zone3', resource_pool_list=('pool1');
-- 設置遠程訪問客戶端
ALTER TENANT test_tenant SET VARIABLES ob_tcp_invited_nodes='%';
創建oracle租戶
創建名為
test_tenant
的一個 3 副本 Oracle 租戶。通過參數ob_compatibility_mode
設置租戶模式,並且必須使用 OBClient 或 ODC 連接 Oracle 租戶進行創建。
CREATE TENANT IF NOT EXISTS test_tenant charset='utf8mb4', replica_num=3, zone_list=('zone1','zone2','zone3'), primary_zone='zone1;zone2,zone3', resource_pool_list=('pool1') SET ob_compatibility_mode='oracle';
創建可從遠程客戶端IP地址訪問OceanBase數據庫的租戶
創建租戶后,直接通過修改變量 ob_tcp_invited_nodes
的值為 %
以便允許任何客戶端 IP 連接該租戶。如果不調整 ob_tcp_invited_nodes
的值,則默認租戶的連接方式為只允許本機的 IP 連接數據庫。
CREATE TENANT IF NOT EXISTS test_tenant charset='utf8mb4', replica_num=3, zone_list=('zone1','zone2','zone3'), primary_zone='zone1;zone2,zone3', resource_pool_list=('pool1') SET ob_tcp_invited_nodes='%';
注意事項
普通租戶的內存最小規格必須大於等於 5 GB,否則創建租戶失敗。如果希望建立租戶進行非常簡單的功能測試,可以修改參數 alter system __min_full_resource_pool_memory
的值為 1073741824
來允許以最小 1 GB 內存的規格創建租戶。
alter system __min_full_resource_pool_memory=1073741824;
查看租戶信息
在 OBClient 中使用 sys 租戶登錄集群
查看當前集群的租戶信息
SELECT * FROM oceanbase.gv$tenant;
查看當前租戶
SHOW TENANT;
查看租戶白名單
系統變量 ob_tcp_invited_nodes
用於設置租戶的 IP 白名單,是租戶全局的白名單限制參數。默認值為 127.0.0.1,::1
,表示僅允許本機的 IP 連接該租戶。
查看該變量確認白名單設置
SHOW VARIABLES LIKE 'ob_tcp_invited_nodes';
值為 %
,表示允許任何客戶端 IP 連接該租戶
系統變量配置規則
ob_tcp_invited_nodes
用於設置租戶的 IP 白名單,支持百分號(%) 、短橫線(_) 和 IP(多個 IP 之間用逗號分隔),支持 IP 列表匹配、掩碼匹配和模糊匹配。
租戶會話管理
查看租戶會話
-- 查看租戶當前會話
SHOW PROCESSLIST;
終止租戶會話
KILL session_id;
-- 或者
KILL CONNECTION session_id;
修改租戶
可以通過 SQL 語句修改租戶的信息,包括修改租戶名、副本數、Zone 列表、主 Zone 以及系統變量值等。
語法
ALTER TENANT {tenant_name | ALL}
[SET] [tenant_option_list] [opt_global_sys_vars_set]
tenant_option_list:
tenant_option [, tenant_option ...]
tenant_option:
COMMENT [=]'string'
|{CHARACTER SET | CHARSET} [=] charsetname
|COLLATE [=] collationname
|REPLICA_NUM [=] num
|ZONE_LIST [=] (zone [, zone…])
|PRIMARY_ZONE [=] zone
|RESOURCE_POOL_LIST [=](poolname [, poolname…])
|DEFAULT TABLEGROUP [=] {NULL | tablegroupname}
|{READ ONLY | READ WRITE}
|LOGONLY_REPLICA_NUM [=] num
|LOCALITY [=] 'locality description'
|LOCK|UNLOCK;
opt_global_sys_vars_set:
VARIABLES system_var_name = expr [,system_var_name = expr] ...
鎖定租戶
租戶被鎖定后,不能在該租戶上創建新的連接,已有的鏈接保持不變。
語法
ALTER TENANT tenant_name LOCK;
刪除租戶
刪除租戶后,租戶下的數據庫和表也同時被刪除。但是租戶使用的資源配置不會被刪除。資源配置可以繼續給其他租戶使用。
對於主備庫配置場景,僅支持在主集群上刪除租戶,不支持在備集群上執行租戶刪除操作。
語法
DROP TENANT tenant_name [FORCE]
-- 或者
DROP TENANT tenant_name PURGE;
說明
-
對於
DROP TENANT
操作:-
當租戶開啟回收站功能時,
DROP TENANT
操作表示刪除的租戶會進入回收站。租戶實際占用的空間並沒有釋放,只是不能再向該租戶建立新的連接。對於回收站中的租戶,后續您可以通過租戶級回收站功能進一步刪除或恢復該租戶-
執行
FLASHBACK
時,可以使用租戶原始的名稱,也可以使用回收站中的名稱,回收站中的名稱全局唯一,因此使用回收站中的名稱,可以明確恢復的是哪個租戶。當多個租戶存在相同的原始名稱時,此時恢復的租戶是這些租戶中最后進入回收站中的租戶。-- 查看回收站中租戶信息 SHOW RECYCLEBIN; --將系統租戶回收站中的 tenant_name 閃回為正常租戶 FLASHBACK TENANT <tenant_name> TO BEFORE DROP;
-
執行
PURGE TENANT
時,同樣可以使用原始名稱和回收站中的名稱。與FLASHBACK
不同,PURGE TENANT
時,如果多個原始名稱相同,則刪除的是最早進入回收站中的租戶。-- 將租戶 tenant_name 從回收站中徹底清除 PURGE TENANT tenant_name; -- 將回收站中的全部對象全部徹底清除 PURGE RECYCLEBIN;
-
-
當租戶關閉回收站功能時,
DROP TENANT
操作表示延遲刪除租戶,后台線程會進行 GC(Garbage Collection)動作,租戶的信息仍然可以通過內部表查詢。租戶具體延遲刪除的時間由配置項schema_history_expire_time
控制,默認為 7 天
-
-
DROP TENANT PURGE
操作表示僅延遲刪除租戶,且無論回收站功能是否開啟,刪除的租戶均不進入回收站。 -
FORCE
參數表示無論回收站功能是否開啟,均可以立刻刪除租戶。
示例
延遲刪除租戶 t1
,刪除的租戶可進入回收站
DROP TENANT t1;
延遲刪除租戶 t1
,刪除的租戶不進入回收站
DROP TENANT t1 PURGE;
立刻刪除租戶 t1
DROP TENANT t1 FORCE;
管理變量
分類
租戶的變量分為 Global 級別和 Session 級別。
- Session 級別的變量繼承自 Global 級別的變量。同時,Session 建立后可以設定 Session 級別的變量。Session 級別的變量在 Session 中覆蓋 Global 級別的變量。
查看變量
查詢 Session/Global 級別變量語句的語法
SHOW [GLOBAL] VARIABLES [SHOW_VARIABLES_OPTS]
SHOW_VARIABLES_OPTS:
[LIKE 'pattern' | WHERE expr]
示例
SHOW VARIABLES LIKE 'ob_query_timeout';
SHOW GLOBAL VARIABLES WHERE variable_name LIKE 'ob_query_timeout';
sys 租戶可以通過內部表 __all_virtual_sys_variable
查詢其他所有普通租戶的 Global 變量。
select * from __all_virtual_sys_variable;
如果連接 sys 租戶后再切換到普通租戶,此時查詢的 Session 級別變量仍然是 sys 租戶的 Session 級別的變量。查詢的 Global 級別的變量是切換后普通租戶的 Global 級別變量。
設置變量
設置 Session 級別的變量僅對當前 Session 有效,對其他 Session無效。設置 Global 級別的變量對當前 Session 無效,需要重新登錄建立新的 Session 才會生效。
語法
SET [GLOBAL] VARIABLE_NAME = 'VALUE'
示例
SET ob_query_timeout = 20000000;
SET GLOBAL ob_query_timeout = 20000000;
說明
變量中類型為 INT
, 並且在 SHOW VARIABLE
命令中顯示 ON/OFF
或者 True/False
的變量,可以通過如下任意方法設置值:
SET @@foreign_key_checks = ON;
SET @@foreign_key_checks = 1;
SET @@foreign_key;
以上三種方式的 Session 級別變量的設置是等效的。