PostgreSQL入门笔记250718
PostgreSQL 介绍
PostgreSQL(简称 Postgres)是一款功能极其强大且开源的对象-关系型数据库管理系统(ORDBMS)。它以可靠性、功能丰富、性能卓越和扩展性而闻名,是许多关键业务应用、地理信息系统(GIS)、数据分析平台等的首选数据库。
以下是对 PostgreSQL 的详细解析:
核心特性与优势
- 开源与自由: 遵循 PostgreSQL 许可证(类似 BSD/MIT),允许自由使用、修改和分发,无版权费用。
- 高度可扩展:
- 数据类型扩展: 支持自定义数据类型(CREATE TYPE)。
- 函数/操作符扩展: 可以用多种语言(如 SQL, PL/pgSQL, Python, Perl, C 等)编写自定义函数(CREATE FUNCTION)和操作符。
- 索引扩展: 支持创建自定义索引访问方法(例如 GiST, SP-GiST, GIN, BRIN),用于高效索引复杂数据类型(如几何对象、全文搜索、数组、JSONB)。
- 过程语言扩展: 可以加载新的服务器端编程语言(如 PL/Python, PL/V8, PL/R)。
- 符合标准: 对 SQL 标准(最新版本通常支持 SQL:2016 的核心功能)的高度兼容是其核心设计目标之一。这使得迁移和编写兼容性高的 SQL 代码更容易。
- 强大的数据完整性:
- 丰富的约束:主键、外键、唯一约束、非空约束、检查约束(CHECK)。
- 排他约束(EXCLUDE):确保表中任意两行在指定的列或表达式上不满足某些条件(常用范围类型防止重叠)。
- 复杂的查询能力:
- 丰富的 JOIN 类型(INNER, LEFT/RIGHT/FULL OUTER, CROSS, LATERAL)。
- 强大的聚合函数和窗口函数(OVER, PARTITION BY, ORDER BY)。
- Common Table Expressions(CTEs),包括递归 CTEs(用于树形结构查询)。
- 表继承(一种面向对象的数据建模方式)。
- 分区表(原生声明式分区,支持范围、列表、哈希分区)。
- 全文搜索(内置支持,基于 tsvector/tsquery)。
- 并发控制与可靠性:
- 多版本并发控制: PostgreSQL 的核心并发机制。写操作不会阻塞读操作(读操作看到的是事务开始前的快照)。这极大地提高了高并发读场景下的性能。
- 事务支持: 完全支持 ACID(原子性、一致性、隔离性、持久性)属性。
- 预写式日志: 所有修改在应用到实际数据文件之前都会先写入 WAL。这是实现数据持久化(D)、崩溃恢复、流复制和 PITR 的基础。
- 强大的崩溃恢复: 利用 WAL 在服务器崩溃后自动恢复到一致状态。
- 丰富的数据类型:
- 基础类型:整数(smallint, integer, bigint)、数值(decimal, numeric, real, double precision)、字符(varchar, text)、布尔值、日期/时间(timestamp, timestamptz, date, time, interval)、枚举、二进制数据(bytea)、货币(money)。
- 结构化类型:数组(任何基础类型或自定义类型的一维或多维数组)、复合类型(类似结构体)。
- 文档类型: JSON, JSONB(二进制 JSON,支持索引和高效查询)、XML。
- 几何类型: 点、线、线段、矩形、多边形、圆等(PostGIS 扩展提供更强大的 GIS 功能)。
- 网络地址类型: inet, cidr, macaddr。
- 全文搜索类型: tsvector, tsquery。
- 范围类型: int4range, int8range, numrange, tsrange, tstzrange, daterange(表示值的区间)。
- UUID 类型: 用于存储全局唯一标识符。
- HStore: 键值对存储(类似于 NoSQL)。
- 性能:
- 优化的查询规划器/执行器,能高效处理复杂查询。
- 多种高性能索引:B-tree(默认,适合范围查询和排序)、Hash(等值查询)、GiST(广义搜索树,适合多维数据、全文搜索、范围)、SP-GiST(空间分区树)、GIN(倒排索引,适合数组、全文搜索、JSONB)、BRIN(块范围索引,适合大型有序表)。
- 并行查询(支持顺序扫描、聚合、连接等操作的并行化)。
- 仅索引扫描(Index-Only Scans):如果索引包含查询所需的所有列,则无需访问表数据。
- JIT 编译(即时编译,加速表达式计算)。
- 安全:
- 强大的身份验证机制:password, md5, scram-sha-256, ident, peer, pam, ldap, radius, cert 等。
- 精细的访问控制:基于角色的权限管理(GRANT/REVOKE),控制对象(表、视图、函数、模式等)的访问权限(SELECT, INSERT, UPDATE, DELETE, EXECUTE, USAGE, CREATE 等)。
- 行级安全:限制用户只能访问表中满足特定策略的行。
- SSL/TLS 加密客户端/服务器连接。
- 数据加密:可选择表空间级加密(结合文件系统或第三方工具)或列级加密(通过 pgcrypto 扩展)。
- 可编程性:
- 存储过程/函数: 支持多种过程语言:PL/pgSQL(类似 Oracle PL/SQL)、PL/Python、PL/Perl、PL/Tcl、PL/Java、PL/V8(JavaScript)、PL/R 等。支持返回单个值、行、表或游标。
- 触发器: 在特定事件(INSERT, UPDATE, DELETE, TRUNCATE)之前或之后自动执行函数。
- 规则系统: 提供一种强大的机制来重写查询或定义视图的更新行为(比触发器更底层,使用需谨慎)。
- 国际化: 支持多字节字符集(如 UTF-8),提供强大的排序、大小写转换和格式化功能(依赖于操作系统的 ICU 库或内置规则)。
关键组件与架构(简化)
- 进程模型:
- Postmaster: 主守护进程,监听连接请求。
- Backend Processes: 每个客户端连接对应一个后端进程,处理该连接的所有查询。
- Background Processes:
checkpointer
: 定期将脏缓冲区写入数据文件并创建检查点(标记 WAL 中已持久化的位置)。background writer
: 将脏缓冲区写入数据文件(减轻检查点压力)。wal writer
: 将 WAL 缓冲区刷新到 WAL 文件。autovacuum launcher/workers
: 自动执行 VACUUM 和 ANALYZE 操作。archiver
: 归档 WAL 文件(如果配置了)。logger
: 处理日志输出。stats collector
: 收集统计信息。
- 内存结构:
- Shared Buffers: 最重要的共享内存区域,缓存表和索引的数据块。
- WAL Buffers: 缓存即将写入 WAL 文件的日志记录。
- Work Mem: 用于排序、哈希操作、临时表等的每个连接私有内存。
- Maintenance Work Mem: 用于维护操作(如 VACUUM, CREATE INDEX, ALTER TABLE ADD FOREIGN KEY)的每个操作私有内存。
- Temp Buffers: 用于临时表的每个会话私有内存。
- 存储结构:
- 集群(Cluster): 一个 PostgreSQL 实例管理的数据库集合。对应一个数据目录(
PGDATA
)。 - 数据库(Database): 逻辑上独立的数据集合。属于一个集群。
- 模式(Schema): 数据库内的命名空间,包含表、视图、函数等对象。用于逻辑组织和管理权限(默认模式
public
)。 - 表空间(Tablespace): 定义数据文件在磁盘上的物理存储位置。可以跨多个磁盘或文件系统。包含多个数据库的对象。
- 数据文件: 存储实际表、索引数据(通常按段分割)。
- WAL 文件: 存储事务日志(按段分割)。
- 集群(Cluster): 一个 PostgreSQL 实例管理的数据库集合。对应一个数据目录(
- 事务与 MVCC:
- 每个元组(行)都有隐藏的系统列
xmin
(创建该版本的事务 ID)和xmax
(删除/锁定该版本的事务 ID)。 - 当一个事务开始时,它获取一个事务快照(Snapshot),决定它能"看到"哪些行版本(基于
xmin
/xmax
和事务状态)。 INSERT
:创建新行,xmin
= 当前事务 ID。UPDATE
:将旧行标记为过期(设置xmax
),并插入一个新行版本(xmin
= 当前事务 ID)。DELETE
:将行标记为过期(设置xmax
)。- 过期的行版本(死元组)由 VACUUM 进程清理回收空间。
- 每个元组(行)都有隐藏的系统列
关键功能与技术
- 复制与高可用:
- 流复制(Streaming Replication): 基于 WAL 的物理复制(主从,异步或同步)。主库将 WAL 记录流式传输给备用库,备用库重放 WAL 以保持同步。支持只读查询(热备)。
- 逻辑复制: 基于复制槽(Replication Slot)的逻辑解码。订阅者可以选择性地复制特定表的数据更改(INSERT/UPDATE/DELETE),支持跨版本复制、异构数据库复制(通过插件)。
- 高可用解决方案: 通常需要配合第三方工具(如 Patroni, repmgr, pgpool-II)实现自动故障转移(Failover)。
- 备份与恢复:
- 逻辑备份:
pg_dump
(备份单个数据库)和pg_dumpall
(备份整个集群,包括全局对象)。恢复使用psql
或pg_restore
。适合小数据量或特定对象恢复。 - 物理备份: 直接复制
PGDATA
目录(需要数据库关闭或处于备份模式)。恢复时替换文件并启动。速度快,适合全量恢复。 - 持续归档与 PITR: 结合物理备份和连续归档的 WAL 文件。允许恢复到备份后的任意时间点(Point-in-Time Recovery)。是实现 RPO≈0 的关键。
- 逻辑备份:
- 扩展(Extensions): PostgreSQL 活力的源泉。通过
CREATE EXTENSION
命令加载。著名的扩展包括:- PostGIS: 地理空间对象支持,业界标准 GIS 扩展。
- pgcrypto: 加密函数。
- hstore: 键值对存储。
- uuid-ossp: 生成 UUID。
- pg_partman: 自动化分区管理。
- Citus: 分布式 PostgreSQL(Sharding)。
- TimescaleDB: 时序数据库扩展(基于 PostgreSQL)。
- pg_stat_statements: 跟踪 SQL 执行统计信息(性能调优必备)。
- 监控与调优:
- 系统视图(Catalog Views):
pg_stat_activity
,pg_stat_all_tables
,pg_stat_all_indexes
,pg_stat_bgwriter
,pg_locks
等提供丰富的运行时信息。 - 统计信息收集器: 自动收集表和索引的访问统计信息(需要
ANALYZE
)。 EXPLAIN
和EXPLAIN ANALYZE
: 分析查询执行计划,是 SQL 性能调优的核心工具。- 日志文件: 配置日志级别(
log_statement
,log_min_duration_statement
等)获取详细信息。 - 外部工具: pgAdmin, DBeaver, psql, Nagios, Zabbix, Prometheus + Grafana (配合 exporters) 等。
- 系统视图(Catalog Views):
适用场景
- Web 应用和 API 后端: 作为可靠的数据存储。
- 地理信息系统: 得益于 PostGIS 的强大功能。
- 数据仓库和分析平台: 强大的复杂查询和聚合能力(配合列存扩展如 Citus Columnar)。
- 金融应用: 对数据一致性和可靠性要求极高的场景。
- 科学数据: 支持复杂数据类型和自定义扩展。
- 内容管理系统: 存储结构化内容和元数据。
- 软件即服务: 多租户架构(通过 Schema 或 Row-Level Security 实现)。
- 时序数据: 配合 TimescaleDB 扩展。
总结
PostgreSQL 是一款功能全面、企业级、开源的关系数据库。它不仅仅是一个 SQL 数据库,更是一个强大的数据管理平台。其核心优势在于:
- 开源免费且无厂商锁定风险。
- 严格遵循 SQL 标准,兼容性好。
- 功能极其丰富且可扩展(数据类型、函数、索引、语言、扩展)。
- 数据完整性和可靠性(ACID, MVCC, WAL, PITR)卓越。
- 性能优秀且可调优。
- 活跃且庞大的社区支持。
无论你是开发人员、DBA 还是架构师,PostgreSQL 都是一个值得深入学习和信赖的数据库解决方案。它能够应对从简单应用到复杂企业级系统的各种挑战。
如果你想深入了解 PostgreSQL 的某个特定方面(如 MVCC 实现细节、流复制配置、JSONB 查询优化、PostGIS 使用、特定扩展等),欢迎提出更具体的问题!
postgresql 入门
PostgreSQL 与 MySQL 是两大主流开源关系型数据库,在设计理念、功能特性和适用场景上存在显著差异。以下是综合对比分析:
🧠 一、核心设计理念
-
PostgreSQL
- 目标定位 :强调 SQL 标准兼容性、数据完整性与功能完备性,定位为企业级数据库。
- 架构:多进程模型(每个连接独立进程),资源隔离性好,适合高一致性场景。
-
MySQL
- 目标定位 :追求 简单易用和高性能,尤其擅长读密集型操作(如 Web 应用)。
- 架构:多线程模型(连接共享进程),资源开销低,适合高并发简单查询。
📊 二、功能与扩展性
特性 | PostgreSQL | MySQL |
---|---|---|
SQL 支持 | 高度兼容 SQL 标准,支持 CTE、窗口函数、递归查询 | 部分兼容,高级功能支持较晚(如窗口函数在 8.0+) |
数据类型 | 丰富:数组、JSONB、范围类型、几何数据(PostGIS) | 基础类型为主,JSON 支持有限 |
索引类型 | B-tree、GIN、GiST、BRIN 等,支持表达式索引 | 以 B-tree 为主,全文索引较弱 |
扩展能力 | 支持插件(如 PostGIS)、自定义函数/类型 | 依赖存储引擎,扩展性有限 |
⚡ 三、性能对比
-
读操作
- MySQL 优势 :简单查询响应快,尤其 读密集型场景(如缓存层)。
- PostgreSQL 劣势:多进程模型内存消耗较高。
-
写操作与复杂查询
- PostgreSQL 优势 :MVCC 实现更彻底,复杂事务和 JOIN 操作性能更强(支持 Hash Join/Merge Join)。
- MySQL 劣势:仅支持 Nested Loop Join,复杂查询易成瓶颈。
🔒 四、事务与一致性
- ACID 支持:两者均支持(MySQL 需 InnoDB 引擎)。
- MVCC 实现 :
- PostgreSQL:无锁读写,无需定期 VACUUM 回收空间(新版优化)。
- MySQL:基于回滚段,高并发写入时可能锁冲突。
🛠️ 五、高可用与运维
能力 | PostgreSQL | MySQL |
---|---|---|
复制机制 | 物理流复制(强一致性)、逻辑复制 | 基于 Binlog 的逻辑复制(易主从不一致) |
分区表 | 声明式分区,支持范围/列表/哈希 | 分区功能较早支持,但优化有限 |
DDL 操作 | 在线 DDL(如加字段不锁表) | 多数 DDL 锁表,需借助第三方工具(pt-online-schema-change) |
☁️ 六、适用场景推荐
-
选择 PostgreSQL 当:
- 需复杂分析(数据仓库)、GIS 系统、金融事务(强一致性)。
- 使用 JSONB 的高效文档存储或自定义数据类型。
-
选择 MySQL 当:
- 高并发 Web 应用(如 CMS、电商)、读多写少业务。
- 需要快速部署和简单运维的中小型项目。
💎 七、其他关键差异
- 许可证 :
- PostgreSQL 使用 BSD 协议,可闭源修改。
- MySQL 使用 GPL,商业应用需注意许可约束。
- 社区生态 :
- MySQL 有 Oracle 商业支持,工具链丰富(如 Percona Toolkit)。
- PostgreSQL 社区活跃,功能迭代更快(年更版本)。
💎 总结:核心选择维度 若追求 功能强大、数据一致性与复杂查询 ➔ PostgreSQL 更优;
若倾向 高性能读取、易用性及成熟生态 ➔ MySQL 更佳。
💡 实际选择需结合业务规模、团队技术栈及长期维护成本。例如,Instagram 因 GIS 需求选 PostgreSQL,而 GitHub 早期因简单读写选 MySQL。
postgresql 基础操作
以下是 PostgreSQL 基础操作的清晰指南,涵盖常用命令和核心操作场景:
一、连接数据库
bash
# 命令行连接(默认用户 postgres)
psql -U postgres -d 数据库名 -h 主机地址 -p 端口
# 示例:连接本机默认数据库
psql -U postgres -d postgres
二、库操作
sql
-- 1. 创建数据库
CREATE DATABASE mydb;
-- 2. 切换数据库
\c mydb
-- 3. 删除数据库(谨慎!)
DROP DATABASE IF EXISTS mydb;
-- 4. 列出所有数据库
\l
三、表操作
sql
-- 1. 创建表
CREATE TABLE users (
id SERIAL PRIMARY KEY, -- 自增主键
name VARCHAR(50) NOT NULL, -- 非空字符串
email VARCHAR(100) UNIQUE, -- 唯一约束
age INT CHECK (age >= 18), -- 检查约束
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 默认值
);
-- 2. 查看表结构
\d users
-- 3. 删除表
DROP TABLE IF EXISTS users;
-- 4. 修改表
ALTER TABLE users ADD COLUMN phone VARCHAR(20); -- 添加列
ALTER TABLE users DROP COLUMN phone; -- 删除列
ALTER TABLE users RENAME COLUMN email TO mail; -- 重命名列
四、数据操作(CRUD)
sql
-- 1. 插入数据
INSERT INTO users (name, email, age)
VALUES
('张三', 'zhangsan@example.com', 25),
('李四', 'lisi@test.org', 30);
-- 2. 查询数据
SELECT * FROM users; -- 所有数据
SELECT name, age FROM users WHERE age > 25; -- 条件过滤
SELECT * FROM users ORDER BY created_at DESC; -- 排序
SELECT * FROM users LIMIT 5; -- 限制结果数
-- 3. 更新数据
UPDATE users SET age = 26 WHERE name = '张三'; -- 更新单条
UPDATE users SET age = age + 1; -- 批量更新(谨慎!)
-- 4. 删除数据
DELETE FROM users WHERE name = '李四'; -- 条件删除
TRUNCATE TABLE users; -- 清空表(不可回滚!)
五、索引管理
sql
-- 1. 创建索引
CREATE INDEX idx_users_email ON users (email); -- 单列索引
CREATE INDEX idx_users_name_age ON users (name, age);-- 复合索引
-- 2. 查看索引
\di
-- 3. 删除索引
DROP INDEX idx_users_email;
六、用户与权限
sql
-- 1. 创建用户
CREATE USER dev_user WITH PASSWORD 'mypassword';
-- 2. 授予权限
GRANT SELECT, INSERT ON users TO dev_user; -- 表级权限
GRANT ALL PRIVILEGES ON DATABASE mydb TO dev_user; -- 库级权限
-- 3. 撤销权限
REVOKE DELETE ON users FROM dev_user;
-- 4. 删除用户
DROP USER IF EXISTS dev_user;
七、视图
sql
-- 1. 创建视图
CREATE VIEW adult_users AS
SELECT name, email FROM users WHERE age >= 18;
-- 2. 使用视图
SELECT * FROM adult_users;
-- 3. 删除视图
DROP VIEW adult_users;
八、事务控制
sql
BEGIN; -- 开启事务
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 提交事务
-- 出错时回滚
ROLLBACK;
九、备份与恢复
bash
# 备份单个数据库
pg_dump -U postgres -d mydb > mydb_backup.sql
# 恢复数据库
psql -U postgres -d newdb < mydb_backup.sql
# 全库备份
pg_dumpall -U postgres > alldb_backup.sql
十、实用命令
sql
-- 查看连接进程
SELECT * FROM pg_stat_activity;
-- 终止进程
SELECT pg_terminate_backend(pid);
-- 查看锁
SELECT * FROM pg_locks;
-- 退出psql
\q
注意事项
- 重要操作前备份数据 (尤其
DROP
/TRUNCATE
) - 生产环境避免直接操作主库(用从库或测试环境验证)
- WHERE 子句先验证(防止误删/误更新)
- 合理使用事务(确保数据一致性)
💡 推荐工具:
- 命令行:
psql
- 图形界面:pgAdmin / DBeaver
- 学习文档:PostgreSQL 官方文档
掌握这些基础操作后,可进一步学习:
➔ JSONB 数据处理
➔ 存储过程(PL/pgSQL)
➔ 分区表
➔ 逻辑复制配置
postgresql 常用命令
以下是 PostgreSQL 最常用命令速查表,涵盖数据库操作、表管理、数据查询、系统监控等核心场景:
🚪 一、连接与退出
bash
# 连接数据库
psql -U <用户名> -d <数据库名> -h <主机> -p <端口>
# 退出psql
\q
🗃️ 二、数据库操作
命令 | 说明 |
---|---|
\l |
列出所有数据库 |
\c <数据库名> |
切换到指定数据库 |
CREATE DATABASE <库名>; |
创建新数据库 |
DROP DATABASE <库名>; |
删除数据库 |
\conninfo |
显示当前连接信息 |
📊 三、表操作
命令 | 说明 |
---|---|
\dt |
列出当前库所有表 |
\d+ <表名> |
查看表结构(带详细信息) |
CREATE TABLE <表名> (...); |
创建表 |
DROP TABLE <表名>; |
删除表 |
ALTER TABLE <表名> ADD COLUMN <列名> <类型>; |
添加列 |
ALTER TABLE <表名> RENAME COLUMN <旧列名> TO <新列名>; |
重命名列 |
\copy <表名> FROM '文件路径' CSV HEADER; |
从CSV导入数据 |
🔍 四、数据查询(CRUD)
sql
-- 查
SELECT * FROM <表名> WHERE <条件> ORDER BY <列> LIMIT N;
SELECT COUNT(*) FROM <表名>; -- 统计行数
-- 增
INSERT INTO <表名> (列1,列2) VALUES (值1,值2);
-- 改
UPDATE <表名> SET 列=新值 WHERE <条件>;
-- 删
DELETE FROM <表名> WHERE <条件>;
⚙️ 五、索引管理
sql
-- 创建索引
CREATE INDEX idx_name ON table (column);
-- 查看索引
\di
-- 删除索引
DROP INDEX idx_name;
👥 六、用户与权限
命令 | 说明 |
---|---|
\du |
列出所有用户/角色 |
CREATE USER <用户名> WITH PASSWORD '密码'; |
创建用户 |
ALTER USER <用户名> WITH PASSWORD '新密码'; |
修改密码 |
GRANT SELECT ON <表名> TO <用户名>; |
授权查询权限 |
REVOKE DELETE ON <表名> FROM <用户名>; |
撤销删除权限 |
📋 七、元命令(psql专属)
命令 | 说明 |
---|---|
\x |
切换扩展显示模式(列转行) |
\e |
在编辑器中打开当前查询 |
\i <文件路径> |
执行SQL文件 |
\timing |
切换SQL执行时间显示 |
\? |
查看所有元命令帮助 |
\h |
SQL命令语法帮助 |
\g |
重新执行上次查询 |
\watch N |
每隔N秒重复执行查询 |
🖥️ 八、系统监控
sql
-- 查看活跃查询
SELECT * FROM pg_stat_activity;
-- 查看锁信息
SELECT * FROM pg_locks;
-- 终止进程
SELECT pg_terminate_backend(<进程ID>);
-- 查看数据库大小
SELECT pg_size_pretty(pg_database_size('<数据库名>'));
-- 查看表大小
SELECT pg_size_pretty(pg_total_relation_size('<表名>'));
💾 九、备份与恢复
bash
# 备份单库
pg_dump -U <用户> -d <库名> > backup.sql
# 恢复单库
psql -U <用户> -d <库名> < backup.sql
# 备份全集群
pg_dumpall > alldb.sql
⚠️ 高频危险命令警示
sql
DROP TABLE <表名>; -- 永久删除表(无确认)
TRUNCATE TABLE <表名>; -- 快速清空表(不可回滚)
DROP DATABASE <库名>; -- 永久删除数据库
UPDATE/DELETE 不带 WHERE 条件; -- 全表更新/删除
📌 操作建议:
- 执行
UPDATE
/DELETE
前先运行SELECT
验证条件- 重要操作前使用
BEGIN;
开启事务,确认无误再COMMIT;
- 生产环境避免直接操作,使用维护窗口
🧠 高效技巧
sql
-- 1. 快速复制表结构
CREATE TABLE new_table AS TABLE old_table WITH NO DATA;
-- 2. 批量插入优化
INSERT INTO table VALUES (v1), (v2), (v3); -- 单次多值
-- 3. 存在则更新,不存在则插入
INSERT INTO table (id, name)
VALUES (1, 'John')
ON CONFLICT (id)
DO UPDATE SET name = EXCLUDED.name;
掌握这些命令可覆盖 90% 日常操作,建议保存为速查手册备用!
PostgreSQL 的 database(库), schema(架) 操作
以下是 PostgreSQL 中 数据库 (Database) 和 模式 (Schema) 的详细操作指南,包含创建、修改、删除等核心操作:
一、数据库 (Database) 操作 1. 创建数据库
sql
-- 基础创建
CREATE DATABASE mydb;
-- 完整选项(指定所有者、编码等)
CREATE DATABASE mydb
WITH
OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'en_US.utf8'
LC_CTYPE = 'en_US.utf8'
TABLESPACE = pg_default
CONNECTION LIMIT = 50; -- 限制最大连接数
2. 修改数据库
sql
-- 重命名数据库
ALTER DATABASE old_name RENAME TO new_name;
-- 修改所有者
ALTER DATABASE mydb OWNER TO new_owner;
-- 修改连接限制
ALTER DATABASE mydb WITH CONNECTION LIMIT 100;
-- 修改默认表空间
ALTER DATABASE mydb SET TABLESPACE new_tablespace;
3. 删除数据库
sql
-- 安全删除(如果存在)
DROP DATABASE IF EXISTS mydb;
-- 强制删除(终止所有连接后删除)
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'mydb';
DROP DATABASE mydb;
4. 查看数据库
sql
-- 列出所有数据库
\l
-- 查看数据库详情
\l+
\list+
-- 查询系统表
SELECT * FROM pg_database;
二、模式 (Schema) 操作 模式是数据库内的命名空间,用于组织数据库对象(表、视图、函数等)。
1. 创建模式
sql
-- 基础创建
CREATE SCHEMA myschema;
-- 指定所有者
CREATE SCHEMA myschema AUTHORIZATION postgres;
-- 创建带注释的模式
CREATE SCHEMA finance
COMMENT '用于存储财务相关数据';
2. 修改模式
sql
-- 重命名模式
ALTER SCHEMA old_name RENAME TO new_name;
-- 修改所有者
ALTER SCHEMA myschema OWNER TO new_owner;
-- 添加注释
COMMENT ON SCHEMA myschema IS '业务数据存储空间';
3. 删除模式
sql
-- 删除空模式
DROP SCHEMA myschema;
-- 强制删除(包含所有对象)
DROP SCHEMA myschema CASCADE;
-- 安全删除
DROP SCHEMA IF EXISTS myschema;
4. 查看模式
sql
-- 列出当前数据库所有模式
\dn
-- 查看模式详情
\dn+
-- 查询系统表
SELECT * FROM information_schema.schemata;
三、跨模式对象操作 1. 访问不同模式的对象
sql
-- 完全限定名访问
SELECT * FROM schema1.table1
JOIN schema2.table2 ON ...;
-- 设置搜索路径
SET search_path TO schema1, public, "$user";
2. 移动对象到不同模式
sql
-- 移动表到新模式
ALTER TABLE public.mytable SET SCHEMA finance;
-- 移动函数
ALTER FUNCTION public.myfunc() SET SCHEMA utils;
3. 跨模式权限管理
sql
-- 允许用户访问特定模式
GRANT USAGE ON SCHEMA finance TO user1;
-- 授予模式内所有表的权限
GRANT SELECT ON ALL TABLES IN SCHEMA finance TO user1;
-- 设置默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA finance
GRANT SELECT ON TABLES TO readonly_user;
四、最佳实践
-
命名规范
sql-- 使用小写和下划线命名 CREATE SCHEMA hr_operations; CREATE DATABASE sales_data;
-
环境隔离方案
sql-- 按环境创建模式 CREATE SCHEMA dev; CREATE SCHEMA staging; CREATE SCHEMA prod;
-
多租户实现
sql-- 每个租户独立模式 CREATE SCHEMA tenant_acme; CREATE SCHEMA tenant_xyz; -- 共享核心表 CREATE TABLE public.tenants ( id SERIAL PRIMARY KEY, name VARCHAR(100) );
-
备份特定模式
bashpg_dump -U postgres -n 'finance' mydb > finance_schema.sql
五、关键系统表
系统表 | 描述 | 常用查询 |
---|---|---|
pg_database |
数据库信息 | SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database; |
pg_namespace |
模式信息 | SELECT nspname, nspowner FROM pg_namespace; |
information_schema.schemata |
模式元数据 | SELECT schema_name, schema_owner FROM information_schema.schemata; |
六、注意事项
-
删除保护
sql-- 防止误删生产数据库 ALTER DATABASE production_db OWNER TO admin_user; REVOKE CONNECT ON DATABASE production_db FROM public;
-
模式搜索路径
sql-- 永久设置数据库的搜索路径 ALTER DATABASE mydb SET search_path TO myschema, public;
-
默认模式 public
-
新用户默认有
public
模式的CREATE
权限 -
生产环境建议撤销:
sqlREVOKE CREATE ON SCHEMA public FROM PUBLIC;
-
掌握这些操作可高效管理 PostgreSQL 的数据库和模式结构,实现数据逻辑隔离和权限控制。
postgresql的 database
操作
以下是 PostgreSQL 中 数据库(database)操作 的全面指南,涵盖创建、管理、维护和优化的关键命令与最佳实践:
一、数据库创建
sql
-- 基础创建
CREATE DATABASE sales_db;
-- 完整参数创建
CREATE DATABASE sales_db
WITH
OWNER = sales_admin -- 指定所有者
ENCODING = 'UTF8' -- 字符编码
LC_COLLATE = 'en_US.utf8' -- 排序规则
LC_CTYPE = 'en_US.utf8' -- 字符分类
TEMPLATE = template0 -- 模板数据库
CONNECTION LIMIT = 100 -- 最大连接数
ALLOW_CONNECTIONS = true -- 允许连接
IS_TEMPLATE = false; -- 是否作为模板
二、数据库修改
sql
-- 重命名数据库
ALTER DATABASE old_name RENAME TO new_name;
-- 修改所有者
ALTER DATABASE sales_db OWNER TO new_admin;
-- 修改连接限制
ALTER DATABASE sales_db WITH CONNECTION LIMIT 200;
-- 修改默认配置参数
ALTER DATABASE sales_db SET work_mem = '16MB';
ALTER DATABASE sales_db RESET work_mem; -- 重置参数
三、数据库删除
sql
-- 安全删除
DROP DATABASE IF EXISTS test_db;
-- 强制终止连接后删除
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'target_db';
DROP DATABASE target_db;
四、数据库查看与信息查询
sql
-- 列出所有数据库
\l
\list
-- 查看数据库详情
\l+
SELECT * FROM pg_database;
-- 查看数据库大小
SELECT pg_size_pretty(pg_database_size('sales_db'));
-- 查看数据库配置
SELECT datname, datconfig FROM pg_database;
五、模板数据库操作
sql
-- 1. 创建模板数据库
CREATE DATABASE my_template WITH IS_TEMPLATE = true;
-- 2. 基于模板创建新数据库
CREATE DATABASE new_db TEMPLATE my_template;
-- 3. 修改数据库为模板
ALTER DATABASE my_template WITH IS_TEMPLATE = true;
六、数据库维护 1. 连接管理
sql
-- 查看活动连接
SELECT * FROM pg_stat_activity WHERE datname = 'sales_db';
-- 终止所有连接
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'sales_db';
2. 数据维护
sql
-- 清理空间
VACUUM FULL VERBOSE ANALYZE; -- 全库清理
-- 重建系统目录
REINDEX DATABASE sales_db;
七、备份与恢复 1. 逻辑备份
bash
# 备份单个数据库
pg_dump -U postgres -Fc sales_db > sales_db.dump # 自定义格式
pg_dump -U postgres sales_db > sales_db.sql # SQL格式
# 备份所有数据库
pg_dumpall > full_backup.sql
2. 恢复操作
bash
# 从SQL文件恢复
psql -U postgres -d sales_db < sales_db.sql
# 从自定义格式恢复
pg_restore -U postgres -d sales_db sales_db.dump
# 创建新库并恢复
createdb new_sales
pg_restore -U postgres -d new_sales sales_db.dump
八、高级操作 1. 表空间管理
sql
-- 创建表空间
CREATE TABLESPACE fast_ssd LOCATION '/ssd_data';
-- 创建数据库到指定表空间
CREATE DATABASE perf_db TABLESPACE fast_ssd;
-- 修改数据库表空间
ALTER DATABASE sales_db SET TABLESPACE fast_ssd;
2. 克隆数据库
sql
-- 通过模板克隆
CREATE DATABASE clone_db TEMPLATE sales_db;
-- 通过备份克隆
CREATE DATABASE clone_db;
pg_restore -d clone_db sales_db.dump
九、权限管理
sql
-- 授权用户访问
GRANT CONNECT ON DATABASE sales_db TO sales_user;
-- 撤销权限
REVOKE CONNECT ON DATABASE sales_db FROM public;
-- 创建组角色
CREATE ROLE sales_team;
GRANT CONNECT ON DATABASE sales_db TO sales_team;
GRANT sales_team TO user1, user2;
十、最佳实践
-
命名规范
- 使用小写+下划线:
sales_europe
- 避免保留字:
order
→sales_order
- 使用小写+下划线:
-
环境隔离
sqlCREATE DATABASE sales_dev; CREATE DATABASE sales_staging; CREATE DATABASE sales_prod;
-
配置优化
sql-- 为分析型数据库增加内存 ALTER DATABASE analytics_db SET maintenance_work_mem = '1GB', work_mem = '128MB';
-
安全加固
sql-- 禁止public连接 REVOKE CONNECT ON DATABASE sales_prod FROM PUBLIC; -- 定期备份脚本 pg_dump -Fc sales_prod | gzip > /backups/sales_$(date +%Y%m%d).dump.gz
-
监控脚本
sql-- 检查数据库状态 SELECT datname, pg_size_pretty(pg_database_size(datname)) as size, numbackends as connections FROM pg_database;
十一、故障排查
sql
-- 检查数据库状态
SELECT datname, datistemplate, datallowconn
FROM pg_database;
-- 修复损坏的数据库(需停机)
pg_dumpall | psql postgres # 重建整个集群
掌握这些数据库操作后,您将能高效管理 PostgreSQL 数据库的生命周期,从创建到维护再到优化。建议结合 pgAdmin
或 DBeaver
等图形工具使用,复杂操作前务必备份数据!
postgresql: 切换database, 查看当前database
在 PostgreSQL 中,切换数据库 和查看当前数据库是日常操作的关键部分。以下是详细的操作指南:
🔄 一、切换数据库 1. 使用 psql
命令行工具
bash
# 从操作系统终端切换
psql -U <用户名> -d <目标数据库名>
# 示例:
psql -U postgres -d sales_db
2. 在 psql 会话中切换
sql
-- 使用 \c 命令
\c <目标数据库名>
-- 示例:
\c sales_db
-- 带用户名切换(自动重连)
\c sales_db postgres
3. 跨数据库操作(不切换)
sql
-- 在查询中指定数据库
SELECT * FROM other_db.public.sales_data;
🔍 二、查看当前数据库 1. 使用 psql 元命令
sql
-- 查看当前连接信息
\c
-- 输出:You are connected to database "sales_db" as user "postgres" via socket...
-- 查看完整连接信息
\conninfo
-- 输出:You are connected to database "sales_db" as user "postgres" on host "localhost" at port "5432"
2. SQL 查询方式
sql
-- 查看当前数据库名
SELECT current_database();
-- 查看数据库+用户信息
SELECT
current_database() AS current_db,
current_user AS current_user,
inet_client_addr() AS client_ip;
3. 查看所有数据库状态
sql
SELECT
datname AS database,
pg_size_pretty(pg_database_size(datname)) AS size,
numbackends AS active_connections
FROM pg_database;
🖥️ 三、图形化工具操作(以 pgAdmin 为例)
-
切换数据库:
- 在左侧对象浏览器中双击目标数据库
- 右键点击数据库 → "Query Tool" 打开新查询窗口
-
查看当前数据库:
- 查看查询窗口左上角数据库标签
- 状态栏显示当前连接的数据库名
⚠️ 四、注意事项
-
切换限制:
sql-- 无法在事务中切换数据库 BEGIN; \c new_db; -- 错误!无法在事务块内切换
-
连接权限:
sql-- 检查连接权限 SELECT has_database_privilege('sales_db', 'CONNECT');
-
连接失败处理:
bash# 尝试连接不存在的数据库 psql -d non_existent_db # 输出:FATAL: database "non_existent_db" does not exist
🧩 五、实用技巧 1. 快速切换脚本
bash
#!/bin/bash
# db_switch.sh
psql -U postgres -d $1
2. 在函数中获取数据库名
sql
CREATE OR REPLACE FUNCTION show_db() RETURNS TEXT AS $$
BEGIN
RETURN current_database();
END;
$$ LANGUAGE plpgsql;
SELECT show_db(); -- 返回当前数据库名
3. 跨数据库操作(需安装扩展)
sql
-- 安装 dblink 扩展
CREATE EXTENSION dblink;
-- 跨数据库查询
SELECT *
FROM dblink(
'dbname=hr_db user=admin password=secret',
'SELECT * FROM employees'
) AS t(id INT, name TEXT);
💡 总结
操作 | 命令 | 使用场景 |
---|---|---|
切换数据库 | \c <dbname> 或 psql -d <dbname> |
开发/运维中访问不同数据库 |
查看当前数据库 | SELECT current_database() |
脚本中动态获取数据库名 |
检查连接信息 | \conninfo |
调试连接问题 |
查看所有数据库 | \l 或 SELECT * FROM pg_database |
数据库管理 |
掌握这些操作能显著提升 PostgreSQL 的工作效率,特别是在多数据库环境中进行开发和维护时。
postgresql的 schema 操作
以下是 PostgreSQL 中 模式(schema)操作 的全面指南,涵盖创建、管理、权限控制和实用技巧:
一、模式基础概念 模式(schema) 是数据库内的逻辑命名空间,用于组织数据库对象(表、视图、函数等)。每个数据库默认包含一个 public
模式。
sql
-- 查看数据库中的模式
\dn
SELECT schema_name FROM information_schema.schemata;
二、模式核心操作 1. 创建模式
sql
-- 基本创建
CREATE SCHEMA sales;
-- 指定所有者
CREATE SCHEMA hr AUTHORIZATION hr_admin;
-- 带注释创建
CREATE SCHEMA finance COMMENT '财务数据存储';
2. 修改模式
sql
-- 重命名模式
ALTER SCHEMA sales RENAME TO north_america_sales;
-- 修改所有者
ALTER SCHEMA hr OWNER TO new_hr_admin;
-- 添加注释
COMMENT ON SCHEMA finance IS '所有财务相关表';
3. 删除模式
sql
-- 安全删除
DROP SCHEMA IF EXISTS temp_schema;
-- 强制删除(包含所有对象)
DROP SCHEMA legacy_schema CASCADE;
4. 查看模式详情
sql
-- 查看模式元数据
\dn+
SELECT *
FROM information_schema.schemata
WHERE schema_name = 'finance';
-- 查看模式大小
SELECT pg_size_pretty(
SUM(pg_total_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename))
) AS schema_size
FROM pg_tables
WHERE schemaname = 'sales';
三、模式权限管理 1. 基础权限控制
sql
-- 授权用户访问模式
GRANT USAGE ON SCHEMA sales TO sales_user;
-- 授予所有表查询权限
GRANT SELECT ON ALL TABLES IN SCHEMA sales TO report_user;
-- 撤销权限
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
2. 默认权限设置
sql
-- 设置新建对象的默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA finance
GRANT SELECT, INSERT ON TABLES TO finance_team;
3. 权限查询
sql
-- 查看模式权限
\dn+
SELECT grantee, privilege_type
FROM information_schema.role_schema_grants
WHERE schema_name = 'hr';
四、对象操作与跨模式访问 1. 创建模式内对象
sql
-- 在指定模式创建表
CREATE TABLE sales.orders (
id SERIAL PRIMARY KEY,
amount DECIMAL NOT NULL
);
-- 创建视图
CREATE VIEW finance.revenue_report AS
SELECT * FROM sales.orders;
2. 移动对象
sql
-- 移动表到不同模式
ALTER TABLE public.customers SET SCHEMA sales;
-- 移动函数
ALTER FUNCTION calculate_tax() SET SCHEMA finance;
3. 跨模式访问
sql
-- 使用完全限定名
SELECT * FROM hr.employees
JOIN sales.orders ON employees.id = orders.employee_id;
-- 临时设置搜索路径
SET search_path TO sales, public;
SELECT * FROM orders; -- 自动搜索sales.orders
五、搜索路径管理 1. 查看当前搜索路径
sql
SHOW search_path;
-- 默认值: "$user", public
2. 修改搜索路径
sql
-- 会话级修改
SET search_path TO sales, hr, public;
-- 数据库级永久修改
ALTER DATABASE mydb SET search_path TO sales, public;
-- 用户级永久修改
ALTER ROLE sales_user SET search_path TO sales;
六、实用技巧与最佳实践 1. 多租户实现
sql
-- 为每个租户创建独立模式
CREATE SCHEMA tenant_acme;
CREATE SCHEMA tenant_xyz;
-- 共享配置表
CREATE TABLE public.tenants (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
2. 环境隔离
sql
-- 按环境创建模式
CREATE SCHEMA dev;
CREATE SCHEMA staging;
CREATE SCHEMA prod;
-- 使用相同表结构
CREATE TABLE dev.users AS SELECT * FROM prod.users WITH NO DATA;
3. 备份特定模式
bash
# 备份单个模式
pg_dump -U postgres -n 'sales' mydb > sales_schema.sql
# 恢复模式
psql -U postgres -d mydb -f sales_schema.sql
4. 模式克隆
sql
-- 复制模式结构
CREATE SCHEMA sales_backup;
CREATE TABLE sales_backup.orders (LIKE sales.orders INCLUDING ALL);
七、系统表与监控 1. 关键系统表
表名 | 描述 |
---|---|
pg_namespace |
存储所有模式信息 |
information_schema.schemata |
模式元数据 |
pg_tables |
所有表信息(含模式) |
2. 监控查询
sql
-- 查找大对象
SELECT schemaname, relname,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||relname))
FROM pg_stat_user_tables
ORDER BY pg_total_relation_size DESC LIMIT 5;
-- 查看模式使用统计
SELECT schemaname,
COUNT(*) AS table_count,
SUM(seq_scan) AS total_scans
FROM pg_stat_user_tables
GROUP BY schemaname;
八、安全实践
sql
-- 1. 限制public模式权限
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
-- 2. 禁用危险函数
REVOKE EXECUTE ON FUNCTION public.pg_read_file(text) FROM PUBLIC;
-- 3. 定期审计
SELECT grantee, privilege_type
FROM information_schema.role_schema_grants
WHERE schema_name = 'finance';
掌握这些模式操作后,您将能:
- 实现数据库对象的逻辑分组
- 建立多租户架构
- 精细控制数据访问权限
- 简化复杂数据库管理
- 实现环境隔离(开发/测试/生产)
💡 建议结合
pgAdmin
图形工具操作复杂场景,关键操作前务必备份数据!
postgresql: 查看当前schema, 切换schema
在 PostgreSQL 中,查看当前 schema 和 切换 schema 是管理对象命名空间的关键操作。以下是详细指南:
🔍 一、查看当前 schema 1. SQL 查询方式
sql
-- 查看当前活动 schema (搜索路径中的第一个)
SELECT current_schema();
-- 查看完整搜索路径
SHOW search_path;
-- 默认值: "$user", public
-- 查看所有可用 schema
\dn
SELECT schema_name FROM information_schema.schemata;
2. psql 元命令方式
sql
-- 查看当前 schema(通过对象操作)
\d
-- 显示当前搜索路径中第一个 schema 下的对象
-- 显示完整连接信息(包含当前数据库)
\conninfo
-- 输出:You are connected to database "mydb" as user "user1"...
3. 图形工具查看(如 pgAdmin)
- 左侧对象浏览器中高亮显示的 schema 即为当前活动 schema
- 查询编辑器顶部显示数据库名和当前 schema
🔄 二、切换当前 schema PostgreSQL 没有直接切换 "当前 schema" 的命令,但可通过修改 search_path
实现等效操作:
1. 临时切换(仅当前会话有效)
sql
-- 设置搜索路径(影响后续所有查询)
SET search_path TO sales, public;
-- 验证切换
SHOW search_path; -- 输出: sales, public
SELECT current_schema(); -- 输出: sales
2. 永久切换(数据库或用户级)
sql
-- 为当前数据库设置默认搜索路径
ALTER DATABASE mydb SET search_path TO hr, public;
-- 为特定用户设置默认搜索路径
ALTER ROLE user1 SET search_path TO finance;
3. 在对象操作中指定 schema
sql
-- 创建表到指定 schema
CREATE TABLE sales.orders (...);
-- 查询特定 schema 的表
SELECT * FROM hr.employees;
⚙️ 三、schema 切换实战场景 场景 1:开发环境切换
sql
-- 根据环境变量切换
SET search_path TO
CASE
WHEN current_setting('server_version_num')::int < 150000
THEN 'legacy'
ELSE 'current'
END,
public;
场景 2:多租户应用
sql
-- 基于租户ID动态切换
SET search_path TO tenant_123, public;
SELECT * FROM orders; -- 自动访问 tenant_123.orders
场景 3:版本化 schema
sql
-- 切换到新版本 schema
SET search_path TO v2, public;
-- 回滚到旧版本
SET search_path TO v1, public;
🛠️ 四、高级管理技巧 1. 在函数中动态切换
sql
CREATE OR REPLACE FUNCTION get_sales_data()
RETURNS TABLE (id INT, amount DECIMAL) AS $$
BEGIN
SET LOCAL search_path TO sales; -- 函数内临时切换
RETURN QUERY SELECT * FROM orders;
END;
$$ LANGUAGE plpgsql;
2. 配置文件预设
sql
-- postgresql.conf 全局设置
search_path = '"$user", public, shared'
3. 连接字符串指定
python
# Python psycopg2 连接时设置
conn = psycopg2.connect(
dbname="mydb",
options="-c search_path=sales,public"
)
⚠️ 五、注意事项
-
权限要求:
sql-- 用户需有目标 schema 的 USAGE 权限 GRANT USAGE ON SCHEMA sales TO user1;
-
临时切换限制:
sqlBEGIN; SET search_path TO new_schema; -- 允许在事务中 COMMIT; -- 事务结束后恢复原设置
-
系统函数影响:
sql-- 部分系统函数在 pg_catalog 中 SET search_path TO sales; SELECT * FROM pg_tables; -- 仍能访问系统表
🔄 六、schema 切换流程图
sql
开始
│
├─ 临时切换 → SET search_path TO schema1 → 会话有效
│
├─ 永久切换 →
│ ├─ 用户级: ALTER ROLE user1 SET search_path...
│ └─ 数据库级: ALTER DATABASE db1 SET search_path...
│
└─ 对象级切换 → 使用全限定名: schema2.table
│
└─ 结束
💡 七、最佳实践
-
命名规范
sql-- 避免歧义名称 CREATE SCHEMA fin_report; -- 而非 "finance"
-
环境隔离
sql-- 开发环境 SET search_path TO dev, public; -- 生产环境 SET search_path TO prod, public;
-
安全实践
sql-- 限制默认 public schema REVOKE CREATE ON SCHEMA public FROM PUBLIC;
-
监控脚本
sql-- 记录 schema 切换历史 SELECT usename, datname, setconfig FROM pg_db_role_setting JOIN pg_database ON setdatabase = pg_database.oid JOIN pg_user ON setrole = pg_user.usesysid;
掌握 schema 的查看与切换技巧,您可以:
- 高效管理多环境开发
- 实现安全的数据隔离
- 简化复杂应用的数据库设计
- 灵活支持多租户架构
📌 关键记忆点:
SELECT current_schema()
查看当前活动 schemaSET search_path TO ...
实现"切换"效果- 生产环境避免使用
public
schema 存储业务数据