上篇博客我们聊了 OceanBase 是什么。这篇进入实操 ------ 把日常使用中最常用的命令整理出来,逐条解释每个参数的作用。适合刚接触 OceanBase、想快速上手的开发者和运维同学。
OceanBase 兼容 MySQL 和 Oracle 两种语法模式,很多基础 SQL(如 CREATE DATABASE、CREATE TABLE、SELECT)和 MySQL 用法一致,本文不再赘述,重点讲 OceanBase 特有的命令:连接工具、资源管理、租户管理,以及常用运维命令。
一、用 OBClient 连接 OceanBase
OBClient 是 OceanBase 的官方命令行客户端,用法和 MySQL 的 mysql 命令非常相似。
基本连接命令
obclient -h 127.0.0.1 -P 2881 -u root@sys -p -D test
| 参数 | 说明 |
|---|---|
-h (host) |
目标主机 IP 地址,默认 127.0.0.1。生产环境通常填 OBProxy 的地址 |
-P (port) |
连接端口号,默认 2881。通过 OBProxy 连接时一般是 2881,直连 OBServer 时是 2881(SQL 端口) |
-u (user) |
登录用户名,格式为 用户名@租户名。root@sys 表示用 sys 租户的 root 用户登录。也可以写成 租户名:用户名 格式 |
-p (password) |
密码。直接写 -p 回车后交互式输入更安全;-p'xxx' 则直接跟密码 |
-D (database) |
连接后默认使用的数据库 |
其他常用 OBClient 选项
| 选项 | 作用 |
|---|---|
-A / --no-auto-rehash |
不自动补全表名 / 列名信息,启动更快 |
-B / --batch |
批处理模式,用制表符分隔列,适合脚本处理输出 |
-e / --execute=SQL |
执行指定 SQL 后直接退出,不进入交互模式 |
-E / --vertical |
垂直显示查询结果,适合列很多的场景 |
-t / --table |
以表格格式显示输出 |
--safe-updates |
安全模式,防止 DELETE / UPDATE 不带 WHERE 误删全表 |
-V / --version |
输出版本号并退出 |
连接示例:执行 SQL 后退出
obclient -h 127.0.0.1 -P 2881 -u root@sys -p -e "SHOW TENANTS"
-e 后跟一条 SQL,执行完直接返回结果并退出,非常适合写脚本。
二、资源管理:创建资源单元、资源池、租户
OceanBase 的多租户体系是三层结构:资源单元(Unit) → 资源池(Pool) → 租户(Tenant)。创建租户前必须先建好 Unit 和 Pool。这些操作只能在 sys 租户下执行。
1. CREATE RESOURCE UNIT --- 创建资源单元
资源单元定义了 CPU、内存、I/O 等硬件资源的规格,是分配给租户的最小资源单位。
CREATE RESOURCE UNIT unit1
MAX_CPU = 1,
MIN_CPU = 1,
MAX_MEMORY = '1G',
MIN_MEMORY = '1G',
MAX_IOPS = 128,
MIN_IOPS = 128,
MAX_DISK_SIZE = '10G',
MAX_SESSION_NUM = 64;
| 参数 | 说明 |
|---|---|
unit_name |
资源单元名称,自定义 |
MIN_CPU |
CPU 规格下限(单位:Core),最小值 1。所有租户的 MIN_CPU 总和不能超过物理 CPU 总数 |
MAX_CPU |
CPU 规格上限。如果不指定 MIN_CPU,默认等于 MAX_CPU |
MIN_MEMORY |
内存下限,最小 1G(1073741824 字节) |
MAX_MEMORY |
内存上限 |
MIN_IOPS |
IOPS 下限,最小 128 |
MAX_IOPS |
IOPS 上限,不指定时默认等于 MIN_IOPS |
MAX_DISK_SIZE |
最大磁盘空间。内存型参数可用 '1G' 这样的字符串 |
MIN_SESSION_NUM |
最小会话数 |
MAX_SESSION_NUM |
最大会话数 |
小贴士:MIN/MAX 的区别在于,MIN 是保底保障,MAX 是上限。当资源空闲时租户可以使用到 MAX,资源紧张时至少保证 MIN。
2. CREATE RESOURCE POOL --- 创建资源池
资源池将 Unit 规格与具体的 Zone(可用区)关联起来,是 Unit 的集合。
CREATE RESOURCE POOL pool1
UNIT = 'unit1',
UNIT_NUM = 1,
ZONE_LIST = ('zone1', 'zone2', 'zone3');
| 参数 | 说明 |
|---|---|
pool_name |
资源池名称,自定义 |
UNIT |
绑定的资源单元规格名(上一步创建的 unit_name) |
UNIT_NUM |
每个 Zone 下创建的 Unit 个数。同一个资源池的 Unit 不能分配到同一台 Server,所以 UNIT_NUM 不能超过单 Zone 内 Server 数量 |
ZONE_LIST |
资源池分布在哪些 Zone 上。多 Zone 部署时填写,格式为逗号分隔的 Zone 名列表 |
3. CREATE TENANT --- 创建租户
租户是 OceanBase 中资源隔离和权限隔离的基本单位,类似于一个 "虚拟数据库实例"。
CREATE TENANT IF NOT EXISTS test_tenant
PRIMARY_ZONE = 'zone1;zone2,zone3',
RESOURCE_POOL_LIST = ('pool1'),
CHARSET = 'utf8mb4'
SET ob_tcp_invited_nodes = '%';
| 参数 | 说明 |
|---|---|
tenant_name |
租户名,最长 63 字节,只能含字母、数字、下划线,以字母或下划线开头 |
IF NOT EXISTS |
如果租户已存在不报错(可选) |
PRIMARY_ZONE |
指定主 Zone,即 leader 副本优先分布的 Zone。RANDOM 表示所有 Zone 优先级相同。zone1;zone2,zone3 中分号表示优先级分组,逗号表示同组内等优 |
RESOURCE_POOL_LIST |
分配给租户的资源池列表,必填。多个资源池的 UNIT_NUM 要一致,ZONE_LIST 不能有交集 |
LOCALITY |
副本在 Zone 间的分布,例如 F@z1,F@z2,F@z3 表示 z1/z2/z3 各一个全功能副本 |
ENABLE_ARBITRATION_SERVICE |
是否开启仲裁服务,默认 False |
CHARACTER SET / CHARSET |
租户字符集 |
COLLATE |
字符序(仅 MySQL 模式生效) |
READ ONLY / READ WRITE |
租户属性,默认读写 |
SET |
设置租户级系统变量,常用的有 ob_compatibility_mode(设为 mysql 或 oracle,默认 MySQL)、ob_tcp_invited_nodes(白名单,% 表示允许所有 IP) |
COMMENT |
备注信息(可选) |
创建 Oracle 兼容模式租户
CREATE TENANT tenant1
PRIMARY_ZONE = 'zone1',
RESOURCE_POOL_LIST = ('pool1')
SET ob_compatibility_mode = 'oracle', ob_tcp_invited_nodes = '%';
关键区别是通过 ob_compatibility_mode = 'oracle' 指定 Oracle 兼容模式。租户创建后模式不可更改。
三、数据库与用户管理
连入业务租户后,日常操作和 MySQL 基本一致。
创建数据库
CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARACTER SET utf8mb4;
| 参数 | 说明 |
|---|---|
database_name |
数据库名 |
IF NOT EXISTS |
已存在时不报错 |
DEFAULT CHARACTER SET |
默认字符集 |
创建用户
CREATE USER 'appuser'@'%' IDENTIFIED BY 'YourPassword123';
| 参数 | 说明 |
|---|---|
username |
用户名 |
host |
允许连接的主机,% 表示任意 IP |
IDENTIFIED BY |
设置密码 |
授予权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'appuser'@'%';
| 参数 | 说明 |
|---|---|
priv_type |
权限类型,如 SELECT、INSERT、ALL PRIVILEGES |
db.* |
作用域,mydb.* 表示 mydb 库的所有表,*.* 表示全局 |
TO |
目标用户 |
修改数据库只读状态
ALTER DATABASE mydb SET READ ONLY;
ALTER DATABASE mydb SET READ WRITE;
在维护窗口将数据库设为只读,防止误写。
四、常用运维命令
以下命令在 sys 租户或业务租户中执行,用于集群和租户的日常运维。
集群节点管理
-- 新增 OBServer 节点
ALTER SYSTEM ADD server '192.168.1.10:2882' zone 'zone1';
-- 删除节点
ALTER SYSTEM DELETE server '192.168.1.10:2882';
-- 停止/启动节点
ALTER SYSTEM STOP server '192.168.1.10:2882';
ALTER SYSTEM START server '192.168.1.10:2882';
| 参数 | 说明 |
|---|---|
svr_ip:svr_port |
OBServer 的 IP 和 RPC 端口(默认 2882) |
zone_name |
节点所属的 Zone |
Zone 管理
-- 新增 Zone
ALTER SYSTEM ADD zone 'zone1' region 'default_region';
-- 设置 Zone 的机房信息
ALTER SYSTEM ALTER zone 'zone1' set idc = 'idc1';
-- 删除/下线/上线 Zone
ALTER SYSTEM DELETE zone 'zone1';
ALTER SYSTEM STOP zone 'zone1';
ALTER SYSTEM START zone 'zone1';
| 参数 | 说明 |
|---|---|
zone_name |
Zone 名称 |
region_name |
Region(地域)名称,一个 Region 可包含多个 Zone |
idc |
机房标识 |
租户管理
-- 查看所有租户
SHOW TENANTS;
-- 锁定/解锁租户(锁定后租户无法登录)
ALTER TENANT test_tenant LOCK;
ALTER TENANT test_tenant UNLOCK;
-- 修改租户主 Zone
ALTER TENANT test_tenant PRIMARY_ZONE = 'zone2';
-- 修改租户白名单
ALTER TENANT test_tenant SET VARIABLES ob_tcp_invited_nodes = '%';
-- 删除租户
DROP TENANT IF EXISTS test_tenant;
参数管理
-- 查看集群级配置项
SHOW PARAMETERS WHERE scope = 'cluster';
-- 查看租户级配置项
SHOW PARAMETERS WHERE scope = 'TENANT';
-- 设置集群配置项
ALTER SYSTEM SET memory_limit = '80%';
-- 针对特定租户设置
ALTER SYSTEM SET memory_limit = '80%' TENANT = 'test_tenant';
| 参数 | 说明 |
|---|---|
scope |
配置项作用域,cluster 为集群级,TENANT 为租户级 |
name |
配置项名称,支持 LIKE 模糊查询 |
ZONE |
指定在哪个 Zone 生效 |
SERVER |
指定在哪台 Server 生效 |
TENANT |
指定对哪个租户生效 |
合并管理
OceanBase 使用 LSM‑Tree 存储引擎,数据写入 memtable 后异步转储和合并到磁盘。
-- 在业务租户中执行租户级合并
ALTER SYSTEM MAJOR FREEZE;
-- 在 sys 租户中对指定租户执行合并
ALTER SYSTEM MAJOR FREEZE TENANT = 'test_tenant';
-- 清理合并失败状态
ALTER SYSTEM CLEAR MERGE ERROR TENANT = 'test_tenant';
会话诊断
-- 查看当前活跃会话
SHOW PROCESSLIST;
-- 终止会话
KILL 12345;
-- 只终止当前查询,不断开会话
KILL QUERY 12345;
| 参数 | 说明 |
|---|---|
session_id |
会话 ID,通过 SHOW PROCESSLIST 获取 |
备份恢复
-- 设置数据备份路径
ALTER SYSTEM SET data_backup_dest = '/backup/data' TENANT = 'test_tenant';
-- 设置日志归档路径
ALTER SYSTEM SET log_archive_dest = '/backup/log' TENANT = 'test_tenant';
-- 启动全量备份
ALTER SYSTEM BACKUP DATABASE;
-- 启动增量备份
ALTER SYSTEM BACKUP INCREMENTAL DATABASE;
-- 启动/停止日志归档
ALTER SYSTEM ARCHIVELOG;
ALTER SYSTEM NOARCHIVELOG;
五、速查表
| 场景 | 命令 |
|---|---|
| 连接数据库 | obclient -h IP -P 2881 -u root@sys -p |
| 创建资源单元 | CREATE RESOURCE UNIT unit1 MAX_CPU=1, MAX_MEMORY='1G'... |
| 创建资源池 | CREATE RESOURCE POOL pool1 UNIT='unit1', UNIT_NUM=1, ZONE_LIST=('zone1') |
| 创建 MySQL 租户 | CREATE TENANT t1 PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('pool1') SET ob_tcp_invited_nodes='%' |
| 创建 Oracle 租户 | 同上,加 SET ob_compatibility_mode='oracle' |
| 查看租户 | SHOW TENANTS |
| 查看配置项 | SHOW PARAMETERS WHERE scope='cluster' |
| 执行合并 | ALTER SYSTEM MAJOR FREEZE |
| 终止会话 | KILL session_id |
| 启动备份 | ALTER SYSTEM BACKUP DATABASE |
小结
OceanBase 的命令体系对 MySQL 用户非常友好 ------ 基础的库表操作几乎零学习成本。真正需要理解的是它的多租户资源管理模型(Unit → Pool → Tenant)和 ALTER SYSTEM 系列运维命令。掌握本文这些命令,日常的连接、建租户、建库建用户、基础运维就够用了。
如果是生产环境,更推荐用 OCP(OceanBase Cloud Platform)这个图形化运维平台来做集群和租户管理,命令行则适合自动化脚本和快速排查问题。
参数说明和语法主要参考自 OceanBase 官方文档,不同版本细节可能有差异,实际使用时建议对照你所用的版本查阅对应文档。