PostgreSQL入门笔记250718

PostgreSQL入门笔记250718

PostgreSQL 介绍

PostgreSQL(简称 Postgres)是一款功能极其强大且开源的对象-关系型数据库管理系统(ORDBMS)。它以可靠性、功能丰富、性能卓越和扩展性而闻名,是许多关键业务应用、地理信息系统(GIS)、数据分析平台等的首选数据库。

以下是对 PostgreSQL 的详细解析:

核心特性与优势

  1. 开源与自由: 遵循 PostgreSQL 许可证(类似 BSD/MIT),允许自由使用、修改和分发,无版权费用。
  2. 高度可扩展:
    • 数据类型扩展: 支持自定义数据类型(CREATE TYPE)。
    • 函数/操作符扩展: 可以用多种语言(如 SQL, PL/pgSQL, Python, Perl, C 等)编写自定义函数(CREATE FUNCTION)和操作符。
    • 索引扩展: 支持创建自定义索引访问方法(例如 GiST, SP-GiST, GIN, BRIN),用于高效索引复杂数据类型(如几何对象、全文搜索、数组、JSONB)。
    • 过程语言扩展: 可以加载新的服务器端编程语言(如 PL/Python, PL/V8, PL/R)。
  3. 符合标准: 对 SQL 标准(最新版本通常支持 SQL:2016 的核心功能)的高度兼容是其核心设计目标之一。这使得迁移和编写兼容性高的 SQL 代码更容易。
  4. 强大的数据完整性:
    • 丰富的约束:主键、外键、唯一约束、非空约束、检查约束(CHECK)。
    • 排他约束(EXCLUDE):确保表中任意两行在指定的列或表达式上不满足某些条件(常用范围类型防止重叠)。
  5. 复杂的查询能力:
    • 丰富的 JOIN 类型(INNER, LEFT/RIGHT/FULL OUTER, CROSS, LATERAL)。
    • 强大的聚合函数和窗口函数(OVER, PARTITION BY, ORDER BY)。
    • Common Table Expressions(CTEs),包括递归 CTEs(用于树形结构查询)。
    • 表继承(一种面向对象的数据建模方式)。
    • 分区表(原生声明式分区,支持范围、列表、哈希分区)。
    • 全文搜索(内置支持,基于 tsvector/tsquery)。
  6. 并发控制与可靠性:
    • 多版本并发控制: PostgreSQL 的核心并发机制。写操作不会阻塞读操作(读操作看到的是事务开始前的快照)。这极大地提高了高并发读场景下的性能。
    • 事务支持: 完全支持 ACID(原子性、一致性、隔离性、持久性)属性。
    • 预写式日志: 所有修改在应用到实际数据文件之前都会先写入 WAL。这是实现数据持久化(D)、崩溃恢复、流复制和 PITR 的基础。
    • 强大的崩溃恢复: 利用 WAL 在服务器崩溃后自动恢复到一致状态。
  7. 丰富的数据类型:
    • 基础类型:整数(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)。
  8. 性能:
    • 优化的查询规划器/执行器,能高效处理复杂查询。
    • 多种高性能索引:B-tree(默认,适合范围查询和排序)、Hash(等值查询)、GiST(广义搜索树,适合多维数据、全文搜索、范围)、SP-GiST(空间分区树)、GIN(倒排索引,适合数组、全文搜索、JSONB)、BRIN(块范围索引,适合大型有序表)。
    • 并行查询(支持顺序扫描、聚合、连接等操作的并行化)。
    • 仅索引扫描(Index-Only Scans):如果索引包含查询所需的所有列,则无需访问表数据。
    • JIT 编译(即时编译,加速表达式计算)。
  9. 安全:
    • 强大的身份验证机制:password, md5, scram-sha-256, ident, peer, pam, ldap, radius, cert 等。
    • 精细的访问控制:基于角色的权限管理(GRANT/REVOKE),控制对象(表、视图、函数、模式等)的访问权限(SELECT, INSERT, UPDATE, DELETE, EXECUTE, USAGE, CREATE 等)。
    • 行级安全:限制用户只能访问表中满足特定策略的行。
    • SSL/TLS 加密客户端/服务器连接。
    • 数据加密:可选择表空间级加密(结合文件系统或第三方工具)或列级加密(通过 pgcrypto 扩展)。
  10. 可编程性:
    • 存储过程/函数: 支持多种过程语言:PL/pgSQL(类似 Oracle PL/SQL)、PL/Python、PL/Perl、PL/Tcl、PL/Java、PL/V8(JavaScript)、PL/R 等。支持返回单个值、行、表或游标。
    • 触发器: 在特定事件(INSERT, UPDATE, DELETE, TRUNCATE)之前或之后自动执行函数。
    • 规则系统: 提供一种强大的机制来重写查询或定义视图的更新行为(比触发器更底层,使用需谨慎)。
  11. 国际化: 支持多字节字符集(如 UTF-8),提供强大的排序、大小写转换和格式化功能(依赖于操作系统的 ICU 库或内置规则)。

