PostgreSQL 安装与实例管理

2026/11/5 PostgreSQL

# 一、PostgreSQL 核心层次结构(前置基础概念)

理解安装、实例、数据库关系的基础,避免概念混淆

实例(Instance/Cluster) → 数据库(Database) → 模式(Schema) → 表(Table)
1
  1. 实例:独立postgres进程 + 共享内存 + 独立数据目录($PGDATA),端口区分;不同实例完全隔离
  2. 数据库:实例内部逻辑隔离,同实例下数据库之间不能直接跨库查询
  3. 模式:数据库内部命名空间,默认public,解决表名冲突
  4. 表:实际数据存储对象

❌ PostgreSQL不支持 database.schema.table 跨库访问;跨库需要 dblink / postgres_fdw


# 二、Windows 图形化安装说明

**官方文档:**https://www.postgresql.org/download/windows/

  1. 使用官方exe安装向导,一路默认安装 → 仅1个实例,端口5432
  2. 安装多个大版本(14/15/16)→ 自动分配不同端口,产生多个实例
  3. 判断实例数量:运行 services.msc,统计 postgresql 开头Windows服务数量
  4. 图形化安装同样遵循:一个实例 = 独立数据目录 + 独立端口

# 三、Linux(CentOS/RHEL)YUM 方式安装 PostgreSQL

**官方文档:**https://www.postgresql.org/download/linux/redhat/


# 四、Linux Docker 部署 PostgreSQL(多实例方案)

Docker Hub 官方镜像页:https://hub.docker.com/_/postgres

Docker 官方使用文档:在 https://docs.docker.com/ 搜 “How to Use the Postgres Docker Official Image”

镜像源码/说明(GitHub):https://github.com/docker-library/docs/tree/master/postgres

核心原则:一个容器 = 一个独立PostgreSQL实例

# 4.1 单实例启动

  1. Pull the Postgres image

    Download the latest Postgres image from Docker Hub.

    docker pull postgres
    
    1
  2. Start a Postgres container

    Set a password for the default user and run the container in detached mode.

    docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
    
    docker run --name some-postgres \
      -d postgres \
      -p 5432:5432 \
      -e POSTGRES_PASSWORD=123456 \
      -v /data/pg13:/var/lib/postgresql/data \
      postgres:13
    
    1
    2
    3
    4
    5
    6
    7
    8
  3. Verify the container is running

    Check logs or use Docker Dashboard to confirm Postgres is up.

    docker logs some-postgres
    
    1
  4. Connect to Postgres

    Use psql to connect to the running database.

    docker exec -it some-postgres psql -U postgres
    
    1

Persist your data

Use Docker volumes to store your database data outside the container for persistence.

# 4.2 同一台机器启动多个独立实例

关键点:宿主机映射端口不同 + 宿主机数据卷目录不同

# 实例1 端口5432
docker run -d --name pg15-1 -p 5432:5432 -e POSTGRES_PASSWORD=123456 -v /data/pg1:/var/lib/postgresql/data postgres:15

# 实例2 端口5433
docker run -d --name pg15-2 -p 5433:5432 -e POSTGRES_PASSWORD=123456 -v /data/pg2:/var/lib/postgresql/data postgres:15

# 实例3 端口5434
docker run -d --name pg15-3 -p 5434:5432 -e POSTGRES_PASSWORD=123456 -v /data/pg3:/var/lib/postgresql/data postgres:15
1
2
3
4
5
6
7
8

# 4.3 Docker部署避坑要点

  1. ❌ 不要多个容器挂载同一个数据卷,会导致数据损坏
  2. ❌ 容器删除不挂卷 → 数据全部丢失
  3. ✅ 生产建议配合 docker-compose 管理
  4. 不同容器实例之间完全隔离,无法直接跨库JOIN查询

# 4.4 docker-compose示例(多实例)

version: '3'
services:
  pg1:
    image: postgres:15
    container_name: pg15-1
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: 123456
    volumes:
      - /data/pg1:/var/lib/postgresql/data
  pg2:
    image: postgres:15
    container_name: pg15-2
    ports:
      - "5433:5432"
    environment:
      POSTGRES_PASSWORD: 123456
    volumes:
      - /data/pg2:/var/lib/postgresql/data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 五、三种安装方式对比总结

安装方式 适用场景 实例管理方式 优点 缺点
Windows图形化安装 本地开发测试 Windows服务 操作简单 不适合生产服务器
Linux YUM安装 服务器生产环境 systemctl管理服务 稳定、便于运维、原生 多实例配置繁琐
Docker容器安装 开发/测试/快速部署 docker命令 快速创建多实例、环境隔离 需要维护容器、数据卷

# 六、常见错误排查

  1. 远程无法连接
    • 防火墙未放行端口:firewall-cmd --add-port=5432/tcp --permanent && firewall-cmd --reload
    • listen_addresses 仍为localhost
    • pg_hba.conf 规则未配置正确
  2. 端口冲突:启动报端口占用,更换端口或者停止占用进程
  3. 权限错误:数据目录属主必须为 postgres 用户

# 七、补充知识点

  1. initdb 本质:初始化数据目录,每执行一次initdb = 新建一个实例
  2. 同一Linux机器不使用docker,也可以手动创建多个实例:initdb -D /data/pg2,通过-p指定不同端口启动
  3. PostgreSQL大版本升级不能直接覆盖,需要使用 pg_upgrade 工具
  4. $PGDATA环境变量指向数据库实例数据目录