Home

人大金仓 KingbaseES 学习 03:启停管理、KSQL 与基础巡检

目标

前两篇完成了 KingbaseES V9 单机部署环境准备和数据库安装。这一篇继续记录安装后的第一组日常操作:服务启停、状态判断、KSQL 常用命令和基础巡检。

这一阶段的重点我认为不是记住很多命令,而是弄清楚每个命令到底证明了什么。数据库运行状态不能只看一个地方,至少要从服务、端口、实例进程和 SQL 连接几个层面交叉判断。

状态判断的四个层面

本次把常用状态检查分成四层:

层面命令证明什么
服务层systemctl status kingbased.service --no-pagersystemd 调用服务脚本是否成功
网络层ss -ltnp | grep 54321操作系统是否有进程监听数据库端口
实例层sys_ctl -D /data/kingbase/data status指定数据目录对应的数据库主进程是否存在
SQL 层ksql -h 127.0.0.1 -p 54321 -U system -d test数据库是否能认证、连接并执行 SQL

systemctl 显示 active (exited) 时,我不会直接判断异常。当前 kingbased.service 是 SysV init 脚本被 systemd 包装后的服务,脚本执行成功后退出是正常表现。真正判断数据库是否运行,还要继续看端口、PID 和 SQL。

启停闭环

先确认数据库正在运行:

# 查看 systemd 视角的服务状态
systemctl status kingbased.service --no-pager

# 查看数据库端口是否监听
ss -ltnp | grep 54321

# 用 Kingbase 自带工具确认实例状态
su - kingbase -c 'sys_ctl -D /data/kingbase/data status'

示例输出:

[root@Kingbase-Server ~]# systemctl status kingbased.service --no-pager
● kingbased.service - LSB: Start and stop the kingbase server
   Loaded: loaded (/etc/rc.d/init.d/kingbased; generated)
   Active: active (exited) since Wed 2026-06-10 16:09:26 CST; 20min ago

[root@Kingbase-Server ~]# ss -ltnp | grep 54321
LISTEN 0 244 0.0.0.0:54321 0.0.0.0:* users:(("kingbase",pid=1452,fd=13))
LISTEN 0 244 [::]:54321    [::]:*      users:(("kingbase",pid=1452,fd=14))

[root@Kingbase-Server ~]# su - kingbase -c 'sys_ctl -D /data/kingbase/data status'
sys_ctl: 正在运行服务器进程(PID: 1452)
/opt/Kingbase/ES/V9/KESRealPro/V009R001C002B0014/Server/bin/kingbase "-D" "/data/kingbase/data"

然后做一次受控停启:

# 停止 KingbaseES 服务
systemctl stop kingbased.service

# 确认端口释放
ss -ltnp | grep 54321 || echo "54321 stopped"

# 启动 KingbaseES 服务
systemctl start kingbased.service

# 再次确认服务、端口和实例状态
systemctl status kingbased.service --no-pager
ss -ltnp | grep 54321
su - kingbase -c 'sys_ctl -D /data/kingbase/data status'

示例输出:

[root@Kingbase-Server ~]# systemctl stop kingbased.service
[root@Kingbase-Server ~]# ss -ltnp | grep 54321 || echo "54321 stopped"
54321 stopped

[root@Kingbase-Server ~]# systemctl start kingbased.service
[root@Kingbase-Server ~]# systemctl status kingbased.service --no-pager
● kingbased.service - LSB: Start and stop the kingbase server
   Active: active (exited) since Wed 2026-06-10 16:30:36 CST; 2s ago

Jun 10 16:30:36 Kingbase-Server kingbased[3439]: 服务器进程已经启动
Jun 10 16:30:36 Kingbase-Server kingbased[3418]: KingbaseES V9 started successfully

[root@Kingbase-Server ~]# ss -ltnp | grep 54321
LISTEN 0 244 0.0.0.0:54321 0.0.0.0:* users:(("kingbase",pid=3480,fd=13))
LISTEN 0 244 [::]:54321    [::]:*      users:(("kingbase",pid=3480,fd=14))

[root@Kingbase-Server ~]# su - kingbase -c 'sys_ctl -D /data/kingbase/data status'
sys_ctl: 正在运行服务器进程(PID: 3480)
/opt/Kingbase/ES/V9/KESRealPro/V009R001C002B0014/Server/bin/kingbase "-D" "/data/kingbase/data"

这组输出说明停启闭环正常:停止后端口释放,启动后服务脚本成功、端口恢复监听,sys_ctl 也能确认新的实例主进程。

sys_ctl status 到底确认什么

sys_ctl status 的关键是 -D 后面的数据目录。

数据库启动后,数据目录中会生成 kingbase.pid。这个文件记录当前数据库主进程 PID、数据目录、端口、socket 目录和实例状态。sys_ctl -D /data/kingbase/data status 会从这个数据目录入手,确认对应的数据库主进程是否存在。