关键组件与架构(简化)

  1. 进程模型:
    • Postmaster: 主守护进程,监听连接请求。
    • Backend Processes: 每个客户端连接对应一个后端进程,处理该连接的所有查询。
    • Background Processes:
      • checkpointer: 定期将脏缓冲区写入数据文件并创建检查点(标记 WAL 中已持久化的位置)。
      • background writer: 将脏缓冲区写入数据文件(减轻检查点压力)。
      • wal writer: 将 WAL 缓冲区刷新到 WAL 文件。
      • autovacuum launcher/workers: 自动执行 VACUUM 和 ANALYZE 操作。
      • archiver: 归档 WAL 文件(如果配置了)。
      • logger: 处理日志输出。
      • stats collector: 收集统计信息。
  2. 内存结构:
    • Shared Buffers: 最重要的共享内存区域,缓存表和索引的数据块。
    • WAL Buffers: 缓存即将写入 WAL 文件的日志记录。
    • Work Mem: 用于排序、哈希操作、临时表等的每个连接私有内存。
    • Maintenance Work Mem: 用于维护操作(如 VACUUM, CREATE INDEX, ALTER TABLE ADD FOREIGN KEY)的每个操作私有内存。
    • Temp Buffers: 用于临时表的每个会话私有内存。
  3. 存储结构:
    • 集群(Cluster): 一个 PostgreSQL 实例管理的数据库集合。对应一个数据目录(PGDATA)。
    • 数据库(Database): 逻辑上独立的数据集合。属于一个集群。
    • 模式(Schema): 数据库内的命名空间,包含表、视图、函数等对象。用于逻辑组织和管理权限(默认模式 public)。
    • 表空间(Tablespace): 定义数据文件在磁盘上的物理存储位置。可以跨多个磁盘或文件系统。包含多个数据库的对象。
    • 数据文件: 存储实际表、索引数据(通常按段分割)。
    • WAL 文件: 存储事务日志(按段分割)。
  4. 事务与 MVCC:
    • 每个元组(行)都有隐藏的系统列 xmin(创建该版本的事务 ID)和 xmax(删除/锁定该版本的事务 ID)。
    • 当一个事务开始时,它获取一个事务快照(Snapshot),决定它能"看到"哪些行版本(基于 xmin/xmax 和事务状态)。
    • INSERT:创建新行,xmin = 当前事务 ID。
    • UPDATE:将旧行标记为过期(设置 xmax),并插入一个新行版本(xmin = 当前事务 ID)。
    • DELETE:将行标记为过期(设置 xmax)。
    • 过期的行版本(死元组)由 VACUUM 进程清理回收空间。

关键功能与技术

  1. 复制与高可用:
    • 流复制(Streaming Replication): 基于 WAL 的物理复制(主从,异步或同步)。主库将 WAL 记录流式传输给备用库,备用库重放 WAL 以保持同步。支持只读查询(热备)。
    • 逻辑复制: 基于复制槽(Replication Slot)的逻辑解码。订阅者可以选择性地复制特定表的数据更改(INSERT/UPDATE/DELETE),支持跨版本复制、异构数据库复制(通过插件)。
    • 高可用解决方案: 通常需要配合第三方工具(如 Patroni, repmgr, pgpool-II)实现自动故障转移(Failover)。
  2. 备份与恢复:
    • 逻辑备份: pg_dump(备份单个数据库)和 pg_dumpall(备份整个集群,包括全局对象)。恢复使用 psqlpg_restore。适合小数据量或特定对象恢复。
    • 物理备份: 直接复制 PGDATA 目录(需要数据库关闭或处于备份模式)。恢复时替换文件并启动。速度快,适合全量恢复。
    • 持续归档与 PITR: 结合物理备份和连续归档的 WAL 文件。允许恢复到备份后的任意时间点(Point-in-Time Recovery)。是实现 RPO≈0 的关键。
  3. 扩展(Extensions): PostgreSQL 活力的源泉。通过 CREATE EXTENSION 命令加载。著名的扩展包括:
    • PostGIS: 地理空间对象支持,业界标准 GIS 扩展。
    • pgcrypto: 加密函数。
    • hstore: 键值对存储。
    • uuid-ossp: 生成 UUID。
    • pg_partman: 自动化分区管理。
    • Citus: 分布式 PostgreSQL(Sharding)。
    • TimescaleDB: 时序数据库扩展(基于 PostgreSQL)。
    • pg_stat_statements: 跟踪 SQL 执行统计信息(性能调优必备)。
  4. 监控与调优:
    • 系统视图(Catalog Views): pg_stat_activity, pg_stat_all_tables, pg_stat_all_indexes, pg_stat_bgwriter, pg_locks 等提供丰富的运行时信息。
    • 统计信息收集器: 自动收集表和索引的访问统计信息(需要 ANALYZE)。
    • EXPLAINEXPLAIN ANALYZE 分析查询执行计划,是 SQL 性能调优的核心工具。
    • 日志文件: 配置日志级别(log_statement, log_min_duration_statement 等)获取详细信息。
    • 外部工具: pgAdmin, DBeaver, psql, Nagios, Zabbix, Prometheus + Grafana (配合 exporters) 等。

