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 倍

总结优先级(建议按顺序执行):

  1. 今天改密码 + 限制 pg_hba.conf
  2. 今天/明天搭备份脚本
  3. 这周内加 pgbouncer
  4. 下周搭 Prometheus + Grafana 监控面板
  5. 每月做一次恢复演练

需要我给你具体的脚本/配置文件(比如完整的 crontab + pgBackRest 配置、postgres_exporter docker-compose、Grafana dashboard json 等),随时说一声,我马上给你。

你的这个环境已经很强了,再把备份和监控补上,基本可以放心上生产了!有什么具体问题(比如想加 PostGIS、做主从、接 MinIO 备份等)随时问我。

posted @ 2026-05-03 03:24  ccims  阅读(11)  评论(0)    收藏  举报