一款真正能扛起核心业务负载的分布式数据库,如何快速上手?
OceanBase 是蚂蚁集团自主研发的原生分布式关系数据库,具备高可用、高扩展、高兼容等特性。它打破了传统单机数据库的容量和性能瓶颈,已在支付宝、网商银行等核心金融场景中经受住了双 11 峰值考验。
OceanBase 提供两种兼容模式:
对于存量 Oracle 用户,Oracle 模式极大降低了迁移成本和代码改造成本。即使你是从零开始的新项目,也可以利用 Oracle 模式丰富的 SQL 特性和成熟的开发体验。
本文聚焦 Oracle 模式,带你从环境搭建到生产级特性进行全流程实操。
学习阶段,推荐使用单机部署(即集群只有一个节点)。生产环境可扩展为多节点集群,部署逻辑一致。
OBD 是官方推荐的自动化部署工具,支持一键安装单机版。
步骤 1:安装 OBD
# 安装必要依赖
yum install -y yum-utils
# 添加 OceanBase 官方 yum 源
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
# 安装 OBD
yum install -y ob-deploy步骤 2:使用 OBD 部署单机版
创建配置文件 ob-single.yaml:
oceanbase-ce:
servers:
- name: ob1
ip: 127.0.0.1
global:
home_path: /home/admin/oceanbase
data_dir: /data/obdata
redo_dir: /redo/obredo
mysql_port: 2881 # 业务端口(MySQL 协议)
rpc_port: 2882 # 内部 RPC 端口
zone: zone1
cluster_id: 1
memory_limit: 4G
system_memory: 1G
stack_size: 512K
cpu_count: 4
enable_syslog_recycle: true
max_syslog_file_count: 4执行部署:
obd cluster deploy ob_single -c ob-single.yaml
obd cluster start ob_single步骤 3:验证服务
obd cluster list
# 应显示 ob_single 状态为 runningOceanBase 默认使用 MySQL 协议,所以可用 mysql 命令行或官方客户端 obclient 连接。
安装 obclient(推荐):
yum install -y obclient连接方式(使用 root 用户,密码默认为空):
obclient -h127.0.0.1 -P2881 -uroot@sys -p -c -A
# 密码为空,直接回车注意:
-uroot@sys表示连接sys租户(系统租户)的 root 用户。
OceanBase 的多租户架构类似于 Oracle 的 CDB/PDB。我们首先创建业务租户。
在创建租户前,需要定义资源规格:
-- 创建资源单元,分配 CPU 和内存
CREATE RESOURCE UNIT unit_2c2g
MAX_CPU = 2,
MIN_CPU = 2,
MEMORY_SIZE = '2G';
-- 创建资源池,指定使用的单元数和所属节点
CREATE RESOURCE POOL pool_1
UNIT = 'unit_2c2g',
UNIT_NUM = 1,
ZONE_LIST = ('zone1');-- 创建租户 test_tenant,指定 Oracle 模式
CREATE TENANT test_tenant
RESOURCE_POOL_LIST = ('pool_1')
SET
ob_compatibility_mode = 'oracle', -- 关键:指定 Oracle 模式
ob_tcp_invited_nodes = '%', -- 允许所有 IP 连接
parallel_servers_target = 10;
-- 查看租户创建状态
SELECT * FROM oceanbase.DBA_OB_TENANTS;# 使用租户的 root 用户(初始密码为空)
obclient -h127.0.0.1 -P2881 -uroot@test_tenant -p
# 回车登录后,我们就进入了 Oracle 模式的租户环境。
Oracle 模式下,用户即 Schema,与 Oracle 一致。
-- 创建用户(需要具有 CREATE USER 权限)
CREATE USER app_user IDENTIFIED BY 'Abc123456';
-- 授予基础权限
GRANT CONNECT, RESOURCE, CREATE SESSION TO app_user;
GRANT CREATE TABLE, CREATE VIEW, CREATE SEQUENCE TO app_user;
-- 授予无限表空间(若使用表空间)
GRANT UNLIMITED TABLESPACE TO app_user;OceanBase 支持表空间,简化与 Oracle 的迁移:
-- 创建表空间
CREATE TABLESPACE tbs_app
DATAFILE 'tbs_app.dbf' SIZE 10G
AUTOEXTEND ON NEXT 1G MAXSIZE 100G;
-- 为用户指定默认表空间
ALTER USER app_user DEFAULT TABLESPACE tbs_app;-- 切换到 app_user 会话
CONNECT app_user/Abc123456@127.0.0.1:2881/test_tenant;
-- 创建表(Oracle 标准语法)
CREATE TABLE employees (
emp_id NUMBER(10) PRIMARY KEY,
emp_name VARCHAR2(100) NOT NULL,
hire_date DATE DEFAULT SYSDATE,
salary NUMBER(10,2),
dept_id NUMBER(10),
status CHAR(1) DEFAULT 'A',
CONSTRAINT chk_salary CHECK (salary >= 0)
);
-- 创建序列
CREATE SEQUENCE seq_emp_id
START WITH 1001
INCREMENT BY 1
CACHE 20;
-- 插入数据
INSERT INTO employees (emp_id, emp_name, hire_date, salary, dept_id)
VALUES (seq_emp_id.NEXTVAL, '张三', SYSDATE, 8500.50, 10);
-- 查询(Oracle 特有的 ROWNUM 和 ROWID 均支持)
SELECT ROWNUM, ROWID, emp_name, salary
FROM employees
WHERE ROWNUM <= 10;OceanBase 的 Oracle 模式支持存储过程、函数、包、触发器,语法与 Oracle 几乎一致。
-- 创建存储过程(打印员工信息)
CREATE OR REPLACE PROCEDURE get_emp(p_emp_id IN NUMBER) IS
v_name VARCHAR2(100);
BEGIN
SELECT emp_name INTO v_name FROM employees WHERE emp_id = p_emp_id;
DBMS_OUTPUT.PUT_LINE('员工姓名:' || v_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('未找到该员工');
END get_emp;
/
-- 调用
CALL get_emp(1001);尽管兼容度高,但仍有一些差异需注意:
特性 | Oracle | OceanBase Oracle 模式 |
|---|---|---|
数据类型 | BLOB/CLOB | 支持,但实现为分布式存储 |
外键约束 | 支持 | 支持,但跨分区外键有限制 |
物化视图 | 完全支持 | 支持,但暂不支持自动刷新 |
分区表 | 范围/列表/哈希/组合 | 完全支持,且支持非分区键索引 |
自增列 | 通过序列+触发器 | 支持 IDENTITY 列(Oracle 12c 特性) |
全局索引 | 支持 | 支持,但需指定 GLOBAL 关键字 |
同义词 | 私有/公有 | 支持 |
闪回查询 | AS OF | 支持(AS OF TIMESTAMP/SCN) |
包(Package) | 支持 | 支持,但部分系统包未实现 |
官方文档提供了《OceanBase 与 Oracle 兼容性对照表》,迁移前务必仔细查阅。
expdp/impdp 风格的语法(OceanBase 提供 OBLOADER/OBDUMPER 命令行工具)。导出源 Oracle 数据(示例为从 Oracle 导出为 CSV,再导入 OceanBase):
但更典型的是直接使用 OMS,这里简要介绍离线迁移方式:
obloader 导入数据安装 obloader:
yum install -y ob-loader-dumper导入 CSV 文件:
obloader -h 127.0.0.1 -P 2881 -u app_user -p Abc123456 -D test_tenant \
--table employees \
-f /data/export/employees.csv \
--cut --field-terminated-by ',' \
--batch 1000OMS 支持基于 Oracle LogMiner 或 XStream 的增量同步,实现不停机迁移。配置 OMS 需要单独部署。
memory_limit:集群总内存,建议预留 1/4 给操作系统system_memory:系统租户内存,建议 1~2Gcpu_count:根据实际 CPU 核数设定parallel_servers_target:并行执行线程数,调大可提升大查询性能在租户级别调整:
ALTER SYSTEM SET parallel_servers_target = 30;使用 EXPLAIN 查看执行计划,支持 Oracle 风格的 EXPLAIN PLAN FOR 或 OceanBase 特有的 EXPLAIN。
EXPLAIN SELECT * FROM employees WHERE dept_id = 10;输出包含分布式执行计划,可观察是否进行分区裁剪、并行度等。
视图 | 作用 |
|---|---|
GV$OB_SQL_AUDIT | SQL 执行历史,可用于慢查询排查 |
DBA_OB_SERVER_JOB | 查看后台任务 |
DBA_OB_TABLE_STATISTICS | 表统计信息 |
GV$OB_SESSION | 当前会话信息 |
示例:查看最近 10 条慢 SQL
SELECT * FROM GV$OB_SQL_AUDIT
WHERE elapsed_time > 1000000 -- 1ms
ORDER BY elapsed_time DESC
LIMIT 10;生产环境部署多个 Zone(可用区),每个 Zone 包含若干 OBServer。OceanBase 使用 Paxos 协议 实现日志同步,故障自动切换,RPO=0,RTO<30s。
OceanBase 支持物理备份(全量+增量)和逻辑备份(exp/imp 风格)。
配置备份目录(需先创建外部存储,如 NFS 或 OSS):
sql
ALTER SYSTEM SET backup_dest = 'file:///data/backup';执行全量备份:
ALTER SYSTEM BACKUP DATABASE PLUS ARCHIVELOG;恢复示例:
ALTER SYSTEM RESTORE DATABASE FROM 'file:///data/backup';用户名@租户名)-p 并直接回车LONG)UTL_FILE)尚未完全支持,需查阅兼容性文档GV$OB_SQL_AUDIT 查找消耗资源最多的 SQLCALL DBMS_STATS.GATHER_SCHEMA_STATS('APP_USER');阶段 | 任务 | 工具/命令 |
|---|---|---|
部署 | 单机或集群安装 | OBD |
管理 | 租户、用户、表空间 | SQL + OBD |
开发 | DDL/DML/PL/SQL | obclient / SQLplus |
迁移 | 从 Oracle 迁移 | OMS / obloader |
调优 | 慢查询、执行计划 | GV$OB_SQL_AUDIT / EXPLAIN |
运维 | 备份恢复、扩缩容 | ALTER SYSTEM |
最后一句:OceanBase 的 Oracle 模式正在快速发展,许多 Oracle 高级特性正在逐步补齐。对于希望摆脱传统 Oracle 高昂成本、同时需要保持高度兼容的团队,它无疑是一个极具竞争力的选择。
动手部署一个单机实例,花一天时间熟悉它的语法和工具,你会发现分布式数据库并没有想象中那么遥远
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。