不做环境铺垫了,直接说结论:银河麒麟v10sp3上跑OceanBase 4.2.1-el8,不但可行,而且比想象中稳。最近我把这套环境从零搭了一遍,从系统检查、obd部署到MySQL客户端连库、图形化工具接业务,全程记录了踩坑过程。这篇文章会把每一步为什么这么做、命令怎么敲、参数怎么算都拆开讲,尤其针对“el8”这个版本号在麒麟系统上的兼容性问题。无论你只是想在国产化环境里快速拉起一个OceanBase实例,还是打算用navicat/DBeaver连库开发,下面这份实操记录应该都能给你省下不少时间。

1. 方案选型:为什么是OceanBase 4.2.1-el8

1.1 先弄懂银河麒麟v10sp3的系统底座

银河麒麟v10sp3是国内很多政务、金融项目里最常见的操作系统版本。它虽然写着“麒麟”,但内核和软件生态实际上是跟CentOS 8 / RHEL 8兼容的。你打开终端执行:

cat /etc/os-release
uname -a

大概率会看到类似这样的输出:

NAME="Kylin Linux Advanced Server"
VERSION="V10 (SP3)"
ID=ky10
ID_LIKE="centos"
PRETTY_NAME="Kylin Linux Advanced Server V10 (SP3)"
VERSION_ID="V10"

内核是4.19左右,glibc版本是2.28。这就是答案的起点:OceanBase社区版从4.2.x开始,官方对x86_64和aarch64都分别提供针对el7和el8的RPM包。所谓el8,指的就是面向RHEL 8/CentOS 8系编译的包,里面的二进制依赖的glibc版本正好和麒麟v10sp3对得上。如果你手误选成el7的包,在麒麟上大概率会报“GLIBC_2.28 not found”或者反过来出现版本冲突。所以“el8”这个后缀不是随便写的,它代表的是与操作系统底座严格对应的编译产物。

1.2 OceanBase 4.2.x解决了什么问题

OceanBase是国产分布式关系型数据库,最大的卖点是MySQL兼容和高可用能力。4.2.1这个版本属于相对稳定的分支,既有分布式架构的强一致性能力,又在单机部署时足够轻量。对我们这种需要从MySQL迁移过来的业务来说,OceanBase的MySQL模式可以复用大部分SQL语法、驱动和ORM框架,应用基本不用大改。

但这里要说明白:我这次部署的是单机版,不是分布式集群。OceanBase的单机版和集群版在安装包上没有区别,都是同一套observer进程,只是通过部署代理工具配置不同节点数而已。在麒麟v10sp3上先跑单机,主要目的是让开发环境能提前介入,验证SQL兼容性和驱动连接性。后面如果要做高可用,只需要在多个节点上重复同样的步骤,再用obd把它们组进同一个集群就行。

1.3 用obd安装而不是手动敲rpm的原因

OceanBase传统安装方式是把observer、libs、clients等RPM包一个个手动装上,然后手写配置文件、自己拉observer进程。这种方式不是不行,但坑非常多:目录权限、初始化参数、内存比例、系统租户密码、observer之间的通信端口,任何一个环节写错,启动都可能直接失败,日志还散落在各个目录里。

官方推荐的部署工具是obd(OceanBase Deployer),全名叫ob-deploy。它最大的价值是把“写配置、造数据、启停、状态检查”这几步封装成几个简单命令:

obd cluster create
obd cluster start
obd cluster list
obd cluster stop

obd会根据你写的yaml配置,自动生成observer需要的数据目录、日志目录、配置文件,并在启动前检查环境依赖。就像用docker-compose管理容器一样,把“需要记住的环境细节”交给了工具本身。所以我强烈建议:不管你是新手还是老运维,都走obd这条路。

2. 安装前系统检查与环境准备

2.1 操作系统版本与CPU架构确认

虽然前面说了麒麟v10sp3是el8兼容,但为了保险,装包前最好确认两个信息:一是系统大版本,二是CPU架构。命令如下:

cat /etc/os-release
uname -m

uname -m会输出x86_64或aarch64。这个决定了你下载RPM包时选x86_64版本还是arm64版本。我这次用的机器是x86_64,如果你的机器是鲲鹏或者飞腾,那么包名里会体现aarch64标识,不要下错。

