PostgresApp 更新实战指南:从自动更新机制到跨主版本数据迁移

发布时间:2026/9/27 21:10:34
PostgresApp 更新实战指南:从自动更新机制到跨主版本数据迁移 数据库桌面应用【免费下载链接】PostgresAppThe easiest way to get started with PostgreSQL on the Mac项目地址https://gitcode.com/gh_mirrors/po/PostgresApp点击查看免费下载Postgres.app 以Mac 上最轻松的 PostgreSQL 入门方式为设计目标其更新机制同样把复杂性隐藏在界面之后内置 Sparkle 自动更新、按 PostgreSQL 主版本捆绑发行、首次启动自动接管旧数据目录。本文以 docs/documentation/update.md 为骨架结合仓库源码深入拆解 Postgres.app 的版本策略、Check For Updates…的底层实现、更新前后的必要检查项以及从 Legacy 版本升级时如何正确迁移数据读完即可安全、无痛地完成一次 Postgres.app 升级。一、版本机制Postgres.app 与 PostgreSQL 的双层版本体系Postgres.app 的更新机制建立在两层版本之上Postgres.app 自身的应用版本以及其捆绑的 PostgreSQL 主版本。理解二者的区别是规划升级路径的前提。PostgreSQL 主版本与次版本PostgreSQL 采用独立的版本策略主版本Major Version自版本号 10 起主版本为版本号的第一段如14在 9.6 及更早的版本中主版本为前两段如9.6。主版本大约每年发布一次包含新功能并且将数据目录升级到新主版本需要执行手动迁移流程参见 migrating-data.md。次版本Minor Version由版本号最后一段表示如14.3或9.6.24。次版本大约每季度为所有受支持的主版本发布一次主要包含 bug 修复与安全更新涵盖 PostgreSQL 本身及其捆绑的依赖。次版本升级只需重启应用即可官方强烈建议安装。Postgres.app 的捆绑策略与多版本并行Postgres.app 的每个发行版都捆绑了特定主版本的 PostgreSQL 二进制。当你在 Check For Updates… 中检查更新时是否会看到新版本取决于你当前运行的发行版类型单版本捆绑只显示与当前捆绑的同一个主版本相关的新发行多版本捆绑显示所有受支持主版本的新发行。这正是多版本并行的基础如果你从 下载页面 获取多版本捆绑的 Postgres.app并给不同服务器配置不同的Port 端口号就可以在 Mac 上同时运行多个 PostgreSQL 主版本例如 14 与 15 并存。从源码层面看捆绑关系写死在应用包结构中PostgreSQL 二进制存放在应用包内的Contents/Versions/目录下每个主版本一个子目录Postgres/Server.swift 中定义的ServerStatus枚举NoBinaries、PortInUse、DataDirInUse、DataDirEmpty、Running、Startable、Unknown会基于这些二进制目录与数据目录、端口状态动态判定服务器状态其中NoBinaries就对应当前捆绑不包含该数据目录所需版本的场景。二、Postgres.app 2 的自动更新Sparkle 驱动的一键升级Postgres.app 2.0 及更高版本内置自动更新功能。使用方式非常直观打开 Postgres.app从Postgres菜单选择Check For Updates…。更新检查、下载、安装均由此入口触发。仓库源码可以证实其底层依赖 Sparkle 框架Postgres/Info.plist 中配置了更新源与签名校验SUFeedURL指向https://postgresapp.com/sparkle/updates_$(PG_BINARIES_VERSIONS).xml——Feed URL 按捆绑的 PostgreSQL 版本集合PG_BINARIES_VERSIONS动态生成这正是上文单版本/多版本捆绑决定可见更新的实现方式SUPublicDSAKeyFile指向dsa_pub.pem仓库根目录 dsa_pub.pem用于对更新包做 DSA 签名验证保证下载的更新未被篡改。Postgres/AppDelegate.swift 中AppDelegate实现了SUUpdaterDelegate并在 Postgres/AppDelegate.swift 的updater(_:willInstallUpdate:)回调中于安装更新前自动停止所有正在运行的服务器server.stopSync()同时终止菜单辅助程序com.postgresapp.Postgres2MenuHelper确保二进制替换过程中没有进程占用文件。这套机制对开发者的启示Postgres.app 的自动更新是应用 数据库二进制一体化的更新更新安装即意味着正在运行的 PostgreSQL 会被短暂停止并重启因此不适合在业务高峰期无准备地触发。三、更新前后的推荐检查清单虽然 Postgres.app 的自我更新应用本身与被捆绑的 PostgreSQL 二进制通常是轻松无痛的过程但官方仍建议在更新前/后执行以下附加步骤逐条核对阅读 Postgres.app 的发布说明在 Check for Update 窗口中会直接显示。重点检查版本专属说明尤其是被弃用deprecated与被移除removed的捆绑 PostgreSQL 版本——若你正在使用某个即将被移除的主版本需要提前规划迁移。阅读你正在使用的 PostgreSQL 主版本的次版本发布说明注意各版本说明顶部的特殊提示对于你可能跳过的所有次版本也建议一并查看避免遗漏累积的注意事项。执行发布说明中建议的操作通常需要对每一个数据库分别执行而不是一次性的全局操作。检查捆绑扩展的 SQL 定义是否需要更新如果你在数据库中安装了捆绑的扩展它们的 SQL 定义可能也需要同步更新。可用下面的查询列出所有已安装但版本落后的扩展SELECT * FROM pg_available_extensions WHERE installed_version IS NOT NULL AND default_version installed_version;如果查询有结果对列出的每个扩展xyz执行ALTER EXTENSION xyz UPDATE;若结果中很可能包含 PostGIS 系列扩展建议改用SELECT postgis_extensions_upgrade();以正确处理 PostGIS 各内部扩展之间的依赖关系。以上操作同样需要对每一个数据库分别执行。四、从 Legacy Postgres.app9.5.x.x / 9.6.x.x / 10.x.x升级到 Postgres.app 2如果你正在运行旧版 Postgres.app 9.5.x.x、9.6.x.x 或 10.x.x升级到 Postgres.app 2 并不需要迁移数据——只需替换/Applications中的 App退出旧版本的 Postgres.app下载新版本的 Postgres.app双击下载的.dmg挂载用新版本替换/Applications中的旧版本双击新版本启动。Postgres.app 2 会自动检测标准位置~/Library/Application Support/Postgres下的已有数据目录如果你把数据目录放在其他位置则需要手动添加打开侧边栏sidebar点击加号按钮将其加入。源码级佐证首次启动自动接管数据目录仓库源码证实了第 4 步自动检测的实现Postgres/ServerManagerExtras.swift 中的checkForExistingDataDirectories()会在首次启动isFirstLaunch()为真时被调用流程为枚举FileManager.default.applicationSupportDirectoryPath()即~/Library/Application Support/Postgres下的顶层目录跳过隐藏文件与子目录递归对每个目录读取其PG_VERSION文件Postgres/Server.swift 也通过varPath/PG_VERSION读取数据目录版本通过BinaryManager.shared.getBinary(for:)找到对应版本的二进制若目录尚未被任何 Server 引用则自动创建一个新的Server名称如 PostgreSQL 15并保存到用户配置中。也就是说只要数据目录位于标准位置且版本二进制存在替换 App 后数据目录会自动出现在侧边栏无需任何手工配置。五、从更早的 Legacy 版本升级必须迁移数据如果你的版本比 9.5 更早直接替换 App 是不够的——数据目录格式无法被新主版本直接读取你需要先 迁移数据推荐方式使用pg_dumpall生成整库 SQL 备份在启动新服务器后用psql还原适用于大多数场景。选择性迁移使用pg_dump逐个数据库导出配合pg_dumpall --globals-only保留角色与表空间。大型数据库如果数据量极大、pg_dump太慢或占用磁盘过多可使用pg_upgrade。注意它要求旧、新版本的二进制同时存在于Contents/Versions/目录中具体步骤含initdb与pg_upgrade命令示例见 migrating-data.md。迁移完成后可在 Server Settings… 中切换开机自动启动的服务器并清理旧数据目录。备选方案定制支持旧版本的 Postgres.app 2如果你希望继续使用旧版服务器另一个途径是制作一个支持旧版本二进制的 Postgres.app 2 定制版Postgres.app 的二进制全部位于应用包Contents/Versions/下将旧版本所需的二进制目录复制进去即可具体说明见 下载页面其redirect_from声明了all-versions.html的历史路径。troubleshooting.md 中同样提到首次启动后可以通过从其他发行版复制版本目录到/Applications/Postgres.app/Contents/Versions/来扩充可用版本。六、更新相关的常见问题速查升级过程中可能遇到以下典型场景详见 troubleshooting.mdPostgreSQL version not installed当前捆绑不包含该数据目录所需版本。若该版本仍在支持期内可从 下载页面 下载不同捆绑若已停止支持请尽快参考 migrating-data.md 迁移数据。端口被占用 / 数据目录被占用升级前确保旧服务器已完全停止多服务器并行时使用不同端口。旧数据目录无法导入checkForExistingDataDirectories()依赖目录下的PG_VERSION文件识别版本见 Postgres/ServerManagerExtras.swift缺少该文件时导入会失败并记录日志此时需手动通过侧边栏加号按钮添加。小结Postgres.app 的升级路径可以概括为三条原则同主版本的次版本升级用 Check For Updates… 一键完成9.5/9.6/10 等 Legacy 版本替换 App 后自动接管数据目录即可更早版本必须先完成数据迁移pg_dumpall / pg_dump / pg_upgrade 任选。而这一切的底层——Sparkle 更新源按PG_BINARIES_VERSIONS动态生成、安装前自动停机、首次启动扫描~/Library/Application Support/Postgres——都能在仓库的 Info.plist、AppDelegate.swift 与 ServerManagerExtras.swift 中找到直接实现。理解这套机制后你便能在升级窗口规划、数据安全与多版本并行之间做出明确决策。赞分享数据库桌面应用【免费下载链接】PostgresAppThe easiest way to get started with PostgreSQL on the Mac项目地址https://gitcode.com/gh_mirrors/po/PostgresApp点击查看免费下载相关推荐DLSS Swapper 零基础上手10 分钟给老游戏换上新版 DLSSDLSS Swapper 零基础上手10 分钟给老游戏换上新版 DLSS 几年前买的游戏里面的 DLSS 可能还停留在旧版本想升级却只能重装整个游戏就为桌面应用DARC升级迁移版本更新与数据迁移指南DARC升级迁移版本更新与数据迁移指南 概述 DARCDecentralized Autonomous Regulated Company作为运行在EVM区块链智能合约DeFi如何轻松导入Rhinoceros 3D模型到Blender这款免费插件让你的工作流效率翻倍如何轻松导入Rhinoceros 3D模型到Blender这款免费插件让你的工作流效率翻倍 import_3dm 是一款专为Blender打造的开源插件能开发工具代码质量静态分析CLI上一篇如何用Speech Emotion Analyzer快速构建语音情感检测系统完整入门指南下一篇GoRequest源码分析深入理解SuperAgent架构设计原理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考