Skip to content

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:进程ID
  • usename:用户名
  • 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:全局事务ID
  • prepared:准备时间
  • 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:数据库OID
  • relation:关系OID(表或索引)
  • page:页号
  • tuple:元组标识符
  • virtualxid:虚拟事务ID
  • transactionid:事务ID
  • pid:持有或等待锁的进程ID
  • mode:锁模式(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发送进程ID
  • usename:复制用户名
  • 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接收进程ID
  • status:WAL接收状态
  • receive_start_lsn:接收开始的WAL位置
  • written_lsn:已写入的WAL位置
  • flushed_lsn:已刷新到磁盘的WAL位置
  • received_tli:当前接收的时间线ID
  • last_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:保留的最旧事务ID
  • catalog_xmin:保留的最旧目录事务ID
  • restart_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:检查点LSN
  • redo_lsn:重做LSN
  • timeline_id:时间线ID
  • full_page_writes:是否启用全页写入
  • next_xid:下一个事务ID
  • oldest_xid:最旧事务ID
  • oldest_active_xid:最旧活跃事务ID
  • checkpoint_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();

内置视图使用最佳实践

监控与告警

  1. 关键指标监控

    • 使用pg_stat_activity监控连接和查询
    • 使用pg_stat_database监控数据库整体性能
    • 使用pg_stat_user_tables监控表的真空和分析情况
    • 使用pg_stat_replication监控复制状态
    • 使用pg_locks监控锁等待和死锁
  2. 自定义监控视图

    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;
  3. 告警设置建议

    • 长时间运行的查询(>5分钟)
    • 空闲事务(>10分钟)
    • 锁等待(>1分钟)
    • 复制延迟(>30秒)
    • 缓存命中率过低(<90%)
    • 死元组比例过高(>20%)
    • WAL堆积过多(>1GB)

性能优化

  1. 查询性能分析

    • 结合pg_stat_statements扩展分析查询性能
    • 使用pg_stat_user_indexes识别未使用的索引
    • 使用pg_statio_user_tables优化缓存使用
  2. 索引优化

    • 根据pg_stat_user_indexes的idx_scan字段,删除未使用的索引
    • 根据pg_stats的correlation字段,为高相关性的列创建索引
    • 使用pg_indexes查看索引定义,优化索引设计
  3. 真空与分析优化

    • 使用pg_stat_user_tables识别需要真空或分析的表
    • 根据n_dead_tup和n_mod_since_analyze调整autovacuum参数
    • 监控autovacuum运行情况,避免其成为性能瓶颈

安全与维护

  1. 安全注意事项

    • 限制对pg_stat_activity的访问,防止敏感查询泄露
    • 限制对pg_settings的修改权限,防止非法配置变更
    • 定期检查pg_prepared_xacts,清理长时间准备的事务
  2. 维护建议

    • 定期重置统计信息(使用pg_stat_reset()函数)
    • 结合监控工具(如Prometheus+Grafana)实现可视化监控
    • 在只读副本上执行复杂的统计查询,减轻主库负担

版本差异总结

视图名称PostgreSQL 9.xPostgreSQL 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内置视图,可以显著提高数据库运维效率,降低故障风险,确保业务系统的高可用性和高性能。