外观
PostgreSQL 内置视图
PostgreSQL提供了丰富的内置视图,用于监控数据库系统的各种状态和性能指标。这些视图是DBA日常运维工作中不可或缺的工具,能够帮助快速诊断问题、优化性能和管理数据库。本文档将详细介绍PostgreSQL中常用的内置视图,按功能分类并提供使用示例。
性能监控视图
全局性能统计视图
pg_stat_database
描述:记录每个数据库的全局统计信息,包括连接数、事务数、读写操作等。
主要字段:
datname:数据库名称numbackends:当前连接数xact_commit:已提交事务数xact_rollback:回滚事务数blks_read:从磁盘读取的数据块数blks_hit:从缓存命中的数据块数tup_returned:查询返回的行数tup_fetched:查询获取的行数tup_inserted:插入的行数tup_updated:更新的行数tup_deleted:删除的行数
使用示例:
sql
-- 查询所有数据库的缓存命中率和事务情况
SELECT
datname,
numbackends,
xact_commit,
xact_rollback,
ROUND(blks_hit * 100.0 / NULLIF(blks_read + blks_hit, 0), 2) AS cache_hit_ratio,
tup_returned,
tup_inserted,
tup_updated,
tup_deleted
FROM pg_stat_database
ORDER BY datname;
-- 版本差异:PostgreSQL 13+新增了stats_reset字段,记录统计信息重置时间pg_stat_bgwriter
描述:记录后台写入进程(background writer)的统计信息。
主要字段:
checkpoints_timed:定时检查点数量checkpoints_req:请求检查点数量checkpoint_write_time:检查点写入时间(毫秒)checkpoint_sync_time:检查点同步时间(毫秒)buffers_checkpoint:检查点写入的缓冲区数量buffers_clean:后台写入的缓冲区数量maxwritten_clean:后台写入被中断的次数buffers_backend:后端直接写入的缓冲区数量buffers_backend_fsync:后端直接执行的fsync次数
使用示例:
sql
-- 分析检查点和后台写入情况
SELECT
checkpoints_timed,
checkpoints_req,
ROUND(checkpoint_write_time / 1000.0, 2) AS checkpoint_write_seconds,
ROUND(checkpoint_sync_time / 1000.0, 2) AS checkpoint_sync_seconds,
buffers_checkpoint,
buffers_clean,
maxwritten_clean,
buffers_backend,
buffers_backend_fsync
FROM pg_stat_bgwriter;
-- 版本差异:PostgreSQL 12+新增了checkpoint_stats_reset字段表性能统计视图
pg_stat_user_tables
描述:记录用户表的统计信息,包括插入、更新、删除操作和真空情况。
主要字段:
relname:表名schemaname:模式名n_live_tup:估计的活行数n_dead_tup:估计的死行数n_mod_since_analyze:自上次分析以来修改的行数last_vacuum:上次手动真空时间last_autovacuum:上次自动真空时间last_analyze:上次手动分析时间last_autoanalyze:上次自动分析时间vacuum_count:手动真空次数autovacuum_count:自动真空次数analyze_count:手动分析次数autoanalyze_count:自动分析次数
使用示例:
sql
-- 查询需要真空或分析的表
SELECT
schemaname,
relname,
n_live_tup,
n_dead_tup,
ROUND(n_dead_tup * 100.0 / GREATEST(n_live_tup, 1), 2) AS dead_tuple_ratio,
n_mod_since_analyze,
last_vacuum,
last_autovacuum,
last_analyze,
last_autoanalyze
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000 OR n_mod_since_analyze > 10000
ORDER BY dead_tuple_ratio DESC;
-- 版本差异:PostgreSQL 10+新增了maintenance_work_mem字段pg_statio_user_tables
描述:记录用户表的I/O统计信息。
主要字段:
relname:表名schemaname:模式名heap_blks_read:从磁盘读取的堆数据块数heap_blks_hit:从缓存命中的堆数据块数idx_blks_read:从磁盘读取的索引块数idx_blks_hit:从缓存命中的索引块数toast_blks_read:从磁盘读取的TOAST块数toast_blks_hit:从缓存命中的TOAST块数tidx_blks_read:从磁盘读取的TOAST索引块数tidx_blks_hit:从缓存命中的TOAST索引块数
使用示例:
sql
-- 查询表和索引的缓存命中率
SELECT
schemaname,
relname,
ROUND(heap_blks_hit * 100.0 / NULLIF(heap_blks_read + heap_blks_hit, 0), 2) AS heap_cache_hit_ratio,
ROUND(idx_blks_hit * 100.0 / NULLIF(idx_blks_read + idx_blks_hit, 0), 2) AS idx_cache_hit_ratio,
heap_blks_read,
heap_blks_hit,
idx_blks_read,
idx_blks_hit
FROM pg_statio_user_tables
ORDER BY schemaname, relname;连接与会话视图
当前连接状态
pg_stat_activity
描述:记录当前所有数据库连接的详细信息,是DBA最常用的视图之一。
主要字段:
pid:进程IDusename:用户名datname:数据库名称application_name:应用程序名称client_addr:客户端IP地址client_hostname:客户端主机名client_port:客户端端口backend_start:连接开始时间xact_start:事务开始时间query_start:查询开始时间state_change:状态变化时间wait_event_type:等待事件类型wait_event:具体等待事件state:连接状态(active, idle, idle in transaction等)query:当前执行的查询语句query_id:查询ID(PostgreSQL 13+)
使用示例:
sql
-- 查询当前活动连接和执行的查询
SELECT
pid,
usename,
datname,
application_name,
client_addr,
backend_start,
state,
wait_event_type,
wait_event,
query_start,
query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY query_start;
-- 查询长时间运行的查询(超过5分钟)
SELECT
pid,
usename,
datname,
application_name,
client_addr,
state,
wait_event_type,
wait_event,
EXTRACT(EPOCH FROM (now() - query_start))::int AS query_duration_seconds,
query
FROM pg_stat_activity
WHERE state = 'active' AND now() - query_start > interval '5 minutes'
ORDER BY query_duration_seconds DESC;
-- 查询空闲事务(超过10分钟)
SELECT
pid,
usename,
datname,
application_name,
client_addr,
backend_start,
xact_start,
state,
EXTRACT(EPOCH FROM (now() - xact_start))::int AS idle_in_xact_seconds,
query
FROM pg_stat_activity
WHERE state = 'idle in transaction' AND now() - xact_start > interval '10 minutes'
ORDER BY idle_in_xact_seconds DESC;
-- 版本差异:PostgreSQL 13+新增query_id字段,PostgreSQL 14+新增backend_xid字段pg_prepared_xacts
描述:记录当前准备好的两阶段事务。
主要字段:
transaction:事务标识符gid:全局事务IDprepared:准备时间owner:事务所有者database:数据库名称
使用示例:
sql
-- 查询所有准备好的事务
SELECT
transaction,
gid,
prepared,
EXTRACT(EPOCH FROM (now() - prepared))::int AS prepared_duration_seconds,
owner,
database
FROM pg_prepared_xacts
ORDER BY prepared;锁与等待视图
锁信息视图
pg_locks
描述:记录当前所有锁的信息,包括持有锁和等待锁的会话。
主要字段:
locktype:锁类型(relation, extend, page, tuple, transactionid等)database:数据库OIDrelation:关系OID(表或索引)page:页号tuple:元组标识符virtualxid:虚拟事务IDtransactionid:事务IDpid:持有或等待锁的进程IDmode:锁模式(AccessShareLock, RowShareLock, RowExclusiveLock等)granted:是否已授予锁
使用示例:
sql
-- 查询所有锁信息,包括等待关系
SELECT
l1.pid AS blocker_pid,
l2.pid AS waiter_pid,
l1.relation::regclass AS relation_name,
l1.mode AS blocker_mode,
l2.mode AS waiter_mode,
a1.query AS blocker_query,
a2.query AS waiter_query
FROM pg_locks l1
JOIN pg_locks l2 ON l1.relation = l2.relation AND l1.pid != l2.pid
JOIN pg_stat_activity a1 ON l1.pid = a1.pid
JOIN pg_stat_activity a2 ON l2.pid = a2.pid
WHERE l1.granted AND NOT l2.granted
ORDER BY l1.relation;
-- 查询特定表的锁信息
SELECT
pid,
usename,
mode,
granted,
query
FROM pg_locks l
JOIN pg_stat_activity a ON l.pid = a.pid
WHERE l.relation = 'your_table_name'::regclass
ORDER BY granted DESC, mode;复制相关视图
主从复制状态
pg_stat_replication
描述:在主服务器上记录复制槽和从服务器的状态信息。
主要字段:
pid:WAL发送进程IDusename:复制用户名application_name:从服务器应用名称client_addr:从服务器IP地址state:复制状态(streaming, catching up等)sent_lsn:已发送的WAL位置write_lsn:从服务器已写入的WAL位置flush_lsn:从服务器已刷新到磁盘的WAL位置replay_lsn:从服务器已回放的WAL位置write_lag:写入延迟flush_lag:刷新延迟replay_lag:回放延迟sync_state:同步状态(async, sync, potential sync)
使用示例:
sql
-- 查询主服务器上的复制状态
SELECT
application_name,
client_addr,
state,
sent_lsn,
write_lsn,
flush_lsn,
replay_lsn,
write_lag,
flush_lag,
replay_lag,
sync_state
FROM pg_stat_replication
ORDER BY application_name;
-- 计算复制延迟(以秒为单位)
SELECT
application_name,
client_addr,
state,
ROUND(EXTRACT(EPOCH FROM (write_lag)), 2) AS write_lag_seconds,
ROUND(EXTRACT(EPOCH FROM (flush_lag)), 2) AS flush_lag_seconds,
ROUND(EXTRACT(EPOCH FROM (replay_lag)), 2) AS replay_lag_seconds,
sync_state
FROM pg_stat_replication
ORDER BY replay_lag DESC;
-- 版本差异:PostgreSQL 10+新增write_lag, flush_lag, replay_lag字段pg_stat_wal_receiver
描述:在从服务器上记录WAL接收进程的状态信息。
主要字段:
pid:WAL接收进程IDstatus:WAL接收状态receive_start_lsn:接收开始的WAL位置written_lsn:已写入的WAL位置flushed_lsn:已刷新到磁盘的WAL位置received_tli:当前接收的时间线IDlast_msg_send_time:最后消息发送时间last_msg_receipt_time:最后消息接收时间
使用示例:
sql
-- 查询从服务器上的WAL接收状态
SELECT
pid,
status,
receive_start_lsn,
written_lsn,
flushed_lsn,
received_tli,
last_msg_send_time,
last_msg_receipt_time
FROM pg_stat_wal_receiver;pg_replication_slots
描述:记录复制槽的信息。
主要字段:
slot_name:复制槽名称plugin:插件名称(用于逻辑复制)slot_type:复制槽类型(physical或logical)active:是否活跃xmin:保留的最旧事务IDcatalog_xmin:保留的最旧目录事务IDrestart_lsn:重启LSN位置confirmed_flush_lsn:确认刷新的LSN位置
使用示例:
sql
-- 查询所有复制槽状态
SELECT
slot_name,
slot_type,
plugin,
database,
active,
xmin,
catalog_xmin,
restart_lsn,
confirmed_flush_lsn
FROM pg_replication_slots
ORDER BY slot_name;
-- 检查复制槽是否导致WAL堆积
SELECT
slot_name,
slot_type,
pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS wal_pending_bytes,
pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS wal_pending_size
FROM pg_replication_slots
ORDER BY wal_pending_bytes DESC;数据库与表状态视图
数据库对象状态
pg_stat_all_tables
描述:记录所有表(包括系统表)的统计信息。
主要字段:与pg_stat_user_tables类似,但包含系统表。
使用示例:
sql
-- 查询所有表的统计信息,包括系统表
SELECT
schemaname,
relname,
n_live_tup,
n_dead_tup,
last_vacuum,
last_autovacuum,
last_analyze,
last_autoanalyze
FROM pg_stat_all_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY n_dead_tup DESC LIMIT 10;pg_stat_user_indexes
描述:记录用户索引的使用统计信息。
主要字段:
relname:表名indexrelname:索引名idx_scan:索引扫描次数idx_tup_read:通过索引读取的行数idx_tup_fetch:通过索引获取的行数
使用示例:
sql
-- 查询索引使用情况,找出未使用的索引
SELECT
schemaname,
relname,
indexrelname,
idx_scan,
idx_tup_read,
idx_tup_fetch
FROM pg_stat_user_indexes
ORDER BY idx_scan ASC, relname, indexrelname;
-- 查询使用频繁的索引
SELECT
schemaname,
relname,
indexrelname,
idx_scan,
idx_tup_read,
idx_tup_fetch
FROM pg_stat_user_indexes
WHERE idx_scan > 1000
ORDER BY idx_scan DESC LIMIT 10;pg_indexes
描述:记录所有索引的定义信息。
主要字段:
schemaname:模式名tablename:表名indexname:索引名tablespace:表空间indexdef:索引定义语句
使用示例:
sql
-- 查询表的所有索引定义
SELECT
schemaname,
tablename,
indexname,
indexdef
FROM pg_indexes
WHERE tablename = 'your_table_name'
ORDER BY indexname;
-- 查询所有唯一索引
SELECT
schemaname,
tablename,
indexname,
indexdef
FROM pg_indexes
WHERE indexdef LIKE '%UNIQUE%'
ORDER BY schemaname, tablename, indexname;索引与统计信息视图
统计信息视图
pg_statistics
描述:记录表和索引的统计信息,用于查询优化器。
主要字段:
schemaname:模式名tablename:表名attname:列名n_distinct:不同值的数量most_common_vals:最常见的值most_common_freqs:最常见值的频率histogram_bounds:直方图边界correlation:列值与物理存储顺序的相关性
使用示例:
sql
-- 查询表列的统计信息
SELECT
schemaname,
tablename,
attname,
n_distinct,
correlation,
most_common_vals[1:3] AS top_3_vals,
most_common_freqs[1:3] AS top_3_freqs
FROM pg_statistics
WHERE tablename = 'your_table_name'
ORDER BY attname;pg_stats
描述:pg_statistics的可读视图,提供更友好的格式。
使用示例:
sql
-- 查询表列的统计信息(使用pg_stats视图)
SELECT
schemaname,
tablename,
attname,
n_distinct,
correlation,
most_common_vals,
histogram_bounds
FROM pg_stats
WHERE tablename = 'your_table_name'
ORDER BY attname;
-- 检查列的相关性,用于判断是否需要索引
SELECT
attname,
correlation,
CASE
WHEN correlation > 0.9 THEN 'High positive correlation - consider index'
WHEN correlation < -0.9 THEN 'High negative correlation - consider index'
ELSE 'Low correlation - index may not help'
END AS index_recommendation
FROM pg_stats
WHERE tablename = 'your_table_name'
ORDER BY abs(correlation) DESC;系统与配置视图
配置参数视图
pg_settings
描述:记录PostgreSQL所有配置参数的当前值和默认值。
主要字段:
name:参数名称setting:当前值unit:单位category:参数类别short_desc:简短描述context:参数上下文(postmaster, superuser, user等)vartype:参数类型(bool, enum, integer, real, string)source:参数值来源sourcefile:配置文件路径sourceline:配置文件行号
使用示例:
sql
-- 查询所有配置参数,按类别分组
SELECT
category,
name,
setting,
unit,
context,
source
FROM pg_settings
ORDER BY category, name;
-- 查询特定类别的参数(如WAL相关)
SELECT
name,
setting,
unit,
short_desc,
context
FROM pg_settings
WHERE category = 'Write-Ahead Log'
ORDER BY name;
-- 查询被修改过的参数
SELECT
name,
setting,
boot_val AS default_value,
sourcefile,
sourceline
FROM pg_settings
WHERE setting <> boot_val
ORDER BY name;事务与MVCC视图
事务状态视图
pg_stat_xact_all_tables
描述:记录当前事务中表的统计信息。
主要字段:
n_tup_ins:插入的行数n_tup_upd:更新的行数n_tup_del:删除的行数n_tup_hot_upd:热更新的行数
使用示例:
sql
-- 查询当前事务中表的修改情况
SELECT
schemaname,
relname,
n_tup_ins AS inserted,
n_tup_upd AS updated,
n_tup_del AS deleted,
n_tup_hot_upd AS hot_updated
FROM pg_stat_xact_all_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
AND (n_tup_ins > 0 OR n_tup_upd > 0 OR n_tup_del > 0)
ORDER BY (n_tup_ins + n_tup_upd + n_tup_del) DESC;WAL与检查点视图
WAL相关视图
pg_stat_wal
描述:记录WAL生成和写入的统计信息。
主要字段:
wal_records:WAL记录数wal_fpi:全页图像数wal_bytes:WAL字节数wal_buffers_full:WAL缓冲区满的次数wal_write:WAL写入次数wal_sync:WAL同步次数wal_write_time:WAL写入时间(毫秒)wal_sync_time:WAL同步时间(毫秒)
使用示例:
sql
-- 查询WAL统计信息
SELECT
wal_records,
wal_fpi,
wal_bytes,
pg_size_pretty(wal_bytes) AS wal_size,
wal_buffers_full,
wal_write,
wal_sync,
ROUND(wal_write_time / 1000.0, 2) AS wal_write_seconds,
ROUND(wal_sync_time / 1000.0, 2) AS wal_sync_seconds
FROM pg_stat_wal;
-- 版本差异:PostgreSQL 13+新增此视图pg_control_checkpoint
描述:函数,显示检查点的控制信息。
主要字段:
checkpoint_lsn:检查点LSNredo_lsn:重做LSNtimeline_id:时间线IDfull_page_writes:是否启用全页写入next_xid:下一个事务IDoldest_xid:最旧事务IDoldest_active_xid:最旧活跃事务IDcheckpoint_time:检查点时间
使用示例:
sql
-- 查询检查点控制信息
SELECT
checkpoint_lsn,
redo_lsn,
timeline_id,
full_page_writes,
next_xid,
oldest_xid,
oldest_active_xid,
checkpoint_time
FROM pg_control_checkpoint();内置视图使用最佳实践
监控与告警
关键指标监控:
- 使用pg_stat_activity监控连接和查询
- 使用pg_stat_database监控数据库整体性能
- 使用pg_stat_user_tables监控表的真空和分析情况
- 使用pg_stat_replication监控复制状态
- 使用pg_locks监控锁等待和死锁
自定义监控视图:
sql-- 创建自定义监控视图,显示表的综合信息 CREATE OR REPLACE VIEW vw_table_monitor AS SELECT t.schemaname, t.relname, pg_size_pretty(pg_total_relation_size(t.relid)) AS total_size, t.n_live_tup, t.n_dead_tup, ROUND(t.n_dead_tup * 100.0 / GREATEST(t.n_live_tup, 1), 2) AS dead_tuple_ratio, t.last_vacuum, t.last_autovacuum, t.last_analyze, t.last_autoanalyze, i.idx_scan, i.idx_tup_read, i.idx_tup_fetch FROM pg_stat_user_tables t LEFT JOIN pg_stat_user_indexes i ON t.schemaname = i.schemaname AND t.relname = i.relname;告警设置建议:
- 长时间运行的查询(>5分钟)
- 空闲事务(>10分钟)
- 锁等待(>1分钟)
- 复制延迟(>30秒)
- 缓存命中率过低(<90%)
- 死元组比例过高(>20%)
- WAL堆积过多(>1GB)
性能优化
查询性能分析:
- 结合pg_stat_statements扩展分析查询性能
- 使用pg_stat_user_indexes识别未使用的索引
- 使用pg_statio_user_tables优化缓存使用
索引优化:
- 根据pg_stat_user_indexes的idx_scan字段,删除未使用的索引
- 根据pg_stats的correlation字段,为高相关性的列创建索引
- 使用pg_indexes查看索引定义,优化索引设计
真空与分析优化:
- 使用pg_stat_user_tables识别需要真空或分析的表
- 根据n_dead_tup和n_mod_since_analyze调整autovacuum参数
- 监控autovacuum运行情况,避免其成为性能瓶颈
安全与维护
安全注意事项:
- 限制对pg_stat_activity的访问,防止敏感查询泄露
- 限制对pg_settings的修改权限,防止非法配置变更
- 定期检查pg_prepared_xacts,清理长时间准备的事务
维护建议:
- 定期重置统计信息(使用pg_stat_reset()函数)
- 结合监控工具(如Prometheus+Grafana)实现可视化监控
- 在只读副本上执行复杂的统计查询,减轻主库负担
版本差异总结
| 视图名称 | PostgreSQL 9.x | PostgreSQL 10+ | PostgreSQL 12+ | PostgreSQL 13+ | PostgreSQL 14+ |
|---|---|---|---|---|---|
| pg_stat_database | ✅ | ✅ | ✅ | ✅(新增stats_reset) | ✅ |
| pg_stat_bgwriter | ✅ | ✅ | ✅ | ✅ | ✅(新增checkpoint_stats_reset) |
| pg_stat_user_tables | ✅ | ✅(新增maintenance_work_mem) | ✅ | ✅ | ✅ |
| pg_stat_activity | ✅ | ✅ | ✅ | ✅(新增query_id) | ✅(新增backend_xid) |
| pg_stat_replication | ✅ | ✅(新增write_lag等) | ✅ | ✅ | ✅ |
| pg_replication_slots | ✅ | ✅ | ✅ | ✅ | ✅ |
| pg_stat_wal | ❌ | ❌ | ❌ | ✅ | ✅ |
| pg_control_checkpoint | ✅ | ✅ | ✅ | ✅ | ✅ |
| pg_settings | ✅ | ✅ | ✅ | ✅ | ✅ |
总结
PostgreSQL内置视图是DBA日常运维工作中的重要工具,提供了丰富的监控和管理功能。通过熟练掌握和使用这些视图,DBA可以实时了解数据库的运行状态,快速诊断问题,优化性能,确保数据库系统的稳定运行。
在实际运维工作中,建议结合监控工具(如Prometheus+Grafana、Zabbix等),将这些内置视图的数据可视化,设置合理的告警规则,实现自动化监控和管理。同时,定期分析这些视图的数据,总结数据库的运行规律,提前发现潜在问题,做好容量规划和性能优化。
通过合理利用PostgreSQL内置视图,可以显著提高数据库运维效率,降低故障风险,确保业务系统的高可用性和高性能。