可以用下面两条命令交叉验证:

# 查看 PID 文件
cat /data/kingbase/data/kingbase.pid

# 查看 PID 对应的系统进程
ps -fp "$(head -1 /data/kingbase/data/kingbase.pid)"

示例输出:

[root@Kingbase-Server ~]# cat /data/kingbase/data/kingbase.pid
3480
/data/kingbase/data
1781080235
54321
/tmp
*
 54321001   1835008
ready

[root@Kingbase-Server ~]# ps -fp "$(head -1 /data/kingbase/data/kingbase.pid)"
UID       PID  PPID  C STIME TTY  TIME     CMD
kingbase 3480    1   0 16:30 ?    00:00:01 /opt/Kingbase/ES/V9/KESRealPro/V009R001C002B0014/Server/bin/kingbase -D /data/kingbase/data

所以,sys_ctl status 比端口检查更贴近数据库实例本身。但最高级别验证仍然是 ksql 登录并执行 SQL,因为这能证明数据库不仅进程在、端口在,而且认证、连接和 SQL 执行都正常。

固化 KingbaseES 命令路径

安装阶段我先临时执行:

export PATH=/opt/Kingbase/ES/V9/Server/bin:$PATH

临时 export 的好处是影响范围小,只对当前 shell 生效。安装路径、实例目录还没完全确认时,不急着写入用户配置文件。

现在安装和启停都已经验证完成,可以把命令路径写进 kingbase 用户的 ~/.bash_profile

su - kingbase

[ -f ~/.bash_profile ] && cp -p ~/.bash_profile ~/.bash_profile.bak.$(date +%Y%m%d%H%M%S) || touch ~/.bash_profile

grep -q '^export KINGBASE_HOME=/opt/Kingbase/ES/V9/Server$' ~/.bash_profile || cat >> ~/.bash_profile <<'EOF'

# KingbaseES V9 command tools
export KINGBASE_HOME=/opt/Kingbase/ES/V9/Server
export PATH=$KINGBASE_HOME/bin:$PATH
EOF

source ~/.bash_profile
command -v ksql
command -v sys_ctl
sys_ctl -D /data/kingbase/data status

示例输出:

[kingbase@Kingbase-Server ~]$ command -v ksql
/opt/Kingbase/ES/V9/Server/bin/ksql

[kingbase@Kingbase-Server ~]$ command -v sys_ctl
/opt/Kingbase/ES/V9/Server/bin/sys_ctl

[kingbase@Kingbase-Server ~]$ sys_ctl -D /data/kingbase/data status
sys_ctl: 正在运行服务器进程(PID: 3480)

建议只给 kingbase 用户配置,不要直接写到 root 或全局 /etc/profile。这样影响面更小,也符合数据库工具由数据库用户使用的习惯。

KSQL 基础登录

直接执行:

ksql -d test

会使用当前 Linux 用户名 kingbase 作为数据库用户名尝试登录。本次返回:

ksql: 错误: could not connect to server: FATAL:  password authentication failed for user "kingbase"

当前环境应显式指定数据库用户:

ksql -U system -d test

这条命令没有指定 -h,所以连接走 Unix socket,而不是 TCP:

test=# \conninfo
以用户 "system" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test"

如果要验证 TCP 连接,应显式加上主机和端口:

ksql -h 127.0.0.1 -p 54321 -U system -d test

示例输出:

test=# \conninfo
以用户 "system" 的身份, 在主机"127.0.0.1", 端口"54321"连接到数据库 "test"

test=# select current_user, current_database(), inet_server_addr(), inet_server_port(), current_timestamp;
 current_user | current_database | inet_server_addr | inet_server_port |       current_timestamp
--------------+------------------+------------------+------------------+-------------------------------
 system       | test             | 127.0.0.1        |            54321 | 2026-06-10 16:53:39.698546+08
(1 行记录)

这说明两种连接方式的差异已经验证清楚:

不写 -h:本地 Unix socket,\conninfo 显示 /tmp,inet_server_addr() 为空
写 -h 127.0.0.1:TCP 连接,\conninfo 显示 127.0.0.1:54321,inet_server_addr() 返回 127.0.0.1

KSQL 常用元命令

本次已验证这些元命令:

\conninfo  查看当前连接信息
\l         查看数据库列表
\dn        查看 schema 列表
\dt        查看表列表
\d         查看当前库对象
\du        查看角色列表
\timing on 打开 SQL 执行耗时
\?         查看 ksql 元命令帮助

当前 test 库里没有业务表,所以 \dt 返回:

Did not find any relations.

\d 能看到系统视图:

public.sys_stat_statements
public.sys_stat_statements_all

这里还有一个细节:当前 KingbaseES V9 的 ksql 中,\h select 不可用:

test=# \h select
invalid command \h
Try \? for help.

所以后续写 KSQL 速查表时,以 \? 输出为准,不把 \h select 写成已验证可用命令。

