人大金仓 KingbaseES 学习 03:启停管理、KSQL 与基础巡检
目标
前两篇完成了 KingbaseES V9 单机部署环境准备和数据库安装。这一篇继续记录安装后的第一组日常操作:服务启停、状态判断、KSQL 常用命令和基础巡检。
这一阶段的重点我认为不是记住很多命令,而是弄清楚每个命令到底证明了什么。数据库运行状态不能只看一个地方,至少要从服务、端口、实例进程和 SQL 连接几个层面交叉判断。
状态判断的四个层面
本次把常用状态检查分成四层:
| 层面 | 命令 | 证明什么 |
|---|---|---|
| 服务层 | systemctl status kingbased.service --no-pager | systemd 调用服务脚本是否成功 |
| 网络层 | 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.1KSQL 常用元命令
本次已验证这些元命令:
\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-pager | active (exited),服务脚本执行成功 |
| 端口监听 | `ss -ltnp | grep 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 -c和ksql -f可用于非交互 SQL 执行。- 基础巡检清单已经形成。
下一篇继续进入数据库对象和权限:用户、角色、数据库、模式、表空间,以及最基础的建表和查询。