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 | 当前连接信息 |
\l | database 列表 |
\dn | schema 列表 |
\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