
在数字化转型浪潮中,关系型数据库承载着企业最核心的业务数据。传统 Oracle 数据库凭借其稳定性、成熟生态和强大的 PL/SQL 能力,长期占据企业级市场。然而,随着数据量激增和云原生趋势,Oracle 的集中式架构在扩展性、成本(License 费用、硬件依赖)和运维复杂度上逐渐力不从心。
OceanBase 作为一款原生分布式数据库,由蚂蚁集团自主研发,打破了传统单机瓶颈。其独特的 Oracle 模式(即兼容 Oracle 语法与语义的租户模式)为 Oracle 用户提供了一条平滑迁移至分布式架构的路径:
本文将带你从零开始,部署一套 OceanBase Oracle 模式集群,详细讲解管理操作、SQL 兼容性、数据迁移和性能调优,帮助你在实际项目中快速落地。
在动手之前,先了解 OceanBase 的几大核心概念:
observer 进程,存储数据切片(Partition)并处理 SQL。Oracle 模式租户内部呈现为“数据库(Database)→ 模式(Schema)→ 表/对象”的三层结构,与 Oracle 的“用户=模式”模型一致。
我们使用三台物理机或虚拟机(CentOS 7.9/RedHat),IP 如下:
角色 | IP | 目录 |
|---|---|---|
OBServer-1 | 192.168.10.101 | /data/1, /data/2 |
OBServer-2 | 192.168.10.102 | /data/1, /data/2 |
OBServer-3 | 192.168.10.103 | /data/1, /data/2 |
每个节点要求至少 8C/32GB,磁盘建议 SSD,数据盘独立。
本文采用 命令行手动部署(也可以使用 OBD 自动化工具),更利于理解原理。
所有节点执行:
# 关闭防火墙与 SELinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 安装基础依赖
yum install -y wget curl libaio libtool-ltdl python3
# 创建 oceanbase 用户
useradd oceanbase
echo 'oceanbase' | passwd --stdin oceanbase
# 创建数据目录(需要与用户权限匹配)
mkdir -p /data/1 /data/2
chown -R oceanbase:oceanbase /data从官网下载 RPM 包(或使用社区版),上传至各节点:
# 以 4.2.x 版本为例
rpm -ivh oceanbase-4.2.1.el7.x86_64.rpm安装后,二进制文件位于 /home/admin/oceanbase(默认)或 /usr/local/oceanbase,我们使用 /home/admin/oceanbase。
在 OBServer-1 上启动第一个节点,作为 RootService 初始节点:
su - oceanbase
cd /home/admin/oceanbase
# 启动命令(单行)
./bin/observer -i eth0 -p 2881 -P 2882 -z zone1 \
-d /data/1 -r '192.168.10.101:2882:2881;192.168.10.102:2882:2881;192.168.10.103:2882:2881' \
-c 1 -n obdemo -o "memory_limit=20G,datafile_size=50G,log_disk_size=30G,enable_syslog_recycle=True"参数解释:
-i:网卡名,用于监听。-p:SQL 端口(默认 2881)。-P:RPC 端口(默认 2882)。-z:指定 Zone 名称。-d:数据目录,需为 /data/1。-r:所有 OBServer 地址列表,格式 IP:RPC_PORT:SQL_PORT。-c:集群 ID。-n:集群名称。-o:启动参数,如内存、数据文件大小等。然后在 OBServer-2 和 OBServer-3 上分别启动(注意 -z zone2/zone3,且不包含 -c 参数,因为集群已初始化):
./bin/observer -i eth0 -p 2881 -P 2882 -z zone2 \
-d /data/1 -r '192.168.10.101:2882:2881;192.168.10.102:2882:2881;192.168.10.103:2882:2881' \
-n obdemo -o "memory_limit=20G,datafile_size=50G,log_disk_size=30G"连接任意节点的 SQL 端口(mysql -h 192.168.10.101 -P 2881 -uroot),执行 Bootstrap 命令:
ALTER SYSTEM BOOTSTRAP ZONE 'zone1' SERVER '192.168.10.101:2882',
ZONE 'zone2' SERVER '192.168.10.102:2882',
ZONE 'zone3' SERVER '192.168.10.103:2882';成功后,集群即搭建完成。
首先修改 root 密码,并创建资源单元规格:
ALTER USER root IDENTIFIED BY 'password';
CREATE RESOURCE UNIT S4C8G MAX_CPU 4, MIN_CPU 4, MEMORY_SIZE '8G', LOG_DISK_SIZE '20G', MAX_IOPS 10000, MIN_IOPS 5000;
CREATE RESOURCE POOL pool_oracle UNIT 'S4C8G', UNIT_NUM 1, ZONE_LIST ('zone1','zone2','zone3');创建租户,指定 ob_compatibility_mode='ORACLE':
CREATE TENANT oracle_tenant RESOURCE_POOL_LIST=('pool_oracle') SET ob_compatibility_mode='ORACLE', ob_tcp_invited_nodes='%';查看租户状态:
SELECT * FROM oceanbase.DBA_OB_TENANTS;租户创建后,系统会自动生成 sys 用户(相当于 Oracle 的 SYS)。使用租户的用户名连接(格式:用户名@租户名):
mysql -h 192.168.10.101 -P 2881 -u sys@oracle_tenant -p输入密码(默认为空,可修改)。
在 Oracle 模式下,用户即 Schema,创建用户会自动生成同名 Schema:
CREATE USER app_user IDENTIFIED BY 'app123';
GRANT CONNECT, RESOURCE, CREATE SESSION TO app_user;创建表:
CREATE TABLE app_user.orders (
order_id NUMBER(10) PRIMARY KEY,
customer_id NUMBER(10) NOT NULL,
order_date DATE DEFAULT SYSDATE,
total_amount NUMBER(12,2),
status VARCHAR2(20)
);支持序列、同义词、触发器、存储过程等。例如:
CREATE SEQUENCE app_user.orders_seq START WITH 1 INCREMENT BY 1;
CREATE TRIGGER app_user.trg_orders_id BEFORE INSERT ON app_user.orders FOR EACH ROW BEGIN SELECT orders_seq.NEXTVAL INTO :NEW.order_id FROM DUAL; END;
/OceanBase Oracle 模式支持表空间(Tablespace),可设置数据文件位置(实际存储于集群的 SSTable 中):
CREATE TABLESPACE tbs_data DATAFILE SIZE '10G' AUTOEXTEND ON NEXT '500M';
CREATE TABLE ... TABLESPACE tbs_data;注意:表空间是逻辑概念,实际数据分布由分区策略决定。
Oracle 类型 | OceanBase 支持 | 备注 |
|---|---|---|
NUMBER | ✅ 完全支持 | 精度与标度一致 |
VARCHAR2 | ✅ | 最大 32767 字节 |
CHAR / NCHAR | ✅ | |
DATE | ✅ | 包含时间戳 |
TIMESTAMP | ✅ | 支持时区 |
CLOB / BLOB | ✅ | 最大 48MB(可调) |
RAW / BFILE | 部分支持 | BFILE 暂不支持 |
ROWID / UROWID | ✅ | 物理行标识 |
UTL_FILE、DBMS_SCHEDULER 等高级包,可用替代方案。常用函数如 TO_CHAR, TO_DATE, SUBSTR, INSTR, DECODE, NVL, COALESCE, CASE 等全部支持。系统视图如 DBA_TABLES, USER_TABLES, ALL_TABLES 提供与 Oracle 相同的信息。
使用 exp/imp(或 Oracle Data Pump)导出数据为 SQL 文件,再通过 OceanBase 的 obloader 或 mysql 命令导入。注意处理 DDL 语法差异,例如:
-- Oracle: CREATE TABLE ... PCTFREE 10;
-- OceanBase: 忽略 PCTFREE 参数,需修改
-- Oracle 的 VARCHAR2(10 CHAR) 在 OceanBase 中需明确为 VARCHAR2(10 CHAR) 或调整长度单位对于存储过程,建议先导出 PL/SQL 源码,在 OceanBase 中重新编译,检查是否报错。
使用 EXPLAIN 查看 SQL 执行计划,OceanBase 提供了类似 Oracle 的 DBMS_XPLAN 包:
EXPLAIN SELECT * FROM orders WHERE customer_id = 1001;支持 OUTLINE 绑定执行计划,与 Oracle 的 SQL Profile 类似。
创建索引语法与 Oracle 一致:
CREATE INDEX idx_customer ON orders(customer_id) LOCAL;
CREATE INDEX idx_date_global ON orders(order_date) GLOBAL;租户级参数可通过 ALTER SYSTEM SET 动态修改,例如:
ALTER SYSTEM SET ob_sql_work_area_percentage = 10; -- 工作区内存比例
ALTER SYSTEM SET parallel_servers_target = 64; -- 并行度GV$OB_SQL_AUDIT 记录 SQL 历史,GV$OB_MEMORY 查看内存使用,GV$OB_IO_SCHEDULER 分析 IO。-- 查看集群状态
SELECT * FROM oceanbase.DBA_OB_SERVERS;
-- 查看分区分布
SELECT * FROM oceanbase.DBA_OB_TABLE_PARTITIONS;
-- 租户资源使用
SELECT * FROM oceanbase.GV$OB_TENANT_MEMORY;增加 OBServer 节点:在新机器启动 observer,并添加到集群:
ALTER SYSTEM ADD SERVER '192.168.10.104:2882' ZONE 'zone1';回收节点:
ALTER SYSTEM DELETE SERVER '192.168.10.104:2882';系统会自动进行数据重分布,无需停机。
每个 Zone 保存一份完整数据,三副本策略下,任何一个 Zone 故障,集群仍可正常工作(Paxos 多数派)。若某个 OBServer 宕机,RootService 会在剩余节点上重新选举 Leader,并将故障节点的数据分区迁移到存活节点。
模拟测试:停止一个 observer 进程,观察业务影响(通常 RTO<30s)。
OceanBase 支持创建 备租户(Standby Tenant),通过日志同步实现跨机房容灾:
CREATE STANDBY TENANT standby_tenant FROM oracle_tenant WITH LOG_RESTORE_SOURCE='...';可通过 ALTER SYSTEM SWITCHOVER 进行主备切换。
背景:某银行核心交易系统原运行于 Oracle RAC 双节点,数据量约 10TB,日交易量 5000 万笔。面临 License 成本高、扩展性瓶颈。
迁移过程:
DBMS_CRYPTO 的替换为 Java 加密。收益:硬件成本降低 50%,扩容时间从数周缩短到小时级。
OceanBase 的 Oracle 模式为企业提供了一条低门槛、高性能的分布式转型路径。通过高度兼容的 SQL 引擎和强大的扩展能力,它不仅解决了传统 Oracle 的扩展性问题,还带来了云原生运维的便捷性。
未来,OceanBase 将持续增强 PL/SQL 包支持、完善物化视图、提升并行查询能力,进一步缩小与原生 Oracle 的差距。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。