PostgreSQL 16 → 18 官方升级实践(Ubuntu 24.04)

一次真实的升级记录。 从 Ubuntu 默认 Cluster 管理模式,迁移到 PostgreSQL 官方推荐目录结构。 全程使用 pg_upgrade,保留所有数据库,最终实现: PostgreSQL 18 官方数据目录 systemd 管理 MacBook 远程访问 完整踩坑记录 一、为什么升级? 原环境: 项目 版本 Ubuntu 24.04 PostgreSQL 16.14 数据目录 /srv/data/db/postgres/16/main 希望升级到: PostgreSQL 18.4 PostgreSQL 18 vs 16 关键改进 特性 PostgreSQL 16 PostgreSQL 18 增量备份 ❌ 仅全量 ✅ pg_basebackup 支持增量,备份时间减少 50%+ 逻辑复制 基础支持 ✅ 支持序列和大对象复制 并行查询 有限并行 ✅ 更多场景支持并行(VACUUM、CREATE INDEX) JSON 处理 JSONB 基础 ✅ JSON_TABLE 增强,复杂查询更高效 SSD 优化 无特殊处理 ✅ 强制 I/O 调度优化(见下文) 连接池 需外部工具 ✅ 内置连接池改进 SSD 专项优化(重要) PostgreSQL 18 对 NVMe/SSD 做了底层优化,这是升级的核心理由: ...

July 25, 2026 · FXIO

家用 PostgreSQL 调优实战:从默认配置到性能翻倍

一台 16GB 内存的家用服务器,PostgreSQL 跑起来总觉得慢,改配置又怕改坏——这篇文章用真实的配置文件逐项拆解,告诉你哪些参数值得动,动多少合适。 开场:一次"改坏"的调优经历 上周帮朋友调一台家用服务器上的 PostgreSQL,他信誓旦旦说"我照着网上的教程改了 shared_buffers 到 8GB,结果数据库直接起不来了"。我一看配置——16GB 的机器,shared_buffers 给了 8GB,再加上操作系统缓存、其他服务,内存直接 OOM。 这种故事在家庭服务器圈子里太常见了。PostgreSQL 的 postgresql.conf 有几百个参数,但真正需要动的也就十来个。今天我们用一台真实的家用机器配置,逐项拆解。 硬件家底:你的机器够干多大的活 先看看今天的实验对象: 项目 配置 CPU 12th Gen Intel i5-1240P(12核16线程) 内存 16GB 磁盘 SSD 系统 Ubuntu 24.04 LTS PG 版本 PostgreSQL 16 16GB 内存、SSD、12 代酷睿——这是典型的家用 NAS 或者小型工作站配置。够用,但没有太多余量可以挥霍。 第一梯队:内存分配三兄弟 PostgreSQL 的性能调优,80% 就是调内存分配。搞明白三个参数,基本就入门了。 shared_buffers — 数据库的"工作台" shared_buffers = 2GB 这是 PostgreSQL 自己用来缓存数据页的内存。你可以把它想象成厨师的工作台——台面越大,能同时摊开的食材越多,不用反复跑冰箱拿东西。 经验法则:物理内存的 25%。16GB 的机器给 2GB 是合理的。给太大(比如 8GB),操作系统缓存会被挤掉,反而变慢;给太小,频繁读磁盘,性能拉胯。 验证方法: SELECT pg_size_pretty(pg_database_size(current_database())) AS db_size, pg_size_pretty(pg_total_relation_size('projects')) AS table_size; 如果你的数据库总量小于 shared_buffers,那说明数据全在缓存里,调大没意义。 ...

July 24, 2026 · FXIO

PostgreSQL 百万级数据实战:查询计划与索引策略全解析

上一篇聊了家用 PostgreSQL 的配置调优,这篇来点硬的——100 万条数据,PostgreSQL 的查询计划选择会发生什么变化?索引策略又该怎么调? 开场:当 30 条变成 100 万条 上篇博客里,我们的 projects 表只有 30 条数据。COUNT 一下 0.97ms,排序一下 0.54ms,快得飞起。但你心里清楚——30 条数据,任何数据库都不会慢。 真正的考验是:数据量上来之后,你的索引还管用吗?优化器还会乖乖走 Index Scan 吗? 今天我们用 100 万条真实数据,把 PostgreSQL 的查询计划拆个底朝天。 实验环境 项目 配置 CPU 12th Gen Intel i5-1240P(12核16线程) 内存 16GB 磁盘 SSD PG 版本 PostgreSQL 16 数据量 1,000,000 行 数据大小 174 MB 索引大小 74 MB 总大小 248 MB 100 万行,248MB——不大不小,刚好是很多真实项目的规模。 插入性能:100 万条要多久 1,000,000 条批量插入: 12.7 秒 平均每秒约 7.8 万条。用的是逐批 10000 条的 INSERT ... VALUES 拼接方式,没有用 COPY。如果用 COPY FROM STDIN,速度还能再快 2-3 倍。 ...

July 24, 2026 · FXIO