1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG070-PG数据库集群管理:基础操作与状态监控

本文档风哥主要介绍PostgreSQL数据库集群的基础操作和状态监控方法,包括数据库管理、连接监控、性能监控等内容,风哥教程参考PostgreSQL官方文档Monitoring Database Activity章节,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 PostgreSQL数据库集群管理概述

PostgreSQL数据库集群管理涉及数据库创建、用户管理、权限配置、性能监控、故障排查等多个方面。有效的集群管理是保障数据库稳定运行的关键。更多视频教程www.fgedu.net.cn

PostgreSQL数据库集群管理内容:

  • 数据库管理:创建、修改、删除数据库
  • 用户管理:创建、修改、删除用户和角色
  • 权限管理:授予和撤销对象权限
  • 表空间管理:创建、修改、删除表空间
  • 连接管理:监控和管理数据库连接
  • 性能监控:监控数据库性能指标
  • 故障排查:诊断和解决数据库问题

1.2 PostgreSQL数据库系统监控视图介绍

PostgreSQL提供了丰富的系统监控视图,用于查看数据库运行状态和性能指标。

# PostgreSQL主要监控视图

## 活动监控视图
pg_stat_activity # 当前活动会话信息
pg_stat_replication # 复制连接状态
pg_stat_wal_receiver # WAL接收器状态

## 数据库统计视图
pg_stat_fgedudb # 数据库级别统计信息
pg_stat_fgedudb_conflicts # 数据库冲突统计

## 表统计视图
pg_stat_fgedu_tables # 用户表统计信息
pg_statio_fgedu_tables # 用户表I/O统计

## 索引统计视图
pg_stat_fgedu_indexes # 用户索引统计信息
pg_statio_fgedu_indexes # 用户索引I/O统计

## 锁监控视图
pg_locks # 当前锁信息
pg_blocking_pids() # 阻塞进程查询函数

## 进程监控视图
pg_stat_progress_vacuum # VACUUM进度
pg_stat_progress_create_index # 创建索引进度
pg_stat_progress_analyze # ANALYZE进度
pg_stat_progress_basebackup # 基础备份进度
pg_stat_progress_copy # COPY进度

## WAL监控视图
pg_stat_wal # WAL统计信息
pg_wal_stat_activity # WAL活动信息

## 后台进程视图
pg_stat_bgwriter # 后台写进程统计
pg_stat_archiver # 归档进程统计

## 查看所有统计视图
$ psql -c “\d pg_stat*”
关联列表
架构模式 | 名称 | 类型 | 拥有者
———-+—————————–+——–+———-
pg_catalog | pg_stat_activity | 视图 | pgsql pg_catalog | pg_stat_all_indexes | 视图 | pgsql pg_catalog | pg_stat_all_tables | 视图 | pgsql pg_catalog | pg_stat_archiver | 视图 | pgsql pg_catalog | pg_stat_bgwriter | 视图 | pgsql pg_catalog | pg_stat_fgedudb | 视图 | pgsql pg_catalog | pg_stat_fgedudb_conflicts | 视图 | pgsql pg_catalog | pg_stat_progress_analyze | 视图 | pgsql pg_catalog | pg_stat_progress_basebackup| 视图 | pgsql pg_catalog | pg_stat_progress_copy | 视图 | pgsql pg_catalog | pg_stat_progress_create_index| 视图 | pgsql pg_catalog | pg_stat_progress_vacuum | 视图 | pgsql pg_catalog | pg_stat_replication | 视图 | pgsql pg_catalog | pg_stat_ssl | 视图 | pgsql pg_catalog | pg_stat_subscription | 视图 | pgsql pg_catalog | pg_stat_fgedu_functions | 视图 | pgsql pg_catalog | pg_stat_fgedu_indexes | 视图 | pgsql pg_catalog | pg_stat_fgedu_tables | 视图 | pgsql pg_catalog | pg_stat_wal | 视图 | pgsql pg_catalog | pg_stat_wal_receiver | 视图 | pgsql

1.3 PostgreSQL数据库集群核心组件

PostgreSQL数据库集群由多个核心组件构成,了解这些组件有助于进行有效的集群管理。

# PostgreSQL集群核心组件

## 后台进程
postmaster # 主进程,管理其他进程
checkpointer # 检查点进程
background writer # 后台写进程
WAL writer # WAL写进程
autovacuum launcher # 自动清理启动器
autovacuum worker # 自动清理工作进程
stats collector # 统计信息收集器
logical launcher # 逻辑复制启动器

## 数据文件
PG_VERSION # 版本文件
postgresql.conf # 主配置文件
pg_hba.conf # 认证配置文件
postmaster.pid # 进程ID文件
postmaster.opts # 启动参数文件

## 数据目录
base/ # 默认表空间
global/ # 共享系统表
pg_wal/ # WAL日志
pg_xact/ # 事务状态
pg_tblspc/ # 表空间链接

