接手过不少生产环境,Kingbase 这个国产关系型数据库在政企系统里已经是标配了。平时最头疼的其实不是日常运维,而是从旧版本或损坏实例“彻底卸载”之后干净重装——大多数人都在这上面踩坑:服务停了就开始删文件,结果端口还被占用,环境变量残留,重装后数据库起不来、初始化失败。这篇“保姆级”全流程我按生产环境的标准记录一下 Linux 服务器上 Kingbase 彻底卸载和重装的完整路径,包括为什么必须按这个顺序来、每一步背后的逻辑,以及最容易忽略的残留点。
所有命令我都分成“可复制直接执行”和“需要根据自身环境调整”两类,路径、服务名在不同版本之间会有细微差别,建议先读完整篇,确认自己机器上的实际情况再动手。
1. 卸载重装前的全局认知与整体规划
1.1 为什么要“彻底”卸载,不彻底会有什么后果
Kingbase 的卸载和传统软件不一样,它不是“双击卸载向导”能搞定的事。大部分发行版本采用 *.bin 自解压安装包 + 数据目录分离的部署方式,数据目录、服务脚本、环境变量、系统用户四部分是独立存在的。如果你只删除安装目录,剩下的三部分依然会干扰下一次部署。
常见残留后果包括:
- 端口被占用,常见默认端口 54321 或 54322 上还有个老进程在监听,导致新实例 bind 失败。
- systemd 服务单元残留,重新安装后 systemctl start 仍然启动旧的配置,指向一段已经不存在的二进制路径。
- 环境变量如 PATH、LD_LIBRARY_PATH 还有旧版本路径,导致 ksql 连到的库版本和实际不一致。
- 系统用户重复或 uid 冲突,数据库文件权限错乱。
- 数据目录里旧的 postmaster.pid 文件存在,新的实例初始化后直接检测到“已经有一个进程在运行”,拒绝启动。
所以我的原则是:先梳理,再执行;宁可慢一点,也不跳步。生产环境操作前还要把当前库的备份落在机器之外,一旦重装失败可以快速回退。
1.2 卸载前必须完成的备份与数据确认
这一步说的是“真要彻底卸载”之前,先确认自己到底要留哪些数据。很多人重装完才想起来有个业务库没导出,到时候哭都来不及。
我平时至少做三层确认:
- 确认库还能不能正常启动。如果能启动,优先用逻辑备份把数据和结构导出。
- 确认业务账号和应用连接串。备份库名、用户名、密码、端口、字符集这些信息,重装后要重建。
- 确认磁盘使用情况。df -h 看一下数据盘剩余空间,避免导出文件写不进去。
逻辑备份推荐用自带的 sys_dump 工具,它在安装目录下的 bin 目录里,和 PostgreSQL 的 pg_dump 类似,属于物理读一致性快照。备份命令参考:
/opt/Kingbase/ES/V8/Server/bin/sys_dump -h 127.0.0.1 -p 54321 -U system -W -F c -f /backup/kingbase_prod.dmp如果你库里有大数据量的表,也可以先只备份结构,再单独用 copy 方式导数据。但这里我建议直接一次性全量导出,别搞太复杂。备份完成后确认文件大小和时间戳,然后把它复制到另一台机器或者对象存储,别和源库在同一个磁盘上。
注意:如果库已经起不来了,也没关系,跳过备份直接进入彻底卸载即可。此时不要尝试用 sys_ctl 强制拉起,避免损坏底下的数据文件。
2. 彻底卸载的核心实施步骤
2.1 停止服务与关闭自启动
卸载的第一步永远不是删文件,而是停服务。先把正在跑的进程停掉,再处理“开机自启”的配置。否则你删文件时会提示占用,或者系统重启后服务又会自己拉起来,让你前功尽弃。
先检查一下当前运行的服务名。不同版本注册的服务名可能不同,常见的是 kingbase8d,也可能是 kingbase。
systemctl list-units --type=service | grep -i kingbase ps -ef | grep -i kingbase确认服务名后,执行停止并禁用自启动:
systemctl stop kingbase8d systemctl disable kingbase8d systemctl daemon-reload这里 systemctl daemon-reload 特别重要,它让 systemd 重新读取配置。如果你不清掉旧的服务文件就重新加载,之后再重装可能会重复注册,出现“Unit file already exists”之类的问题。
我对进程残留的判断方法很简单:停服务后,再跑一次 ps -ef | grep kingbase,如果还有进程,说明这个服务单元可能不是它真正的启动方式,也可能是装了多套实例。此时需要按 PID 逐个处理,必要时用 kill 命令收尾,但注意不要 kill 到别的重要进程。
2.2 删除安装目录、数据目录与系统残留
服务停掉后,下面就是“物理清理”阶段。安装目录通常位于 /opt/Kingbase 或 /home/kingbase/KingbaseES,数据目录一般都在安装目录下的 data 子目录里,也可能通过参数指定到了独立数据盘。
先用命令把实际路径确认清楚,别凭记忆硬删:
which ksql which sys_ctl ls -ld /opt/Kingbase du -sh /opt/Kingbase之后执行删除命令。这一步也是很多人最拿不准的地方,到底哪些目录能删?我的建议是:如果已经确定了要对这套旧环境做彻底卸载,那安装目录、数据目录、日志目录、临时目录一起删干净;如果还有依赖这套环境的脚本,你需要先把脚本中引用的路径清点出来,而不是把脚本留下。
rm -rf /opt/Kingbase rm -rf /home/kingbaserm -rf 是高风险操作,强烈建议在执行前先执行 ls 看清路径,再人工确认一遍。生产环境最好用一个临时变量保存路径,避免一不小心写成 rm -rf /。
2.3 清理用户、环境变量与 systemd 痕迹
物理目录删完,还没有结束。接下来是三处最容易遗漏的地方。
第一处是系统用户。Kingbase 安装时会创建一个专用用户,常见是 kingbase,也可能带了版本号后缀。这个用户如果留着,新装时容易出现 uid 不一致的问题。确认这个用户没有其他用途后执行:
userdel -r kingbase第二处是环境变量。常见配置文件位置包括:
- /etc/profile.d/kingbase.sh 或 /etc/profile.d/kingbasees.sh
- /root/.bashrc 或 /home/xxx/.bashrc
- /etc/profile
用 grep 搜索一下所有引用 Kingbase 路径的环境变量配置:
grep -r "Kingbase\|kingbase" /etc/profile.d/ /etc/profile /root/.bashrc 2>/dev/null找到后把它从配置中移除,或者直接删除对应的 profile.d 脚本。第三处是 systemd 残留。查找服务单元:
ls -l /etc/systemd/system/ | grep -i kingbase ls -l /usr/lib/systemd/system/ | grep -i kingbase相关文件可以直接删除,然后执行 systemctl daemon-reload 更新 systemd 状态。最后再用四个命令交叉确认:ps 里没有进程、端口没有监听、命令找不到、目录不存在。只有这四项全过,才算真正卸载干净。
ps -ef | grep -i kingbase ss -lntp | grep 54321 which ksql ls -ld /opt/Kingbase3. 重装前的环境检查和新版本部署
3.1 重装前置依赖与安装包准备
旧环境清干净之后,不要急着双击安装包,先把基础环境检查一遍。Kingbase 对 Linux 系统有一些基础要求,常见依赖包括 libaio、libnuma、readline、zlib 等。不同发行版包名不同,CentOS/RHEL 可以这样装:
yum install -y libaio libaio-devel libnuma libnuma-devel readline readline-devel zlib zlib-devel如果用的是 Ubuntu/Debian 系,对应包名是:
apt install -y libaio1 libnuma1 libreadline-dev zlib1g-dev然后检查系统架构和内核版本,Kingbase 一般要求 x86_64 或 ARM 架构,内核版本太老可能会安装后起服务报“Unsupported kernel”之类的错误。检查命令:
uname -m uname -r安装包我习惯单独放在一个目录里面,比如 /data/software,同时记录下它的 MD5 或 SHA256 值,确保安装包完整。很多时候安装到一半报 “corrupted installer” 根本不是环境问题,是包没下完整。
检查文件完整性:
sha256sum KingbaseES_V008R006C008B0014_Linux-x86_64.iso最后确认安装路径的父目录有足够空间,建议至少预留 20G,因为 Kingbase 安装目录本身不小,后面数据文件和日志还会持续增长。
3.2 图形化/无人值守安装的执行过程
安装包通常是一个 .iso 镜像或 .bin 文件。如果是 iso,先把它挂载:
mount -o loop KingbaseES_V008R006C008B0014_Linux-x86_64.iso /mnt cd /mnt ls -la在安装目录里可以看到 setup.sh 或 install.sh。在服务器没有图形界面的情况下,安装向导可以用命令行模式启动。具体参数因版本而异,常见形式是:
./setup.sh -console如果本机有图形界面,直接执行 ./setup.sh 会弹出安装向导,选择你要安装的产品组件、安装目录、数据目录,向导会一步步引导。这里有一个关键点:安装目录尽量选在独立挂载的大分区下,并且不要选择“仅安装客户端”之类的最小化组件,除非你确定自己只需要客户端工具。
等待安装完成后,检查安装目录是不是真的生成完整了。最直观的方法是看版本文件:
cat /opt/Kingbase/ES/V8/install/version.ini接着要确认安装后是否自动创建了 kingbase 用户。有些版本安装向导会自带创建用户的过程,有些版本需要手动创建。如果没有,执行:
useradd kingbase然后把安装目录的属主改成这个用户,这一步不能省。数据库进程始终应该以非 root 用户运行,这是安全底线,也是避免初始化时报 “cannot be run as root” 的关键。
3.3 数据库实例初始化与参数校准
安装程序完成之后,并不是立刻就能用,还需要初始化数据目录。这一步等价于 PostgreSQL 的 initdb 阶段,只是命令名称不同。常见命令在 $KINGBASE_HOME/bin 下,可能是 initdb,也可能是 sys_ctl 的 init 子命令。
我先手动创建数据目录并授权:
mkdir -p /data/kingbase/data chown -R kingbase:kingbase /data/kingbase然后切换到 kingbase 用户,执行初始化:
su - kingbase cd /opt/Kingbase/ES/V8/Server/bin ./initdb -D /data/kingbase/data -U system --encoding=UTF8 --locale=C这里的 -U system 是安全管理员用户,后面建表和连接时最常用的超级用户就是它。编码我建议直接 UTF8,别的编码后面处理中文或第三方系统对接时容易出乱码。
初始化完成后,临时启动一次数据库验证能否正常拉起:
./sys_ctl -D /data/kingbase/data -l /data/kingbase/log/start.log start如果日志里出现 “database system is ready to accept connections”,说明初始化没问题。接下来就是配置核心参数。打开 data 目录下的 kingbase.conf,按机器配置调整几个关键项:
- shared_buffers:建议设置为物理内存的 25% 左右。
- max_connections:按最大并发量设定,不要盲目复制网上的极限值。
- port:默认端口,如果业务要求用标准端口,提前改好。
- listen_addresses:改成 * 或具体业务网段,否则只能本机访问。
改完参数后重启实例,确保新配置生效。
4. 重装后的服务纳管、验证与日常维护
4.1 注册 systemd 服务与开机自启
手动拉起数据库后,接着要把实例纳入 systemd 管理,否则服务器一重启数据库不会自动起来。生产环境的数据库不能依赖人工登录后启动。
先手动创建一个服务单元文件,路径在 /etc/systemd/system/kingbase8d.service 或 /usr/lib/systemd/system/kingbase8d.service,示例内容如下:
[Unit] Description=KingbaseES Database Server After=network.target [Service] User=kingbase Group=kingbase Environment=KINGBASE_DATA=/data/kingbase/data ExecStart=/opt/Kingbase/ES/V8/Server/bin/sys_ctl -D /data/kingbase/data start ExecStop=/opt/Kingbase/ES/V8/Server/bin/sys_ctl -D /data/kingbase/data stop Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target这里有个细节,ExecStart 用 sys_ctl start 而非直接启动 postmaster 进程,是为了让 systemd 能通过日志文件拿到完整输出。之后执行:
chmod 644 /etc/systemd/system/kingbase8d.service systemctl daemon-reload systemctl enable kingbase8d systemctl start kingbase8d启动后查看服务状态,如果状态显示 active (running),并且进程的属主是 kingbase 而不是 root,就说明服务纳管成功。之后每次服务器重启,系统都会自动把这个单元拉起来。
4.2 连通性验证与基础健康检查
服务起来之后,还需要做一轮基础验证,不能只看 systemctl 显示 active 就觉得万事大吉。
第一步,检查端口监听:
ss -lntp | grep 54321第二步,用 ksql 客户端连上测试库:
/opt/Kingbase/ES/V8/Server/bin/ksql -U system -d test -p 54321 -h 127.0.0.1进去之后执行几条 SQL,确认能正常创建表和插数据:
create table t1 (id int primary key, name varchar(32)); insert into t1 values (1, 'hello'); select * from t1;第三步,检查日志有没有异常。日志文件一般在数据目录下的 log 子目录,重点看有没有 “Segmentation fault”“Permission denied” 这类字样。
最后按业务需要创建应用账号和数据库,并设置密码:
create user app_user with password 'StrongPass123'; create database app_db owner app_user;如果之前备份过数据,这一步就可以通过 sys_restore 把导出的 dmp 文件恢复进新实例。恢复命令:
/opt/Kingbase/ES/V8/Server/bin/sys_restore -U system -d app_db -h 127.0.0.1 -p 54321 /backup/kingbase_prod.dmp一个常见误区是恢复时报 “role does not exist”,这说明备份里使用的角色在新实例里还没有创建。先按备份文件的角色信息创建好同名用户,再执行恢复,就能顺利通过。
5. 卸载重装过程中最常见的问题与避坑经验
5.1 服务进程残留与端口占用
这类问题出现频率最高。症状是重装后启动实例时日志报 “could not bind to address 0.0.0.0:54321: Address already in use”,或者报已经有 postmaster 在运行。
我排查顺序是:先看端口,再看进程,再看数据目录里的 pid 文件。如果端口被占用,先找到占用的 PID:
ss -lntp | grep 54321 fuser -v 54321/tcp如果显示的是旧 kingbase 进程,直接 kill。如果是其他业务进程占了这个端口,你要么改新实例端口,要么和业务方协调。千万不要顺手 kill 掉不是自己进程的东西。
另一种极端情况是端口没被占用,但实例提示已经有一个进程,这是数据目录下的 postmaster.pid 文件残留的问题。确认无进程后直接删除这个 pid 文件,再启动即可。
5.2 环境变量缓存与 PATH 指向混乱
重装后遇到的第二类高频问题是命令版本错乱。比如你明明装了新版,ksql --version 显示的还是旧版本号,或者输入 sys_ctl 直接报 command not found。
原因基本都是 shell 环境变量缓存。bash 启动时会读取 .bashrc、/etc/profile 等文件,旧的环境变量就算文件已经删了,当前 shell 仍然保留着 export 的状态。解决方式很简单,重新打开一个终端,或者手动执行:
hash -r unset KINGBASE_HOME unset PATH如果你在脚本里调用了 ksql,脚本开头建议主动写明白绝对路径,比如:
/opt/Kingbase/ES/V8/Server/bin/ksql -U system -d test -p 54321 -h 127.0.0.1 <<EOF select version(); EOF这样可以避免脚本运行环境不同造成的诡异问题。我在实际生产脚本里都是这么干的,不指望环境变量永远正确。
5.3 数据目录权限与 SELinux/防火墙干扰
重装后最常见的权限问题是启动服务时报 “Permission denied”,但日志没有更多细节。这大概率是目录属主不对。我见过有人在 root 下执行 initdb 初始化了目录,后面切换 kingbase 用户启动时因为没有写权限而失败。解决办法是统一属主:
chown -R kingbase:kingbase /data/kingbase chmod 700 /data/kingbase/data如果你的系统开启了 SELinux,还需要检查服务是否被拦。可以先临时看一下 avc 日志:
ausearch -m avc -ts recent | grep kingbase或者临时设置 SELinux 为宽松模式验证是不是它的原因。如果是,最好为这个目录添加正确的标记:
semanage fcontext -a -t postgresql_db_t "/data/kingbase/(/.*)?" restorecon -Rv /data/kingbase这里直接借用了 postgresql 的 SELinux 类型,安全性实际也是可用的。
防火墙方面,确认实例端口对外可达:
firewall-cmd --zone=public --add-port=54321/tcp --permanent firewall-cmd --reload如果还是连接不上,用 telnet 或 nc 从应用机器上测一下端口通不通,通不过再一层层查 iptables、云安全组、物理防火墙,避免绕远路。
最后分享一个我自己的习惯:重装之后我会写一个简单的环境信息备忘,包括实例目录、端口、字符集、备份文件的 md5、应用连接配置,全部放到 /data/kingbase/README。这个文件看着不起眼,但是在半年后或者交接工作的时候,价值非常大。毕竟彻底卸载和重装这件事,做得越干净,后续运维就越省心。