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')

解决

  1. 卸载无关服务(如 GitLab)释放内存
  2. 扩大 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

预期成功流程

  1. [PASSED] config.yaml 格式检查
  2. [PASSED] MetaDB 时钟同步检查
  3. 步骤一:校验 config.yaml
  4. 步骤二:创建 OMS 元信息库(导入 SQL)
  5. 步骤三:创建 OMS 各组件配置文件
  6. 步骤四:重启 OMS 所有组件(nginx、oms_console、oms_drc_cm、oms_drc_supervisor、sshd)
  7. 步骤五:初始化 OMS 资源标签和资源组
  8. 【结束】全部初始化步骤执行成功

五、OMS CE 版最终踩坑:oms_console 安全模块缺失

5.1 现象

supervisord 显示所有组件 RUNNING,但:

  • curl -I http://127.0.0.1:8089/oms/health 返回 502 Bad Gateway
  • oms_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 模式会有部分类型不兼容(如 NUMBERDECIMAL),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:8088cm_nodes
oms_console 安全模块缺失 CE 版镜像裁剪,无法解决

8.3 下一步建议

方案一:阿里云 OB Cloud(推荐)

  • 登录 阿里云 OceanBase 控制台
  • 创建按量付费实例,选择 Oracle 兼容模式
  • OMS 为托管服务,无需自己部署
  • 5 分钟即可开始迁移配置

方案二:内网企业版环境

  • 使用企业版 all-in-one 安装包(带 install.sh 和完整 Docker Compose 编排)
  • 目标端兼容模式改为 Oracle
  • 其余 OMS 操作流程与本文完全一致

方案三:继续学习理论流程

  • 本地已完成 OB 部署、租户创建、Oracle 授权
  • OMS 控制台的点击操作流程已掌握
  • 内网企业版直接复用

如有问题欢迎在评论区交流。本文基于真实踩坑记录整理,希望帮助后来者少走弯路。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