运维管理19 分钟阅读
openGauss 运维命令 100 条
openGauss 的运维方式既保留了 PostgreSQL 体系中常见的 SQL 和系统视图,也提供了 gsom、gsctl、gsguc、gscheck、gsdump 等专用工具。
2026年7月28日阅读—点赞—收藏—
dba100opengauss墨力计划
在知识库中专注阅读,并随时返回相关工具与课程
openGauss 的运维方式既保留了 PostgreSQL 体系中常见的 SQL 和系统视图,也提供了 gsom、gsctl、gsguc、gscheck、gsdump 等专用工具。
openGauss 的运维方式既保留了 PostgreSQL 体系中常见的 SQL 和系统视图,也提供了 gs_om、gs_ctl、gs_guc、gs_check、gs_dump 等专用工具。
对于 DBA 来说,真正需要掌握的不是零散地记住几个工具名称,而是在实例启动失败、连接数升高、锁等待、慢 SQL、空间增长、主备延迟和备份恢复等场景下,快速找到正确的检查入口。
下面整理了 openGauss DBA 日常使用频率较高的 100 条命令,覆盖连接与实例、数据库对象、参数配置、会话与锁、SQL 性能、空间管理、用户权限、备份恢复、主备管理和故障诊断等场景。

本文以 openGauss 社区版常用功能为基础。不同版本、单机与主备部署、企业版与轻量版之间可能存在差异,执行前应先确认数据库版本和部署架构。文中的数据库名、用户名、IP、端口、目录和对象名均为示例。
涉及停库、切换、重建备库、终止会话、删除对象和恢复覆盖等操作时,应先确认影响范围,并提前做好备份。
1gsql -d postgres -p 5432远程连接可以执行:
1gsql -d appdb -h 192.168.1.10 -p 5432 -U appuser -W-W 表示交互式输入密码,避免密码直接出现在 Shell 历史记录中。
1SELECT version();也可以在操作系统中查看客户端工具版本:
1gsql --version1SELECT current_database();1SELECT2 current_user,3 session_user;session_user 是最初建立连接的用户,current_user 可能因角色切换而发生变化。
1SELECT2 inet_server_addr(),3 inet_server_port();在 VIP、负载均衡或主备环境中,可以用它确认当前连接到了哪个节点。
1SELECT2 inet_client_addr(),3 inet_client_port();1SELECT2 pg_postmaster_start_time(),3 now() - pg_postmaster_start_time() AS uptime;1SELECT2 now(),3 current_setting('TimeZone') AS timezone;1SHOW data_directory;也可以在服务器上检查环境变量:
1echo "$PGDATA"1ps -ef | grep '[g]aussdb'该命令可以确认 gaussdb 进程是否存在,以及实例使用的数据目录和启动参数。
1SELECT2 datname,3 datdba::regrole AS owner,4 encoding,5 datallowconn6FROM pg_database7ORDER BY datname;在 gsql 中也可以执行:
1\l1CREATE DATABASE appdb2 WITH OWNER = appuser3 ENCODING = 'UTF8';1ALTER DATABASE appdb OWNER TO dba_user;1ALTER DATABASE appdb ALLOW_CONNECTIONS false;恢复连接:
1ALTER DATABASE appdb ALLOW_CONNECTIONS true;执行前要确认不会影响正常业务。
1DROP DATABASE appdb;删除数据库不可回退,必须确认备份有效,并先清理连接。
1SELECT2 nspname AS schema_name,3 nspowner::regrole AS owner4FROM pg_namespace5ORDER BY nspname;1CREATE SCHEMA app AUTHORIZATION appuser;1SELECT2 schemaname,3 tablename,4 tableowner5FROM pg_tables6WHERE schemaname NOT IN ('pg_catalog', 'information_schema')7ORDER BY schemaname, tablename;1SELECT2 schemaname,3 viewname,4 viewowner5FROM pg_views6WHERE schemaname NOT IN ('pg_catalog', 'information_schema')7ORDER BY schemaname, viewname;在 gsql 中执行:
1\d+ app.orders查看当前模式下的对象:
1\dt+1SHOW max_connections;1SELECT2 name,3 setting,4 unit,5 context,6 pending_restart7FROM pg_settings8ORDER BY name;1SELECT2 name,3 setting,4 boot_val,5 reset_val,6 context7FROM pg_settings8WHERE setting IS DISTINCT FROM boot_val9ORDER BY name;1SHOW config_file;同时查看客户端认证文件:
1SHOW hba_file;1gs_guc set -D "$PGDATA" -c "max_connections=1000"该命令修改配置文件。参数是否需要重启,应结合 pg_settings.context 判断。
1gs_guc set -N all -I all -c "log_min_duration_statement=3000"集群环境中应使用实际节点范围,执行后检查每个实例是否修改成功。
1gs_guc set -D "$PGDATA" \2 -h "host appdb appuser 192.168.1.0/24 sha256"开放网段前应遵循最小权限原则,避免配置过大的地址范围。
1gs_guc check -D "$PGDATA" -c "max_connections"集群范围检查:
1gs_guc check -N all -I all -c "max_connections"1SELECT pg_reload_conf();也可以执行:
1gs_ctl reload -D "$PGDATA"只有支持 reload 的参数才能在不重启实例的情况下生效。
1SET statement_timeout = '30min';恢复默认值:
1RESET statement_timeout;该方式只影响当前会话。
1SELECT count(*) AS connection_count2FROM pg_stat_activity;1SELECT2 datname,3 usename,4 state,5 count(*) AS sessions6FROM pg_stat_activity7GROUP BY datname, usename, state8ORDER BY sessions DESC;1SELECT2 pid,3 usename,4 datname,5 client_addr,6 state,7 query_start,8 query9FROM pg_stat_activity10WHERE state <> 'idle'11ORDER BY query_start;1SELECT2 pid,3 usename,4 client_addr,5 now() - query_start AS running_time,6 query7FROM pg_stat_activity8WHERE state = 'active'9 AND query_start IS NOT NULL10ORDER BY running_time DESC;1SELECT2 pid,3 usename,4 client_addr,5 now() - xact_start AS transaction_time,6 state,7 query8FROM pg_stat_activity9WHERE xact_start IS NOT NULL10ORDER BY transaction_time DESC;1SELECT2 pid,3 usename,4 client_addr,5 now() - xact_start AS transaction_time,6 query7FROM pg_stat_activity8WHERE state = 'idle in transaction'9ORDER BY xact_start;空闲事务可能长期占用锁并阻止垃圾版本回收。
1SELECT2 pid,3 locktype,4 mode,5 relation::regclass AS relation_name,6 granted7FROM pg_locks8ORDER BY granted, pid;1SELECT2 blocked.pid AS blocked_pid,3 blocked.query AS blocked_query,4 blocker.pid AS blocker_pid,5 blocker.query AS blocker_query6FROM pg_stat_activity blocked7JOIN pg_locks blocked_lock8 ON blocked.pid = blocked_lock.pid9 AND NOT blocked_lock.granted10JOIN pg_locks blocker_lock11 ON blocker_lock.granted12 AND blocker_lock.locktype = blocked_lock.locktype13 AND blocker_lock.database IS NOT DISTINCT FROM blocked_lock.database14 AND blocker_lock.relation IS NOT DISTINCT FROM blocked_lock.relation15 AND blocker_lock.page IS NOT DISTINCT FROM blocked_lock.page16 AND blocker_lock.tuple IS NOT DISTINCT FROM blocked_lock.tuple17 AND blocker_lock.transactionid IS NOT DISTINCT FROM blocked_lock.transactionid18JOIN pg_stat_activity blocker19 ON blocker.pid = blocker_lock.pid20WHERE blocker.pid <> blocked.pid;1SELECT pg_cancel_backend(12345);该操作尝试取消当前 SQL,但保留数据库连接。
1SELECT pg_terminate_backend(12345);终止会话会回滚未提交事务。执行前应确认 PID、用户、客户端和业务影响。
1EXPLAIN2SELECT *3FROM app.orders4WHERE customer_id = 1001;1EXPLAIN (ANALYZE, BUFFERS, VERBOSE)2SELECT *3FROM app.orders4WHERE customer_id = 1001;ANALYZE 会真正执行 SQL。对于 UPDATE、DELETE、INSERT 和高开销查询,应在测试环境验证,或放在可回滚事务中谨慎执行。
1SELECT2 schemaname,3 relname,4 seq_scan,5 seq_tup_read,6 idx_scan,7 n_live_tup,8 n_dead_tup9FROM pg_stat_user_tables10ORDER BY seq_tup_read DESC;1SELECT2 schemaname,3 relname,4 indexrelname,5 idx_scan,6 idx_tup_read,7 idx_tup_fetch8FROM pg_stat_user_indexes9ORDER BY idx_scan;idx_scan = 0 不能直接证明索引无用,还要结合统计信息重置时间和业务周期判断。
1SELECT2 schemaname,3 relname,4 indexrelname,5 pg_size_pretty(pg_relation_size(indexrelid)) AS index_size,6 idx_scan7FROM pg_stat_user_indexes8WHERE idx_scan = 09ORDER BY pg_relation_size(indexrelid) DESC;1ANALYZE app.orders;对表执行清理并收集统计信息:
1VACUUM ANALYZE app.orders;1SELECT2 schemaname,3 relname,4 last_vacuum,5 last_autovacuum,6 last_analyze,7 last_autoanalyze8FROM pg_stat_user_tables9ORDER BY relname;1SELECT2 schemaname,3 relname,4 n_live_tup,5 n_dead_tup,6 CASE7 WHEN n_live_tup + n_dead_tup = 0 THEN 08 ELSE round(n_dead_tup * 100.0 /9 (n_live_tup + n_dead_tup), 2)10 END AS dead_tuple_pct11FROM pg_stat_user_tables12ORDER BY dead_tuple_pct DESC;1SELECT2 datname,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_deleted12FROM pg_stat_database13ORDER BY datname;1SELECT pg_stat_reset();重置后索引使用次数、表扫描等累计统计会从零开始。生产环境执行前应确认监控和分析是否依赖这些数据。
1SELECT2 datname,3 pg_size_pretty(pg_database_size(datname)) AS database_size4FROM pg_database5WHERE datallowconn6ORDER BY pg_database_size(datname) DESC;1SELECT pg_size_pretty(pg_database_size(current_database()));1SELECT2 n.nspname AS schema_name,3 pg_size_pretty(SUM(pg_total_relation_size(c.oid))) AS total_size4FROM pg_class c5JOIN pg_namespace n ON n.oid = c.relnamespace6WHERE c.relkind IN ('r', 'm')7 AND n.nspname NOT IN ('pg_catalog', 'information_schema')8GROUP BY n.nspname9ORDER BY SUM(pg_total_relation_size(c.oid)) DESC;1SELECT2 schemaname,3 relname,4 pg_size_pretty(pg_total_relation_size(relid)) AS total_size,5 pg_size_pretty(pg_relation_size(relid)) AS table_size6FROM pg_stat_user_tables7ORDER BY pg_total_relation_size(relid) DESC8LIMIT 20;1SELECT2 pg_size_pretty(pg_relation_size('app.orders')) AS table_size,3 pg_size_pretty(pg_indexes_size('app.orders')) AS indexes_size,4 pg_size_pretty(pg_total_relation_size('app.orders')) AS total_size;1SELECT2 spcname,3 spcowner::regrole AS owner,4 pg_tablespace_location(oid) AS location,5 pg_size_pretty(pg_tablespace_size(oid)) AS size6FROM pg_tablespace7ORDER BY spcname;1CREATE TABLESPACE app_ts2 OWNER appuser3 LOCATION '/data/opengauss/app_ts';目录应提前创建,并授权给数据库运行用户。
1SELECT2 schemaname,3 tablename,4 indexname,5 indexdef6FROM pg_indexes7WHERE schemaname = 'app'8 AND tablename = 'orders'9ORDER BY indexname;1REINDEX TABLE app.orders;重建单个索引:
1REINDEX INDEX app.idx_orders_customer;重建期间可能持有较强锁,生产环境应评估执行窗口。
1VACUUM FULL app.orders;VACUUM FULL 会重写表并持有排他锁,不适合在业务高峰期直接执行。
1SELECT2 usename,3 usesuper,4 usecreatedb,5 valbegin,6 valuntil7FROM pg_user8ORDER BY usename;1SELECT2 rolname,3 rolsuper,4 rolcreaterole,5 rolcreatedb,6 rolcanlogin,7 rolconnlimit8FROM pg_roles9ORDER BY rolname;1CREATE USER appuser2 IDENTIFIED BY 'Replace_With_Strong_Password';生产环境应使用符合安全规范的复杂密码,并避免把真实密码写入脚本和文章。
1ALTER USER appuser2 IDENTIFIED BY 'Replace_With_New_Strong_Password';1ALTER USER appuser ACCOUNT LOCK;解锁:
1ALTER USER appuser ACCOUNT UNLOCK;1ALTER ROLE appuser CONNECTION LIMIT 50;-1 表示不限制,但仍受数据库总连接参数控制。
1GRANT CONNECT ON DATABASE appdb TO appuser;1GRANT USAGE ON SCHEMA app TO appuser;如果需要在模式中创建对象:
1GRANT CREATE ON SCHEMA app TO appuser;1GRANT SELECT, INSERT, UPDATE, DELETE2ON TABLE app.orders3TO appuser;授予模式中现有表的只读权限:
1GRANT SELECT ON ALL TABLES IN SCHEMA app TO readonly_role;1REVOKE INSERT, UPDATE, DELETE2ON TABLE app.orders3FROM appuser;回收权限前应确认用户是否通过其他角色间接获得相同权限。
1gs_dump -h 192.168.1.10 -p 5432 -U backup_user \2 -F c -f /backup/appdb.dump appdb自定义格式便于后续使用 gs_restore 选择性恢复。
1gs_dump -h 192.168.1.10 -p 5432 -U backup_user \2 -F p -f /backup/appdb.sql appdb1gs_dump -h 192.168.1.10 -p 5432 -U backup_user \2 -s -f /backup/appdb_schema.sql appdb1gs_dump -h 192.168.1.10 -p 5432 -U backup_user \2 -a -F c -f /backup/appdb_data.dump appdb1gs_dump -h 192.168.1.10 -p 5432 -U backup_user \2 -n app -F c -f /backup/app_schema.dump appdb1gs_dump -h 192.168.1.10 -p 5432 -U backup_user \2 -t app.orders -F c -f /backup/orders.dump appdb1gs_dumpall -h 192.168.1.10 -p 5432 -U backup_user \2 -f /backup/all_databases.sql全局备份通常包括用户、角色、表空间定义和数据库对象,恢复前应检查目标环境差异。
1gs_restore -h 192.168.1.10 -p 5432 -U restore_user \2 -d appdb /backup/appdb.dump1gs_restore -h 192.168.1.10 -p 5432 -U restore_user \2 -d appdb -j 4 /backup/appdb.dump并行度应结合 CPU、磁盘能力和业务负载设置。
1gsql -h 192.168.1.10 -p 5432 -U restore_user \2 -d appdb -f /backup/appdb.sql恢复完成后应校验报错日志、对象数量、表行数、约束、索引和统计信息。
1gs_om -t status --detail重点确认节点角色、实例状态和主备关系是否正常。
1gs_om -t start1gs_om -t stop停库前应确认业务已经停止、事务已处理,并按变更流程执行。
1gs_om -t restart1gs_ctl status -D "$PGDATA"1gs_ctl start -D "$PGDATA" -l "$GAUSSLOG/gaussdb-start.log"1gs_ctl stop -D "$PGDATA" -m fastfast 会断开客户端并回滚活动事务。immediate 属于强制关闭,下一次启动需要进行故障恢复。
1gs_ctl query -D "$PGDATA"该命令可查看本地角色、连接状态、发送与接收位置等主备信息。
在待升主的备节点执行:
1gs_ctl switchover -D "$PGDATA" -m fast切换前必须确认主备同步正常、复制无异常,并检查业务连接方式。
1gs_ctl build -D "$PGDATA" -b auto查看重建进度:
1gs_ctl querybuild -D "$PGDATA"重建会覆盖备节点数据目录,必须确认目标节点和数据目录准确无误。
1gs_check -i CheckClusterState也可以根据实际需求选择检查项或检查场景。
1gs_checkos -i A用于检查操作系统参数、磁盘、网络和相关环境配置。不同版本支持的检查项可能不同,可先执行 gs_checkos -? 查看帮助。
1gs_checkperf该工具可以检查主机、节点、会话、进程和 I/O 等性能信息。
1gs_collector --begin-time="20260726 10:00" \2 --end-time="20260726 11:00"具体参数应以当前版本 gs_collector --help 为准。收集包可能包含日志、配置和主机信息,对外发送前应进行脱敏。
1gs_ssh -c "date; hostname; uptime"批量执行前应确保命令安全,避免在所有节点同时执行高风险或高负载操作。
1echo "$GAUSSLOG"查找近期错误:
1grep -RniE "ERROR|FATAL|PANIC" "$GAUSSLOG" | tail -1001ss -lntp | grep 5432如果系统没有 ss,可以使用:
1netstat -lntp | grep 54321uptime2free -m3top数据库卡顿时不能只看瞬时 CPU,还要结合负载、内存、交换区、I/O 和数据库等待一起分析。
1df -h2df -i3iostat -x 1 5重点关注数据目录、日志目录、备份目录的空间、inode 和磁盘延迟。
1gs_om -V2gs_ctl --version3gs_dump --version4gs_restore --version查看命令帮助:
1gs_om -?2gs_ctl --help3gs_dump --help当文章示例与现场环境不一致时,应以当前安装版本自带的帮助信息和对应版本官方文档为准。
这 100 条命令覆盖了 openGauss DBA 日常运维中常见的检查入口,但真正的运维能力并不是把命令复制到服务器上执行,而是先判断当前环境属于单机、主备还是集群,确认版本、节点角色和业务影响,再选择合适的命令。
尤其是实例启停、主备切换、备库重建、会话终止、VACUUM FULL 和恢复覆盖等操作,都不应该脱离现场环境直接照搬。
建议将这些命令整理成自己的巡检模板,并在测试环境中逐条验证。等真正遇到连接暴增、锁等待、SQL 变慢、空间告警或主备异常时,才能更快地从现象定位到原因。