如果你之前尝试过别的数据库,比如mysql-8.4.7或mariadb,系统里可能残留了相关的服务进程、端口占用或环境变量。建议先看一下:

ss -lntp | grep -E '2881|2882|3306'
ps -ef | grep -E 'mysql|mariadb|observer'

有冲突就先停掉或者换个端口。OceanBase默认使用2881端口(MySQL协议客户端连接)和2882端口(observer内部节点通信),如果这两个端口被占,会直接影响启动。

2.2 依赖软件包准备

OceanBase observer进程运行时时依赖libaio和numactl,obd本身依赖python3和部分开发库。麒麟v10sp3一般自带python3,但有时版本偏低,或者缺setuptools组件。建议先把这些基础包通过yum装上:

yum install -y libaio libaio-devel libtool openssl-devel numactl-libs python3 python3-pip

如果你没法联网,用离线yum源或者本地光盘源也可以,但最省心的方式是在线yum安装。银河麒麟的yum源配置各家环境不一样,这里不展开了。需要注意的一点是,observer运行时不要求python3版本多新,但obd启动时会跑一段python检查脚本,如果python3被替换成软链接指向python2,那后面必然报错。保险起见:

python3 --version

至少是3.6以上。麒麟v10sp3默认的版本通常够用。

2.3 创建专用用户和目录

OceanBase官方明确要求:observer不能以root用户启动。这一点是很多第一次装的人容易忽略的。原因有两层:第一,observer在启动时会调用一些资源限制接口,root启动可能会跳过某些检查,导致生产环境行为不一致;第二,OceanBase的数据文件和日志文件必须属于一个普通用户,否则后续的进程管理和备份恢复会碰到权限错乱。

所以安装前先创建一个专门用户:

useradd -s /bin/bash oceanbase

然后规划目录。我习惯把OceanBase所有数据放在独立挂载盘下,比如/data/oceanbase。这样即使系统区出了问题,数据也不受影响。

mkdir -p /data/oceanbase
chown -R oceanbase:oceanbase /data/oceanbase
chmod -R 755 /data/oceanbase

目录所有者必须是oceanbase,因为在后面编写obd配置时,obd会指定一个home_path来存放所有运行数据。如果该目录属于root,observer启动时连写日志都办不到。

2.4 防火墙与SELinux状态调整

麒麟v10sp3默认可能开启firewalld,SELinux也可能处于Enforcing模式。这两个都会拦截observer监听端口(2881/2882)以及obd执行时的临时文件访问。为了少踩坑,我把它们都关掉了:

systemctl stop firewalld
systemctl disable firewalld
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0

请注意,setenforce 0只对当前会话生效,要永久生效还得改配置文件。如果你们公司安全基线要求SELinux必须开启,那也可以不上这步,但需要额外配置端口和文件上下文,工作量不小。开发环境我建议先关闭,快速验证功能,后面再按安全策略慢慢收紧。

3. 获取安装包:在线源与离线包双保险

3.1 通过在线yum源安装

如果你所在服务器能访问外网,最舒服的安装方式就是配置OceanBase的官方仓库。在/etc/yum.repos.d/下新建一个oceanbase.repo:

[oceanbase]
name=oceanbase
baseurl=https://mirrors.aliyun.com/oceanbase/community/stable/el/8/x86_64/
enabled=1
gpgcheck=0

如果是arm机器,把x86_64替换成aarch64即可。然后执行:

yum clean all
yum makecache

之后我们可以先单独安装obd:

yum install -y ob-deploy

这条命令会把obd以及依赖的python包一起装好。装完验证版本:

obd --version

能看到类似“OceanBase Deployer: 2.x.x”这样的输出,就算成了。之后OceanBase的observer相关包不需要提前单独装,obd在部署时会根据配置自动从仓库拉取对应版本,非常省心。

3.2 离线环境安装的完整路径

离线环境就麻烦一些。我这次是在内网机器上操作,没有外网,所以提前在联网机器上下载了一堆RPM包。需要准备的核心包有这些:

  • ob-deploy
  • oceanbase-ce
  • oceanbase-ce-libs
  • obclient
  • obproxy(如果你计划做代理接入,这里先不装)

具体文件名一般是像这样:

ob-deploy-2.3.0-1.el8.x86_64.rpm
oceanbase-ce-4.2.1.8-100000192024012215.el8.x86_64.rpm
oceanbase-ce-libs-4.2.1.8-100000192024012215.el8.x86_64.rpm
obclient-2.2.3-1.el8.x86_64.rpm

