ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kingbase数据库Linux彻底卸载与重装保姆级指南

Kingbase数据库Linux彻底卸载与重装保姆级指南 接手过不少生产环境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 --typeservice | 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 --encodingUTF8 --localeC这里的 -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] DescriptionKingbaseES Database Server Afternetwork.target [Service] Userkingbase Groupkingbase EnvironmentKINGBASE_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 Restarton-failure RestartSec5s [Install] WantedBymulti-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 文件。如果端口被占用先找到占用的 PIDss -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 --zonepublic --add-port54321/tcp --permanent firewall-cmd --reload如果还是连接不上用 telnet 或 nc 从应用机器上测一下端口通不通通不过再一层层查 iptables、云安全组、物理防火墙避免绕远路。最后分享一个我自己的习惯重装之后我会写一个简单的环境信息备忘包括实例目录、端口、字符集、备份文件的 md5、应用连接配置全部放到 /data/kingbase/README。这个文件看着不起眼但是在半年后或者交接工作的时候价值非常大。毕竟彻底卸载和重装这件事做得越干净后续运维就越省心。
返回列表