PG数据库日常应用

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-64MB
  • effective_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 扩展
  • 数据仓库:复杂查询、多表关联、统计分析
相关推荐
XDHCOM2 小时前
MySQL ER_DD_VERSION_INSTALLED报错解析,数据字典版本问题,故障修复与远程处理指南
数据库·mysql
yaoyouzhong3 小时前
MySQL 批量插入详解:快速提升大数据导入效率的实战方法
大数据·数据库·mysql
NineData4 小时前
NineData V5.0 产品发布会:让 AI 成为数据管理的驱动力,4月16日!
数据库·人工智能·ai编程
高梦轩5 小时前
PG数据库
数据库·oracle
云草桑5 小时前
DBA mssql 解决排序规则冲突 QA prod 和开发配置都是一样的服务器排序规则 为啥开发环境的的存储过程需要 加这个COLLATE Chinese_PRC_CI_AS
数据库·dba·mssql
卤炖阑尾炎5 小时前
MySQL 故障排查与生产环境优化实战指南
数据库·mysql
小陈工5 小时前
2026年4月2日技术资讯洞察:数据库融合革命、端侧AI突破与脑机接口产业化
开发语言·前端·数据库·人工智能·python·安全
solihawk5 小时前
分区大表统计信息不准确引发的性能问题
数据库
百结2146 小时前
postgresql日常运用
数据库·postgresql·oracle