跳转至

PostgreSQL 备忘

连接

psql "postgresql://user:pass@127.0.0.1:5432/dbname"
psql -h 127.0.0.1 -U user -d dbname

127.0.0.1 走 TCP 需要 pg_hba.conf 允许;localhost 在部分系统会走 Unix socket,两者表现不同,排错时注意区分。

备份与恢复

# 备份(自定义格式,可并行、可选择性恢复)
pg_dump -Fc -U user -d dbname -f dbname-$(date +%F).dump

# 恢复
pg_restore -d dbname --clean --if-exists dbname-2026-01-01.dump

# 只导表结构
pg_dump -s -U user -d dbname > schema.sql

查看连接数与占用

SELECT pid, usename, state, wait_event_type, left(query, 60) AS q
FROM pg_stat_activity ORDER BY query_start;

-- 终止某个会话
SELECT pg_terminate_backend(12345);

慢查询

-- 先开扩展
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

SELECT calls, round(total_exec_time::numeric, 1) AS total_ms,
       round(mean_exec_time::numeric, 1) AS mean_ms,
       left(query, 80) AS query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;

索引是否被用上

EXPLAIN (ANALYZE, BUFFERS) SELECT ...;

看 Seq Scan 出现在大表上通常说明索引缺失或条件写法导致索引失效(比如对列做了函数运算)。