<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>PostgreSQL on FXIO 技术博客</title><link>https://fxio.site/tags/postgresql/</link><description>Recent content in PostgreSQL on FXIO 技术博客</description><generator>Hugo -- 0.157.0</generator><language>zh-cn</language><lastBuildDate>Sat, 25 Jul 2026 10:25:00 +0800</lastBuildDate><atom:link href="https://fxio.site/tags/postgresql/index.xml" rel="self" type="application/rss+xml"/><item><title>PostgreSQL 16 → 18 官方升级实践（Ubuntu 24.04）</title><link>https://fxio.site/posts/sql/postgresql-16-upgrade-to-18/</link><pubDate>Sat, 25 Jul 2026 10:25:00 +0800</pubDate><guid>https://fxio.site/posts/sql/postgresql-16-upgrade-to-18/</guid><description>&lt;blockquote&gt;
&lt;p&gt;一次真实的升级记录。&lt;/p&gt;
&lt;p&gt;从 Ubuntu 默认 Cluster 管理模式，迁移到 PostgreSQL 官方推荐目录结构。&lt;/p&gt;
&lt;p&gt;全程使用 pg_upgrade，保留所有数据库，最终实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PostgreSQL 18&lt;/li&gt;
&lt;li&gt;官方数据目录&lt;/li&gt;
&lt;li&gt;systemd 管理&lt;/li&gt;
&lt;li&gt;MacBook 远程访问&lt;/li&gt;
&lt;li&gt;完整踩坑记录&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;
&lt;hr&gt;
&lt;h1 id="一为什么升级"&gt;一、为什么升级？&lt;/h1&gt;
&lt;p&gt;原环境：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu&lt;/td&gt;
&lt;td&gt;24.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;16.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据目录&lt;/td&gt;
&lt;td&gt;/srv/data/db/postgres/16/main&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;希望升级到：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;PostgreSQL 18.4
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="postgresql-18-vs-16-关键改进"&gt;PostgreSQL 18 vs 16 关键改进&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;PostgreSQL 16&lt;/th&gt;
&lt;th&gt;PostgreSQL 18&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;增量备份&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ 仅全量&lt;/td&gt;
&lt;td&gt;✅ pg_basebackup 支持增量，备份时间减少 50%+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;逻辑复制&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;基础支持&lt;/td&gt;
&lt;td&gt;✅ 支持序列和大对象复制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;并行查询&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;有限并行&lt;/td&gt;
&lt;td&gt;✅ 更多场景支持并行（VACUUM、CREATE INDEX）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JSON 处理&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSONB 基础&lt;/td&gt;
&lt;td&gt;✅ JSON_TABLE 增强，复杂查询更高效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSD 优化&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;无特殊处理&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;强制 I/O 调度优化&lt;/strong&gt;（见下文）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;连接池&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;需外部工具&lt;/td&gt;
&lt;td&gt;✅ 内置连接池改进&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="ssd-专项优化重要"&gt;SSD 专项优化（重要）&lt;/h2&gt;
&lt;p&gt;PostgreSQL 18 对 NVMe/SSD 做了底层优化，这是升级的&lt;strong&gt;核心理由&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>家用 PostgreSQL 调优实战：从默认配置到性能翻倍</title><link>https://fxio.site/posts/sql/postgresql-home-tuning/</link><pubDate>Fri, 24 Jul 2026 12:29:00 +0800</pubDate><guid>https://fxio.site/posts/sql/postgresql-home-tuning/</guid><description>&lt;blockquote&gt;
&lt;p&gt;一台 16GB 内存的家用服务器，PostgreSQL 跑起来总觉得慢，改配置又怕改坏——这篇文章用真实的配置文件逐项拆解，告诉你哪些参数值得动，动多少合适。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!-- more --&gt;
&lt;h2 id="开场一次改坏的调优经历"&gt;开场：一次&amp;quot;改坏&amp;quot;的调优经历&lt;/h2&gt;
&lt;p&gt;上周帮朋友调一台家用服务器上的 PostgreSQL，他信誓旦旦说&amp;quot;我照着网上的教程改了 shared_buffers 到 8GB，结果数据库直接起不来了&amp;quot;。我一看配置——16GB 的机器，shared_buffers 给了 8GB，再加上操作系统缓存、其他服务，内存直接 OOM。&lt;/p&gt;
&lt;p&gt;这种故事在家庭服务器圈子里太常见了。PostgreSQL 的 &lt;code&gt;postgresql.conf&lt;/code&gt; 有几百个参数，但真正需要动的也就十来个。今天我们用一台真实的家用机器配置，逐项拆解。&lt;/p&gt;
&lt;h2 id="硬件家底你的机器够干多大的活"&gt;硬件家底：你的机器够干多大的活&lt;/h2&gt;
&lt;p&gt;先看看今天的实验对象：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;配置&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;12th Gen Intel i5-1240P（12核16线程）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;16GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;磁盘&lt;/td&gt;
&lt;td&gt;SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;Ubuntu 24.04 LTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PG 版本&lt;/td&gt;
&lt;td&gt;PostgreSQL 16&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;16GB 内存、SSD、12 代酷睿——这是典型的家用 NAS 或者小型工作站配置。够用，但没有太多余量可以挥霍。&lt;/p&gt;
&lt;h2 id="第一梯队内存分配三兄弟"&gt;第一梯队：内存分配三兄弟&lt;/h2&gt;
&lt;p&gt;PostgreSQL 的性能调优，80% 就是调内存分配。搞明白三个参数，基本就入门了。&lt;/p&gt;
&lt;h3 id="shared_buffers--数据库的工作台"&gt;shared_buffers — 数据库的&amp;quot;工作台&amp;quot;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;shared_buffers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;2GB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这是 PostgreSQL 自己用来缓存数据页的内存。你可以把它想象成厨师的工作台——台面越大，能同时摊开的食材越多，不用反复跑冰箱拿东西。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经验法则：物理内存的 25%&lt;/strong&gt;。16GB 的机器给 2GB 是合理的。给太大（比如 8GB），操作系统缓存会被挤掉，反而变慢；给太小，频繁读磁盘，性能拉胯。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;验证方法：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pg_size_pretty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pg_database_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_database&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;db_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pg_size_pretty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pg_total_relation_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;projects&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;table_size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你的数据库总量小于 shared_buffers，那说明数据全在缓存里，调大没意义。&lt;/p&gt;</description></item><item><title>PostgreSQL 百万级数据实战：查询计划与索引策略全解析</title><link>https://fxio.site/posts/sql/postgresql-million-rows-index/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><guid>https://fxio.site/posts/sql/postgresql-million-rows-index/</guid><description>从 30 条到 100 万条，PostgreSQL 的查询计划怎么变？索引该怎么建？用真实基准测试数据说话。</description></item></channel></rss>