## 查看后台进程
$ ps -ef | grep pgsql | grep -v grep
pgsql 12345 1 0 10:00 ? 00:00:00 pgsql: checkpointer
pgsql 12346 1 0 10:00 ? 00:00:00 pgsql: background writer
pgsql 12347 1 0 10:00 ? 00:00:00 pgsql: walwriter
pgsql 12348 1 0 10:00 ? 00:00:00 pgsql: autovacuum launcher
pgsql 12349 1 0 10:00 ? 00:00:00 pgsql: logical replication launcher

## 查看进程类型
$ psql -c “SELECT pid, usename, fgapplication_name, state, query FROM pg_stat_activity WHERE backend_type != ‘client backend’;”
pid | usename | fgapplication_name | state | query
——-+———-+——————+——–+————————-
12345 | | | |
12346 | | | |
12347 | | | |
12348 | | | |
12349 | | | |
(5 行记录)

风哥提示:了解PostgreSQL后台进程的作用,有助于理解数据库的工作原理和排查性能问题。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 PostgreSQL数据库监控规划

PostgreSQL数据库监控规划建议:

# 生产环境监控规划

## 监控指标分类
### 系统层面
– CPU使用率
– 内存使用率
– 磁盘I/O
– 网络流量

### 数据库层面
– 连接数
– 事务数
– 锁等待
– 慢查询
– 复制延迟

## 监控频率规划
– 实时监控: 连接数、锁等待
– 分钟级监控: 事务数、查询数
– 小时级监控: 表大小、索引使用率
– 天级监控: 备份状态、统计信息

## 监控阈值规划
– 连接数使用率 > 80%: 警告
– 连接数使用率 > 90%: 严重
– 锁等待时间 > 5秒: 警告
– 锁等待时间 > 30秒: 严重
– 复制延迟 > 1GB: 警告
– 复制延迟 > 10GB: 严重
– 磁盘使用率 > 80%: 警告
– 磁盘使用率 > 90%: 严重

## 监控工具规划
– 基础监控: pg_stat视图
– 性能监控: pg_stat_statements
– 日志分析: pgBadger
– 可视化监控: Grafana + Prometheus

2.2 PostgreSQL数据库告警规划

PostgreSQL数据库告警规划建议:

# 生产环境告警规划

## 告警级别定义
P1 – 紧急: 数据库不可用,需要立即处理
P2 – 严重: 性能严重下降,需要尽快处理
P3 – 警告: 存在潜在问题,需要关注
P4 – 提示: 信息性告警,可稍后处理

## 告警规则配置
### P1级告警
– 数据库服务停止
– 数据文件损坏
– 主从切换失败

### P2级告警
– 连接数超过90%
– 磁盘空间不足
– 复制延迟过大
– 长时间锁等待

### P3级告警
– 连接数超过80%
– 慢查询增多
– 表膨胀严重
– 索引失效

### P4级告警
– 统计信息过期
– 临时文件过多
– 自动清理频繁

## 告警通知方式
– 邮件通知: 所有级别
– 短信通知: P1、P2级
– 电话通知: P1级
– 企业微信/钉钉: 所有级别

## 告警处理流程
1. 接收告警
2. 确认问题
3. 分析原因
4. 执行修复
5. 验证结果
6. 记录文档

2.3 PostgreSQL数据库维护规划

PostgreSQL数据库维护规划建议:

# 生产环境维护规划

## 日常维护任务
### 每日任务
– 检查数据库服务状态
– 检查错误日志
– 检查备份状态
– 检查复制状态

### 每周任务
– 分析表统计信息
– 检查表膨胀情况
– 检查索引使用率
– 检查慢查询日志

### 每月任务
– 执行VACUUM ANALYZE
– 检查表空间使用情况
– 检查用户权限
– 更新统计信息

## 维护窗口规划
– 日常维护: 业务低峰期(凌晨2-5点)
– 大型维护: 周末或节假日
– 紧急维护: 随时进行

## 维护脚本规划
/postgresql/scripts/
├── daily_check.sh # 日常检查脚本
├── weekly_maintain.sh # 周维护脚本
├── monthly_maintain.sh # 月维护脚本
├── vacuum_analyze.sh # 清理分析脚本
└── backup_check.sh # 备份检查脚本

## 维护记录规划
– 维护时间
– 维护内容
– 执行结果
– 问题描述
– 解决方案

风哥教程针对风哥教程针对风哥教程针对生产环境建议:建立完善的监控告警体系,定期执行维护任务,保障数据库稳定运行。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 PostgreSQL数据库集群基础操作

3.1.1 数据库管理操作

# 数据库管理操作

## 创建数据库
$ psql -c “CREATE DATABASE fgedudb WITH ENCODING=’UTF8′ OWNER=pgsql TEMPLATE=template1;”
CREATE DATABASE

## 查看数据库列表
$ psql -l
数据库列表
名称 | 拥有者 | 字符编码 | 校对规则 | Ctype | 存取权限
———–+———-+———-+————-+————-+———————–
fgedudb | pgsql | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
pgsql | pgsql | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | pgsql | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/pgsql +
| | | | | postgres=CTc/pgsql template1 | pgsql | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/pgsql +
| | | | | postgres=CTc/pgsql (4 行记录)

