1. 环境准备与连接作为国产数据库的佼佼者Kingbase人大金仓在企业级应用中越来越常见。第一次接触它时我也被那一堆参数搞得头晕眼花。经过几个项目的实战我整理出这套保姆级操作指南帮你避开我踩过的那些坑。1.1 安装后的基础检查装好Kingbase后别急着用先做这几个检查# 检查版本注意V是大写 kingbase -V # 查看默认端口54321占用情况 netstat -tulnp | grep 54321 # 确认服务进程 ps -ef | grep kingbase如果端口被占用建议修改安装目录下data/kingbase.conf中的port参数。我遇到过同事装完启动失败的情况八成是端口冲突。1.2 服务启停的正确姿势启动服务不是简单敲命令就行重点是这个-D参数要指向你的数据目录# 进入安装目录的bin文件夹 cd /opt/Kingbase/ES/V8/bin # 带符号表示后台运行重要 ./kingbase -D /opt/Kingbase/ES/V8/data 注意生产环境强烈建议配置成systemd服务用systemctl start kingbase管理。我有次服务器重启后忘了手动启动服务导致业务中断被通报批评...1.3 连接数据库的三种方式除了常用的ksql客户端还有这些连接方式# 基础连接-W参数后直接跟密码不要留空格 ./ksql -USYSTEM -W123456 -p54321 TEST # 交互式输入密码更安全 ./ksql -USYSTEM -p54321 TEST # 远程连接示例注意防火墙设置 ./ksql -h 192.168.1.100 -Uadmin -p54322 PROD_DB遇到连接失败时先检查data/pg_hba.conf文件里的IP白名单设置。上周我还帮客户解决了这个问题他们从办公网连不上就是因为没配置访问规则。2. 用户与权限管理2.1 用户创建的门道创建用户时有个大坑Kingbase默认对用户名和密码是大小写敏感的。看这个对比-- 正确做法用户名会存储为全大写 CREATE USER web_user PASSWORD Abc1234; -- 错误示例加了双引号会导致严格区分大小写 CREATE USER web_user PASSWORD Abc1234;曾经有个项目因为这个问题排查了三小时——应用代码里用的web_user登录但数据库里存的是WEB_USER。2.2 权限分配的黄金法则权限不要一股脑给SUPERUSER按需分配才是王道-- 开发人员典型权限组合 ALTER USER dev_user CREATEDB CREATEROLE LOGIN; -- 只读用户权限 CREATE USER reader_user PASSWORD readonly; GRANT SELECT ON ALL TABLES IN SCHEMA public TO reader_user;建议建立角色模板比如readonly_role、dev_role然后给用户分配角色。我们现在的运维规范要求所有权限变更必须走工单审批。2.3 密码安全策略在kingbase.conf里加上这些参数强制密码复杂度password_encryption md5 password_reuse_time 90 password_reuse_max 3 password_min_length 12最近等保2.0检查时这项配置帮客户加了分。记得改完要SELECT sys_reload_conf();才能生效。3. 数据库对象操作3.1 建库时的关键参数创建生产环境数据库时这几个参数必须关注CREATE DATABASE order_db WITH OWNERdba_admin ENCODINGUTF8 LC_COLLATEzh_CN.UTF-8 LC_CTYPEzh_CN.UTF-8 CONNECTION LIMIT50;特别是字符集有次我们导入数据出现乱码就是因为建库时用了默认的SQL_ASCII。现在团队规定所有库必须明确指定UTF8。3.2 日常对象管理技巧记住这些实用命令-- 查看所有表比\dt更详细 SELECT * FROM sys_tables WHERE schemanamepublic; -- 快速修改表所有者 ALTER TABLE customer OWNER TO new_dba; -- 查看表占用空间单位MB SELECT pg_size_pretty(pg_total_relation_size(user_log));有个小技巧用\x on开启扩展显示模式查看宽表数据时特别方便。4. 数据备份与恢复4.1 逻辑备份实战生产环境备份一定要加--formatcustom参数# 单库备份推荐方式 ./sys_dump -h 127.0.0.1 -p 54321 -U backup_user -Fc -f /backup/db_202308.dmp prod_db # 全库备份含全局对象 ./sys_dumpall -h 127.0.0.1 -p 54321 -U backup_user -f /backup/full_202308.sql血泪教训有次用纯文本格式备份200GB数据库结果花了6小时。换成custom格式后只要2小时还支持并行恢复。4.2 恢复数据的避坑指南不同备份方式要用对应恢复命令# 恢复custom格式备份 ./sys_restore -h 127.0.0.1 -p 54321 -U dba_user -d new_db /backup/db_202308.dmp # 执行SQL格式备份 ./ksql -h 127.0.0.1 -p 54321 -U dba_user -f /backup/full_202308.sql恢复大库时建议先--schema-only检查结构再--data-only导入数据。我们有一次因为没检查把测试库结构覆盖到了生产库...5. 状态监控与诊断5.1 性能监控三板斧这几个视图是排查性能问题的利器-- 查看活跃会话重点关注wait_event不为空的 SELECT * FROM sys_stat_activity WHERE stateactive; -- 查询锁等待 SELECT blocked_locks.pid AS blocked_pid, blocking_locks.pid AS blocking_pid FROM sys_locks blocked_locks JOIN sys_locks blocking_locks ON blocking_locks.locktype blocked_locks.locktype AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid AND blocking_locks.pid ! blocked_locks.pid; -- 查看慢查询需要先设置log_min_duration_statement SELECT * FROM sys_stat_statements ORDER BY total_time DESC LIMIT 10;5.2 日常维护命令集把这些命令加入你的巡检脚本-- 查看数据库大小Top10 SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM sys_database ORDER BY pg_database_size(datname) DESC LIMIT 10; -- 检查膨胀表需要安装sys_stat_statements SELECT schemaname, relname, n_dead_tup, n_live_tup FROM sys_stat_user_tables WHERE n_dead_tup 1000 ORDER BY n_dead_tup DESC; -- 手动触发WAL日志切换备份前执行 SELECT pg_switch_wal();建议用\o命令把结果输出到文件比如\o /tmp/db_check.log。我们团队现在用Python脚本自动解析这些指标生成报告。
Kingbase人大金仓运维实战:从环境搭建到日常管理的核心命令集
1. 环境准备与连接作为国产数据库的佼佼者Kingbase人大金仓在企业级应用中越来越常见。第一次接触它时我也被那一堆参数搞得头晕眼花。经过几个项目的实战我整理出这套保姆级操作指南帮你避开我踩过的那些坑。1.1 安装后的基础检查装好Kingbase后别急着用先做这几个检查# 检查版本注意V是大写 kingbase -V # 查看默认端口54321占用情况 netstat -tulnp | grep 54321 # 确认服务进程 ps -ef | grep kingbase如果端口被占用建议修改安装目录下data/kingbase.conf中的port参数。我遇到过同事装完启动失败的情况八成是端口冲突。1.2 服务启停的正确姿势启动服务不是简单敲命令就行重点是这个-D参数要指向你的数据目录# 进入安装目录的bin文件夹 cd /opt/Kingbase/ES/V8/bin # 带符号表示后台运行重要 ./kingbase -D /opt/Kingbase/ES/V8/data 注意生产环境强烈建议配置成systemd服务用systemctl start kingbase管理。我有次服务器重启后忘了手动启动服务导致业务中断被通报批评...1.3 连接数据库的三种方式除了常用的ksql客户端还有这些连接方式# 基础连接-W参数后直接跟密码不要留空格 ./ksql -USYSTEM -W123456 -p54321 TEST # 交互式输入密码更安全 ./ksql -USYSTEM -p54321 TEST # 远程连接示例注意防火墙设置 ./ksql -h 192.168.1.100 -Uadmin -p54322 PROD_DB遇到连接失败时先检查data/pg_hba.conf文件里的IP白名单设置。上周我还帮客户解决了这个问题他们从办公网连不上就是因为没配置访问规则。2. 用户与权限管理2.1 用户创建的门道创建用户时有个大坑Kingbase默认对用户名和密码是大小写敏感的。看这个对比-- 正确做法用户名会存储为全大写 CREATE USER web_user PASSWORD Abc1234; -- 错误示例加了双引号会导致严格区分大小写 CREATE USER web_user PASSWORD Abc1234;曾经有个项目因为这个问题排查了三小时——应用代码里用的web_user登录但数据库里存的是WEB_USER。2.2 权限分配的黄金法则权限不要一股脑给SUPERUSER按需分配才是王道-- 开发人员典型权限组合 ALTER USER dev_user CREATEDB CREATEROLE LOGIN; -- 只读用户权限 CREATE USER reader_user PASSWORD readonly; GRANT SELECT ON ALL TABLES IN SCHEMA public TO reader_user;建议建立角色模板比如readonly_role、dev_role然后给用户分配角色。我们现在的运维规范要求所有权限变更必须走工单审批。2.3 密码安全策略在kingbase.conf里加上这些参数强制密码复杂度password_encryption md5 password_reuse_time 90 password_reuse_max 3 password_min_length 12最近等保2.0检查时这项配置帮客户加了分。记得改完要SELECT sys_reload_conf();才能生效。3. 数据库对象操作3.1 建库时的关键参数创建生产环境数据库时这几个参数必须关注CREATE DATABASE order_db WITH OWNERdba_admin ENCODINGUTF8 LC_COLLATEzh_CN.UTF-8 LC_CTYPEzh_CN.UTF-8 CONNECTION LIMIT50;特别是字符集有次我们导入数据出现乱码就是因为建库时用了默认的SQL_ASCII。现在团队规定所有库必须明确指定UTF8。3.2 日常对象管理技巧记住这些实用命令-- 查看所有表比\dt更详细 SELECT * FROM sys_tables WHERE schemanamepublic; -- 快速修改表所有者 ALTER TABLE customer OWNER TO new_dba; -- 查看表占用空间单位MB SELECT pg_size_pretty(pg_total_relation_size(user_log));有个小技巧用\x on开启扩展显示模式查看宽表数据时特别方便。4. 数据备份与恢复4.1 逻辑备份实战生产环境备份一定要加--formatcustom参数# 单库备份推荐方式 ./sys_dump -h 127.0.0.1 -p 54321 -U backup_user -Fc -f /backup/db_202308.dmp prod_db # 全库备份含全局对象 ./sys_dumpall -h 127.0.0.1 -p 54321 -U backup_user -f /backup/full_202308.sql血泪教训有次用纯文本格式备份200GB数据库结果花了6小时。换成custom格式后只要2小时还支持并行恢复。4.2 恢复数据的避坑指南不同备份方式要用对应恢复命令# 恢复custom格式备份 ./sys_restore -h 127.0.0.1 -p 54321 -U dba_user -d new_db /backup/db_202308.dmp # 执行SQL格式备份 ./ksql -h 127.0.0.1 -p 54321 -U dba_user -f /backup/full_202308.sql恢复大库时建议先--schema-only检查结构再--data-only导入数据。我们有一次因为没检查把测试库结构覆盖到了生产库...5. 状态监控与诊断5.1 性能监控三板斧这几个视图是排查性能问题的利器-- 查看活跃会话重点关注wait_event不为空的 SELECT * FROM sys_stat_activity WHERE stateactive; -- 查询锁等待 SELECT blocked_locks.pid AS blocked_pid, blocking_locks.pid AS blocking_pid FROM sys_locks blocked_locks JOIN sys_locks blocking_locks ON blocking_locks.locktype blocked_locks.locktype AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid AND blocking_locks.pid ! blocked_locks.pid; -- 查看慢查询需要先设置log_min_duration_statement SELECT * FROM sys_stat_statements ORDER BY total_time DESC LIMIT 10;5.2 日常维护命令集把这些命令加入你的巡检脚本-- 查看数据库大小Top10 SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM sys_database ORDER BY pg_database_size(datname) DESC LIMIT 10; -- 检查膨胀表需要安装sys_stat_statements SELECT schemaname, relname, n_dead_tup, n_live_tup FROM sys_stat_user_tables WHERE n_dead_tup 1000 ORDER BY n_dead_tup DESC; -- 手动触发WAL日志切换备份前执行 SELECT pg_switch_wal();建议用\o命令把结果输出到文件比如\o /tmp/db_check.log。我们团队现在用Python脚本自动解析这些指标生成报告。