PG数据库日常应用

一、基础连接与库表操作(psql 常用)

1. 连接数据库

bash

运行

复制代码
# 本地连接
psql -U postgres -d mydb

# 远程连接
psql -h 192.168.1.100 -p 5432 -U postgres -d mydb
2. psql 常用元命令
  • \l --- 列出所有数据库
  • \c mydb --- 切换数据库
  • \dt --- 查看当前库所有表
  • \d users --- 查看表结构(字段、类型、索引、约束)
  • \du --- 查看所有用户及权限
  • \q --- 退出 psql
3. 库 / 表 / 索引基础 SQL

sql

复制代码
-- 创建库
CREATE DATABASE mydb;

-- 创建表(含约束、自增、注释)
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(50) UNIQUE NOT NULL,
  email VARCHAR(100),
  create_time TIMESTAMP DEFAULT now(),
  remark TEXT
);
COMMENT ON TABLE users IS '用户表';

-- 新增/修改/删除索引
CREATE INDEX idx_users_username ON users(username);
DROP INDEX idx_users_username;

二、开发常用 SQL 技巧

1. 增删改查进阶
  • RETURNING(插入 / 更新后返回字段)

sql

复制代码
INSERT INTO users(username) VALUES('zhangsan') RETURNING id, create_time;
  • UPSERT(存在则更新,不存在则插入)

sql

复制代码
INSERT INTO users(id, username)
VALUES (1, 'lisi')
ON CONFLICT(id) DO UPDATE SET username = EXCLUDED.username;
2. JSON/JSONB 灵活存储(替代 NoSQL)

sql

复制代码
-- 插入 JSON
INSERT INTO configs(data) VALUES('{"theme":"dark","lang":"zh"}'::JSONB);

-- 查询 JSON 字段
SELECT data->>'theme' AS theme FROM configs;

-- JSON 条件查询(可建索引加速)
SELECT * FROM configs WHERE data @> '{"lang":"zh"}'::JSONB;
3. 分页、排序、聚合

sql

复制代码
-- 分页(OFFSET 大表性能差,推荐游标/键值分页)
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;

-- 窗口函数(分组排名、累计)
SELECT username,
       RANK() OVER (PARTITION BY dept ORDER BY salary DESC) AS rank
FROM employees;

三、日常监控与问题排查

1. 连接与会话

sql

复制代码
-- 查看所有活动连接
SELECT pid, usename, datname, state, query FROM pg_stat_activity;

-- 杀掉异常会话(谨慎!)
SELECT pg_terminate_backend(12345);
2. 慢查询定位(需开启 pg_stat_statements)

sql

复制代码
-- 按平均耗时排序慢查询 TOP10
SELECT queryid, query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY mean_time DESC LIMIT 10;
3. 表 / 索引膨胀与死元组

sql

复制代码
-- 查看表死元组比例
SELECT relname, n_live_tup, n_dead_tup,
       n_dead_tup::float/(n_live_tup+n_dead_tup) AS dead_ratio
FROM pg_stat_user_tables;

四、日常维护(必做)

1. VACUUM 清理(自动 / 手动)
  • 删除 / 更新后空间不会立即释放,需清理 "死元组"

sql

复制代码
-- 手动清理(业务低峰)
VACUUM ANALYZE users;

-- 全库深度清理(锁表,谨慎)
VACUUM FULL;
2. 统计信息更新

sql

复制代码
-- 更新单表统计(优化器依赖)
ANALYZE users;
3. 磁盘与大小检查

sql

复制代码
-- 数据库大小
SELECT pg_size_pretty(pg_database_size('mydb'));

-- 表大小(含索引)
SELECT pg_size_pretty(pg_total_relation_size('users'));

五、备份与恢复(数据安全)

1. 逻辑备份(pg_dump)

bash

运行

复制代码
# 全库备份
pg_dump -U postgres mydb > mydb_backup.sql

# 仅备份 schema
pg_dump -s -U postgres mydb > mydb_schema.sql
2. 物理备份(pg_basebackup)

bash

运行

复制代码
# 基础全量备份
pg_basebackup -D /backup/pg -U postgres -P -Xs
3. 恢复

bash

运行

复制代码
# 逻辑恢复
psql -U postgres -d mydb < mydb_backup.sql

六、典型应用场景

  • 企业级系统:ERP、CRM、财务、电商(强事务、复杂查询)
  • GIS 地理信息:PostGIS 扩展,地图、物流、轨迹、围栏
  • IoT 时序数据:TimescaleDB 扩展,传感器、监控、日志
  • Web 应用:CMS(Drupal/WordPress)、社交、用户配置(JSONB)
  • 数据仓库 / BI:CTE、窗口函数、并行查询

七、配置优化要点(postgresql.conf)

  • shared_buffers:内存 25%--40%
  • work_mem:排序 / 哈希内存(512MB--2GB)
  • maintenance_work_mem:VACUUM / 建索引内存
  • max_connections:连接数(配合 PgBouncer 连接池)

八、生产环境最佳实践

  1. 禁用超级用户直连,按业务分用户、最小权限
  2. 定期备份(全量 + WAL 归档)
  3. 开启慢查询日志、连接监控
  4. 自动 VACUUM/ANALYZE
  5. 连接池 PgBouncer、读写分离、Citus 分片
相关推荐
这个DBA有点耶1 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G1 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备1 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远1 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren1 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安1 天前
MySQL-触发器
数据库·mysql
白远山1 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro1 天前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理
2603_965148111 天前
AI+API选品:下一代智能商务助手雏形已现
java·大数据·数据库·人工智能·数据挖掘