运维管理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 均为示例,涉及终止会话、删除对象、切换主备和恢复覆盖的操作,必须先确认影响范围。
1ksql -h 192.168.10.10 -p 54321 -U system -d test生产环境不建议在命令行中直接填写密码,避免密码出现在 Shell 历史记录和进程列表中。
1ksql -d test能否免密连接取决于 sys_hba.conf 中的认证配置和当前操作系统用户。
1SELECT version();也可以只查看服务端版本号:
1SHOW server_version;1SELECT current_database(),2 current_user,3 session_user;session_user 是最初建立连接的用户,current_user 可能因 SET ROLE 发生变化。
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;在 VIP、读写分离和多节点环境中,可以用它确认当前实际连接到了哪台数据库。
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;pending_restart = true 表示参数已经修改,但需要重启实例后才能生效。
1sys_ctl start -D /data/kingbase2sys_ctl stop -D /data/kingbase -m fast3sys_ctl restart -D /data/kingbase -m fast生产环境通常使用 fast 模式正常关闭。不要在没有评估影响的情况下直接使用 immediate。
1\lSQL 方式:
1SELECT datname,2 datdba::regrole AS owner,3 encoding,4 datcollate,5 datctype,6 datallowconn7FROM sys_database8ORDER BY datname;1\dnSQL 方式:
1SELECT schema_name,2 schema_owner3FROM information_schema.schemata4ORDER BY schema_name;1SHOW search_path;search_path 决定没有显式指定 Schema 时,数据库按照什么顺序查找对象。
1\dt public.*SQL 方式:
1SELECT schemaname,2 tablename,3 tableowner4FROM sys_tables5WHERE schemaname = 'public'6ORDER BY tablename;1\d+ public.orders\d+ 可以查看字段、索引、约束、存储参数和部分空间信息。
1\dv2\dmSQL 方式查看普通视图:
1SELECT 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;contype 常见值包括主键、外键、唯一约束和检查约束。
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;时间阈值应根据业务特点调整,不能只凭执行时间判断 SQL 是否异常。
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);该命令只取消当前 SQL,通常不会直接断开数据库连接。
1SELECT sys_terminate_backend(12345);该操作会断开会话并回滚未提交事务。生产执行前必须确认 PID、用户、客户端和事务影响。
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;剩余连接数很少时,还应检查是否存在连接池泄漏、异常重连或大量 idle 会话。
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;最老事务通常是排查 Vacuum 无法回收、表膨胀和事务号风险的重要入口。
1SET lock_timeout = '10s';设置后,当前会话等待锁超过 10 秒会报错退出,适合变更脚本防止无限等待。
1EXPLAIN2SELECT *3FROM public.orders4WHERE order_no = 'A10001';EXPLAIN 只生成执行计划,不会真正执行 SQL。
1EXPLAIN (ANALYZE, BUFFERS, VERBOSE)2SELECT *3FROM public.orders4WHERE order_no = 'A10001';ANALYZE 会真正执行 SQL。对 UPDATE、DELETE、INSERT 和超大查询使用前必须谨慎。
1SELECT extname,2 extversion3FROM sys_extension4WHERE extname = 'sys_stat_statements';KingbaseES V8R6 中该组件通常已经内置,但默认统计开关仍需结合实际参数确认。
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;不同补丁版本的耗时字段可能略有差异,执行前可先使用 \d+ sys_stat_statements 查看结构。
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;增加调用次数条件,可以避免只执行一次的偶发 SQL 干扰判断。
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;物理读和临时块读写较高,通常需要继续检查索引、执行计划、排序和 Hash 操作。
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;临时文件持续增长通常与大排序、Hash 聚合、Hash Join 或 work_mem 不足有关。
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+SQL 方式:
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;n_live_tup 和 n_dead_tup 都是统计估算值,不等于精确 COUNT(*)。
1df -h /data/kingbase2df -i /data/kingbase3du -sh /data/kingbase/*除了容量,还要检查 inode 是否耗尽。不要在高峰期对超大目录频繁执行深度 du。
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;普通 Vacuum 主要回收可复用空间,通常不会把表文件直接缩小。
1VACUUM (FULL, VERBOSE, ANALYZE) public.orders;VACUUM FULL 会重写表并持有较强锁,大表执行时间长,必须安排维护窗口。
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;索引扫描次数为 0 不代表一定可以删除,还要考虑统计重置时间、主键约束和低频业务。
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();该命令应在主库执行,用于查看当前 WAL 写入位置。
1SELECT sys_is_in_recovery();返回 false 通常表示主库,返回 true 通常表示备库正在恢复或回放 WAL。
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;字节差只能说明 WAL 位置差距,还应结合时间延迟、网络和回放状态综合判断。
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;不再使用但仍保留的复制槽可能阻止 WAL 清理,最终导致磁盘空间持续增长。
1SELECT sys_drop_replication_slot('slot_name');删除前必须确认没有备库、订阅端或同步程序继续依赖该复制槽。
1CHECKPOINT;2SELECT sys_switch_wal();检查点和强制切换 WAL 会增加 I/O 或产生新的 WAL 文件,不应作为日常“清理日志”的手段频繁执行。
1\du+SQL 方式:
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 test适合用于监控探测、启动脚本和故障切换前的连通性检查。
1sys_dump -h 192.168.10.10 -p 54321 -U system \2 -d appdb -F c -f /backup/appdb_20260724.dump自定义格式便于使用 sys_restore 进行选择性恢复和并行恢复。
1sys_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.dump对分区表执行前,应确认当前版本是否会自动包含所有分区。
1sys_restore -l /backup/appdb_20260724.dump恢复前先检查备份文件内容,可以避免选错数据库、模式或对象。
1sys_restore -h 192.168.10.10 -p 54321 -U system \2 -d appdb_restore -j 4 /backup/appdb_20260724.dump-j 4 表示使用 4 个并行任务,实际并行度应结合 CPU、I/O 和业务负载确定。
1sys_basebackup -h 192.168.10.10 -p 54321 \2 -U esrep -D /backup/basebackup \3 -Fp -Xs -P -R该命令需要复制用户和相应权限,备份目录应为空,并提前确认空间是否充足。
1sys_rman \2 --config=/home/kingbase/kbbr_repo/sys_rman.conf \3 --stanza=kingbase info重点检查完整备份、差异备份、增量备份、归档范围和备份状态。
1repmgr cluster show应重点关注节点角色、运行状态、上游节点和复制状态。实际执行时建议使用安装目录下的绝对路径。
1sys_monitor.sh status2sys_monitor.sh start3sys_monitor.sh stop集群环境应通过对应版本的集群管理脚本统一操作,不要在不了解集群状态的情况下分别手工启停各节点数据库。
这 100 条命令基本覆盖了金仓 DBA 日常巡检和故障排查中最常见的入口,但真正的生产运维不能只靠背命令。
遇到问题时,建议始终按照“确认环境和节点角色、观察现象、检查会话与等待、定位阻塞或 SQL、评估影响、执行处理、验证恢复”的顺序进行。特别是 sys_terminate_backend、VACUUM FULL、删除复制槽、主备切换和备份恢复等操作,执行前必须确认业务影响并保留回退方案。
另外,KingbaseES 不同 V8 补丁版本、兼容模式和高可用部署方式之间可能存在差异。现场执行时,应以当前环境的 version() 返回结果、系统视图结构、工具帮助信息以及对应版本的官方文档为准,不能把其他数据库或其他版本的命令直接照搬到生产环境。
更多 Oracle、MySQL、PostgreSQL、MongoDB 实战内容,可以访问 DBA 学习平台:ora100.com