PostgreSQL 安装与实例管理
# 一、PostgreSQL 核心层次结构(前置基础概念)
理解安装、实例、数据库关系的基础,避免概念混淆
实例(Instance/Cluster) → 数据库(Database) → 模式(Schema) → 表(Table)
- 实例:独立postgres进程 + 共享内存 + 独立数据目录($PGDATA),端口区分;不同实例完全隔离
- 数据库:实例内部逻辑隔离,同实例下数据库之间不能直接跨库查询
- 模式:数据库内部命名空间,默认
public,解决表名冲突 - 表:实际数据存储对象
❌ PostgreSQL不支持
database.schema.table跨库访问;跨库需要dblink/postgres_fdw
# 二、Windows 图形化安装说明
**官方文档:**https://www.postgresql.org/download/windows/
- 使用官方exe安装向导,一路默认安装 → 仅1个实例,端口5432
- 安装多个大版本(14/15/16)→ 自动分配不同端口,产生多个实例
- 判断实例数量:运行
services.msc,统计postgresql开头Windows服务数量 - 图形化安装同样遵循:一个实例 = 独立数据目录 + 独立端口
# 三、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 单实例启动
Pull the Postgres image
Download the latest Postgres image from Docker Hub.
docker pull postgres1Start 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:131
2
3
4
5
6
7
8Verify the container is running
Check logs or use Docker Dashboard to confirm Postgres is up.
docker logs some-postgres1Connect to Postgres
Use
psqlto connect to the running database.docker exec -it some-postgres psql -U postgres1
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
2
3
4
5
6
7
8
# 4.3 Docker部署避坑要点
- ❌ 不要多个容器挂载同一个数据卷,会导致数据损坏
- ❌ 容器删除不挂卷 → 数据全部丢失
- ✅ 生产建议配合
docker-compose管理 - 不同容器实例之间完全隔离,无法直接跨库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
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命令 | 快速创建多实例、环境隔离 | 需要维护容器、数据卷 |
# 六、常见错误排查
- 远程无法连接
- 防火墙未放行端口:
firewall-cmd --add-port=5432/tcp --permanent && firewall-cmd --reload listen_addresses仍为localhostpg_hba.conf规则未配置正确
- 防火墙未放行端口:
- 端口冲突:启动报端口占用,更换端口或者停止占用进程
- 权限错误:数据目录属主必须为
postgres用户
# 七、补充知识点
initdb本质:初始化数据目录,每执行一次initdb = 新建一个实例- 同一Linux机器不使用docker,也可以手动创建多个实例:
initdb -D /data/pg2,通过-p指定不同端口启动 - PostgreSQL大版本升级不能直接覆盖,需要使用
pg_upgrade工具 $PGDATA环境变量指向数据库实例数据目录