版本号里的日期位置不同,但核心的“4.2.1”要对上。把这些包拷贝到离线机器的某个目录,比如/opt/ob-rpm,然后用yum localinstall安装,这个命令会自动检测本地目录里的依赖:

cd /opt/ob-rpm
yum localinstall -y *.rpm

如果遇到某个依赖包没在目录里,yum会尝试从已配置的源里找,如果没有就报错。这时候需要你把缺失的包名在网上找出来,用相同的el8.x86_64后缀下载补齐。这是离线安装最繁琐的地方,但没太多技巧,就是个补包过程。

3.3 校验包完整性

下载完后不要急着装,建议先做一次sha256校验,尤其从非官方渠道拿包的时候。在联网机器上下载时拿到官方提供的校验值,离线机器上执行:

sha256sum oceanbase-ce-*.rpm

对比一下输出值,避免传输过程中损坏。这个习惯虽然多花两分钟,但能避免安装到一半包损坏导致的各种诡异报错。

3.4 安装完后的环境变量

离线安装完obd后,命令可能不在默认PATH里。执行:

which obd

如果没找到,需要手动加环境变量。obd一般安装在/usr/local/bin/或者/root/.local/bin/下。如果是用obd工具自动安装依赖包的场景,配置文件会写在自己的目录里,但命令行工具不自动加入PATH。我习惯在/etc/profile.d/obd.sh里写入:

export PATH=$PATH:/usr/local/bin:/root/.local/bin
source /etc/profile

这个细节很多人会在第一步跪掉,看到“command not found”就以为安装失败,其实只是路径没配好。

4. 使用obd部署单机OceanBase实例

4.1 编写集群配置文件

obd部署OceanBase需要一个yaml格式的配置文件,文件名随便起,比如ob_test.yaml。内容看起来不少,但核心就几块。我提供一个最简可用的单机版配置,以一台32GB内存、4核CPU的机器为例:

user:
  username: oceanbase
  password: your_password_here
  key_file: /home/oceanbase/.ssh/id_rsa
  port: 22

oceanbase-ce:
  servers:
    - 127.0.0.1
  global:
    home_path: /data/oceanbase
    data_dir: /data/oceanbase/store
    redo_dir: /data/oceanbase/redo
    log_dir: /data/oceanbase/log
    memory_limit: 24G
    system_memory: 6G
    datafile_size: 20G
    log_disk_size: 20G
    cpu_count: 4
    devname: eth0
    production_mode: false
  server1:
    mysql_port: 2881
    rpc_port: 2882
    zone: zone1

说一下这几个关键参数的含义和数值估算逻辑:

  • user.username表示以哪个系统用户运行observer进程,必须是非root。
  • home_path是observer所有运行时数据的根目录,我设置为/data/oceanbase。data_dir、redo_dir、log_dir如果不单独写,会默认在home_path下按标准结构生成。建议单独指定到独立目录,方便后续扩容。
  • memory_limit是整个observer进程可用的内存上限,我设置为物理内存的75%~80%。32GB内存留7~8GB给操作系统和其它进程,给observer 24G是合理的。
  • system_memory是OceanBase用来做内部缓存和分析的内存,不能太小,否则启动时容易OOM。官方建议是memory_limit的20%以上,我给了6G,折中。
  • datafile_size是数据文件大小,这是预分配的,不是像磁盘那样用多少占多少,所以不能超过实际可用磁盘空间。20G在这个demo里够了。
  • log_disk_size是redo日志盘大小。OceanBase对redo日志的写吞吐要求比较高,建议至少和数据文件同级别,我这里给20G。
  • production_mode设为false表示处于单机非生产模式。如果设成true,obd会在启动时检查内存、磁盘数量等生产环境要求,单机过不了就报错。
  • devname是网卡名,一定要改成服务器实际网卡名,用ip addr查看。如果写错,observer虽然能启动,但节点间通信可能异常。

4.2 创建集群并启动

配置文件写好并保存为.yaml后,执行:

obd cluster create obtest -c ob_test.yaml

obd会先检查配置合法性,接着自动下载或匹配本地observer的RPM包,然后创建相关目录。看到最后的“Connect to observer success”字样,就说明一次性部署成功。

接下来启动集群:

obd cluster start obtest