## 查看数据库大小
$ psql -c “SELECT datname, pg_size_pretty(pg_fgedudb_size(datname)) AS size FROM pg_fgedudb ORDER BY pg_fgedudb_size(datname) DESC;”
datname | size
———–+———
fgedudb | 15 GB
pgsql | 8769 kB
template1 | 8769 kB
template0 | 8769 kB
(4 行记录)

## 修改数据库配置
$ psql -c “ALTER DATABASE fgedudb SET work_mem = ‘256MB’;”
ALTER DATABASE

$ psql -c “ALTER DATABASE fgedudb SET log_min_duration_statement = 1000;”
ALTER DATABASE

## 重命名数据库
$ psql -c “ALTER DATABASE fgedudb RENAME TO fgedudb_new;”
ALTER DATABASE

## 删除数据库
$ psql -c “DROP DATABASE IF EXISTS fgedudb_test;”
DROP DATABASE

## 查看数据库配置
$ psql -c “SELECT * FROM pg_db_role_setting;”
setfgedudb | setrole | setconfig
————+———+————————–
16384 | 0 | {work_mem=256MB}
16384 | 0 | {log_min_duration_statement=1000}
(2 行记录)

3.1.2 用户和角色管理操作

# 用户和角色管理操作

## 创建角色
$ psql -c “CREATE ROLE dba_role WITH LOGIN PASSWORD ‘Fgedu@2026’ CREATEROLE CREATEDB;”
CREATE ROLE

## 创建用户
$ psql -c “CREATE USER fgapp_fgedu WITH PASSWORD ‘Fgedu@2026’ CONNECTION LIMIT 100;”
CREATE USER

$ psql -c “CREATE USER readonly_fgedu WITH PASSWORD ‘Fgedu@2026’ CONNECTION LIMIT 50;”
CREATE USER

## 授予角色权限
$ psql -c “GRANT dba_role TO fgapp_fgedu;”
GRANT ROLE

## 授予数据库权限
$ psql -c “GRANT ALL PRIVILEGES ON DATABASE fgedudb TO fgapp_fgedu;”
GRANT

$ psql -c “GRANT CONNECT ON DATABASE fgedudb TO readonly_fgedu;”
GRANT

## 授予模式权限
$ psql -c “GRANT ALL PRIVILEGES ON SCHEMA public TO fgapp_fgedu;”
GRANT

$ psql -c “GRANT USAGE ON SCHEMA public TO readonly_fgedu;”
GRANT

## 授予表权限
$ psql -c “GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO fgapp_fgedu;”
GRANT

$ psql -c “GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_fgedu;”
GRANT

## 修改用户密码
$ psql -c “ALTER USER fgapp_fgedu WITH PASSWORD ‘NewPassword@2026’;”
ALTER ROLE

## 设置用户有效期
$ psql -c “ALTER USER fgapp_fgedu WITH VALID UNTIL ‘2026-12-31’;”
ALTER ROLE

## 查看用户列表
$ psql -c “\du”
角色列表
角色名称 | 属性 | 成员属于
—————–+——————————————–+——————-
fgapp_fgedu | 密码有效直至2026-12-31 00:00:00+08 | {dba_role}
dba_role | 建立角色, 建立DB | {}
pgsql | 超级用户, 建立角色, 建立DB, 复制, 流复制 | {}
readonly_fgedu | 密码有效直至2026-12-31 00:00:00+08 | {}

## 删除用户
$ psql -c “DROP USER IF EXISTS test_fgedu;”
DROP ROLE

3.1.3 表空间管理操作

# 表空间管理操作

## 创建表空间
$ psql -c “CREATE TABLESPACE fgedu_data LOCATION ‘/postgresql/fgedutbss/fgedu_data’;”
CREATE TABLESPACE

$ psql -c “CREATE TABLESPACE fgedu_index LOCATION ‘/postgresql/fgedutbss/fgedu_index’;”
CREATE TABLESPACE

## 查看表空间列表
$ psql -c “\db”
表空间列表
名称 | 拥有者 | 位置
—————–+———-+——————————-
fgedu_data | pgsql | /postgresql/fgedutbss/fgedu_data
fgedu_index | pgsql | /postgresql/fgedutbss/fgedu_index
pg_default | pgsql |
pg_global | pgsql |

## 查看表空间大小
$ psql -c “SELECT spcname, pg_size_pretty(pg_fgedutbs_size(oid)) AS size FROM pg_fgedutbs;”
spcname | size
—————-+———
pg_default | 15 GB
pg_global | 560 kB
fgedu_data | 50 GB
fgedu_index | 10 GB
(4 行记录)

## 设置默认表空间
$ psql -c “ALTER DATABASE fgedudb SET default_fgedutbs = ‘fgedu_data’;”
ALTER DATABASE

## 在指定表空间创建表
$ psql -d fgedudb -c “CREATE TABLE fgedu_fgedus (id SERIAL PRIMARY KEY, name VARCHAR(100)) TABLESPACE fgedu_data;”
CREATE TABLE fgedu_$ psql -d fgedudb -c “CREATE INDEX idx_fgedu_fgedus_name ON fgedu_fgedus(name) TABLESPACE fgedu_index;”
CREATE INDEX

