PostgreSQL Field Guide

PostgreSQL 现场速查

连接、psql、对象、会话、锁与容量的高频命令

psql

psql 'postgresql://user@host:5432/database?sslmode=verify-full'
psql -X --set ON_ERROR_STOP=on --file migration.sql "$DATABASE_URL"
命令作用
\conninfo当前连接信息
\ldatabase 列表
\dnschema 列表
\dt app.*表列表
\d+ app.orders对象定义与存储信息
\du角色列表
\dx扩展列表
\timing on显示客户端观察的耗时
\x auto宽结果自动纵向显示
\gdesc描述查询结果列而不展示行
\q退出

脚本使用 -X 避免加载用户 .psqlrc,并用 ON_ERROR_STOP 在首个错误退出。

当前上下文

SELECT
  version(),
  current_database(),
  current_user,
  session_user,
  current_schema(),
  current_setting('TimeZone') AS timezone,
  inet_server_addr(),
  inet_server_port();

对象大小

SELECT
  relname,
  pg_size_pretty(pg_total_relation_size(relid)) AS total,
  pg_size_pretty(pg_relation_size(relid)) AS heap,
  pg_size_pretty(pg_indexes_size(relid)) AS indexes
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 20;

活跃会话与长事务

SELECT
  pid, usename, application_name, state,
  now() - xact_start AS xact_age,
  wait_event_type, wait_event,
  left(query, 160) AS query
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
ORDER BY xact_start NULLS LAST;

谁阻塞谁

SELECT
  blocked.pid AS blocked_pid,
  blocker.pid AS blocker_pid,
  now() - blocked.query_start AS blocked_for,
  left(blocked.query, 120) AS blocked_query,
  left(blocker.query, 120) AS blocker_query
FROM pg_stat_activity AS blocked
CROSS JOIN LATERAL unnest(pg_blocking_pids(blocked.pid)) AS b(pid)
JOIN pg_stat_activity AS blocker ON blocker.pid = b.pid;

不要看到 blocker 就立刻 pg_terminate_backend。先确认业务、事务内容、是否可重试和终止后影响。

安全的会话设置

BEGIN;
SET LOCAL statement_timeout = '10s';
SET LOCAL lock_timeout = '2s';
SET LOCAL search_path = app, pg_catalog;
-- work
COMMIT;

诊断顺序

确认目标实例与角色 → 记录 SQLSTATE → 检查事务状态 → 检查等待事件/阻塞 → 获取查询计划与统计 → 在受控环境复现 → 修复后执行验证查询。

连接尚未建立时使用 PostgreSQL 连接错误排查;连接成功后的 SQL 错误使用 错误与 SQLSTATE

扩展、维护工具和开源组件的升级边界见 PostgreSQL 扩展与开源生态选型

索引与存储概念见 PostgreSQL 索引与存储访问方法;协议兼容、分支与 PostgreSQL 血缘见 PostgreSQL 血缘与兼容数据库

Last updated on

On this page