heroku-postgres 与 postgres.app 版本不一致时,升级和建库会影响旧表吗?
16.8、16.10 和 16.12 都是 PostgreSQL 16 的小版本。正常情况下,小版本升级兼容现有数据存储格式,通常无需导出再导入数据库。能否创建“16.12 数据库”取决于实际运行的服务器版本:在 16.10 服务器上创建的数据库仍由 16.10 运行,不能单独指定为 16.12。PostgreSQL 版本策略
原问题中的 heroku-postgres 含义不够明确,需要确认它指的是 Heroku 云端数据库,还是 postgres.app 中某个本地服务器的名称。
先确认两个版本号分别来自哪里
postgres.app 管理本机 PostgreSQL。如果 heroku-postgres 指 Heroku 云端托管服务,更新本机 postgres.app 不会触发云端数据库升级。如果它只是本地服务器的名称,则应检查该服务器当前使用的 PostgreSQL 程序。
分别连接到相关数据库,在 psql 中执行:
SHOW server_version;
SELECT version();
SELECT current_database(), inet_server_addr(), inet_server_port();
再执行以下 psql 命令查看连接信息:
\conninfo
使用 Unix-domain socket 连接时,inet_server_addr() 可能返回 NULL,不能仅凭这一项判断连接目标。
终端中的下面这条命令只显示客户端版本,不能用来确认服务器是否已经升级:
psql --version
为什么不能在同一个实例中分别运行 16.10 和 16.12 数据库?
同一个 PostgreSQL 实例中的数据库由同一套服务器程序运行。执行 CREATE DATABASE 时,不会为新数据库安装另一套 PostgreSQL,也没有用于指定服务器版本的参数。PostgreSQL 建库说明
因此:
- 实例仍运行 16.10 时,新旧数据库都由 16.10 运行。
- 实例升级并重启到 16.12 后,新旧数据库都由 16.12 运行。
- 本机使用 16.12 客户端连接 16.10 服务器,不会把服务器升级为 16.12。
对于有建库权限的本地实例,确认连接目标后可以执行:
CREATE DATABASE example_db;
这条命令会创建一个新数据库,客户端版本不同不会导致已有数据库中的表被改写。如果目标是 Heroku 托管服务,应按相应套餐的资源创建流程操作,不能假定具有任意执行 CREATE DATABASE 的权限。
postgres.app 升级到 16.12 后,旧表需要迁移吗?
Postgres.app 官方说明,小版本更新通常只需更新应用并重启。同时,应阅读升级过程中跨过的各个 PostgreSQL 小版本发布说明,处理其中要求的额外操作。Postgres.app 更新说明
PostgreSQL 16.12 发布说明明确指出,从 16.X 升级不需要 dump/restore。但如果旧数据目录此前运行的是 16.8,还需要检查中间版本的迁移说明,不能只看 16.12 的说明。PostgreSQL 16.12 发布说明
例如,16.10 发布说明建议重建使用 numeric_minmax_multi_ops 的 BRIN 索引。这项建议只针对符合条件的索引,并不意味着所有表或索引都需要重建。PostgreSQL 16.10 迁移说明
升级前先备份重要数据,之后确认服务器已重启,并检查扩展和发布说明中的适用事项。数据格式兼容也不代表所有查询行为和扩展都绝对不会变化。
Heroku 支持哪些版本,如何自动升级?
支持范围以 Heroku Postgres Version Support 为准。应区分 Heroku 支持的 PostgreSQL 主版本与某个实例正在运行的小版本。
Heroku 官方说明,小版本由平台管理,用户不能自行指定升级到某个小版本。对于 Standard 及以上套餐,如果有更新的小版本,平台会在数据库维护后自动更新。其他套餐应查看各自的维护说明,不能直接套用这一时间安排。Heroku 升级说明
本机显示 16.12、Heroku 显示 16.10,单凭这一点不能认定存在兼容性故障。分别查询服务器版本和连接目标后,再决定需要更新本地实例、云端实例,还是仅更新客户端工具。
备注:内容仅供参考。