## 移动表到其他表空间
$ psql -d fgedudb -c “ALTER TABLE fgedu_fgedus SET TABLESPACE fgedu_data;”
ALTER TABLE

## 移动索引到其他表空间
$ psql -d fgedudb -c “ALTER INDEX idx_fgedu_fgedus_name SET TABLESPACE fgedu_index;”
ALTER INDEX

## 重命名表空间
$ psql -c “ALTER TABLESPACE fgedu_data RENAME TO fgedu_data_new;”
ALTER TABLESPACE

## 删除表空间
$ psql -c “DROP TABLESPACE IF EXISTS fgedu_test;”
DROP TABLESPACE

3.2 PostgreSQL数据库集群状态监控

3.2.1 连接状态监控

# 连接状态监控

## 查看当前连接数
$ psql -c “SELECT count(*) AS total_connections FROM pg_stat_activity;”
total_connections
——————-
25
(1 行记录)

## 查看最大连接数
$ psql -c “SHOW max_connections;”
max_connections
—————–
200
(1 行记录)

## 查看连接使用率
$ psql -c ”
SELECT
(SELECT count(*) FROM pg_stat_activity) AS current_connections,
(SELECT setting::int FROM pg_settings WHERE name = ‘max_connections’) AS max_connections,
ROUND((SELECT count(*) FROM pg_stat_activity)::numeric /
(SELECT setting::int FROM pg_settings WHERE name = ‘max_connections’) * 100, 2) AS usage_percent;

current_connections | max_connections | usage_percent
———————+—————–+—————
25 | 200 | 12.50
(1 行记录)

## 查看各数据库连接数
$ psql -c ”
SELECT datname, count(*) AS connections
FROM pg_stat_activity
WHERE datname IS NOT NULL
GROUP BY datname
ORDER BY connections DESC;

datname | connections
———–+————-
fgedudb | 15
pgsql | 8
(2 行记录)

## 查看各用户连接数
$ psql -c ”
SELECT usename, count(*) AS connections
FROM pg_stat_activity
WHERE usename IS NOT NULL
GROUP BY usename
ORDER BY connections DESC;

usename | connections
————-+————-
fgapp_fgedu | 12
pgsql | 10
readonly_fgedu | 3
(3 行记录)

## 查看活动连接详情
$ psql -c ”
SELECT pid, usename, datname, state, query_start,
now() – query_start AS duration, query
FROM pg_stat_activity
WHERE state = ‘active’
ORDER BY query_start;

pid | usename | datname | state | query_start | duration | query
——-+———–+———+——–+——————————-+—————–+—————————–
12500 | fgapp_fgedu | fgedudb | active | 2026-04-02 10:00:00.123456+08 | 00:00:05.123456 | SELECT * FROM fgedu_orders…
12501 | fgapp_fgedu | fgedudb | active | 2026-04-02 10:00:01.123456+08 | 00:00:04.123456 | UPDATE fgedu_fgedus SET…
(2 行记录)

## 查看空闲连接
$ psql -c ”
SELECT pid, usename, datname, state,
now() – state_change AS idle_duration
FROM pg_stat_activity
WHERE state = ‘idle’
ORDER BY state_change;

pid | usename | datname | state | idle_duration
——-+———–+———+——-+———————-
12400 | fgapp_fgedu | fgedudb | idle | 00:05:00.123456
12401 | fgapp_fgedu | fgedudb | idle | 00:03:00.123456
(2 行记录)

## 终止连接
$ psql -c “SELECT pg_cancel_backend(12500);”
pg_cancel_backend
——————-
t
(1 行记录)

## 断开连接
$ psql -c “SELECT pg_terminate_backend(12501);”
pg_terminate_backend
———————-
t
(1 行记录)

3.2.2 锁状态监控

# 锁状态监控

## 查看当前锁信息
$ psql -c ”
SELECT locktype, fgedudb, relation, mode, granted, count(*)
FROM pg_locks
GROUP BY locktype, fgedudb, relation, mode, granted
ORDER BY count(*) DESC;

locktype | fgedudb | relation | mode | granted | count
—————+———-+———-+———————+———+——-
relation | 16384 | 12345 | AccessShareLock | t | 10
transactionid | | | ExclusiveLock | t | 5
(2 行记录)

## 查看锁等待
$ psql -c ”
SELECT
blocked_locks.pid AS blocked_pid,
blocked_activity.usename AS blocked_fgedu,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_fgedu,
blocked_activity.query AS blocked_query,
blocking_activity.query AS blocking_query
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
AND blocking_locks.fgedudb IS NOT DISTINCT FROM blocked_locks.fgedudb
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
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;

blocked_pid | blocked_fgedu | blocking_pid | blocking_fgedu | blocked_query | blocking_query
————-+————–+————–+—————+————————————–+————————————-
12600 | fgapp_fgedu | 12500 | fgapp_fgedu | UPDATE fgedu_fgedus SET name=’test’…| UPDATE fgedu_fgedus SET name=’old’…
(1 行记录)

## 查看长时间持有锁的会话
$ psql -c ”
SELECT
pid,
now() – pg_stat_activity.query_start AS duration,
query,
state
FROM pg_stat_activity
WHERE (pg_stat_activity.query_start IS NOT NULL AND
now() – pg_stat_activity.query_start > interval ‘5 minutes’)
ORDER BY duration DESC;

