运维管理26 分钟阅读
金仓 运维命令 100 条
做金仓数据库运维,真正考验 DBA 的并不是会不会建库建表,而是在生产环境出现连接暴增、SQL 卡顿、锁等待、WAL 堆积、主备延迟、备份失败或者集群节点异常时,能不能快速找到正确的排查入口。
2026年7月24日阅读—点赞—收藏—
dba100墨力计划金仓金仓数据库
100 条命令系列文章专栏
做金仓数据库运维,真正考验 DBA 的并不是会不会建库建表,而是在生产环境出现连接暴增、SQL 卡顿、锁等待、WAL 堆积、主备延迟、备份失败或者集群节点异常时,能不能快速找到正确的排查入口。
做金仓数据库运维,真正考验 DBA 的并不是会不会建库建表,而是在生产环境出现连接暴增、SQL 卡顿、锁等待、WAL 堆积、主备延迟、备份失败或者集群节点异常时,能不能快速找到正确的排查入口。
KingbaseES 的很多管理方式与 PostgreSQL 相似,但客户端工具、系统视图、函数名称、备份工具和高可用组件又有自己的特点。比如日常连接通常使用 ksql,实例启停使用 sys_ctl,动态性能视图以 sys_stat_* 为主,逻辑备份使用 sys_dump,物理备份常用 sys_rman,高可用集群则经常需要结合 repmgr 和 sys_monitor.sh 进行管理。
下面整理 100 条金仓数据库 DBA 日常使用频率较高的命令,覆盖实例管理、对象空间、会话连接、事务锁、SQL 性能、统计信息、WAL、主备复制、用户权限、备份恢复和集群运维等常见场景。
本文主要面向 KingbaseES V8。不同补丁版本、兼容模式和部署架构下,部分视图字段、工具路径和参数可能存在差异,执行前应先确认实际版本。文中的数据库名、用户名、IP、端口、目录和 PID 均为示例,涉及终止会话、删除对象、切换主备和恢复覆盖的操作,必须先确认影响范围。
生产环境不建议在命令行中直接填写密码,避免密码出现在 Shell 历史记录和进程列表中。
能否免密连接取决于 sys_hba.conf 中的认证配置和当前操作系统用户。
也可以只查看服务端版本号:
session_user 是最初建立连接的用户,current_user 可能因 SET ROLE 发生变化。
在 VIP、读写分离和多节点环境中,可以用它确认当前实际连接到了哪台数据库。
可以快速判断实例近期是否发生过重启。
也可以在操作系统上执行:
分别对应主参数文件、客户端认证文件和用户映射文件。
pending_restart = true 表示参数已经修改,但需要重启实例后才能生效。
生产环境通常使用 fast 模式正常关闭。不要在没有评估影响的情况下直接使用 immediate。
SQL 方式:
SQL 方式:
search_path 决定没有显式指定 Schema 时,数据库按照什么顺序查找对象。
SQL 方式:
\d+ 可以查看字段、索引、约束、存储参数和部分空间信息。
SQL 方式查看普通视图:
contype 常见值包括主键、外键、唯一约束和检查约束。
排查性能插件、兼容插件或功能差异时,应先确认相关扩展是否已经安装。
时间阈值应根据业务特点调整,不能只凭执行时间判断 SQL 是否异常。
长时间空闲事务可能阻止垃圾版本回收,并造成表膨胀和事务号压力。
该命令只取消当前 SQL,通常不会直接断开数据库连接。
该操作会断开会话并回滚未提交事务。生产执行前必须确认 PID、用户、客户端和事务影响。
剩余连接数很少时,还应检查是否存在连接池泄漏、异常重连或大量 idle 会话。
如果返回空数组,表示该会话当前没有被其他后台进程阻塞。
最老事务通常是排查 Vacuum 无法回收、表膨胀和事务号风险的重要入口。
设置后,当前会话等待锁超过 10 秒会报错退出,适合变更脚本防止无限等待。
EXPLAIN 只生成执行计划,不会真正执行 SQL。
ANALYZE 会真正执行 SQL。对 UPDATE、DELETE、INSERT 和超大查询使用前必须谨慎。
KingbaseES V8R6 中该组件通常已经内置,但默认统计开关仍需结合实际参数确认。
不同补丁版本的耗时字段可能略有差异,执行前可先使用 \d+ sys_stat_statements 查看结构。
增加调用次数条件,可以避免只执行一次的偶发 SQL 干扰判断。
物理读和临时块读写较高,通常需要继续检查索引、执行计划、排序和 Hash 操作。
缓存命中率只能作为趋势指标,不能脱离业务类型和存储性能单独判断。
临时文件持续增长通常与大排序、Hash 聚合、Hash Join 或 work_mem 不足有关。
重置后历史累计数据会被清空。生产环境应先确认监控、分析和审计是否依赖这些数据。
适合用于数据库负载趋势、事务提交回滚和死锁情况的快速检查。
SQL 方式:
n_live_tup 和 n_dead_tup 都是统计估算值,不等于精确 COUNT(*)。
除了容量,还要检查 inode 是否耗尽。不要在高峰期对超大目录频繁执行深度 du。
大量数据装载、批量删除或数据分布明显变化后,可以考虑重新收集统计信息。
普通 Vacuum 主要回收可复用空间,通常不会把表文件直接缩小。
VACUUM FULL 会重写表并持有较强锁,大表执行时间长,必须安排维护窗口。
索引扫描次数为 0 不代表一定可以删除,还要考虑统计重置时间、主键约束和低频业务。
重建整张表的所有索引:
执行期间的锁行为与版本和使用方式有关,生产环境应提前验证。
该命令应在主库执行,用于查看当前 WAL 写入位置。
返回 false 通常表示主库,返回 true 通常表示备库正在恢复或回放 WAL。
字节差只能说明 WAL 位置差距,还应结合时间延迟、网络和回放状态综合判断。
该命令应在备库执行。
如果主库长时间没有写入,时间差可能持续增大,因此不能仅凭这个值判断复制异常。
该视图通常在备库上使用。
不再使用但仍保留的复制槽可能阻止 WAL 清理,最终导致磁盘空间持续增长。
删除前必须确认没有备库、订阅端或同步程序继续依赖该复制槽。
检查点和强制切换 WAL 会增加 I/O 或产生新的 WAL 文件,不应作为日常“清理日志”的手段频繁执行。
SQL 方式:
实际生产密码应符合密码复杂度和定期轮换要求,不要照搬示例。
用户连接数限制不能替代应用连接池治理,但可以作为数据库侧保护措施。
只有数据库连接权限并不代表用户能够访问指定模式中的对象。
默认权限只影响之后创建的对象,不会自动补齐已经存在的表。
适合用于监控探测、启动脚本和故障切换前的连通性检查。
自定义格式便于使用 sys_restore 进行选择性恢复和并行恢复。
对分区表执行前,应确认当前版本是否会自动包含所有分区。
恢复前先检查备份文件内容,可以避免选错数据库、模式或对象。
-j 4 表示使用 4 个并行任务,实际并行度应结合 CPU、I/O 和业务负载确定。
该命令需要复制用户和相应权限,备份目录应为空,并提前确认空间是否充足。
重点检查完整备份、差异备份、增量备份、归档范围和备份状态。
应重点关注节点角色、运行状态、上游节点和复制状态。实际执行时建议使用安装目录下的绝对路径。
集群环境应通过对应版本的集群管理脚本统一操作,不要在不了解集群状态的情况下分别手工启停各节点数据库。
这 100 条命令基本覆盖了金仓 DBA 日常巡检和故障排查中最常见的入口,但真正的生产运维不能只靠背命令。
遇到问题时,建议始终按照“确认环境和节点角色、观察现象、检查会话与等待、定位阻塞或 SQL、评估影响、执行处理、验证恢复”的顺序进行。特别是 sys_terminate_backend、VACUUM FULL、删除复制槽、主备切换和备份恢复等操作,执行前必须确认业务影响并保留回退方案。
另外,KingbaseES 不同 V8 补丁版本、兼容模式和高可用部署方式之间可能存在差异。现场执行时,应以当前环境的 version() 返回结果、系统视图结构、工具帮助信息以及对应版本的官方文档为准,不能把其他数据库或其他版本的命令直接照搬到生产环境。
更多 Oracle、MySQL、PostgreSQL、MongoDB 实战内容,可以访问 DBA 学习平台:ora100.com
1ksql -h 192.168.10.10 -p 54321 -U system -d test1ksql -d test1SELECT version();1SHOW server_version;1SELECT current_database(),2 current_user,3 session_user;1SELECT inet_server_addr() AS server_ip,2 inet_server_port() AS server_port,3 inet_client_addr() AS client_ip,4 inet_client_port() AS client_port;1SELECT sys_postmaster_start_time() AS startup_time,2 now() - sys_postmaster_start_time() AS uptime;1SHOW data_directory;1sys_ctl status -D /data/kingbase1SHOW config_file;2SHOW hba_file;3SHOW ident_file;1SELECT name,2 setting,3 unit,4 context,5 pending_restart6FROM sys_settings7WHERE name IN (8 'max_connections',9 'shared_buffers',10 'work_mem',11 'maintenance_work_mem',12 'wal_level',13 'max_wal_size'14)15ORDER BY name;1sys_ctl start -D /data/kingbase2sys_ctl stop -D /data/kingbase -m fast3sys_ctl restart -D /data/kingbase -m fast1\l1SELECT datname,2 datdba::regrole AS owner,3 encoding,4 datcollate,5 datctype,6 datallowconn7FROM sys_database8ORDER BY datname;1\dn1SELECT schema_name,2 schema_owner3FROM information_schema.schemata4ORDER BY schema_name;1SHOW search_path;1\dt public.*1SELECT schemaname,2 tablename,3 tableowner4FROM sys_tables5WHERE schemaname = 'public'6ORDER BY tablename;1\d+ public.orders1\dv2\dm1SELECT schemaname,2 viewname,3 viewowner4FROM sys_views5ORDER BY schemaname, viewname;1SELECT conname,2 contype,3 sys_get_constraintdef(oid) AS definition4FROM sys_constraint5WHERE conrelid = 'public.orders'::regclass;1SELECT schemaname,2 tablename,3 indexname,4 indexdef5FROM sys_indexes6WHERE schemaname = 'public'7 AND tablename = 'orders'8ORDER BY indexname;1SELECT nmsp_parent.nspname AS parent_schema,2 parent.relname AS parent_table,3 nmsp_child.nspname AS child_schema,4 child.relname AS child_table5FROM sys_inherits i6JOIN sys_class parent7 ON parent.oid = i.inhparent8JOIN sys_class child9 ON child.oid = i.inhrelid10JOIN sys_namespace nmsp_parent11 ON nmsp_parent.oid = parent.relnamespace12JOIN sys_namespace nmsp_child13 ON nmsp_child.oid = child.relnamespace14ORDER BY 1, 2, 3, 4;1SELECT extname,2 extversion,3 extnamespace::regnamespace AS schema_name4FROM sys_extension5ORDER BY extname;1SELECT pid,2 usename,3 datname,4 client_addr,5 application_name,6 state,7 backend_start,8 query_start,9 wait_event_type,10 wait_event,11 query12FROM sys_stat_activity13ORDER BY backend_start;1SELECT count(*) AS current_connections2FROM sys_stat_activity;1SELECT usename,2 count(*) AS connections3FROM sys_stat_activity4GROUP BY usename5ORDER BY connections DESC;1SELECT client_addr,2 application_name,3 count(*) AS connections4FROM sys_stat_activity5WHERE backend_type = 'client backend'6GROUP BY client_addr, application_name7ORDER BY connections DESC;1SELECT pid,2 usename,3 datname,4 client_addr,5 now() - query_start AS running_time,6 wait_event_type,7 wait_event,8 query9FROM sys_stat_activity10WHERE state = 'active'11 AND pid <> sys_backend_pid()12ORDER BY query_start;1SELECT pid,2 usename,3 datname,4 now() - query_start AS running_time,5 wait_event_type,6 wait_event,7 query8FROM sys_stat_activity9WHERE state = 'active'10 AND query_start < now() - interval '5 minutes'11ORDER BY query_start;1SELECT pid,2 usename,3 client_addr,4 xact_start,5 state_change,6 now() - xact_start AS transaction_age,7 query8FROM sys_stat_activity9WHERE state = 'idle in transaction'10ORDER BY xact_start;1SELECT sys_cancel_backend(12345);1SELECT sys_terminate_backend(12345);1SELECT current_setting('max_connections')::int AS max_connections,2 count(*) AS used_connections,3 current_setting('max_connections')::int - count(*) AS remaining_connections4FROM sys_stat_activity;1SELECT pid,2 usename,3 datname,4 xact_start,5 now() - xact_start AS transaction_age,6 state,7 query8FROM sys_stat_activity9WHERE xact_start IS NOT NULL10ORDER BY xact_start;1SELECT pid,2 usename,3 client_addr,4 now() - xact_start AS transaction_age,5 state,6 query7FROM sys_stat_activity8WHERE xact_start < now() - interval '10 minutes'9ORDER BY xact_start;1SELECT locktype,2 database,3 relation::regclass AS relation,4 page,5 tuple,6 virtualxid,7 transactionid,8 pid,9 mode,10 granted11FROM sys_locks12ORDER BY granted, pid;1SELECT a.pid,2 a.usename,3 a.client_addr,4 a.wait_event_type,5 a.wait_event,6 now() - a.query_start AS wait_time,7 a.query8FROM sys_stat_activity a9WHERE a.wait_event_type = 'Lock'10ORDER BY a.query_start;1SELECT blocked.pid AS blocked_pid,2 blocked.usename AS blocked_user,3 blocker.pid AS blocker_pid,4 blocker.usename AS blocker_user,5 now() - blocked.query_start AS blocked_time,6 blocked.query AS blocked_sql,7 blocker.query AS blocker_sql8FROM sys_stat_activity blocked9CROSS JOIN LATERAL unnest(sys_blocking_pids(blocked.pid)) AS bpid10JOIN sys_stat_activity blocker11 ON blocker.pid = bpid12ORDER BY blocked.query_start;1SELECT sys_blocking_pids(12345);1SELECT l.pid,2 a.usename,3 a.client_addr,4 l.mode,5 l.granted,6 a.state,7 a.query8FROM sys_locks l9JOIN sys_stat_activity a10 ON a.pid = l.pid11WHERE l.relation = 'public.orders'::regclass12ORDER BY l.granted, l.pid;1SELECT pid,2 locktype,3 relation::regclass AS relation,4 transactionid,5 mode6FROM sys_locks7WHERE granted = false;1SELECT pid,2 usename,3 datname,4 xact_start,5 now() - xact_start AS age,6 state,7 query8FROM sys_stat_activity9WHERE xact_start IS NOT NULL10ORDER BY xact_start11LIMIT 10;1SET lock_timeout = '10s';1EXPLAIN2SELECT *3FROM public.orders4WHERE order_no = 'A10001';1EXPLAIN (ANALYZE, BUFFERS, VERBOSE)2SELECT *3FROM public.orders4WHERE order_no = 'A10001';1SELECT extname,2 extversion3FROM sys_extension4WHERE extname = 'sys_stat_statements';1SELECT queryid,2 calls,3 round(total_exec_time::numeric, 2) AS total_exec_ms,4 round(mean_exec_time::numeric, 2) AS avg_exec_ms,5 rows,6 query7FROM sys_stat_statements8ORDER BY total_exec_time DESC9LIMIT 20;1SELECT queryid,2 calls,3 round(mean_exec_time::numeric, 2) AS avg_exec_ms,4 round(total_exec_time::numeric, 2) AS total_exec_ms,5 query6FROM sys_stat_statements7WHERE calls >= 108ORDER BY mean_exec_time DESC9LIMIT 20;1SELECT queryid,2 calls,3 shared_blks_hit,4 shared_blks_read,5 temp_blks_read,6 temp_blks_written,7 query8FROM sys_stat_statements9ORDER BY shared_blks_read DESC10LIMIT 20;1SELECT datname,2 blks_hit,3 blks_read,4 round(5 100.0 * blks_hit / nullif(blks_hit + blks_read, 0),6 27 ) AS cache_hit_percent8FROM sys_stat_database9WHERE datname IS NOT NULL10ORDER BY cache_hit_percent;1SELECT datname,2 temp_files,3 sys_size_pretty(temp_bytes) AS temp_size,4 deadlocks,5 blk_read_time,6 blk_write_time7FROM sys_stat_database8ORDER BY temp_bytes DESC;1SELECT sys_stat_statements_reset();1SELECT datname,2 numbackends,3 xact_commit,4 xact_rollback,5 blks_read,6 blks_hit,7 tup_returned,8 tup_fetched,9 tup_inserted,10 tup_updated,11 tup_deleted,12 deadlocks13FROM sys_stat_database14WHERE datname = current_database();1SELECT sys_size_pretty(2 sys_database_size(current_database())3 ) AS database_size;1SELECT datname,2 sys_size_pretty(sys_database_size(datname)) AS database_size3FROM sys_database4WHERE datallowconn5ORDER BY sys_database_size(datname) DESC;1SELECT n.nspname AS schema_name,2 sys_size_pretty(SUM(sys_total_relation_size(c.oid))) AS total_size3FROM sys_class c4JOIN sys_namespace n5 ON n.oid = c.relnamespace6WHERE c.relkind IN ('r', 'm', 'p')7 AND n.nspname NOT IN ('sys_catalog', 'information_schema')8GROUP BY n.nspname9ORDER BY SUM(sys_total_relation_size(c.oid)) DESC;1SELECT schemaname,2 relname AS table_name,3 sys_size_pretty(sys_total_relation_size(relid)) AS total_size,4 sys_size_pretty(sys_relation_size(relid)) AS table_size,5 sys_size_pretty(sys_indexes_size(relid)) AS index_size6FROM sys_stat_user_tables7ORDER BY sys_total_relation_size(relid) DESC8LIMIT 20;1SELECT sys_size_pretty(2 sys_total_relation_size('public.orders')3 ) AS total_size,4 sys_size_pretty(5 sys_relation_size('public.orders')6 ) AS table_size,7 sys_size_pretty(8 sys_indexes_size('public.orders')9 ) AS index_size;1SELECT indexrelname AS index_name,2 sys_size_pretty(sys_relation_size(indexrelid)) AS index_size,3 idx_scan4FROM sys_stat_user_indexes5WHERE schemaname = 'public'6 AND relname = 'orders'7ORDER BY sys_relation_size(indexrelid) DESC;1\db+1SELECT spcname,2 sys_get_userbyid(spcowner) AS owner,3 sys_tablespace_location(oid) AS location4FROM sys_tablespace5ORDER BY spcname;1SELECT spcname,2 sys_size_pretty(sys_tablespace_size(oid)) AS tablespace_size3FROM sys_tablespace4ORDER BY sys_tablespace_size(oid) DESC;1SELECT schemaname,2 relname AS table_name,3 n_live_tup,4 n_dead_tup5FROM sys_stat_user_tables6ORDER BY n_live_tup DESC7LIMIT 20;1df -h /data/kingbase2df -i /data/kingbase3du -sh /data/kingbase/*1SELECT schemaname,2 relname,3 last_vacuum,4 last_autovacuum,5 last_analyze,6 last_autoanalyze7FROM sys_stat_user_tables8ORDER BY last_autovacuum NULLS FIRST;1SELECT schemaname,2 relname,3 n_live_tup,4 n_dead_tup,5 round(6 100.0 * n_dead_tup / nullif(n_live_tup + n_dead_tup, 0),7 28 ) AS dead_tuple_percent9FROM sys_stat_user_tables10WHERE n_dead_tup > 011ORDER BY n_dead_tup DESC12LIMIT 20;1ANALYZE VERBOSE public.orders;1VACUUM (VERBOSE, ANALYZE) public.orders;1VACUUM (FULL, VERBOSE, ANALYZE) public.orders;1SELECT pid,2 datname,3 relid::regclass AS table_name,4 phase,5 heap_blks_total,6 heap_blks_scanned,7 heap_blks_vacuumed,8 num_dead_tuples9FROM sys_stat_progress_vacuum;1SELECT schemaname,2 relname AS table_name,3 indexrelname AS index_name,4 idx_scan,5 sys_size_pretty(sys_relation_size(indexrelid)) AS index_size6FROM sys_stat_user_indexes7WHERE idx_scan = 08ORDER BY sys_relation_size(indexrelid) DESC;1SELECT n.nspname AS schema_name,2 c.relname AS index_name,3 i.indisvalid,4 i.indisready5FROM sys_index i6JOIN sys_class c7 ON c.oid = i.indexrelid8JOIN sys_namespace n9 ON n.oid = c.relnamespace10WHERE NOT i.indisvalid11 OR NOT i.indisready;1REINDEX INDEX public.idx_orders_order_no;1REINDEX TABLE public.orders;1SELECT pid,2 datname,3 relid::regclass AS table_name,4 index_relid::regclass AS index_name,5 command,6 phase,7 blocks_total,8 blocks_done,9 tuples_total,10 tuples_done11FROM sys_stat_progress_create_index;1SELECT sys_current_wal_lsn();1SELECT sys_is_in_recovery();1SELECT pid,2 usename,3 application_name,4 client_addr,5 state,6 sync_state,7 sent_lsn,8 write_lsn,9 flush_lsn,10 replay_lsn11FROM sys_stat_replication12ORDER BY application_name;1SELECT application_name,2 client_addr,3 state,4 sync_state,5 sys_size_pretty(6 sys_wal_lsn_diff(sys_current_wal_lsn(), replay_lsn)7 ) AS replay_delay8FROM sys_stat_replication;1SELECT sys_last_wal_receive_lsn() AS receive_lsn,2 sys_last_wal_replay_lsn() AS replay_lsn,3 sys_size_pretty(4 sys_wal_lsn_diff(5 sys_last_wal_receive_lsn(),6 sys_last_wal_replay_lsn()7 )8 ) AS replay_gap;1SELECT sys_last_xact_replay_timestamp() AS last_replay_time,2 now() - sys_last_xact_replay_timestamp() AS replay_time_gap;1SELECT status,2 receive_start_lsn,3 written_lsn,4 flushed_lsn,5 sender_host,6 sender_port,7 conninfo8FROM sys_stat_wal_receiver;1SELECT slot_name,2 slot_type,3 active,4 active_pid,5 restart_lsn,6 confirmed_flush_lsn7FROM sys_replication_slots8ORDER BY slot_name;1SELECT sys_drop_replication_slot('slot_name');1CHECKPOINT;2SELECT sys_switch_wal();1\du+1SELECT rolname,2 rolsuper,3 rolcreatedb,4 rolcreaterole,5 rolcanlogin,6 rolconnlimit,7 rolvaliduntil8FROM sys_roles9ORDER BY rolname;1CREATE USER app_user2WITH PASSWORD 'Replace_With_Strong_Password'3LOGIN;1ALTER USER app_user2WITH PASSWORD 'Replace_With_New_Strong_Password';1ALTER USER app_user2VALID UNTIL '2027-12-31 23:59:59';1ALTER ROLE app_user2CONNECTION LIMIT 50;1GRANT CONNECT2ON DATABASE appdb3TO app_user;1GRANT USAGE2ON SCHEMA app3TO app_user;1GRANT SELECT, INSERT, UPDATE, DELETE2ON ALL TABLES IN SCHEMA app3TO app_user;1ALTER DEFAULT PRIVILEGES2IN SCHEMA app3GRANT SELECT, INSERT, UPDATE, DELETE4ON TABLES5TO app_user;1SELECT grantee,2 table_schema,3 table_name,4 privilege_type5FROM information_schema.role_table_grants6WHERE table_schema = 'app'7ORDER BY grantee, table_name, privilege_type;1sys_isready -h 192.168.10.10 -p 54321 -d test1sys_dump -h 192.168.10.10 -p 54321 -U system \2 -d appdb -F c -f /backup/appdb_20260724.dump1sys_dump -h 192.168.10.10 -p 54321 -U system \2 -d appdb -n app -F c -f /backup/app_schema.dump1sys_dump -h 192.168.10.10 -p 54321 -U system \2 -d appdb -t app.orders -F c -f /backup/orders.dump1sys_restore -l /backup/appdb_20260724.dump1sys_restore -h 192.168.10.10 -p 54321 -U system \2 -d appdb_restore -j 4 /backup/appdb_20260724.dump1sys_basebackup -h 192.168.10.10 -p 54321 \2 -U esrep -D /backup/basebackup \3 -Fp -Xs -P -R1sys_rman \2 --config=/home/kingbase/kbbr_repo/sys_rman.conf \3 --stanza=kingbase info1repmgr cluster show1sys_monitor.sh status2sys_monitor.sh start3sys_monitor.sh stop