适用场景

  • 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 是两大主流开源关系型数据库,在设计理念、功能特性和适用场景上存在显著差异。以下是综合对比分析:


🧠 一、核心设计理念

  1. PostgreSQL

    • 目标定位 :强调 SQL 标准兼容性、数据完整性与功能完备性,定位为企业级数据库。
    • 架构:多进程模型(每个连接独立进程),资源隔离性好,适合高一致性场景。
  2. MySQL

    • 目标定位 :追求 简单易用和高性能,尤其擅长读密集型操作(如 Web 应用)。
    • 架构:多线程模型(连接共享进程),资源开销低,适合高并发简单查询。

📊 二、功能与扩展性

特性 PostgreSQL MySQL
SQL 支持 高度兼容 SQL 标准,支持 CTE、窗口函数、递归查询 部分兼容,高级功能支持较晚(如窗口函数在 8.0+)
数据类型 丰富:数组、JSONB、范围类型、几何数据(PostGIS) 基础类型为主,JSON 支持有限
索引类型 B-tree、GIN、GiST、BRIN 等,支持表达式索引 以 B-tree 为主,全文索引较弱
扩展能力 支持插件(如 PostGIS)、自定义函数/类型 依赖存储引擎,扩展性有限

⚡ 三、性能对比

  1. 读操作

    • MySQL 优势 :简单查询响应快,尤其 读密集型场景(如缓存层)。
    • PostgreSQL 劣势:多进程模型内存消耗较高。
  2. 写操作与复杂查询

    • 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

注意事项

  1. 重要操作前备份数据 (尤其 DROP / TRUNCATE
  2. 生产环境避免直接操作主库(用从库或测试环境验证)
  3. WHERE 子句先验证(防止误删/误更新)
  4. 合理使用事务(确保数据一致性)

💡 推荐工具:

掌握这些基础操作后,可进一步学习:

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 条件; -- 全表更新/删除

📌 操作建议

  1. 执行UPDATE/DELETE前先运行SELECT验证条件
  2. 重要操作前使用BEGIN;开启事务,确认无误再COMMIT;
  3. 生产环境避免直接操作,使用维护窗口

🧠 高效技巧

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;

四、最佳实践

  1. 命名规范

    sql 复制代码
    -- 使用小写和下划线命名
    CREATE SCHEMA hr_operations;
    CREATE DATABASE sales_data;
  2. 环境隔离方案

    sql 复制代码
    -- 按环境创建模式
    CREATE SCHEMA dev;
    CREATE SCHEMA staging;
    CREATE SCHEMA prod;
  3. 多租户实现

    sql 复制代码
    -- 每个租户独立模式
    CREATE SCHEMA tenant_acme;
    CREATE SCHEMA tenant_xyz;
    
    -- 共享核心表
    CREATE TABLE public.tenants (
      id SERIAL PRIMARY KEY,
      name VARCHAR(100)
    );
  4. 备份特定模式

    bash 复制代码
    pg_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;

六、注意事项

  1. 删除保护

    sql 复制代码
    -- 防止误删生产数据库
    ALTER DATABASE production_db OWNER TO admin_user;
    REVOKE CONNECT ON DATABASE production_db FROM public;
  2. 模式搜索路径

    sql 复制代码
    -- 永久设置数据库的搜索路径
    ALTER DATABASE mydb SET search_path TO myschema, public;
  3. 默认模式 public

    • 新用户默认有 public 模式的 CREATE 权限

    • 生产环境建议撤销:

      sql 复制代码
      REVOKE 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;

十、最佳实践

  1. 命名规范

    • 使用小写+下划线:sales_europe
    • 避免保留字:ordersales_order
  2. 环境隔离

    sql 复制代码
    CREATE DATABASE sales_dev;
    CREATE DATABASE sales_staging;
    CREATE DATABASE sales_prod;
  3. 配置优化

    sql 复制代码
    -- 为分析型数据库增加内存
    ALTER DATABASE analytics_db 
    SET maintenance_work_mem = '1GB',
        work_mem = '128MB';
  4. 安全加固

    sql 复制代码
    -- 禁止public连接
    REVOKE CONNECT ON DATABASE sales_prod FROM PUBLIC;
    
    -- 定期备份脚本
    pg_dump -Fc sales_prod | gzip > /backups/sales_$(date +%Y%m%d).dump.gz
  5. 监控脚本

    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 数据库的生命周期,从创建到维护再到优化。建议结合 pgAdminDBeaver 等图形工具使用,复杂操作前务必备份数据!





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 为例)

  1. 切换数据库

    • 在左侧对象浏览器中双击目标数据库
    • 右键点击数据库 → "Query Tool" 打开新查询窗口
  2. 查看当前数据库

    • 查看查询窗口左上角数据库标签
    • 状态栏显示当前连接的数据库名

