Chapter 01

PostgreSQL 简介与安装

了解 PG 与 MySQL 的本质差异,掌握多种安装方式,熟练使用 psql 命令行工具

1.1 PostgreSQL 是什么

PostgreSQL(官方读作 "post-gress-Q-L",社区常称 "Postgres" 或 "PG")诞生于 1986 年加州大学伯克利分校的 POSTGRES 项目,1996 年更名为 PostgreSQL 并采用开源许可证(类 BSD)。经过近 40 年的持续发展,它已成为全球功能最完整、SQL 标准支持最好的开源关系型数据库。

🐘

为什么是大象?大象是 PostgreSQL 的吉祥物,名叫 Slonik。在软件世界,大象象征着"永不忘记"(强大的数据一致性保证)和"力大无穷"(处理海量数据的能力)。

PostgreSQL 的核心设计哲学是:优先满足 SQL 标准与数据正确性,而非追求极限性能。这使得它在数据完整性、事务语义和丰富功能方面远超 MySQL,但也意味着在某些极简场景下配置更复杂。

1.2 PostgreSQL vs MySQL 核心差异

特性PostgreSQL 17MySQL 8
SQL 标准支持极高,递归 CTE、窗口函数、WITH TIES、MERGE 等部分支持,某些特性需变通
ACID 合规完整 ACID,所有操作默认事务安全InnoDB 引擎支持,但 DDL 不可回滚
JSON 支持JSONB(二进制存储,可索引),性能极强JSON 类型,不支持 GIN 索引
数组类型原生支持 integer[]、text[] 等不支持,需用 JSON 或关联表代替
全文搜索内置 tsvector/tsquery,支持中文扩展内置 FULLTEXT,功能较弱
DDL 事务DDL 可回滚(ALTER TABLE 在事务中)DDL 立即提交,不可回滚
MVCC 实现堆表存多版本,无 Undo Log 概念Undo Log 存储旧版本
扩展系统CREATE EXTENSION,PostGIS/TimescaleDB 等插件机制,扩展生态相对弱
并发模型多进程(每连接一个进程)多线程(每连接一个线程)
默认端口54323306
💡

何时选择 PostgreSQL?需要复杂查询(窗口函数、CTE)、存储 JSON 文档且要索引其字段、地理空间查询(PostGIS)、要求严格 SQL 标准合规、或需要更好的并发写入一致性时,PostgreSQL 是更好的选择。

版本历史与当前 LTS

PostgreSQL 每年发布一个主版本(通常在9月),每个主版本支持 5 年。

版本发布时间EOL重要新特性
PG 17 (当前最新)2024-092029-11增量排序优化、MERGE 增强、逻辑复制槽故障转移
PG 16 (LTS)2023-092028-11逻辑复制可从 Standby 发布、更多并行化、pg_stat_io
PG 152022-102027-11MERGE 语句、pg_walinspect、排序性能提升
PG 142021-092026-11Pipeline mode、连接池优化、JSONB 下标访问

1.3 安装方式

方式一:macOS — Homebrew

SHELL# 安装 PostgreSQL 17(推荐)
brew install postgresql@17

# 启动服务(开机自启)
brew services start postgresql@17

# 将 psql 加入 PATH(按 brew 安装完成后的提示操作)
echo 'export PATH="/opt/homebrew/opt/postgresql@17/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

# 验证安装
psql --version
# psql (PostgreSQL) 17.x

# 首次连接(用当前系统用户名,无需密码)
psql postgres

方式二:macOS — Postgres.app(图形化最简方式)

  1. 访问 postgresapp.com 下载 Postgres.app
  2. 拖入 Applications,点击 Initialize 即可启动
  3. 点击 "Open psql" 直接进入命令行,无需配置环境变量
  4. 支持同时运行多个 PG 版本,适合本地开发

方式三:Linux — apt(Ubuntu/Debian)

SHELL# 添加官方 APT 仓库
sudo apt install -y curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail \
  https://www.postgresql.org/media/keys/ACCC4CF8.asc

sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \
  https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" \
  > /etc/apt/sources.list.d/pgdg.list'

sudo apt update
sudo apt install -y postgresql-17

# 服务管理
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo systemctl status postgresql

# 切换到 postgres 系统用户并连接
sudo -u postgres psql

方式四:Linux — yum(RHEL/CentOS/Fedora)

SHELL# 安装 PGDG 仓库 RPM(以 RHEL 9 为例)
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 禁用系统默认 PostgreSQL 模块
sudo dnf -qy module disable postgresql

# 安装
sudo dnf install -y postgresql17-server postgresql17-contrib

# 初始化数据目录
sudo /usr/pgsql-17/bin/postgresql-17-setup initdb

# 启动并设置开机自启
sudo systemctl enable --now postgresql-17

方式五:Docker(最快上手)

