连接数据库
▶
本地连接(默认端口5432)
gsql -d postgres -p 5432
指定用户/库/端口连接
gsql -d <db_name> -U <user> -p <port> -W <password>
远程连接(-h 指定IP)
gsql -h <ip> -d <db_name> -U <user> -p <port> -W
指定库名进入 gsql 交互模式
gsql -d <db_name> -p <port> -r
-r 开启 readline 支持,支持方向键编辑历史命令
执行单条SQL后返回
gsql -d <db_name> -p <port> -c "SELECT version();"
执行SQL文件
gsql -d <db_name> -p <port> -f /path/to/script.sql
gsql 内部常用元命令
\l -- 列出所有数据库
\dn -- 列出所有schema
\dt -- 列出当前库所有表
\d <table> -- 查看表结构
\du -- 列出所有用户/角色
\dx -- 列出已安装扩展
\conninfo -- 查看当前连接信息
\x -- 切换扩展显示模式(宽表友好)
\timing -- 开启SQL执行计时
\q -- 退出 gsql
集群与实例状态
▶
查看集群状态(OM方式)最常用
gs_om -t status --detail
查看集群简要状态
gs_om -t status
CM集群状态查询(含主备角色)CM模式
cm_ctl query -Cvdi
参数说明:-C 集群状态 -v 详细信息 -d 数据目录 -i 实例信息
查看主备角色
cm_ctl query -Cvip
查看单个实例状态
gs_ctl status -D <GAUSSDATA>/dn1
启动实例
gs_ctl start -D <GAUSSDATA>/dn1
停止实例
gs_ctl stop -D <GAUSSDATA>/dn1
重启实例
gs_ctl restart -D <GAUSSDATA>/dn1
查看数据库版本
gsql -d postgres -p <port> -c "SELECT version();"
查看数据库运行模式(主/备/级联备)
gsql -d postgres -p <port> -c "SELECT local_role, static_connect, state FROM pg_stat_replication;"
查看数据库是否处于恢复状态
gsql -d postgres -p <port> -c "SELECT pg_is_in_recovery();"
查看所有节点信息(OM)
gs_om -t status --all
会话管理
▶
查看当前所有活动会话最常用
SELECT pid, usename, datname, client_addr, state, query, query_start, state_change
FROM pg_stat_activity
WHERE state <> 'idle'
ORDER BY query_start;
查看所有会话(含空闲)
SELECT pid, usename, datname, client_addr, state, query, query_start, backend_start
FROM pg_stat_activity
ORDER BY backend_start;
查看当前连接数
SELECT count(*) FROM pg_stat_activity;
按用户统计连接数
SELECT usename, count(*) as cnt
FROM pg_stat_activity
GROUP BY usename
ORDER BY cnt DESC;
按数据库统计连接数
SELECT datname, count(*) as cnt
FROM pg_stat_activity
GROUP BY datname
ORDER BY cnt DESC;
查看最大连接数设置
SHOW max_connections;
查看长时间运行的会话(超过5分钟)
SELECT pid, usename, datname, query, now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'active'
AND now() - query_start > interval '5 min'
ORDER BY duration DESC;
终止指定会话谨慎操作
SELECT pg_terminate_backend(<pid>);
将 <pid> 替换为实际会话PID,可从 pg_stat_activity 获取
取消指定会话的当前查询(不断开连接)
SELECT pg_cancel_backend(<pid>);
批量终止某用户的所有会话高危
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE usename = '<username>'
AND pid <> pg_backend_pid();
查看空闲会话(长时间无活动)
SELECT pid, usename, datname, client_addr, state,
now() - state_change AS idle_duration
FROM pg_stat_activity
WHERE state = 'idle'
AND now() - state_change > interval '30 min'
ORDER BY idle_duration DESC;
查看某条SQL的执行计划(实时)
EXPLAIN (ANALYZE, BUFFERS) <SQL语句>;
性能排查
▶
查看当前正在执行的SQL最常用
SELECT pid, usename, datname, query, query_start,
now() - query_start AS exec_time
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY exec_time DESC;
查看慢SQL(需开启 log_min_duration_statement)
-- 查看慢SQL配置
SHOW log_min_duration_statement;
-- 设置慢SQL阈值(如超过3秒记录)
ALTER SYSTEM SET log_min_duration_statement = 3000;
查看TOP 10 耗时SQL(历史)
SELECT query, calls, total_time, mean_time, rows,
round((total_time / sum(total_time) OVER ()) * 100, 2) AS pct
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
需安装 pg_stat_statements 扩展:CREATE EXTENSION pg_stat_statements;
查看数据库缓存命中率
SELECT datname,
round(blks_hit::numeric / (blks_hit + blks_read) * 100, 2) AS hit_ratio_pct
FROM pg_stat_database
WHERE blks_hit + blks_read > 0
ORDER BY hit_ratio_pct;
查看表大小排序(Top 20)
SELECT schemaname, relname,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
pg_size_pretty(pg_relation_size(relid)) AS table_size,
pg_size_pretty(pg_indexes_size(relid)) AS index_size
FROM pg_stat_all_tables
WHERE schemaname NOT IN ('pg_catalog','pg_toast','information_schema')
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 20;
查看索引使用情况(未使用的索引)
SELECT schemaname, relname, indexrelname,
idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_all_indexes
WHERE schemaname NOT IN ('pg_catalog','pg_toast','information_schema')
AND idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;
查看表的死元组比例(需VACUUM)
SELECT schemaname, relname,
n_live_tup, n_dead_tup,
round(n_dead_tup::numeric / NULLIF(n_live_tup,0) * 100, 2) AS dead_pct,
last_vacuum, last_autovacuum
FROM pg_stat_all_tables
WHERE n_dead_tup > 0
AND schemaname NOT IN ('pg_catalog','pg_toast','information_schema')
ORDER BY dead_pct DESC;
手动VACUUM ANALYZE 指定表
VACUUM ANALYZE <schema>.<table>;
查看当前事务信息
-- 查看当前事务ID
SELECT txid_current();
-- 查看活跃事务(长事务排查)
SELECT pid, usename, xact_start, query,
now() - xact_start AS xact_duration
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
ORDER BY xact_start;
查看autovacuum运行状态
SELECT pid, datname, usename, query, query_start
FROM pg_stat_activity
WHERE query LIKE '%autovacuum%'
AND state = 'active';
查看数据库整体性能指标
SELECT datname, numbackends, xact_commit, xact_rollback,
blks_read, blks_hit, tup_returned, tup_fetched, tup_inserted,
tup_updated, tup_deleted, conflicts, temp_files, temp_bytes,
deadlocks
FROM pg_stat_database
WHERE datname IS NOT NULL
ORDER BY numbackends DESC;
检查是否存在全表扫描的高频SQL
SELECT schemaname, relname, seq_scan, seq_tup_read,
idx_scan, idx_tup_fetch,
CASE WHEN seq_scan > 0 THEN round(seq_tup_read::numeric / seq_scan, 0) ELSE 0 END AS avg_seq_tup
FROM pg_stat_all_tables
WHERE schemaname NOT IN ('pg_catalog','pg_toast','information_schema')
AND seq_scan > 100
ORDER BY avg_seq_tup DESC
LIMIT 20;
锁与等待分析
▶
查看当前锁等待链最常用
SELECT t1.pid AS blocked_pid,
t1.usename AS blocked_user,
t1.query AS blocked_query,
t2.pid AS blocking_pid,
t2.usename AS blocking_user,
t2.query AS blocking_query,
now() - t1.query_start AS blocked_duration
FROM pg_stat_activity t1
JOIN pg_stat_activity t2
ON t2.pid = ANY (pg_blocking_pids(t1.pid))
WHERE t1.state = 'active';
查看所有锁信息
SELECT locktype, relation::regclass, mode, granted, pid,
transactionid, virtualtransaction
FROM pg_locks
ORDER BY granted, relation;
查看未授予的锁(被阻塞的锁请求)
SELECT locktype, relation::regclass, mode, pid, transactionid,
(SELECT query FROM pg_stat_activity WHERE pid = l.pid) AS query
FROM pg_locks l
WHERE granted = false;
查看锁等待关系图(阻塞源→被阻塞)
SELECT
waiting.locktype AS waiting_locktype,
waiting.relation::regclass AS waiting_table,
waiting.mode AS waiting_mode,
waiting.pid AS waiting_pid,
active.mode AS holding_mode,
active.pid AS holding_pid,
(SELECT query FROM pg_stat_activity WHERE pid = waiting.pid) AS waiting_query,
(SELECT query FROM pg_stat_activity WHERE pid = active.pid) AS holding_query
FROM pg_locks waiting
JOIN pg_locks active
ON waiting.relation = active.relation
AND waiting.granted = false
AND active.granted = true
AND waiting.pid <> active.pid;
按表统计锁竞争
SELECT relation::regclass AS table_name,
mode, granted, count(*) AS lock_count
FROM pg_locks
WHERE relation IS NOT NULL
GROUP BY relation, mode, granted
ORDER BY lock_count DESC;
查看死锁日志(检查 pg_log)
-- 在数据库日志目录中搜索 deadlock
grep -i "deadlock" $GAUSSLOG/pg_log/*.log | tail -50
查看是否有死锁记录
SELECT datname, deadlocks FROM pg_stat_database WHERE deadlocks > 0;
存储空间管理
▶
查看数据库总大小最常用
SELECT datname,
pg_size_pretty(pg_database_size(datname)) AS db_size
FROM pg_database
ORDER BY pg_database_size(datname) DESC;
查看指定表大小(含索引)
SELECT pg_size_pretty(pg_total_relation_size('<schema>.<table>'));
查看表空间使用情况
SELECT spcname,
pg_size_pretty(pg_tablespace_size(oid)) AS tspc_size
FROM pg_tablespace
ORDER BY pg_tablespace_size(oid) DESC;
查看WAL日志大小
-- 查看WAL日志文件大小
SELECT pg_size_pretty(sum(size)) AS wal_size
FROM pg_ls_waldir();
查看WAL日志文件列表
SELECT name, size, modification FROM pg_ls_waldir() ORDER BY modification DESC;
查看WAL相关参数
SHOW wal_level;
SHOW max_wal_size;
SHOW min_wal_size;
SHOW wal_keep_segments;
SHOW checkpoint_segments; -- 旧版
查看当前WAL LSN位置
SELECT pg_current_wal_lsn();
SELECT pg_current_wal_lsn(), pg_walfile_name(pg_current_wal_lsn());
查看磁盘空间(操作系统层)
df -h
查看数据目录占用空间
du -sh <GAUSSDATA>/
查看日志目录空间
du -sh $GAUSSLOG/*
清理旧日志文件
-- 查找7天前的日志文件
find $GAUSSLOG/pg_log/ -name "*.log" -mtime +7 -ls
-- 确认后删除(谨慎操作)
find $GAUSSLOG/pg_log/ -name "*.log" -mtime +7 -delete
主备与复制
▶
查看主备复制状态(主库执行)最常用
SELECT pid, usename, application_name, client_addr,
state, sync_state, sync_priority,
sent_lsn, write_lsn, flush_lsn, replay_lsn,
now() - replay_lsn AS replication_lag
FROM pg_stat_replication;
查看备库接收状态(备库执行)
SELECT status, receive_start_lsn, receive_start_lsn,
received_lsn, last_msg_send_time, last_msg_receipt_time
FROM pg_stat_wal_receiver;
计算主备延迟(字节差)
SELECT application_name, client_addr, state,
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes,
pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)) AS lag_size
FROM pg_stat_replication;
查看同步模式设置
SHOW synchronous_commit;
SHOW synchronous_standby_names;
CM 主备切换高危操作
-- 手动 switchover(主备互换)
cm_ctl switchover -n <node_id> -D <data_dir>
-- failover(主库故障强制切换)
cm_ctl failover -n <node_id> -D <data_dir>
switchover 是正常主备切换(主库正常),failover 是故障切换(主库异常)。切换前确认备库同步状态。
OM 方式主备切换
gs_om -t switch --primary
查看归档状态
-- 查看归档是否开启
SHOW archive_mode;
SHOW archive_command;
-- 查看归档状态
SELECT * FROM pg_stat_archiver;
查看复制槽
SELECT slot_name, plugin, slot_type, database,
active, restart_lsn, xmin
FROM pg_replication_slots;
构建备库(流复制)
gs_ctl build -D <standby_data_dir> -b full
-b full 全量构建;-b incremental 增量构建。构建前确保主库可达且 repl 用户有权限。
查看备库回放进度
-- 备库执行
SELECT pg_last_wal_receive_lsn() AS receive_lsn,
pg_last_wal_replay_lsn() AS replay_lsn,
pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn()) AS lag_bytes;
参数管理
▶
查看参数当前值
SHOW <param_name>;
-- 查看所有参数
SHOW ALL;
查看参数来源(配置文件/默认值/命令行)
SELECT name, setting, unit, source,
minval, maxval, boot_val, resetval
FROM pg_settings
WHERE name LIKE '%<keyword>%'
ORDER BY name;
动态修改参数(会话级)
SET work_mem = '256MB';
动态修改参数(系统级,立即生效)
ALTER SYSTEM SET <param_name> = <value>;
部分参数需要 reload 生效:SELECT pg_reload_conf();
重载配置文件(不重启)
-- gsql 中执行
SELECT pg_reload_conf();
-- 操作系统层
gs_ctl reload -D <GAUSSDATA>/dn1
查看常用核心参数
-- 内存相关
SHOW shared_buffers;
SHOW work_mem;
SHOW maintenance_work_mem;
-- 连接相关
SHOW max_connections;
-- WAL相关
SHOW wal_level;
SHOW max_wal_size;
SHOW wal_keep_segments;
SHOW synchronous_commit;
-- 超时相关
SHOW session_timeout;
SHOW statement_timeout;
SHOW lock_timeout;
-- 日志相关
SHOW log_min_duration_statement;
SHOW logging_collector;
SHOW log_directory;
恢复参数默认值
ALTER SYSTEM RESET <param_name>;
查看参数是否需要重启生效
SELECT name, setting, context
FROM pg_settings
WHERE name = '<param_name>';
-- context = 'postmaster' 表示需要重启
-- context = 'sighup' 表示 reload 即可
-- context = 'user' / 'superuser' 表示即时生效
日志排查
▶
查看日志目录位置
SHOW log_directory;
SHOW data_directory;
查看最新错误日志最常用
-- 查看最近的错误
tail -100 $GAUSSLOG/pg_log/postgresql-$(date +%Y-%m-%d).log | grep -i error
-- 查看所有日志中的 ERROR
grep -n "ERROR" $GAUSSLOG/pg_log/*.log | tail -50
查看最新 FATAL/PANIC 日志
grep -n "FATAL\|PANIC" $GAUSSLOG/pg_log/*.log | tail -20
实时跟踪日志输出
tail -f $GAUSSLOG/pg_log/postgresql-$(date +%Y-%m-%d).log
按时间段过滤日志
-- 查看今天14:00-15:00的日志
grep "2026-08-23 14:" $GAUSSLOG/pg_log/*.log | more
-- 按关键字搜索
grep -i "<关键字>" $GAUSSLOG/pg_log/*.log
查看慢SQL日志
grep "duration:" $GAUSSLOG/pg_log/*.log | sort -t: -k3 -rn | head -20
查看 checkpoint 日志
grep -i "checkpoint" $GAUSSLOG/pg_log/*.log | tail -30
查看连接断开日志
grep -i "connection\|disconnect\|timeout" $GAUSSLOG/pg_log/*.log | tail -30
查看 CM 日志(CM 模式集群)
-- CM server 日志
tail -100 $GAUSSHOME/log/cm/cms/cm_server.log
-- CM agent 日志
tail -100 $GAUSSHOME/log/cm/agent/cm_agent.log
-- 查看集群事件日志
grep -i "switchover\|failover\|restart" $GAUSSHOME/log/cm/cms/cm_server-*.log | tail -20
查看 OM 日志
-- OM 操作日志
ls -lt $GAUSSHOME/log/om/
tail -100 $GAUSSHOME/log/om/gs_om-$(date +%Y-%m-%d).log
查看 gs_ctl 操作日志
tail -100 <GAUSSDATA>/dn1/gs_ctl.log
查看 xlog 日志大小(检查归档堆积)
du -sh <GAUSSDATA>/dn1/pg_xlog/
ls -lhS <GAUSSDATA>/dn1/pg_xlog/ | head -20
备份与恢复
▶
逻辑备份单表
gs_dump -d <db_name> -t <schema>.<table> -f /backup/table.sql -p <port>
逻辑备份整个数据库
gs_dump -d <db_name> -f /backup/db_dump.sql -p <port>
逻辑备份指定格式(自定义/压缩)
-- 自定义格式(支持并行恢复)
gs_dump -d <db_name> -Fc -f /backup/db.dump -p <port>
-- 目录格式(支持并行)
gs_dump -d <db_name> -Fd -f /backup/db_dir -p <port>
-- 压缩级别(0-9)
gs_dump -d <db_name> -Fc -Z6 -f /backup/db.dump -p <port>
并行备份(多线程)
gs_dump -d <db_name> -Fd -j 4 -f /backup/db_dir -p <port>
-j 4 使用4个线程并行备份,大幅提升大库备份速度
逻辑恢复(SQL格式)
gsql -d <db_name> -p <port> -f /backup/db_dump.sql
逻辑恢复(自定义格式)
-- 恢复到指定数据库
gs_restore -d <db_name> -p <port> /backup/db.dump
-- 并行恢复
gs_restore -d <db_name> -p <port> -j 4 /backup/db.dump
-- 仅恢复指定表
gs_restore -d <db_name> -p <port> -t <table> /backup/db.dump
数据导出(gs_dumpall 全集群)
-- 全库备份(含角色和表空间定义)
gs_dumpall -f /backup/all.sql -p <port>
-- 仅导出全局对象(角色、表空间)
gs_dumpall -g -f /backup/globals.sql -p <port>
数据导入(gs_loader)
gs_loader -d <db_name> -p <port> -U <user> -W <password> \
-t <table_name> \
-f /path/to/data.csv \
-c /path/to/control.ctl
需要准备控制文件 .ctl 定义字段映射关系,类似 Oracle SQL*Loader
PITR 时间点恢复(物理备份恢复)
-- 1. 恢复基础备份到数据目录
gs_ctl restore -D <data_dir> -b full
-- 2. 配置恢复目标时间
-- 在 postgresql.conf 或 recovery.conf 中设置
restore_command = 'cp /archive/%f %p'
recovery_target_time = '2026-08-23 14:00:00'
recovery_target_action = 'promote'
-- 3. 启动恢复
gs_ctl start -D <data_dir> -M recovery
查看备份进度
-- 查看正在执行的备份
SELECT pid, usename, query, query_start
FROM pg_stat_activity
WHERE query LIKE '%dump%' OR query LIKE '%backup%';
用户与权限
▶
查看所有用户/角色
SELECT rolname, rolsuper, rolcreaterole, rolcreatedb,
rolcanlogin, rolconnlimit, rolexpire
FROM pg_roles
ORDER BY rolname;
创建用户
CREATE USER <username> PASSWORD '<password>';
修改密码
ALTER USER <username> PASSWORD '<new_password>';
锁定/解锁用户
-- 锁定
ALTER USER <username> ACCOUNT LOCK;
-- 解锁
ALTER USER <username> ACCOUNT UNLOCK;
设置用户连接数限制
ALTER USER <username> CONNECTION LIMIT 10;
设置用户有效期
ALTER USER <username> VALID UNTIL '2026-12-31 23:59:59';
授予权限
-- 授予库权限
GRANT ALL ON DATABASE <db_name> TO <username>;
-- 授予schema权限
GRANT USAGE, CREATE ON SCHEMA <schema> TO <username>;
-- 授予表权限
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA <schema> TO <username>;
-- 授予序列权限
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA <schema> TO <username>;
查看用户的权限
-- 查看用户对表的权限
SELECT grantee, table_schema, table_name, privilege_type
FROM information_schema.table_privileges
WHERE grantee = '<username>'
ORDER BY table_schema, table_name;
查看在线用户会话
SELECT pid, usename, datname, client_addr, state, query_start
FROM pg_stat_activity
WHERE usename = '<username>';
应急处理
▶
数据库无法连接 - 排查步骤
-- 1. 检查数据库是否运行
gs_om -t status
cm_ctl query -Cvdi
-- 2. 检查端口是否监听
netstat -tlnp | grep <port>
ss -tlnp | grep <port>
-- 3. 检查防火墙
iptables -L -n | grep <port>
firewall-cmd --list-ports
-- 4. 检查最大连接数是否已满
gsql -d postgres -p <port> -c "SELECT count(*), max_connections FROM pg_stat_activity, (SELECT setting::int AS max_connections FROM pg_settings WHERE name='max_connections') t;"
-- 5. 检查 pg_hba.conf 是否允许远程连接
cat <GAUSSDATA>/dn1/pg_hba.conf | grep -v "^#" | grep -v "^$"
连接数打满 - 应急处理
-- 1. 查看连接数使用情况
SELECT count(*) AS total, state, usename
FROM pg_stat_activity GROUP BY state, usename;
-- 2. 杀掉空闲会话释放连接
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle'
AND pid <> pg_backend_pid()
AND usename = '<app_user>';
-- 3. 临时调大 max_connections(需reload)
ALTER SYSTEM SET max_connections = 500;
SELECT pg_reload_conf();
max_connections 调大需要重启实例才能完全生效;reload 后新连接按新值处理
磁盘空间满 - 应急处理
-- 1. 检查磁盘空间
df -h
-- 2. 检查数据目录大小
du -sh <GAUSSDATA>/dn1/
-- 3. 检查 WAL 日志堆积
du -sh <GAUSSDATA>/dn1/pg_xlog/
ls -lhS <GAUSSDATA>/dn1/pg_xlog/ | head -20
-- 4. 手动触发 checkpoint 回收 WAL
CHECKPOINT;
-- 5. 清理旧日志
find $GAUSSLOG/pg_log/ -name "*.log" -mtime +7 -delete
-- 6. 检查是否有大临时文件
du -sh <GAUSSDATA>/dn1/pgsql_tmp/
CPU 飙高 - 排查步骤
-- 1. 查看消耗CPU的SQL
SELECT pid, usename, datname, query, query_start,
now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;
-- 2. 查看消耗CPU的会话PID
-- 在操作系统层执行
top -c
-- 记下占用CPU高的 gaussdb/gsql 进程PID
-- 3. 根据PID查看对应SQL
SELECT pid, usename, datname, query
FROM pg_stat_activity
WHERE pid = <os_pid>;
-- 4. 限制或取消该SQL
SELECT pg_cancel_backend(<pid>);
主备延迟过大 - 排查
-- 1. 主库查看复制延迟
SELECT application_name, client_addr, state,
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes,
pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)) AS lag_size
FROM pg_stat_replication;
-- 2. 检查备库状态
-- 切换到备库执行
gs_om -t status --detail
-- 3. 检查备库是否在恢复
SELECT pg_is_in_recovery();
SELECT status, received_lsn, last_msg_receipt_time
FROM pg_stat_wal_receiver;
-- 4. 检查网络带宽
ping <standby_ip>
iperf3 -c <standby_ip> -- 需安装iperf3
-- 5. 如果延迟持续增大,考虑重建备库
gs_ctl build -D <standby_data_dir> -b incremental
数据库 hang 住 - 排查步骤
-- 1. 尝试本地连接(排除网络问题)
gsql -d postgres -p <port>
-- 2. 如果能连上,检查锁等待
SELECT pid, query, now() - query_start AS duration
FROM pg_stat_activity WHERE state = 'active';
-- 3. 检查是否有锁等待
SELECT * FROM pg_locks WHERE granted = false;
-- 4. 检查磁盘IO是否打满(操作系统层)
iostat -x 2 5
-- 5. 检查内存
free -m
vmstat 2 5
-- 6. 如果完全无响应,查看日志
tail -200 $GAUSSLOG/pg_log/postgresql-$(date +%Y-%m-%d).log
-- 7. 最后手段:强制重启(谨慎)
gs_ctl restart -D <GAUSSDATA>/dn1 -M fast
查看数据库启动失败原因
-- 检查最新日志
tail -200 $GAUSSLOG/pg_log/postgresql-$(date +%Y-%m-%d).log
-- 常见启动失败原因:
-- 1. 端口被占用 → netstat -tlnp | grep <port>
-- 2. 参数配置错误 → 检查 postgresql.conf
-- 3. 数据目录权限问题 → chown -R <user>:<group> <GAUSSDATA>
-- 4. 共享内存不足 → ipcs -m | grep <user>
-- 5. WAL损坏 → 尝试 gs_ctl start -D <dir> -M immediate
检查 pg_hba.conf 远程访问配置
-- 查看当前配置
cat <GAUSSDATA>/dn1/pg_hba.conf | grep -v "^#" | grep -v "^$"
-- 添加允许远程访问的规则(追加到文件末尾)
echo "host all all 0.0.0.0/0 sha256" >> <GAUSSDATA>/dn1/pg_hba.conf
-- 重载配置
gs_ctl reload -D <GAUSSDATA>/dn1
生产环境请按实际IP段配置,不要用 0.0.0.0/0 放通全部。OpenGauss 默认使用 sha256 加密方式。
常用系统视图速查
▶
会话与活动
pg_stat_activity -- 当前会话/连接信息
pg_stat_replication -- 主备复制状态
pg_stat_wal_receiver -- 备库WAL接收状态
pg_stat_archiver -- 归档进程状态
锁与等待
pg_locks -- 当前锁信息
pg_blocking_pids() -- 获取阻塞某会话的PID列表
统计信息
pg_stat_database -- 数据库级统计(事务/缓存/死锁等)
pg_stat_all_tables -- 表级统计(扫描/元组/VACUUM)
pg_stat_all_indexes -- 索引使用统计
pg_stat_statements -- SQL执行统计(需扩展)
大小与空间
pg_database_size() -- 数据库大小
pg_relation_size() -- 表/索引大小
pg_total_relation_size() -- 表+索引+TOAST总大小
pg_tablespace_size() -- 表空间大小
pg_ls_waldir() -- WAL目录文件列表
WAL与LSN
pg_current_wal_lsn() -- 当前WAL LSN
pg_walfile_name() -- LSN转WAL文件名
pg_wal_lsn_diff() -- 两个LSN的字节差
pg_last_wal_receive_lsn() -- 备库最后接收的LSN
pg_last_wal_replay_lsn() -- 备库最后回放的LSN
参数与配置
pg_settings -- 所有GUC参数及来源
SHOW <param> -- 查看单个参数
pg_reload_conf() -- 重载配置文件