PostgreSQL 最新版本情况
让我先确认一下 PostgreSQL 最新版本情况。
您说得对!PostgreSQL 18.3 才是目前最新稳定版本。让我查找可用的 PG18 镜像源:
PG18 镜像拉取成功!确认版本并清理旧镜像:
确认是 PostgreSQL 18.3,镜像无 entrypoint,需要手动 initdb 初始化。开始完整部署:
sudo 成功了。现在 initdb:
SELinux :Z 重置了权限。不挂载已有目录,让 initdb 自己创建:
:Z 让挂载目录被重新 label 但 owner 还是宿主机用户。换一个思路——让容器以 root 初始化,或直接用环境变量方式启动:
CloudNativePG 镜像是为 Kubernetes 设计的,没有 entrypoint 脚本。改用 Bitnami PostgreSQL 镜像(支持环境变量一键启动,且有国内可访问镜像):
找到根因了!Podman 运行在 rootless 模式 + user namespace 映射:宿主机 UID 1000 → 容器 UID 0(root),容器内 UID 26(postgres)→ 宿主机 UID 100025。所以需要将宿主机目录 owner 改为 100025:
initdb 成功! 现在启动 PostgreSQL 18 容器并开启所有高级功能:
容器正在运行!现在启用高级扩展:
所有扩展已成功安装!最后验证整体配置:
部署完成!以下是完整总结:
PostgreSQL 18.3 部署完成
基本信息
| 项目 | 内容 |
|---|---|
| 版本 | PostgreSQL 18.3 (Debian 18.3-1.pgdg11+1) |
| 镜像来源 | ghcr.io/cloudnative-pg/postgresql:18 |
| 容器名 | postgres18 |
| 端口 | 5432 |
| 数据目录 | /home/x/pgdata/data(持久化) |
| 用户名 | pgadmin |
| 密码 | StrongPass@2026 |
| 数据库 | maindb |
高级参数配置
| 类别 | 参数 | 值 |
|---|---|---|
| 性能 | shared_buffers |
256MB |
work_mem |
4MB | |
effective_cache_size |
768MB | |
max_connections |
200 | |
| WAL/复制 | wal_level |
logical(支持逻辑复制) |
max_wal_senders |
10 | |
max_replication_slots |
10 | |
hot_standby |
on | |
| 查询优化 | jit |
on(JIT 编译加速) |
enable_partitionwise_join |
on | |
enable_partitionwise_aggregate |
on | |
| 监控 | track_io_timing |
on |
track_functions |
all | |
log_min_duration_statement |
1000ms(慢查询日志) | |
| 安全 | password_encryption |
scram-sha-256 |
| AutoVacuum | autovacuum_vacuum_scale_factor |
0.02 |
autovacuum_analyze_scale_factor |
0.01 |
已安装扩展(19个)
| 扩展 | 版本 | 用途 |
|---|---|---|
pg_stat_statements |
1.12 | SQL 统计分析 |
pgcrypto |
1.4 | 加密函数 |
uuid-ossp |
1.1 | UUID 生成 |
hstore |
1.8 | 键值对存储 |
ltree |
1.3 | 树形层级结构 |
citext |
1.8 | 大小写不敏感文本 |
pg_trgm |
1.6 | 模糊匹配/相似度搜索 |
btree_gin |
1.3 | GIN 索引增强 |
btree_gist |
1.8 | GiST 索引增强 |
intarray |
1.5 | 整数数组操作 |
cube |
1.5 | 多维空间数据 |
earthdistance |
1.2 | 地球距离计算 |
tablefunc |
1.0 | 交叉表/数据透视 |
unaccent |
1.1 | 文本去重音 |
isn |
1.3 | ISBN/ISSN 标准编号 |
lo |
1.2 | 大对象管理 |
dict_int |
1.0 | 整数全文索引字典 |
dict_xsyn |
1.0 | 同义词全文索引字典 |
plpgsql |
1.0 | 存储过程语言(内置) |
连接方式
# 从宿主机连接
psql -h 10.0.0.10 -p 5432 -U pgadmin -d maindb
# 容器内连接
podman exec -it postgres18 psql -U pgadmin -d maindb
恭喜! PostgreSQL 18.3 部署成功,而且配置得非常专业——19 个扩展全开、WAL logical 复制就绪、JIT + 分区优化 + 详细监控全部启用,数据目录持久化也处理得干净(rootless Podman + user namespace 权限修复到位)。
你现在已经有一个生产级别的单节点 PostgreSQL 18 了。下面我按优先级给你一些实用建议,帮你把这个环境从“能用”变成“可靠、可维护、可扩展”。
1. 立即做的安全加固(今天必须做)
-- 1. 改密码(别用 StrongPass@2026 这种示例密码)
ALTER USER pgadmin WITH PASSWORD '你的超强密码-至少20位-包含大小写+数字+符号';
-- 2. 限制只允许特定 IP 连接(登录容器后执行)
-- 编辑 /var/lib/postgresql/data/pg_hba.conf,把下面这行改成:
host all all 10.0.0.0/8 scram-sha-256 -- 或者只允许你的办公网段
host all all 127.0.0.1/32 scram-sha-256
容器操作方式:
podman exec -it postgres18 bash
# 然后用 vim 或 echo 方式修改 pg_hba.conf
podman restart postgres18
2. 备份策略(最重要!)
单节点最怕的就是数据丢失。建议立刻做两件事:
方案 A(推荐新手):每日全量 + WAL 归档(PITR)
# 在宿主机建备份目录
mkdir -p /home/x/pgbackup
chown 100025:100025 /home/x/pgbackup # 必须和容器 postgres UID 一致
# 每天凌晨 2 点全量备份(crontab)
0 2 * * * podman exec postgres18 pg_dump -U pgadmin -d maindb -F c -Z 9 -f /var/lib/postgresql/data/backup/maindb_$(date +\%F).dump
方案 B(生产推荐):用 pgBackRest(比 pg_dump 专业太多)
- 支持增量备份、并行、加密、S3 存储
- 官方文档非常友好
3. 监控与告警(已经装了 pg_stat_statements,赶紧用起来)
-- 查看最慢的 20 条 SQL(每天看一次)
SELECT query, calls, total_time, mean_time, rows
FROM pg_stat_statements
ORDER BY total_time DESC LIMIT 20;
-- 查看当前连接和锁情况
SELECT * FROM pg_stat_activity WHERE state = 'active';
长期监控建议:
- 安装
postgres_exporter+ Prometheus + Grafana(一键 docker-compose 就能跑) - 或者直接用 pgAdmin 4 的监控面板(已经内置)
4. 连接池(强烈推荐)
200 个 max_connections 在高并发下很容易打满。立刻加一层连接池:
podman run -d --name pgbouncer \
-p 6432:6432 \
-e DATABASES="maindb=host=10.0.0.10 port=5432 user=pgadmin password=xxx dbname=maindb" \
--restart unless-stopped \
pgbouncer/pgbouncer:latest
之后应用都连 5432 → 改成连 6432(pgbouncer),连接数瞬间降到 20~50。
5. 容器运维最佳实践
# 1. 给容器加资源限制(防止吃光宿主机内存)
podman run ... --memory=2g --cpus=2.0 ...
# 2. 设置 systemd 自动启动(Podman rootless 推荐方式)
podman generate systemd --name postgres18 --new -f
sudo cp ~/.config/systemd/user/container-postgres18.service /etc/systemd/system/
systemctl --user enable --now container-postgres18
# 3. 升级镜像(小版本直接 pull 即可)
podman pull ghcr.io/cloudnative-pg/postgresql:18
podman stop postgres18 && podman rm postgres18
# 重新 run(数据目录还在,自动恢复)
大版本升级(18 → 19)一定要用 pg_upgrade + 完整备份,别直接换镜像。
6. 其他值得立刻做的
- 慢查询日志已经开了(
log_min_duration_statement = 1000ms),建议再加:ALTER SYSTEM SET log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '; SELECT pg_reload_conf(); - 定期 VACUUM:已经把
autovacuum_vacuum_scale_factor调到 0.02,很好,但还是建议每周跑一次:VACUUM (ANALYZE, VERBOSE); - 扩展更新:
ALTER EXTENSION pg_trgm UPDATE;等有新版本时执行。 - 测试恢复流程:每月至少做一次
pg_restore演练,别等到真出事才发现备份坏了。
7. 未来演进建议
你现在用的是 CloudNativePG 镜像,其实已经为 Kubernetes 做好准备了。
如果以后要上生产,强烈建议直接上 CloudNativePG Operator + Kubernetes:
- 自动 failover
- 自动备份到 S3/MinIO
- 读写分离、一键扩容
- 比手动维护单节点安全 10 倍
总结优先级(建议按顺序执行):
- 今天改密码 + 限制 pg_hba.conf
- 今天/明天搭备份脚本
- 这周内加 pgbouncer
- 下周搭 Prometheus + Grafana 监控面板
- 每月做一次恢复演练
需要我给你具体的脚本/配置文件(比如完整的 crontab + pgBackRest 配置、postgres_exporter docker-compose、Grafana dashboard json 等),随时说一声,我马上给你。
你的这个环境已经很强了,再把备份和监控补上,基本可以放心上生产了!有什么具体问题(比如想加 PostGIS、做主从、接 MinIO 备份等)随时问我。

浙公网安备 33010602011771号