VMware 下 CentOS7 部署 OceanBase 4.5.0 社区版 + OMS 4.2.13 实现 Oracle 迁移学习环境
VMware + CentOS7 从零部署 OceanBase 4.5.0 社区版与 OMS 4.2.13 CE:踩坑实录与学习总结
前言:本文记录笔者在 VMware 虚拟机中从零搭建 OceanBase 4.5.0 社区版(CE) + OMS 4.2.13 CE 测试环境的完整踩坑过程。由于社区版不支持 Oracle 模式租户,本文目标端使用 MySQL 租户模拟,OMS 操作流程与企业版完全一致,可在内网企业版环境中无缝复用。
关键结论前置:OMS 4.2.13 CE 社区版镜像存在裁剪,单容器
docker run方式无法完整启动(oms_console安全模块 Bean 缺失),建议学习流程后在内网企业版环境或阿里云 OB Cloud 中进行实际迁移。
一、环境准备
1.1 服务器配置
| 项目 | 配置 |
|---|---|
| OS | CentOS 7.9 (VMware 克隆机) |
| CPU | 8 核 |
| 内存 | 24G(OB 占 18G,OMS 需额外内存) |
| 磁盘 | 300G SSD(从 60G 扩展) |
| IP | 192.168.126.130(NAT 模式) |
| Oracle 源端 | 192.168.126.128:1521/ORCL,用户 GJYWDB |
1.2 VMware 磁盘扩容(60G → 300G)
VMware 扩展虚拟磁盘后,CentOS 内部不会自动识别,需手动调整 LVM:
# 1. 查看当前分区
fdisk -l | grep /dev/sd
lsblk
df -Th
# 2. 扩展 sda2 物理分区(LVM)
fdisk /dev/sda
# 交互命令序列:
# p → 记录 sda2 的 Start 扇区(如 2099200)
# d → 删除 2 号分区
# n → 新建分区 → p → 2 → 2099200(起始扇区必须与原来一致)→ 回车(默认到最后)
# t → 2 → 8e(改为 Linux LVM)
# w → 保存退出
# 3. 刷新分区表
partprobe /dev/sda
# 4. 扩展 LVM 逻辑卷和文件系统
pvresize /dev/sda2
lvextend -l +100%FREE /dev/mapper/centos-root
xfs_growfs /dev/mapper/centos-root
# 5. 验证
df -h
lsblk
扩容后验证:centos-root 从 26G 扩展到 296G,可用 292G。
1.3 配置静态 IP
cat > /etc/sysconfig/network-scripts/ifcfg-ens33 <<'EOF'
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.126.130
NETMASK=255.255.255.0
GATEWAY=192.168.126.2
DNS1=223.5.5.5
DNS2=114.114.114.114
EOF
systemctl restart network
ip addr | grep 192.168.126.130
1.4 系统参数优化(root 执行)
踩坑点:
cat <<'EOF'heredoc 方式粘贴时容易因换行问题报错,建议逐行echo追加。
# 关闭防火墙和 SELinux(必须彻底 disabled,不能是 permissive)
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
sed -i 's/^SELINUX=permissive$/SELINUX=disabled/' /etc/selinux/config
# 内核参数(逐行追加)
echo "fs.aio-max-nr = 1048576" >> /etc/sysctl.conf
echo "net.core.somaxconn = 2048" >> /etc/sysctl.conf
echo "net.core.netdev_max_backlog = 10000" >> /etc/sysctl.conf
echo "vm.swappiness = 0" >> /etc/sysctl.conf
echo "vm.min_free_kbytes = 2097152" >> /etc/sysctl.conf
echo "vm.overcommit_memory = 0" >> /etc/sysctl.conf
echo "fs.file-max = 6573688" >> /etc/sysctl.conf
echo "vm.max_map_count = 655360" >> /etc/sysctl.conf
sysctl -p
# 文件句柄(逐行追加)
echo "* soft nofile 655350" >> /etc/security/limits.conf
echo "* hard nofile 655350" >> /etc/security/limits.conf
echo "* soft stack unlimited" >> /etc/security/limits.conf
echo "* hard stack unlimited" >> /etc/security/limits.conf
echo "* soft nproc 655360" >> /etc/security/limits.conf
echo "* hard nproc 655360" >> /etc/security/limits.conf
# 验证(需重新登录或 su - root)
ulimit -n
ulimit -u
1.5 更换国内 yum 源(CentOS 7 EOL)
CentOS 7 已于 2024 年 6 月 30 日 EOL,官方源下线,需换阿里云 Vault 归档源:
mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
# 阿里云 Vault 源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# Docker 国内源(国外源会报 connection reset)
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# EPEL 归档源
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-archive-7.repo
yum clean all
yum makecache fast
1.6 安装 Docker
yum install -y yum-utils docker-ce docker-ce-cli containerd.io
systemctl start docker && systemctl enable docker
1.7 创建 admin 用户及目录
groupadd admin && useradd -g admin -d /home/admin -s /bin/bash admin
echo "admin ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
mkdir -p /data/1/obtest /data/log1/obtest /home/admin
chown -R admin:admin /data /home/admin
usermod -aG docker admin
二、部署 OceanBase 4.5.0 社区版
2.1 下载并安装 obd(admin 执行)
su - admin
cd ~
# 下载 all-in-one 包
wget https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/standalone-all-in-one/oceanbase-standalone-all-in-one-4.3.5.3-20250115.el7.x86_64.tar.gz
tar -xzf oceanbase-standalone-all-in-one-4.3.5.3-20250115.el7.x86_64.tar.gz
cd oceanbase-all-in-one
踩坑点:install.sh 必须用 root 执行,否则后续 obd 镜像权限不足:
su -
cd /home/admin/oceanbase-all-in-one
bash bin/install.sh
# 加载环境变量
su - admin
source ~/.oceanbase-all-in-one/bin/env.sh
obd --version
2.2 加载本地 rpm 镜像(关键!必须用 root)
社区版 install.sh 不会自动加载 rpm 到 obd 镜像,需手动添加:
# root 执行
su -
obd mirror clone /home/admin/oceanbase-all-in-one/rpms/
obd mirror list local
踩坑点:admin 用户执行 obd mirror list local 会显示为空,因为 obd 镜像库目录权限归 root 所有。
2.3 编写单机部署配置
su - admin
cat > ~/obtest.yaml <<'EOF'
user:
username: admin
password: your_admin_password_here
port: 22
oceanbase-ce:
version: 4.5.0.0
servers:
- 192.168.126.130
global:
home_path: /home/admin/obtest
data_dir: /data/1/obtest
redo_dir: /data/log1/obtest
devname: ens33
mysql_port: 2881
rpc_port: 2882
obshell_port: 2886
production_mode: false
memory_limit: 18G
system_memory: 4G
datafile_size: 100G
datafile_maxsize: 100G
log_disk_size: 20G
cpu_count: 8
192.168.126.130:
zone: zone1
EOF
注意:
version必须与obd mirror list中的版本一致(如4.5.0.0,不是4.5.0)。
2.4 部署并启动集群
obd cluster deploy obtest -c ~/obtest.yaml
obd cluster start obtest
obd cluster display obtest
预期输出:
+----------------+---------+------+-------+--------+
| ip | version | port | zone | status |
+----------------+---------+------+-------+--------+
| 192.168.126.130| 4.5.0.0 | 2881 | zone1 | ACTIVE |
+----------------+---------+------+-------+--------+
保存 sys 租户 root 密码(随机生成,部署日志中会打印):
obclient -h192.168.126.130 -P2881 -uroot@sys -p'ofCcIdMI2nQz7fphikD0' -Doceanbase -A
三、创建业务租户
3.1 尝试创建 Oracle 模式租户(社区版不支持)
obd cluster tenant create obtest -n oboracle --max-cpu=2 --memory-size=2G --log-disk-size=6G --mode=oracle --charset=utf8mb4 -s 'ob_tcp_invited_nodes="%"'
报错:
[ERROR] (1235, 'Not support oracle mode not supported')
结论:社区版(CE)仅支持 MySQL 模式,Oracle 模式需企业版(EE)。本文后续用 MySQL 租户模拟目标端。
3.2 创建 MySQL 租户
# OMS 元数据库租户
obd cluster tenant create obtest -n obmysql --max-cpu=2 --memory-size=2G --log-disk-size=6G --mode=mysql --charset=utf8mb4 -s 'ob_tcp_invited_nodes="%"'
# 模拟目标租户
obd cluster tenant create obtest -n obtest --max-cpu=2 --memory-size=2G --log-disk-size=6G --mode=mysql --charset=utf8mb4 -s 'ob_tcp_invited_nodes="%"'
scenario 选择:输入 2(complex_oltp)或回车默认 4(htap)。
3.3 踩坑:创建租户报内存不足
[ERROR] (4733, 'zone 'zone1' resource not enough to hold 1 unit. ... MEMORY resource not enough')
解决:
- 卸载无关服务(如 GitLab)释放内存
- 扩大 OB 集群内存限制:
obd cluster stop obtest
sed -i 's/memory_limit: 10G/memory_limit: 18G/' ~/obtest.yaml
sed -i 's/system_memory: 3G/system_memory: 4G/' ~/obtest.yaml
obd cluster redeploy obtest
obd cluster start obtest
3.4 踩坑:业务租户 root 密码为空字符串
OB 4.5.0 业务租户初始密码为空字符串 '',不是空密码,必须用 -p'' 连接:
# 连接 obmysql(注意是两个单引号)
obclient -h127.0.0.1 -P2881 -uroot@obmysql -p'' -A
# 设置密码
ALTER USER root IDENTIFIED BY 'Root@1234';
EXIT;
# 连接 obtest
obclient -h127.0.0.1 -P2881 -uroot@obtest -p'' -A
ALTER USER root IDENTIFIED BY 'Root@1234';
EXIT;
3.5 创建 OMS 元数据库
obclient -h127.0.0.1 -P2881 -uroot@obmysql -p'Root@1234' -A
CREATE DATABASE IF NOT EXISTS oms_meta DEFAULT CHARACTER SET utf8mb4;
CREATE USER 'oms'@'%' IDENTIFIED BY 'Oms@1234';
GRANT ALL PRIVILEGES ON oms_meta.* TO 'oms'@'%';
GRANT CREATE, SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER, DROP ON *.* TO 'oms'@'%';
EXIT;
四、部署 OMS 4.2.13 CE(踩坑重灾区)
4.1 下载安装包
OMS 包较大(约 6GB),wget 单线程慢,推荐 aria2c 多线程或迅雷下载后上传:
# aria2c 多线程下载
yum install -y aria2
aria2c -x 16 -s 16 "https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/oms/4.2.13_CE/oms_4.2.13-ce-el7-x86.tar.gz"
4.2 加载 Docker 镜像
cd ~
tar -xzf oms_4.2.13-ce-el7-x86.tar.gz
# 直接加载镜像(不要手动解压 tar.gz 里的分层文件)
docker load -i oms_4.2.13-ce-el7-x86.tar.gz
# 查看镜像
docker images
踩坑点:tar -xzf 会解压出 blobs/、manifest.json 等 Docker 分层文件,不要手动操作这些文件,直接用 docker load -i 加载整个 tar.gz。
4.3 给镜像打简写标签
docker tag reg.docker.alibaba-inc.com/oceanbase/oms-ce:feature_4.2.13_ce_el7_x86 oms-ce:4.2.13
4.4 踩坑:config.yaml 必须是扁平结构
OMS 4.2.13 的 config.yaml 不能使用嵌套结构(如 oms_meta: port: 2881),必须使用顶层扁平键,否则 check_engine.py 解析时 port 为空字符串,导致 int('') 报错。
正确配置(从镜像内提取完整 /home/admin/conf 目录后,修改其中的 config.yaml):
# 先提取镜像内完整的 conf 目录到宿主机
docker run --rm -v /home/admin:/host_admin oms-ce:4.2.13 bash -c "cp -r /home/admin/conf /host_admin/"
# 修改 config.yaml
cat > /home/admin/conf/config.yaml <<'EOF'
# OMS 元数据库配置(必须扁平结构)
oms_meta_host: 127.0.0.1
oms_meta_port: 2881
oms_meta_user: oms@obmysql
oms_meta_password: Oms@1234
oms_meta_database: oms_meta
# DRC 相关数据库(可与元数据库共用)
drc_cm_db: oms_meta
drc_rm_db: oms_meta
drc_cm_heartbeat_db: oms_meta
# CM 服务地址(关键!缺失会导致 NoneType replace 报错)
cm_url: http://127.0.0.1:8088
# 集群节点配置(单节点)
cm_nodes: "127.0.0.1:8088"
# 服务端口
server_port: 8090
# 时序数据库
tsdb_type: INFLUXDB
tsdb_host: 127.0.0.1
tsdb_port: 8086
EOF
4.5 踩坑:Docker 挂载目录会覆盖镜像内原有文件
OMS 镜像的 /home/admin/conf 下不仅有 config.yaml,还有 command/ 启动脚本目录。如果直接用 -v /home/admin/conf:/home/admin/conf 挂载,会覆盖掉镜像内的 command/start_nginx.sh 等文件,导致 supervisord 报 exit 127。
正确做法:先提取镜像内完整的 conf 目录到宿主机,修改 config.yaml 后再挂载整个目录。
4.6 启动 OMS 容器
docker run -d --name oms-server --restart always --network host --privileged -v /home/admin/conf:/home/admin/conf -v /home/admin/logs:/home/admin/logs -e OMS_MODE=CE oms-ce:4.2.13
4.7 查看启动日志
docker logs -f oms-server
预期成功流程:
[PASSED]config.yaml 格式检查[PASSED]MetaDB 时钟同步检查- 步骤一:校验 config.yaml
- 步骤二:创建 OMS 元信息库(导入 SQL)
- 步骤三:创建 OMS 各组件配置文件
- 步骤四:重启 OMS 所有组件(nginx、oms_console、oms_drc_cm、oms_drc_supervisor、sshd)
- 步骤五:初始化 OMS 资源标签和资源组
【结束】全部初始化步骤执行成功
五、OMS CE 版最终踩坑:oms_console 安全模块缺失
5.1 现象
supervisord 显示所有组件 RUNNING,但:
curl -I http://127.0.0.1:8089/oms/health返回 502 Bad Gatewayoms_console反复崩溃重启(exit status 1)
5.2 查看 oms_console 日志
docker exec oms-server cat /home/admin/logs/oms_console_stderr.log | tail -20
核心错误:
NoSuchBeanDefinitionException: No qualifying bean of type
'com.alipay.oms.priv.security.local.JdbcUserDetailService'
5.3 原因分析
OMS 4.2.13 CE 版镜像为了减小体积,裁剪了本地安全认证模块的相关类文件。oms_console(Spring Boot 应用)启动时需要注入 JdbcUserDetailService Bean,但 CE 版缺少该类,导致 Spring 上下文初始化失败,Tomcat 虽然启动了但应用无法提供服务。
5.4 结论
| 问题 | 原因 |
|---|---|
| 模板文件路径不一致 | /root/omsflow/scripts/conf/cm/ vs /home/admin/conf/cm/ |
oms_console Spring Boot 启动失败 |
CE 版裁剪了 JdbcUserDetailService 安全模块 |
add_resource 步骤失败 |
依赖 oms_console 的 API,但 oms_console 无法提供服务 |
这不是配置问题,是 CE 版镜像本身不完整,单容器 docker run 方式无法完整启动。
六、Oracle 源端授权(已完成,可直接复用)
在 Oracle 19c (192.168.126.128:1521/ORCL) 上执行:
ALTER SESSION SET CONTAINER=ORCL;
GRANT CONNECT, RESOURCE TO GJYWDB;
GRANT SELECT ANY TABLE TO GJYWDB;
GRANT SELECT ANY DICTIONARY TO GJYWDB;
GRANT CREATE SESSION TO GJYWDB;
-- 如需增量同步,还需:
GRANT EXECUTE ON DBMS_LOGMNR TO GJYWDB;
GRANT SELECT ON V_$ARCHIVED_LOG TO GJYWDB;
GRANT SELECT ON V_$LOGMNR_CONTENTS TO GJYWDB;
七、OMS 迁移项目配置流程(企业版/OB Cloud 复用)
7.1 新建数据源 - Oracle 源端
| 字段 | 值 |
|---|---|
| 数据源类型 | Oracle |
| 连接地址 | 192.168.126.128 |
| 端口 | 1521 |
| 数据库 | ORCL (SID) |
| 用户名 | GJYWDB |
| 密码 | (GJYWDB 密码) |
7.2 新建数据源 - OceanBase 目标端
| 字段 | 社区版(学习) | 企业版(实际) |
|---|---|---|
| 数据源类型 | OceanBase | OceanBase |
| 兼容模式 | MySQL | Oracle |
| 连接地址 | 192.168.126.130 |
(企业版IP) |
| 端口 | 2881 |
2881 |
| 租户名 | obtest |
oboracle |
| 集群名 | obtest |
obtest |
| 用户名 | root |
root |
| 密码 | Root@1234 |
(企业版密码) |
7.3 新建迁移项目
OMS 控制台 → 数据迁移 → 新建迁移项目
| 配置项 | 选择 |
|---|---|
| 源端 | Oracle 数据源 |
| 目标端 | OceanBase 数据源 |
| 迁移类型 | 结构迁移 + 全量迁移 + 增量同步 |
| 迁移对象 | 勾选 GJYWDB Schema 下的表、视图、存储过程等 |
| 全量校验 | 建议勾选 |
点击 预检查并启动。
注意:Oracle 到 MySQL 模式会有部分类型不兼容(如
NUMBER→DECIMAL),OMS 会自动转换或提示,这是正常的。学习阶段重点掌握操作流程。
八、总结与建议
8.1 已完成的工作
| 步骤 | 状态 |
|---|---|
| VMware 磁盘扩容 + LVM 扩展 | ✅ |
| CentOS 系统调优(内核参数、句柄、yum源、Docker) | ✅ |
| OceanBase 4.5.0 CE 单机部署 | ✅ |
| 业务租户创建(MySQL 模式) | ✅ |
| Oracle 源端用户授权 | ✅ |
| OMS 元数据库创建 | ✅ |
| OMS CE 镜像加载与配置 | ✅(但镜像不完整) |
8.2 核心踩坑点汇总
| 踩坑点 | 解决方案 |
|---|---|
cat <<'EOF' 粘贴报错 |
逐行 echo 追加 |
obd mirror list local 为空 |
root 执行 obd mirror clone |
| 租户创建报内存不足 | 卸载 GitLab,扩大 memory_limit |
| 业务租户 root 密码 | 初始为 -p''(空字符串),连进去后 ALTER USER |
OMS config.yaml 格式 |
必须扁平结构,不能用嵌套 |
Docker 挂载覆盖 command/ |
先提取镜像内完整 conf 再挂载 |
cm_url / cm_nodes 缺失 |
补全 cm_url: http://127.0.0.1:8088 和 cm_nodes |
oms_console 安全模块缺失 |
CE 版镜像裁剪,无法解决 |
8.3 下一步建议
方案一:阿里云 OB Cloud(推荐)
- 登录 阿里云 OceanBase 控制台
- 创建按量付费实例,选择 Oracle 兼容模式
- OMS 为托管服务,无需自己部署
- 5 分钟即可开始迁移配置
方案二:内网企业版环境
- 使用企业版 all-in-one 安装包(带
install.sh和完整 Docker Compose 编排) - 目标端兼容模式改为 Oracle
- 其余 OMS 操作流程与本文完全一致
方案三:继续学习理论流程
- 本地已完成 OB 部署、租户创建、Oracle 授权
- OMS 控制台的点击操作流程已掌握
- 内网企业版直接复用
如有问题欢迎在评论区交流。本文基于真实踩坑记录整理,希望帮助后来者少走弯路。
更多推荐



所有评论(0)