<?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>数据库 on FXIO 技术博客</title><link>https://fxio.site/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/</link><description>Recent content in 数据库 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/%E6%95%B0%E6%8D%AE%E5%BA%93/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>Presto 驱动升级引发的生产事故：超长 SQL 400 报错排查记</title><link>https://fxio.site/posts/java/presto-driver-upgrade-bug/</link><pubDate>Wed, 10 Jun 2026 01:30:00 +0800</pubDate><guid>https://fxio.site/posts/java/presto-driver-upgrade-bug/</guid><description>&lt;h2 id="问题现象"&gt;问题现象&lt;/h2&gt;
&lt;p&gt;普通 SQL 正常，stg 环境没发现异常。但生产环境用户反馈：&lt;strong&gt;超长 SQL（超过 1MB）会触发 400 报错&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;恰好生产环境的用户有很多那种业务逻辑复杂、拼接出来的超长 SQL。&lt;/p&gt;
&lt;h2 id="排查过程"&gt;排查过程&lt;/h2&gt;
&lt;p&gt;第一步是对比。把报错的 SQL 和不报错的 SQL 摆在一起看，唯一的共同点就是——&lt;strong&gt;长&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;短 SQL 跑得好好的，长到一定长度就 400。这不是 SQL 语法问题，是传输层的问题。&lt;/p&gt;
&lt;h2 id="根因"&gt;根因&lt;/h2&gt;
&lt;p&gt;查到最后，原因是这样的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安全合规要求&lt;/strong&gt;，把普通的 &lt;code&gt;Statement&lt;/code&gt; 升级为 &lt;code&gt;PreparedStatement&lt;/code&gt;。因为普通 Statement 有 SQL 注入风险，安全团队要求整改。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Presto 驱动版本太低&lt;/strong&gt;，低版本的 Presto JDBC 驱动对 &lt;code&gt;PreparedStatement&lt;/code&gt; 的支持不完善，特别是对超长 SQL 的处理有 bug。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务端 Presto 没有同步升级&lt;/strong&gt;。原因很简单——影响太大，涉及的下游服务和业务太多，不敢动。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以就出现了一个尴尬的局面：客户端驱动升级了（为了安全），服务端没升级（为了稳定），两边版本不一致，超长 SQL 直接 400。&lt;/p&gt;
&lt;h2 id="解决方案"&gt;解决方案&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;还原升级。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把客户端驱动退回到兼容当前服务端的版本。安全问题用其他方式规避（比如在应用层做参数化查询、输入校验等）。&lt;/p&gt;
&lt;p&gt;这不是最优解，但在&amp;quot;安全&amp;quot;和&amp;quot;可用&amp;quot;之间，先保可用。&lt;/p&gt;
&lt;h2 id="避坑建议"&gt;避坑建议&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. 灰度环境重点覆盖验证&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;stg 环境为什么没发现？因为测试用的 SQL 都是短的。灰度环境应该&lt;strong&gt;重点覆盖边界场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;超长 SQL（1MB+）&lt;/li&gt;
&lt;li&gt;特殊字符&lt;/li&gt;
&lt;li&gt;高并发场景&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. 客户端和服务端版本要对齐&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;升级驱动前，先确认服务端版本兼容性。不要客户端升了、服务端没升，两边版本不一致是定时炸弹。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 安全整改要评估影响面&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>DBeaver 安装与使用</title><link>https://fxio.site/posts/sql/dbeaver-sql/</link><pubDate>Tue, 13 Jan 2026 21:28:34 +0800</pubDate><guid>https://fxio.site/posts/sql/dbeaver-sql/</guid><description>&lt;h2 id="数据库选择"&gt;数据库选择&lt;/h2&gt;
&lt;h3 id="sqlite"&gt;sqlite&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;小巧&lt;/li&gt;
&lt;li&gt;无需安装&lt;/li&gt;
&lt;li&gt;支持标准sql 语法&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="数据库客户端"&gt;数据库客户端&lt;/h2&gt;
&lt;h3 id="dbeaver"&gt;DBeaver&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DBeaver (Community Edition)&lt;/li&gt;
&lt;li&gt;支持 MySQL, PostgreSQL, SQLite等数据库&lt;/li&gt;
&lt;li&gt;免费,开源&lt;/li&gt;
&lt;li&gt;跨平台&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dbeaver-下载安装"&gt;DBeaver 下载安装&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;下载地址: &lt;a href="https://dbeaver.io/download/"&gt;https://dbeaver.io/download/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;创建示例数据库&lt;/li&gt;
&lt;li&gt;&lt;img alt="img.png" loading="lazy" src="https://fxio.site/posts/sql/dbeaver-sql/img.png"&gt;&lt;/li&gt;
&lt;li&gt;下载jdbc驱动&lt;/li&gt;
&lt;li&gt;&lt;img alt="img_1.png" loading="lazy" src="https://fxio.site/posts/sql/dbeaver-sql/img_1.png"&gt;&lt;/li&gt;
&lt;li&gt;打开sql脚本编辑器&lt;/li&gt;
&lt;li&gt;&lt;img alt="img_2.png" loading="lazy" src="https://fxio.site/posts/sql/dbeaver-sql/img_2.png"&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dbeaver示例数据库-表介绍"&gt;DBeaver示例数据库-表介绍&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DBeaver 默认自带的示例数据库&lt;/li&gt;
&lt;li&gt;使用的是业界非常著名的 Chinook 数据库。&lt;/li&gt;
&lt;li&gt;它模拟了一个 “数字音乐商店”（类似早期的 iTunes Store）的业务场景。&lt;/li&gt;
&lt;li&gt;这个数据库结构非常经典，特别适合用来练习 SQL 的 JOIN（连接查询）、GROUP BY（分组统计）&lt;/li&gt;
&lt;li&gt;以及理解主外键关系。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="数据表"&gt;数据表&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Album 音乐专辑表&lt;/li&gt;
&lt;li&gt;Artist 艺术家/歌手&lt;/li&gt;
&lt;li&gt;Customer 客户&lt;/li&gt;
&lt;li&gt;Employee 员工&lt;/li&gt;
&lt;li&gt;Genre 流派&lt;/li&gt;
&lt;li&gt;Invoice 发票/订单头&lt;/li&gt;
&lt;li&gt;InvoiceLine 发票明细/订单行&lt;/li&gt;
&lt;li&gt;MediaType 媒体格式&lt;/li&gt;
&lt;li&gt;Playlist 歌单&lt;/li&gt;
&lt;li&gt;PlaylistTrack 歌单&lt;/li&gt;
&lt;li&gt;sqlite_schema sqlite元数据&lt;/li&gt;
&lt;li&gt;Track 歌曲/单曲&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="查看表关系"&gt;查看表关系&lt;/h3&gt;
&lt;p&gt;&lt;img alt="img_3.png" loading="lazy" src="https://fxio.site/posts/sql/dbeaver-sql/img_3.png"&gt;&lt;/p&gt;
&lt;h2 id="select-练习"&gt;select 练习&lt;/h2&gt;
&lt;h3 id="1select单表查询"&gt;1.select单表查询&lt;/h3&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 class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Track&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;笔记:&lt;/p&gt;</description></item></channel></rss>