SHELL# 拉取官方镜像并启动容器
docker run -d \
  --name pg17 \
  -e POSTGRES_PASSWORD=mypassword \
  -e POSTGRES_DB=myapp \
  -p 5432:5432 \
  -v pg17_data:/var/lib/postgresql/data \
  postgres:17-alpine

# 连接到容器内的 psql
docker exec -it pg17 psql -U postgres -d myapp

# 使用 docker-compose(推荐开发环境)
YAML (docker-compose.yml)version: '3.9'
services:
  postgres:
    image: postgres:17-alpine
    environment:
      POSTGRES_PASSWORD: devpassword
      POSTGRES_USER: myuser
      POSTGRES_DB: mydb
    ports:
      - "5432:5432"
    volumes:
      - pg_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U myuser -d mydb"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  pg_data:

1.4 psql 命令行工具

psql 是 PostgreSQL 官方命令行客户端,功能强大。连接命令格式:

SHELL# 完整格式
psql -h localhost -p 5432 -U myuser -d mydb

# 使用连接字符串(URL 格式)
psql "postgresql://myuser:mypassword@localhost:5432/mydb"

# 使用环境变量(避免密码出现在命令行)
export PGPASSWORD=mypassword
psql -h localhost -U myuser mydb

核心元命令(Meta-Commands)

psql 的元命令以反斜杠 \ 开头,不是 SQL,不需要分号结尾:

命令功能等价操作
\l\list列出所有数据库MySQL: SHOW DATABASES
\c dbname切换到指定数据库MySQL: USE dbname
\dt列出当前 Schema 的所有表MySQL: SHOW TABLES
\dt *.* 列出所有 Schema 的所有表
\d tablename查看表结构(列、类型、索引、约束)MySQL: DESCRIBE tablename
\d+ tablename详细表信息(含存储参数)
\di列出索引SHOW INDEX FROM table
\dv列出视图SHOW FULL TABLES WHERE Type='VIEW'
\df列出函数
\du列出用户/角色SELECT User FROM mysql.user
\dn列出 SchemaMySQL: SHOW DATABASES
\e用系统默认编辑器编辑上一条 SQL
\i file.sql执行 SQL 文件MySQL: SOURCE file.sql
\timing开关查询耗时显示
\x切换扩展显示模式(列转行,宽表友好)
\?查看所有元命令帮助
\h SELECT查看某条 SQL 语句的语法帮助
\q退出 psqlMySQL: quit / exit
PSQL SESSION-- 连接后的典型操作流程
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    | ICU Locale
-----------+----------+----------+-------------+-------------+------------
 myapp     | myuser   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |

postgres=# \c myapp
You are now connected to database "myapp" as user "myuser".

myapp=# \dt
         List of relations
 Schema |   Name   | Type  |  Owner
--------+----------+-------+---------
 public | orders   | table | myuser
 public | products | table | myuser
 public | users    | table | myuser

myapp=# \d users
                          Table "public.users"
   Column    |            Type             | Nullable |      Default
-------------+-----------------------------+----------+-------------------
 id          | bigint                      | not null | generated always as identity
 username    | character varying(50)       | not null |
 email       | text                        | not null |
 created_at  | timestamp with time zone    | not null | now()
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "users_email_key" UNIQUE CONSTRAINT, btree (email)

1.5 pgAdmin 4 图形工具

pgAdmin 4 是 PostgreSQL 官方维护的图形化管理工具,支持 Web 浏览器和桌面客户端两种形式。

🖥️

安装方式访问 pgadmin.org 下载对应平台安装包;也可通过 pip 安装:pip install pgadmin4;Docker 版:docker run -p 5050:80 dpage/pgadmin4

🔧

主要功能Query Tool(SQL 编辑器)、ERD 图、Table/View 管理、备份还原向导、pg_stat_activity 监控面板、Explain 可视化执行计划。

1.6 核心名词解释

PostgreSQL 的对象层次结构与 MySQL 有所不同,理解这些概念是掌握 PG 的基础:

对象层次可视化

HIERARCHYPostgreSQL Instance (Cluster)
└── pg_global tablespace
    ├── pg_default tablespace
    │   ├── Database: postgres   (系统默认数据库)
    │   ├── Database: template1  (新建数据库的模板)
    │   └── Database: myapp      (你的应用数据库)
    │       ├── Schema: public   (默认 schema)
    │       │   ├── Table: users
    │       │   ├── Table: orders
    │       │   ├── View: active_users
    │       │   └── Function: update_timestamp()
    │       ├── Schema: audit    (审计日志 schema)
    │       │   └── Table: audit_log
    │       └── Schema: archive  (历史数据 schema)
    │           └── Table: orders_2023
    └── custom tablespace: /ssd/pg_data  (高速存储)
📌

本章小结PostgreSQL 是功能最完整的开源 RDBMS,在 SQL 标准支持、JSONB、DDL 事务、扩展系统等方面远超 MySQL。核心对象层次:Cluster → Database → Schema → Table。psql 的元命令(\l、\c、\dt、\d)是日常操作的核心工具。WAL 是 PG 可靠性的基石。