启动过程会打印observer启动日志的关键片段。如果一切正常,会看到“observer program health check ok”之类的输出。然后查看集群状态:

obd cluster list
obd cluster status obtest

status输出里显示observer进程为running就对了。还可以用系统命令确认进程存在:

ps -ef | grep observer

正常会看到/home/data/oceanbase/bin/observer这样的进程路径。

4.3 初始化并修改root密码

OceanBase刚部署完时,系统租户root@sys的密码为空。需要马上连接并修改。先通过obclient连接:

obclient -h127.0.0.1 -P2881 -uroot@sys -c

输入空密码回车,就能进入OceanBase的MySQL命令行。然后立即执行:

ALTER USER 'root'@'sys' IDENTIFIED BY 'YourStrongPwd123';

这里要说明,OceanBase的账号体系是“用户名@租户名”。root@sys是系统租户的管理员,不是业务库的普通账号。业务数据存放在普通租户里,但单机部署时,可以用系统租户直接建库建用户来快速测试。

建一个业务用户并授权,可以这样操作:

CREATE DATABASE app_db;
CREATE USER 'app_user'@'%' IDENTIFIED BY 'AppUserPwd123';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';

4.4 设置开机自启

obd本身提供了一些启停命令,但把obd命令做成systemd服务才能真正实现开机自启。我习惯写一个简单的unit文件,放在/etc/systemd/system/oceanbase.service:

[Unit]
Description=OceanBase Server
After=network.target syslog.target

[Service]
Type=forking
User=oceanbase
Group=oceanbase
ExecStart=/usr/local/bin/obd cluster start obtest
ExecStop=/usr/local/bin/obd cluster stop obtest
RemainAfterExit=yes
Restart=on-failure

[Install]
WantedBy=multi-user.target

注意obd路径要替换成你机器上which obd的结果。写完执行:

systemctl daemon-reload
systemctl enable oceanbase
systemctl start oceanbase

这里有个小坑:obd cluster start在执行时会锁定一个临时文件,如果systemd同时触发多次或你手动又执行了一次obd start,会有冲突。所以开机自启只保留systemd这一条路,别再在rc.local里重复写。

5. 连接与图形化工具配置

5.1 用MySQL客户端连接OceanBase

observer起来后,2881端口监听的就是MySQL协议。因此你完全不需要装obclient,直接用系统里的mysql客户端就能连:

mysql -h127.0.0.1 -P2881 -uroot@sys -p

如果你机器上没有mysql客户端,装个mariadb客户端也行:

yum install -y mariadb

然后同样用mysql命令连接。不过为了兼容性,我建议还是把obclient装上,它针对OceanBase的租户切换、show命令做了一些优化,尤其是查集群状态时体验更好。但日常开发用MySQL客户端完全没问题。

5.2 银河麒麟桌面版下装DBeaver或Navicat

很多开发机是银河麒麟桌面版,大家习惯用图形化工具连数据库,类似navicat那种。这点OceanBase做得不错,因为它走的是MySQL协议,所以所有支持MySQL连接的数据库客户端都能用它。

如果你要免费方案,我推荐DBeaver。在DBeaver官网下载Linux通用版tar.gz包,或者直接下载.rpm安装包:

cd /opt
tar -xzf dbeaver-ce-*.tar.gz
./dbeaver/dbeaver

需要注意的是,DBeaver依赖gtk3、libcanberra等图形库,如果启动报错,先用yum安装:

yum install -y gtk3 libcanberra-gtk3

启动DBeaver后,新建连接,选择“MySQL”,填入:

  • 主机:127.0.0.1(远程就填麒麟服务器IP)
  • 端口:2881
  • 用户名:root@sys,或app_user
  • 密码:对应密码

只要能ping通2881端口,就可以连上。

Navicat也一样。Navicat for MySQL或Navicat Premium连接MySQL类数据库时,填写同样的信息即可。麒麟桌面版安装Navicat一般是用Linux版.tar.gz解压后运行start_navicat脚本,或者安装官方.appimage版本,这里不细说。

5.3 JDBC接入SpringBoot等应用

如果你们的业务是Java后端,JDBC驱动直接用MySQL的官方驱动就行,不需要额外装OceanBase驱动。连接串这样写:

jdbc:mysql://127.0.0.1:2881/app_db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8

