database Cheatsheet
PostgreSQL 常用命令速查表
PostgreSQL 日常运维命令一页速查:连接与角色管理、库表操作、查询分析、锁与事务排查、备份恢复和复制状态检查等 30+ 高频操作,含关键参数说明与典型排障场景示例。
把 PostgreSQL 日常最常敲的命令按连接、库表、查询分析、锁排查、备份恢复和复制分组整理,排障现场直接复制改参数即可。
连接与角色 Connection & Role
- 连接指定用户和主机,-W 强制密码提示
psql -U postgres -h 127.0.0.1 -p 5432 - 执行命令后退出,适合脚本
psql -U postgres -d db_name -c "\dt" - 创建登录角色
CREATE ROLE app_user WITH LOGIN PASSWORD 'secret'; - 授予连接数据库权限
GRANT CONNECT ON DATABASE db TO app_user; - 授予 schema 权限
GRANT ALL ON SCHEMA public TO app_user; - 修改参数需 reload,部分需 restart
ALTER SYSTEM SET shared_buffers = 4GB; - 重载配置文件,不中断连接
SELECT pg_reload_conf();
库表操作 Database & Table
- 列出所有数据库
\l - 列出当前库的所有表
\dt - 查看表结构、索引和约束
\d table_name - 查看表结构详情含描述和存储信息
\d+ table_name - 并发建索引不锁表,但耗时更长且不能在事务中用
CREATE INDEX CONCURRENTLY idx_name ON t(col); - 回收死元组并更新统计信息,不锁表
VACUUM ANALYZE t; - 全量回收磁盘空间,会锁表且重写整张表
VACUUM FULL t; - 并发重建索引不锁表(PG 12+)
REINDEX INDEX CONCURRENTLY idx_name;
查询分析 Query Analysis
- 查看执行计划,不执行查询
EXPLAIN SELECT * FROM t WHERE col = 1; - 执行并显示实际耗时,注意会修改数据(DML)
EXPLAIN ANALYZE SELECT * FROM t WHERE col = 1; - 含缓冲区命中信息,判断 IO 瓶颈
EXPLAIN (ANALYZE, BUFFERS) SELECT ... - 找出频繁全表扫描的表,考虑加索引
SELECT * FROM pg_stat_user_tables WHERE seq_scan > 0 ORDER BY seq_scan DESC; - 查看当前数据库大小
SELECT pg_size_pretty(pg_database_size(current_database())); - 查看死元组最多的表,需要 VACUUM
SELECT relname, n_dead_tup FROM pg_stat_user_tables ORDER BY n_dead_tup DESC LIMIT 10;
锁与事务 Lock & Transaction
- 查看活跃查询,找长查询和卡住的连接
SELECT pid, state, query FROM pg_stat_activity WHERE state != 'idle'; - 取消查询(发 SIGINT),不断开连接
SELECT pg_cancel_backend(<pid>); - 终止连接(发 SIGTERM),强制断开
SELECT pg_terminate_backend(<pid>); - 查看等待中的锁
SELECT * FROM pg_locks WHERE NOT granted; - 锁等待关联查询,找阻塞源头
SELECT pid, mode, granted, query FROM pg_locks l JOIN pg_stat_activity a USING(pid) WHERE NOT l.granted; - 找空闲但未提交的事务,这些会持有锁
SELECT * FROM pg_stat_activity WHERE state = 'idle in transaction';
备份恢复 Backup & Recovery
- 逻辑备份单个库
pg_dump -U postgres db_name > backup.sql - 自定义压缩格式,支持并行恢复
pg_dump -U postgres -Fc db_name > db.dump - 并行恢复(4 个 worker),加速大库恢复
pg_restore -U postgres -d db_name -j 4 db.dump - 只备份角色定义,迁移时先恢复
pg_dumpall -U postgres --roles-only > roles.sql - 开始物理备份(需 archive_mode 开启)
SELECT pg_start_backup("label"); - 查看当前 WAL 文件名
SELECT pg_walfile_name(pg_current_wal_lsn());
流复制 Streaming Replication
- 主库查看从库同步状态
SELECT application_name, state, sync_state, sent_lsn, write_lsn FROM pg_stat_replication; - 从库查看接收和回放进度
SELECT status, receive_lsn, replay_lsn FROM pg_stat_wal_receiver; - 查看复制延迟时长
SELECT NOW() - pg_last_xact_replay_timestamp() AS replication_lag; - 查看复制延迟字节数
SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes FROM pg_stat_replication;
容易踩的坑
- CREATE INDEX CONCURRENTLY 不能在事务块中使用,如果中间失败会留下 INVALID 索引,需 DROP 后重建。
- idle in transaction 连接是最常见的锁阻塞源头,设置 idle_in_transaction_session_timeout 自动清理。
- pg_dump 是逻辑备份,大数据量用 pg_basebackup 做物理备份 + WAL 归档实现 PITR。