pid | duration | query | state
——-+—————–+——————————+——–
12500 | 00:10:00.123456 | UPDATE fgedu_fgedus SET … | active
(1 行记录)

## 查看表级锁
$ psql -c ”
SELECT
c.relname,
l.mode,
l.granted,
a.usename,
a.query
FROM pg_locks l
JOIN pg_class c ON c.oid = l.relation
JOIN pg_stat_activity a ON a.pid = l.pid
WHERE l.relation IS NOT NULL
ORDER BY c.relname;

relname | mode | granted | usename | query
—————-+———————+———+———–+——————————
fgedu_fgedus | RowExclusiveLock | t | fgapp_fgedu | INSERT INTO fgedu_fgedus…
fgedu_orders | AccessShareLock | t | fgapp_fgedu | SELECT * FROM fgedu_orders…
(2 行记录)

风哥提示:锁等待是影响数据库性能的常见问题,定期监控锁状态可以及时发现和解决锁冲突。更多学习教程公众号风哥教程itpux_com

3.3 PostgreSQL数据库性能监控

3.3.1 数据库统计信息监控

# 数据库统计信息监控

## 查看数据库统计信息
$ psql -c ”
SELECT
datname,
numbackends AS current_connections,
xact_commit,
xact_rollback,
blks_read,
blks_hit,
tup_returned,
tup_fetched,
tup_inserted,
tup_updated,
tup_deleted
FROM pg_stat_fgedudb
WHERE datname = ‘fgedudb’;

datname | current_connections | xact_commit | xact_rollback | blks_read | blks_hit | tup_returned | tup_fetched | tup_inserted | tup_updated | tup_deleted
———-+———————+————-+—————+———–+———-+————–+————-+————–+————-+————-
fgedudb | 15 | 1234567 | 123 | 1234567 | 12345678 | 123456789 | 12345678 | 1234567 | 123456 | 12345
(1 行记录)

## 查看缓存命中率
$ psql -c ”
SELECT
datname,
blks_read,
blks_hit,
ROUND(blks_hit::numeric / (blks_hit + blks_read) * 100, 2) AS cache_hit_ratio
FROM pg_stat_fgedudb
WHERE datname = ‘fgedudb’;

datname | blks_read | blks_hit | cache_hit_ratio
———-+———–+———-+—————–
fgedudb | 1234567 | 12345678 | 90.91
(1 行记录)

## 查看事务提交率
$ psql -c ”
SELECT
datname,
xact_commit,
xact_rollback,
ROUND(xact_commit::numeric / (xact_commit + xact_rollback) * 100, 2) AS commit_ratio
FROM pg_stat_fgedudb
WHERE datname = ‘fgedudb’;

datname | xact_commit | xact_rollback | commit_ratio
———-+————-+—————+————–
fgedudb | 1234567 | 123 | 99.99
(1 行记录)

## 查看表统计信息
$ psql -c ”
SELECT
schemaname,
relname,
seq_scan,
seq_tup_read,
idx_scan,
idx_tup_fetch,
n_tup_ins,
n_tup_upd,
n_tup_del,
n_tup_hot_upd
FROM pg_stat_fgedu_tables
ORDER BY seq_scan DESC
LIMIT 10;

schemaname | relname | seq_scan | seq_tup_read | idx_scan | idx_tup_fetch | n_tup_ins | n_tup_upd | n_tup_del | n_tup_hot_upd
————+—————–+———-+————–+———-+—————+———–+———–+———–+—————
public | fgedu_orders | 12345 | 123456789 | 123456 | 12345678 | 123456 | 12345 | 1234 | 10000
public | fgedu_fgedus | 5678 | 12345678 | 56789 | 5678901 | 56789 | 5678 | 567 | 5000
(2 行记录)

## 查看索引使用率
$ psql -c ”
SELECT
schemaname,
relname,
indexrelname,
idx_scan,
idx_tup_read,
idx_tup_fetch
FROM pg_stat_fgedu_indexes
ORDER BY idx_scan DESC
LIMIT 10;

schemaname | relname | indexrelname | idx_scan | idx_tup_read | idx_tup_fetch
————+—————+——————–+———-+————–+—————
public | fgedu_fgedus | idx_fgedu_fgedus_id | 123456 | 1234567 | 1234567
public | fgedu_orders | idx_fgedu_orders_id| 100000 | 1000000 | 1000000
(2 行记录)

## 查看未使用的索引
$ psql -c ”
SELECT
schemaname,
relname,
indexrelname,
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
FROM pg_stat_fgedu_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;

schemaname | relname | indexrelname | index_size
————+————-+————–+————
public | fgedu_test | idx_test | 128 kB
(1 行记录)

3.3.2 后台进程监控

# 后台进程监控