非交互执行 SQL

ksql 不只能进入交互界面,也可以直接执行单条 SQL 或 SQL 文件。这对后续巡检脚本很有用。

执行单条 SQL:

ksql -h 127.0.0.1 -p 54321 -U system -d test -c 'select current_user, current_database();'

示例输出:

 current_user | current_database
--------------+------------------
 system       | test
(1 行记录)

执行 SQL 文件:

cat > ~/kes_basic_check.sql <<'SQL'
\conninfo
select current_user, current_database();
show data_directory;
show port;
select version();
SQL

ksql -h 127.0.0.1 -p 54321 -U system -d test -f ~/kes_basic_check.sql

示例输出:

以用户 "system" 的身份, 在主机"127.0.0.1", 端口"54321"连接到数据库 "test"

 current_user | current_database
--------------+------------------
 system       | test
(1 行记录)

   data_directory
---------------------
 /data/kingbase/data
(1 行记录)

 port
-------
 54321
(1 行记录)

KingbaseES V009R001C002B0014 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit

这里要注意:当前认证方式仍会提示输入 system 用户口令。学习阶段先手工输入,后续讲自动化巡检时再单独处理口令管理,不在文章里记录密码。

基础巡检清单

完成安装后,最小巡检可以先看这些项目:

检查项命令本次结果
服务状态systemctl status kingbased.service --no-pageractive (exited),服务脚本执行成功
端口监听`ss -ltnpgrep 54321`
PID 文件cat /data/kingbase/data/kingbase.pid主进程 PID 为 3480,状态 ready
主进程ps -fp "$(head -1 /data/kingbase/data/kingbase.pid)"kingbase -D /data/kingbase/data
实例状态sys_ctl -D /data/kingbase/data status正在运行
挂载空间df -hT / /tmp /opt /data/tmp/opt/data 空间充足
目录占用du -sh /opt/Kingbase/ES/V9 /data/kingbase/data软件 5.8G,数据 155M
启动日志tail -n 120 /data/kingbase/data/sys_log/startup.log当前 16:30 启动正常
当前日志文件cat /data/kingbase/data/current_logfiles指向 sys_log/kingbase-2026-06-10_163036.log

磁盘空间示例输出:

[root@Kingbase-Server ~]# df -hT / /tmp /opt /data
Filesystem            Type  Size  Used Avail Use% Mounted on
/dev/mapper/klas-root xfs    25G   11G   15G  41% /
/dev/mapper/klas-tmp  xfs    12G  119M   12G   1% /tmp
/dev/mapper/klas-opt  xfs    15G  5.9G  9.2G  40% /opt
/dev/mapper/klas-data xfs    20G  332M   20G   2% /data

[root@Kingbase-Server ~]# du -sh /opt/Kingbase/ES/V9 /data/kingbase/data
5.8G    /opt/Kingbase/ES/V9
155M    /data/kingbase/data

启动日志怎么读

startup.log 中保留了一条历史 FATAL

2026-06-10 15:34:48.319 CST [40358] FATAL:  lock file "kingbase.pid" already exists

这条是前面重复启动服务时留下的记录。它说明当时数据目录里已经有运行中的数据库主进程,不代表当前实例异常。

当前这次启动对应 PID 3480,日志显示监听 IPv4、IPv6 和 Unix socket 后正常重定向日志:

2026-06-10 16:30:35.824 CST [3480] LOG:  starting KingbaseES V009R001C002B0014 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit
2026-06-10 16:30:35.826 CST [3480] LOG:  listening on IPv4 address "0.0.0.0", port 54321
2026-06-10 16:30:35.826 CST [3480] LOG:  listening on IPv6 address "::", port 54321
2026-06-10 16:30:35.829 CST [3480] LOG:  listening on Unix socket "/tmp/.s.KINGBASE.54321"
2026-06-10 16:30:36.656 CST [3480] LOG:  redirecting log output to logging collector process

当前日志文件由 current_logfiles 指出:

[root@Kingbase-Server ~]# cat /data/kingbase/data/current_logfiles
stderr sys_log/kingbase-2026-06-10_163036.log

这也提醒我们:排查启动问题时先看 startup.log;服务已经启动后,后续运行日志要继续看 current_logfiles 指向的文件。

当前进度

这一轮已经完成 KingbaseES V9 安装后的基础操作验证:

  • 服务启停正常。
  • 端口监听正常。
  • 数据目录 PID、系统进程、sys_ctl status 能互相对应。
  • ksql 可以通过 Unix socket 和 TCP 两种方式连接。
  • KSQL 常用元命令已经完成第一轮验证。
  • ksql -cksql -f 可用于非交互 SQL 执行。
  • 基础巡检清单已经形成。

下一篇继续进入数据库对象和权限:用户、角色、数据库、模式、表空间,以及最基础的建表和查询。

数据库 KingbaseES 人大金仓 Linux KSQL 技术分享