第一次接触KingbaseES的Linux管理员可能会有点懵,这个国产数据库该怎么上手?别担心,我们先从最基础的环境准备开始。记得我第一次部署KingbaseES时,花了半天时间才搞明白各种路径关系,现在把这些经验都总结给你。
安装完KingbaseES后,首先要确认数据库服务是否正常。打开终端,切换到kingbase用户(注意这个用户是在安装时自动创建的):
bash复制su - kingbase
接着检查版本信息,这个命令特别实用,尤其是在管理多台服务器时:
bash复制kingbase -V
我建议把这个命令输出记录下来,后期排查问题时能快速确认环境差异。有一次我遇到个奇怪的兼容性问题,最后发现是测试环境和生产环境的版本差了0.1,就是靠这个命令发现的。
端口检查是另一个关键操作。KingbaseES默认使用54321端口(和PostgreSQL的5432很像但不同),用这个命令查看:
bash复制netstat -an | grep 54321
如果看到类似0.0.0.0:54321的输出,说明端口监听正常。要是没反应,可能是服务没启动或者防火墙挡住了。
启动KingbaseES可不是简单敲个命令就行,这里面有不少门道。首先找到你的安装路径,通常在/opt/Kingbase/ES/V7或/usr/local/kingbase下。进入bin目录后,启动命令长这样:
bash复制./kingbase -D /你的数据目录路径 &
注意这个-D参数特别重要,它指定了数据目录的位置。我第一次用时就忘了加&符号,结果终端一关服务就停了,闹了个大笑话。
更专业的做法是用systemd管理服务。创建个/etc/systemd/system/kingbase.service文件,内容如下:
ini复制[Unit]
Description=KingbaseES Database Server
After=network.target
[Service]
Type=forking
User=kingbase
Group=kingbase
ExecStart=/opt/Kingbase/ES/V7/Server/bin/kingbase -D /opt/Kingbase/ES/V7/data
ExecStop=/usr/bin/pg_ctl stop -D /opt/Kingbase/ES/V7/data
Restart=on-failure
[Install]
WantedBy=multi-user.target
然后执行:
bash复制systemctl daemon-reload
systemctl start kingbase
systemctl enable kingbase
这样就能用systemctl status kingbase查看服务状态了,还能设置开机自启,比手动启动稳多了。
连接数据库是日常操作,但新手容易在参数上栽跟头。基本连接命令格式如下:
bash复制./ksql -U 用户名 -W 密码 -p 端口 数据库名
比如连接默认的SYSTEM账户:
bash复制./ksql -USYSTEM -WMANAGER -p54321 TEST
这里有个坑:密码参数-W后面不直接跟密码,而是等命令行提示输入时再输,这样更安全。我第一次用时傻傻地在-W后面直接写密码,结果死活连不上。
进入交互界面后,常用命令得记牢:
\l 列出所有数据库\c 数据库名 切换数据库\dt 显示当前数据库的表\du 列出所有用户角色\q 退出我习惯先用\l看看有哪些数据库,再用\c切换到目标库。曾经误操作删错库,就是没先确认当前连接的数据库,血的教训啊!
创建用户是基本功,但权限分配才是重点。创建普通用户:
sql复制CREATE USER 用户名 CONNECTION LIMIT 10 PASSWORD '密码';
注意CONNECTION LIMIT限制同时连接数,生产环境一定要设置,防止单个用户耗尽连接池。我就见过因为没设限制,一个跑批任务把数据库连接全占了的情况。
权限分配更讲究,KingbaseES有这些常用角色:
给用户赋权要遵循最小权限原则:
sql复制ALTER USER 用户名 CREATEDB;
ALTER USER 用户名 CREATEROLE;
千万别随便给SUPERUSER权限!有次给开发人员开了超级权限,结果他误删了系统表,整个库都得从备份恢复。
创建数据库时,字符集和排序规则很重要:
sql复制CREATE DATABASE 数据库名
WITH OWNER='用户名'
ENCODING 'UTF8'
LC_COLLATE='zh_CN.UTF-8'
LC_CTYPE='zh_CN.UTF-8'
TEMPLATE=template0;
特别是中文环境,一定要指定zh_CN.UTF-8,否则排序和搜索会出问题。我就遇到过按拼音排序失效的情况,就是因为没设对LC_COLLATE。
数据库参数调整也很关键,修改kingbase.conf里的这些参数能显著提升性能:
ini复制shared_buffers = 4GB # 建议内存的25%
work_mem = 16MB # 每个查询操作的内存
maintenance_work_mem = 256MB # 维护操作的内存
effective_cache_size = 12GB # 系统可用缓存
改完记得重启服务生效。调优是个细致活,建议先在测试环境验证效果。
逻辑备份用sys_dump,这是最常用的工具:
bash复制./sys_dump -h 主机IP -p 端口 -U 用户名 -W 密码 -Fc -f 备份文件路径 数据库名
-Fc表示自定义格式,压缩比高还能选择性恢复。我每周定时跑这个命令做全量备份,已经救过我三次了。
恢复备份要特别注意版本兼容性:
bash复制./ksql -h 主机IP -U 用户名 -W 密码 -d 目标数据库 -p 端口 -f 备份文件
有次我用新版本恢复旧版备份,结果部分函数不兼容,最后还是得找相同版本的中间环境过渡。现在我都严格记录每个备份的版本信息。
物理备份更彻底,直接打包数据目录:
bash复制tar -czvf kingbase_backup.tar.gz /opt/Kingbase/ES/V7/data
这种备份恢复时要求KingbaseES版本完全一致,适合迁移整个数据库实例。记得备份前先停服务,保证数据一致性。
定期维护能避免很多问题,这几个命令我每天必查:
查看锁等待:
sql复制SELECT * FROM sys_locks WHERE NOT granted;
检查长事务:
sql复制SELECT * FROM sys_stat_activity WHERE state <> 'idle'
AND now() - xact_start > interval '5 minutes';
清理旧连接:
sql复制SELECT pg_terminate_backend(pid) FROM sys_stat_activity
WHERE state = 'idle' AND now() - state_change > interval '1 hour';
有次系统卡死,就是靠查锁等待发现有个事务没提交,锁住了关键表。现在我都配置了监控,超过5分钟的事务自动报警。
定期执行VACUUM也很重要:
sql复制VACUUM (VERBOSE, ANALYZE) 表名;
-- 或者全库维护
VACUUM FULL;
特别是频繁更新的表,不做VACUUM会导致表膨胀,性能直线下降。我设置每周凌晨自动执行,效果立竿见影。
掌握这些查询,你就能像老中医一样把脉数据库:
查看最耗时的SQL:
sql复制SELECT query, calls, total_time, mean_time
FROM sys_stat_statements
ORDER BY total_time DESC LIMIT 10;
需要先启用pg_stat_statements扩展,在kingbase.conf里加:
ini复制shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all
表空间使用情况:
sql复制SELECT schemaname, tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename))
FROM sys_tables
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
LIMIT 20;
我常用这个查哪些表占空间最多,有一次发现个日志表占了80%空间,赶紧加了分区和归档策略。
连接数监控也很关键:
sql复制SELECT datname, usename, count(*)
FROM sys_stat_activity
GROUP BY datname, usename;
配合max_connections参数,可以合理设置连接池大小。曾经因为连接数爆满导致服务不可用,现在我都预留20%的缓冲。