## 查看后台写进程统计
$ psql -c “SELECT * FROM pg_stat_bgwriter;”
-[ RECORD 1 ]———+——————————
checkpoints_timed | 1234
checkpoints_req | 56
checkpoint_write_time | 12345678
checkpoint_sync_time | 123456
buffers_checkpoint | 1234567
buffers_clean | 123456
maxwritten_clean | 1234
buffers_backend | 12345
buffers_backend_fsync | 12
buffers_alloc | 1234567
stats_reset | 2026-01-01 00:00:00+08

## 查看归档进程统计
$ psql -c “SELECT * FROM pg_stat_archiver;”
-[ RECORD 1 ]——+——————————
archived_count | 123456
last_archived_wal | 000000010000000000000123
last_archived_time | 2026-04-02 10:00:00+08
failed_count | 0
last_failed_wal |
last_failed_time |
stats_reset | 2026-01-01 00:00:00+08

## 查看WAL统计
$ psql -c “SELECT * FROM pg_stat_wal;”
-[ RECORD 1 ]—-+——————————
wal_records | 12345678
wal_fpi | 123456
wal_bytes | 1234567890123
wal_buffers_full | 1234
wal_write | 123456
wal_sync | 12345
wal_write_time | 12345.67
wal_sync_time | 1234.56
stats_reset | 2026-01-01 00:00:00+08

## 查看VACUUM进度
$ psql -c “SELECT * FROM pg_stat_progress_vacuum;”
-[ RECORD 1 ]——+——————————
pid | 12345
datid | 16384
datname | fgedudb
relid | 12345
phase | scanning heap
heap_blks_total | 123456
heap_blks_scanned | 50000
heap_blks_vacuumed| 0
index_vacuum_count| 0
max_dead_tuples | 12345678
num_dead_tuples | 1234567

## 查看创建索引进度
$ psql -c “SELECT * FROM pg_stat_progress_create_index;”
-[ RECORD 1 ]—–+——————————
pid | 12345
datid | 16384
datname | fgedudb
relid | 12345
index_relid | 0
command | CREATE INDEX
phase | building index
lockers_total | 0
lockers_done | 0
current_locker_pid| 0
blocks_total | 123456
blocks_done | 50000
tuples_total | 1234567
tuples_done | 500000
partitions_total | 0
partitions_done | 0

Part04-生产案例与实战讲解

4.1 PostgreSQL数据库连接监控实战

4.1.1 连接数告警脚本

# 创建连接数监控脚本
$ cat > /postgresql/scripts/pg_connection_monitor.sh << 'EOF' #!/bin/bash # pg_connection_monitor.sh # from:www.itpux.com.qq113257174.wx:itpux-com # from:www.itpux.com.qq113257174.wx:itpux-com # from:www.itpux.com.qq113257174.wx:itpux-com # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` # web: `http://www.fgedu.net.cn` # web: `http://www.fgedu.net.cn` # web: http://www.fgedu.net.cn LOG_FILE=/postgresql/log/connection_monitor.log ALERT_THRESHOLD=80 CRITICAL_THRESHOLD=90 # 获取当前连接数和最大连接数 CURRENT_CONN=$(psql -t -c "SELECT count(*) FROM pg_stat_activity;") MAX_CONN=$(psql -t -c "SELECT setting::int FROM pg_settings WHERE name = 'max_connections';") # 计算使用率 USAGE_PERCENT=$(echo "scale=2; $CURRENT_CONN / $MAX_CONN * 100" | bc) # 记录日志 echo "$(date '+%Y-%m-%d %H:%M:%S') - 当前连接数: $CURRENT_CONN, 最大连接数: $MAX_CONN, 使用率: ${USAGE_PERCENT}%" >> $LOG_FILE

# 判断是否告警
if (( $(echo “$USAGE_PERCENT >= $CRITICAL_THRESHOLD” | bc -l) )); then
echo “[CRITICAL] 连接数使用率 ${USAGE_PERCENT}% 超过临界阈值 ${CRITICAL_THRESHOLD}%”
# 发送告警(可集成邮件、短信等)
# mail -s “PostgreSQL连接数告警” admin@fgedu.net.cn <<< "连接数使用率: ${USAGE_PERCENT}%" elif (( $(echo "$USAGE_PERCENT >= $ALERT_THRESHOLD” | bc -l) )); then
echo “[WARNING] 连接数使用率 ${USAGE_PERCENT}% 超过警告阈值 ${ALERT_THRESHOLD}%”
fi

# 显示空闲连接
IDLE_CONN=$(psql -t -c “SELECT count(*) FROM pg_stat_activity WHERE state = ‘idle’;”)
echo “空闲连接数: $IDLE_CONN”

# 显示长时间空闲连接
LONG_IDLE=$(psql -t -c ”
SELECT count(*) FROM pg_stat_activity
WHERE state = ‘idle’
AND now() – state_change > interval ’30 minutes’;
“)
if [ “$LONG_IDLE” -gt 0 ]; then
echo “[WARNING] 长时间空闲连接数: $LONG_IDLE”
fi
EOF

chmod +x /postgresql/scripts/pg_connection_monitor.sh

# 执行监控
$ /postgresql/scripts/pg_connection_monitor.sh
[WARNING] 连接数使用率 85.50% 超过警告阈值 80%
空闲连接数: 150
[WARNING] 长时间空闲连接数: 25

