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 分片
相关推荐
XLYcmy5 分钟前
AI 赋能后中文与英文数据库对比分析报告 上
数据库·ai·llm·prompt·检索·wos·cnki
这个DBA有点耶41 分钟前
ELT 工具选型完整指南:从 ETL 差异分析到工程落地
数据库·架构·代码规范
IvorySQL1 小时前
PostgreSQL 日报|堆表选择性索引更新(10 月 13 日)
数据库·人工智能·postgresql·开源·区块链
张洛闻Eren1 小时前
Ansible【第一课】:Ansible介绍
运维·数据库·云原生·kubernetes·github·ansible
深圳市益普科技有限公司2 小时前
中小封装厂上 MES,为什么十个项目九个坑?
大数据·数据库·人工智能
云边云科技_云网融合2 小时前
从 POS 机到访客 Wi-Fi:零售门店安全建设的完整解法
服务器·网络·数据库
天行健,君子而铎2 小时前
知形-数据库风险监测系统:非侵入式、可溯源、差异化的数据库安全方案
网络·数据库·安全
这个DBA有点耶2 小时前
分布式事务深度:TCC空回滚、悬挂与Saga补偿风暴的根因与解法
数据库·mysql·代码规范
执笔为剑2 小时前
2.1.2-2、V8R3迁移到V8R6-迁移介绍
数据库
hiahiahia1232 小时前
Message 和对话
服务器·前端·数据库