驱动类名是com.mysql.cj.jdbc.Driver,也就是说,你的SpringBoot项目里那个mysql-connector-java依赖不用换。唯一要注意的是,OceanBase的SQL模式跟MySQL还是有一些细微差异,比如某些索引Hint、分区语法。一般来说,标准的CRUD和简单查询都能平滑跑通。

6. 常见问题与排坑实录

6.1 报错:错误配置了user,不能以root运行

有些人为了省事,配置文件的user.username直接写了root,obd在部署时直接报错拒绝。OceanBase不允许root启动 observer,这是硬限制。解决方式就是创建oceanbase用户,并把data_dir、redo_dir等目录的属主改成这个用户。

6.2 启动后observer进程闪退

最常见的原因是内存不足。我见过很多来问的人,给observer设了20G的memory_limit,结果机器总内存才16G,怎么可能起得来。obd启动前会尽量检查,但极端情况下还是会起进程后立刻被OOM Killer杀掉。如果发现observer进程消失,先看系统日志:

dmesg | tail -20

看到oom-killer就说明内存确实不够,需要下调memory_limit和datafile_size,或者加物理内存。

6.3 客户端连接报“Access denied”

遇到这种先确认你用的账号格式。root在OceanBase里不是root@localhost,而是root@sys。连接时如果写成-mysql -uroot -p,默认会解析成root@%或root@localhost,自然认证失败。一定要用 -uroot@sys 这种租户后缀形式。

6.4 端口通了但连接超时

检查防火墙和SELinux,前面已经说过。此外,要确认observer实际监听的是不是2881:

ss -lntp | grep 2881

如果没监听,看看observer状态和日志。日志位置在配置的log_dir下,比如/data/oceanbase/log/observer.log。这个文件是排查启动问题的第一入口,报错信息远比obd的提示详细。我自己每次查问题都是先tail这个日志:

tail -100 /data/oceanbase/log/observer.log

6.5 启动时报“open files”不够

OceanBase对文件描述符要求很高,尤其数据文件多的时候。如果启动日志里提示file limit过低,需要修改系统ulimit。在/etc/security/limits.conf里添加:

oceanbase soft nofile 655350
oceanbase hard nofile 655350
oceanbase soft nproc unlimited
oceanbase hard nproc unlimited

改完重新登录oceanbase用户生效。

6.6 离线安装时提示缺少依赖包

这是离线安装最常见的问题。yum localinstall虽然会解析依赖,但如果依赖包不在本地目录也没配置外部源,就会中断。解决思路:拷贝rpm包时,除了oceanbase相关包,把obclient、mysql-libs等可能被依赖的包一并下载。更聪明的做法是先用yumdownloader下载所有依赖,比如在联网机器上执行:

yumdownloader --resolve --destdir=/opt/ob-rpm ob-deploy oceanbase-ce oceanbase-ce-libs obclient

这样会把所有依赖一起拉到目录里,传到离线机器后yum localinstall *.rpm大概率一把过。

6.7 obd命令执行时报python模块缺失

obd是基于python3的工具,依赖setuptools、paramiko等库。如果系统python环境被改装过,比如多版本python并存,obd可能会找不到对应模块。解决办法是重新安装obd的依赖包,或者用系统的默认python3重新安装obd。如果在线,可以执行:

pip3 install --upgrade setuptools paramiko

如果离线,需要下载这些依赖的whl包手动安装,是个体力活。避免这个问题的最好方式就是在装obd前不要在系统上乱动python,也不要设置PYPTHONHOME之类的环境变量。

6.8 配置参数调整后需要重启

如果你的确调整了sys系统变量或者参数,比如修改了memory_limit,需要重启observer进程才能全面生效。用obd重启:

obd cluster restart obtest

注意重启过程会先停掉所有节点,如果是有业务在跑的库,必须选在维护窗口做。

这套流程走下来,我已经把银河麒麟v10sp3上的OceanBase 4.2.1-el8从零跑通。回过头看,最大的感受是:国产系统上装数据库,最怕的不是工具不成熟,而是沿用老经验想当然。el8版本选择、obd配置里的内存比例、非root用户权限、防火墙和selinux,这四件事只要有一件没对上,后面就会反复折腾。如果你现在也正卡在某一步,不妨把observer.log多翻几页,再回头检查这几个基础项。先把单机跑通,后面无论是加节点还是切生产模式,都会顺很多。

更多推荐