4.2 PostgreSQL数据库锁监控实战

4.2.1 锁等待监控脚本

# 创建锁监控脚本
$ cat > /postgresql/scripts/pg_lock_monitor.sh << 'EOF' #!/bin/bash # pg_lock_monitor.sh # from:www.itpux.com.qq113257174.wx:itpux-com # from:www.itpux.com.qq113257174.wx:itpux-com # from:www.itpux.com.qq113257174.wx:itpux-com # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` # web: `http://www.fgedu.net.cn` # web: `http://www.fgedu.net.cn` # web: http://www.fgedu.net.cn LOG_FILE=/postgresql/log/lock_monitor.log echo "========================================" >> $LOG_FILE
echo “锁监控检查 – $(date)” >> $LOG_FILE
echo “========================================” >> $LOG_FILE

# 检查锁等待
LOCK_WAIT=$(psql -t -c ”
SELECT count(*) FROM pg_locks l1
JOIN pg_locks l2 ON l1.locktype = l2.locktype
AND l1.fgedudb IS NOT DISTINCT FROM l2.fgedudb
AND l1.relation IS NOT DISTINCT FROM l2.relation
AND l1.page IS NOT DISTINCT FROM l2.page
AND l1.tuple IS NOT DISTINCT FROM l2.tuple
AND l1.virtualxid IS NOT DISTINCT FROM l2.virtualxid
AND l1.transactionid IS NOT DISTINCT FROM l2.transactionid
AND l1.classid IS NOT DISTINCT FROM l2.classid
AND l1.objid IS NOT DISTINCT FROM l2.objid
AND l1.objsubid IS NOT DISTINCT FROM l2.objsubid
AND l1.pid != l2.pid
WHERE NOT l1.granted AND l2.granted;
“)

if [ “$LOCK_WAIT” -gt 0 ]; then
echo “[WARNING] 发现 $LOCK_WAIT 个锁等待” >> $LOG_FILE

# 显示锁等待详情
psql -c ”
SELECT
blocked.pid AS blocked_pid,
blocked.usename AS blocked_fgedu,
blocking.pid AS blocking_pid,
blocking.usename AS blocking_fgedu,
blocked.query AS blocked_query,
now() – blocked.query_start AS wait_duration
FROM pg_stat_activity blocked
JOIN pg_locks blocked_locks ON blocked.pid = blocked_locks.pid
JOIN pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
AND blocking_locks.fgedudb IS NOT DISTINCT FROM blocked_locks.fgedudb
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
AND blocking_locks.pid != blocked_locks.pid
JOIN pg_stat_activity blocking ON blocking.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted AND blocking_locks.granted;
” >> $LOG_FILE
else
echo “[OK] 无锁等待” >> $LOG_FILE
fi

# 检查长时间持有锁的会话
LONG_LOCK=$(psql -t -c ”
SELECT count(*) FROM pg_stat_activity
WHERE wait_event_type = ‘Lock’
AND now() – query_start > interval ‘5 minutes’;
“)

if [ “$LONG_LOCK” -gt 0 ]; then
echo “[WARNING] 发现 $LONG_LOCK 个长时间锁等待” >> $LOG_FILE
fi

echo “锁监控检查完成” >> $LOG_FILE
EOF

chmod +x /postgresql/scripts/pg_lock_monitor.sh

# 执行监控
$ /postgresql/scripts/pg_lock_monitor.sh
[WARNING] 发现 2 个锁等待
blocked_pid | blocked_fgedu | blocking_pid | blocking_fgedu | blocked_query | wait_duration
————-+————–+————–+—————+————————————–+—————
12600 | fgapp_fgedu | 12500 | fgapp_fgedu | UPDATE fgedu_fgedus SET name=’test’…| 00:02:30
12601 | fgapp_fgedu | 12500 | fgapp_fgedu | UPDATE fgedu_fgedus SET name=’new’… | 00:01:45
(2 行记录)

4.3 PostgreSQL数据库表空间监控实战

4.3.1 表空间监控脚本

# 创建表空间监控脚本
$ cat > /postgresql/scripts/pg_fgedutbs_monitor.sh << 'EOF' #!/bin/bash # pg_fgedutbs_monitor.sh # from:www.itpux.com.qq113257174.wx:itpux-com # from:www.itpux.com.qq113257174.wx:itpux-com # from:www.itpux.com.qq113257174.wx:itpux-com # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` # web: `http://www.fgedu.net.cn` # web: `http://www.fgedu.net.cn` # web: http://www.fgedu.net.cn LOG_FILE=/postgresql/log/fgedutbs_monitor.log ALERT_THRESHOLD=80 CRITICAL_THRESHOLD=90 echo "========================================" >> $LOG_FILE
echo “表空间监控检查 – $(date)” >> $LOG_FILE
echo “========================================” >> $LOG_FILE

# 获取表空间使用情况
psql -c ”
SELECT
spcname AS fgedutbs,
pg_size_pretty(pg_fgedutbs_size(oid)) AS used_size,
pg_size_pretty(pg_fgedutbs_location(oid)) AS location
FROM pg_fgedutbs;
” >> $LOG_FILE

