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 分片
相关推荐
阿维的博客日记2 小时前
MySQL中type字段解析
数据库·mysql
Trouvaille ~2 小时前
【MySQL篇】表的操作:数据的容器
linux·数据库·mysql·oracle·xshell·ddl·表的操作
黑牛儿2 小时前
从0开始实现Mysql主从配置实战
服务器·数据库·后端·mysql
爱学习的小囧2 小时前
vSphere 9.0 API 实操教程 —— 轻松检索 vGPU 与 DirectPath 配置文件
linux·运维·服务器·网络·数据库·esxi·vmware
麦聪聊数据2 小时前
数据库安全与运维管控(一):MySQL、PG与Oracle原生审计机制对比
运维·数据库·mysql·oracle
ZHENGZJM2 小时前
后端基石:Go 项目初始化与数据库模型设计
开发语言·数据库·golang
小小程序员.¥2 小时前
oracle--plsql块、存储过程、存储函数
数据库·sql·oracle
fire-flyer2 小时前
ClickHouse系列(四):压缩不是为了省磁盘,而是为了更快的查询
数据库·clickhouse
刘~浪地球2 小时前
Redis 从入门到精通(十四):内存管理与淘汰策略
数据库·redis·缓存