⚠️ 四、注意事项

  1. 切换限制

    sql 复制代码
    -- 无法在事务中切换数据库
    BEGIN;
    \c new_db; -- 错误!无法在事务块内切换
  2. 连接权限

    sql 复制代码
    -- 检查连接权限
    SELECT has_database_privilege('sales_db', 'CONNECT');
  3. 连接失败处理

    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 调试连接问题
查看所有数据库 \lSELECT * 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';

掌握这些模式操作后,您将能:

  1. 实现数据库对象的逻辑分组
  2. 建立多租户架构
  3. 精细控制数据访问权限
  4. 简化复杂数据库管理
  5. 实现环境隔离(开发/测试/生产)

💡 建议结合 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"
)

⚠️ 五、注意事项

  1. 权限要求

    sql 复制代码
    -- 用户需有目标 schema 的 USAGE 权限
    GRANT USAGE ON SCHEMA sales TO user1;
  2. 临时切换限制

    sql 复制代码
    BEGIN;
    SET search_path TO new_schema; -- 允许在事务中
    COMMIT; -- 事务结束后恢复原设置
  3. 系统函数影响

    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
        │
        └─ 结束

💡 七、最佳实践

  1. 命名规范

    sql 复制代码
    -- 避免歧义名称
    CREATE SCHEMA fin_report; -- 而非 "finance"
  2. 环境隔离

    sql 复制代码
    -- 开发环境
    SET search_path TO dev, public;
    
    -- 生产环境
    SET search_path TO prod, public;
  3. 安全实践

    sql 复制代码
    -- 限制默认 public schema
    REVOKE CREATE ON SCHEMA public FROM PUBLIC;
  4. 监控脚本

    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 的查看与切换技巧,您可以:

  • 高效管理多环境开发
  • 实现安全的数据隔离
  • 简化复杂应用的数据库设计
  • 灵活支持多租户架构

📌 关键记忆点

  1. SELECT current_schema() 查看当前活动 schema
  2. SET search_path TO ... 实现"切换"效果
  3. 生产环境避免使用 public schema 存储业务数据
相关推荐
Dontla1 天前
Postgres介绍(PostgreSQL)(开源对象关系型数据库管理系统)(与Mysql对比)
数据库·postgresql·开源
__风__3 天前
PostgreSQL ExecInitIndexScan 函数解析
数据库·postgresql
中文很快乐3 天前
postgreSQL的sql语句
数据库·sql·postgresql
····懂···3 天前
如何成为 PostgreSQL 中级专家
数据库·postgresql
dingdingfish3 天前
PostgreSQL 16 Administration Cookbook 读书笔记:第6章 Security
postgresql·database·security·administration·cookbook
小至尖尖4 天前
FastCDC 项目启动玩玩 😁😁😁😁
postgresql·sql优化
mini小新4 天前
PostgreSQL如何进行跨服务器迁移数据
服务器·数据库·postgresql·数据迁移
OK_boom5 天前
npgsql/dapper/postgresql的时区问题
数据库·postgresql