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 分片
相关推荐
老纪的技术唠嗑局1 小时前
超级干货分享:中小企业使用 OceanBase 实践经验汇总
数据库
CLOUD ACE1 小时前
谷歌云代理|零售商Target 如何利用 Spanner Graph 提升零售发现体验并将数据库维护成本降低 50%
数据库·零售
AI大模型-小雄1 小时前
Codex写分页接口为什么越翻越慢?用Cursor Pagination解决重复与漏数据
大数据·数据库·elasticsearch·搜索引擎·chatgpt·后端开发·codex
少晓年2 小时前
从 MySQL 迁移到人大金仓 KingbaseES:完整指南与实践
数据库·mysql
SelectDB3 小时前
Apache Doris AI RAG 实战:从基础 RAG 到知识图谱增强的技术能力与选型
数据库
SelectDB3 小时前
电商企业 PostgreSQL 迁移 Apache Doris:80TB 分析数据统一平台技术能力与实践
数据库
SelectDB3 小时前
阶跃星辰 Agent 可观测:Apache Doris / SelectDB 的技术能力与实践
数据库
SelectDB3 小时前
ApacheDoris Iceberg V3 湖仓 DML:Apache Doris / SelectDB 的技术能力与实践
数据库
SelectDB3 小时前
ApacheDoris Python UDF:SQL 调用 Python 的技术能力、选型对比与实践
数据库
Crazy________3 小时前
Redis03:持久化存储,大key分析,主从复制及哨兵模式
数据库·redis·容器