# 检查文件系统使用率
for dir in $(psql -t -c “SELECT pg_fgedutbs_location(oid) FROM pg_fgedutbs WHERE pg_fgedutbs_location(oid) IS NOT NULL;”); do
if [ -d “$dir” ]; then
USAGE=$(df -h “$dir” | tail -1 | awk ‘{print $5}’ | tr -d ‘%’)
MOUNT=$(df -h “$dir” | tail -1 | awk ‘{print $6}’)

if [ “$USAGE” -ge $CRITICAL_THRESHOLD ]; then
echo “[CRITICAL] 表空间目录 $dir (挂载点: $MOUNT) 使用率 ${USAGE}%” >> $LOG_FILE
elif [ “$USAGE” -ge $ALERT_THRESHOLD ]; then
echo “[WARNING] 表空间目录 $dir (挂载点: $MOUNT) 使用率 ${USAGE}%” >> $LOG_FILE
else
echo “[OK] 表空间目录 $dir (挂载点: $MOUNT) 使用率 ${USAGE}%” >> $LOG_FILE
fi
fi
done

# 检查数据目录使用率
DATA_USAGE=$(df -h $PGDATA | tail -1 | awk ‘{print $5}’ | tr -d ‘%’)
if [ “$DATA_USAGE” -ge $CRITICAL_THRESHOLD ]; then
echo “[CRITICAL] 数据目录使用率 ${DATA_USAGE}%” >> $LOG_FILE
elif [ “$DATA_USAGE” -ge $ALERT_THRESHOLD ]; then
echo “[WARNING] 数据目录使用率 ${DATA_USAGE}%” >> $LOG_FILE
else
echo “[OK] 数据目录使用率 ${DATA_USAGE}%” >> $LOG_FILE
fi

# 检查WAL目录使用率
WAL_DIR=$PGDATA/pg_wal
WAL_SIZE=$(du -sh $WAL_DIR | awk ‘{print $1}’)
echo “[INFO] WAL目录大小: $WAL_SIZE” >> $LOG_FILE

echo “表空间监控检查完成” >> $LOG_FILE
EOF

chmod +x /postgresql/scripts/pg_fgedutbs_monitor.sh

# 执行监控
$ /postgresql/scripts/pg_fgedutbs_monitor.sh
========================================
表空间监控检查 – Thu Apr 2 10:00:00 CST 2026
========================================
表空间 | 使用大小 | 位置
—————-+———-+————–
pg_default | 15 GB |
pg_global | 560 kB |
fgedu_data | 50 GB | /postgresql/fgedutbss/fgedu_data
fgedu_index | 10 GB | /postgresql/fgedutbss/fgedu_index
(4 行记录)

[OK] 表空间目录 /postgresql/fgedutbss/fgedu_data (挂载点: /postgresql) 使用率 65%
[OK] 表空间目录 /postgresql/fgedutbss/fgedu_index (挂载点: /postgresql) 使用率 65%
[OK] 数据目录使用率 65%
[INFO] WAL目录大小: 2.5G
表空间监控检查完成

风哥提示:定期执行监控脚本,及时发现和处理潜在问题,是保障数据库稳定运行的关键。from PostgreSQL:www.itpux.com

Part05-风哥经验总结与分享

5.1 PostgreSQL数据库集群管理最佳实践

PostgreSQL数据库集群管理最佳实践风哥教程风哥教程风哥教程总结:

  • 监控先行:建立完善的监控体系,实时掌握数据库状态
  • 告警及时:配置合理的告警阈值,及时发现问题
  • 定期维护:执行定期维护任务,保持数据库健康
  • 权限最小:遵循最小权限原则,保障数据安全
  • 备份验证:定期验证备份有效性,确保数据可恢复
  • 文档完善:记录管理操作和问题处理过程

5.2 PostgreSQL数据库日常检查清单

# PostgreSQL日常检查清单

## 服务状态检查
□ 数据库服务运行正常
□ 监听端口正常
□ 后台进程正常

## 连接检查
□ 连接数正常
□ 无异常连接
□ 无长时间空闲连接

## 性能检查
□ 缓存命中率正常(>95%)
□ 无长时间锁等待
□ 无慢查询堆积

## 存储检查
□ 数据目录空间充足
□ WAL目录空间充足
□ 表空间空间充足

## 复制检查
□ 复制状态正常
□ 复制延迟正常
□ 归档状态正常

## 日志检查
□ 无错误日志
□ 无警告日志
□ 无异常断开

5.3 PostgreSQL数据库监控工具推荐

PostgreSQL数据库监控相关工具推荐:

from oracle:www.itpux.com

  • pg_stat_statements:SQL语句统计扩展
  • pgBadger:日志分析工具
  • PgBouncer:连接池管理工具
  • pgwatch2:监控和告警平台
  • Prometheus + Grafana:可视化监控方案
  • pgAdmin:图形化管理工具
风哥风哥教程风哥教程风哥教程总结:PostgreSQL集群管理需要建立完善的监控告警体系,定期执行维护任务,及时发现和处理问题,保障数据库稳定高效运行。更多视频教程www.fgedu.net.cn

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息