PostgreSQL(简称 PG)是功能强大的开源关系型数据库。日常应用主要围绕连接与基础操作、SQL 开发、用户权限、维护监控、备份恢复五大核心场景。以下是系统化的实战指南。
一、连接与基础操作(psql 命令行)
1. 连接数据库
bash
运行
# 本地连接(默认用户postgres)
su - postgres
psql
# 远程连接
psql -U 用户名 -d 库名 -h 主机IP -p 端口 (默认5432)
# 示例:psql -U appuser -d mydb -h 192.168.1.100 -p 5432
2. psql 常用元命令
\l:列出所有数据库\c 库名:切换数据库\dt:列出当前库所有表\d 表名:查看表结构(字段、类型、约束、索引)\du:列出所有用户及权限\q:退出 psql
二、日常 SQL 操作(CRUD)
1. 库与表管理
sql
-- 创建数据库
CREATE DATABASE mydb;
-- 删除数据库
DROP DATABASE mydb;
-- 创建表(含常用约束)
CREATE TABLE users (
id SERIAL PRIMARY KEY, -- 自增主键
username VARCHAR(50) UNIQUE NOT NULL, -- 唯一非空
email VARCHAR(100) UNIQUE,
age INT CHECK (age >= 18), -- 检查约束
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 默认值
);
-- 修改表(添加字段)
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- 删除表
DROP TABLE users;
2. 数据增删改查(DML)
sql
-- 插入
INSERT INTO users (username, email, age)
VALUES ('zhangsan', 'zs@example.com', 25);
-- 查询(基础/条件/排序/分页)
SELECT id, username FROM users WHERE age > 20 ORDER BY create_time DESC LIMIT 10 OFFSET 0;
-- 更新
UPDATE users SET age = 26 WHERE username = 'zhangsan';
-- 删除
DELETE FROM users WHERE id = 1;
3. 高级查询特性
- JOIN 关联:支持内连接、左 / 右连接、全连接
- 聚合函数 :
COUNT(),SUM(),AVG(),GROUP BY,HAVING - CTE 公共表表达式 :
WITH tmp AS (SELECT ...) SELECT ... FROM tmp - 窗口函数 :
ROW_NUMBER(),RANK(),PARTITION BY(复杂统计必备)
三、用户与权限管理(安全核心)
sql
-- 1. 创建用户
CREATE USER appuser WITH PASSWORD 'mypassword';
-- 2. 授予权限(最小权限原则)
-- 授予库权限
GRANT CONNECT ON DATABASE mydb TO appuser;
-- 授予模式(public)权限
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO appuser;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO appuser;
-- 3. 收回权限
REVOKE INSERT ON users FROM appuser;
-- 4. 删除用户
DROP USER appuser;
四、日常维护(稳定运行关键)
1. 清理与统计(VACUUM/ANALYZE)
PG 采用MVCC 多版本机制,更新 / 删除会产生死元组,需定期清理PostgreSQL。
sql
-- 标准清理(无锁,日常推荐)
VACUUM ANALYZE; -- 全库
VACUUM ANALYZE users; -- 单表
-- 全量清理(锁表,回收磁盘空间,低峰执行)
VACUUM FULL users;
-- 生产建议:开启autovacuum(默认开启)
2. 索引管理(性能核心)
sql
-- 创建B树索引(最常用)
CREATE INDEX idx_users_username ON users(username);
-- 查看索引
\d users
-- 删除索引
DROP INDEX idx_users_username;
-- 优化原则:为WHERE/JOIN/ORDER BY字段建索引;避免过度索引(影响写入)
3. 慢查询分析
sql
-- 1. 开启慢查询日志(postgresql.conf)
log_min_duration_statement = 200; -- 记录执行>200ms的SQL
-- 2. 查看执行计划(优化SQL必备)
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 20;
-- 重点关注:Seq Scan(全表扫描→需建索引)、Index Scan(索引扫描)
五、备份与恢复(数据安全)
1. 逻辑备份(pg_dump,适合小库、迁移)
bash
运行
# 单库备份
pg_dump -U postgres -d mydb -f mydb_backup.sql
# 压缩备份
pg_dump -U postgres mydb | gzip > mydb_$(date +%F).sql.gz
# 恢复
psql -U postgres -d mydb -f mydb_backup.sql
2. 物理备份(pg_basebackup,适合大库、主从)
bash
运行
# 全量物理备份
pg_basebackup -D /backup/pg -U postgres -P -Fp -Xs
3. 定时备份(Crontab)
bash
运行
# 每天2点备份
0 2 * * * pg_dump -U postgres mydb | gzip > /backup/mydb_$(date +\%F).sql.gz
六、配置与监控
1. 核心配置(postgresql.conf)
shared_buffers:数据库共享内存,建议内存 25%work_mem:单查询排序 / Join 内存,默认 4MB→调至 16-64MBeffective_cache_size:系统可用缓存,建议内存 75%listen_addresses = '*':允许远程连接
2. 远程访问(pg_hba.conf)
ini
# 允许192.168.1.0/24网段用户密码连接
host all all 192.168.1.0/24 scram-sha-256
修改后重启 :systemctl restart postgresql
3. 常用监控 SQL
sql
-- 活跃连接
SELECT count(*) FROM pg_stat_activity;
-- 表大小
SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) FROM pg_stat_user_tables;
-- 锁状态(排查阻塞)
SELECT * FROM pg_locks WHERE NOT granted;
七、常见应用场景
- Web 后端:配合 Django/Flask/Java,存储用户、订单、业务数据
- 地理信息(GIS):PostGIS 扩展,支持经纬度、地图计算
- 时序数据:存储日志、监控指标,配合 TimescaleDB 扩展
- 数据仓库:复杂查询、多表关联、统计分析