PostgreSQL 扩展的价值不只在安装那一刻,也体现在升级、迁移和卸载时是否可靠。pgsql_tweaks 1.0.5 是一个很小的维护版本,但它修复的问题很实际:从 1.0 开始,扩展对象被安装到独立 schema 后,自动生成的卸载脚本不再总是可用;1.0.5 让卸载流程重新工作,并且支持扩展被安装在不同 schema 名称下的场景。
这个版本修了什么
pgsql_tweaks 是一组面向 PostgreSQL 的函数和视图集合,可以通过源码、PGXN 或 PostgreSQL RPM 包获得。1.0.5 没有强调新函数或新视图,而是聚焦在一个维护性问题:卸载脚本。
问题的根源在于 1.0 版本改变了对象布局:扩展对象开始安装到自己的 schema 中。这样的隔离通常是好事,能减少对象名冲突,也方便权限管理;但如果卸载脚本仍然假设对象在旧位置,或者假设 schema 名称固定,就可能在 DROP EXTENSION、卸载包、重装扩展时踩坑。
1.0.5 的修复点可以概括为两句话:
- 卸载脚本重新适配了独立 schema 的安装方式。
- 即使安装时使用了不同的 schema 名称,卸载也能正常完成。
为什么 schema 名称会影响卸载
PostgreSQL 扩展通常由控制文件、SQL 安装脚本、升级脚本和卸载相关逻辑共同组成。扩展对象如果被安装到可配置 schema 中,脚本就不能硬编码某个 schema 名称,否则在下面这种安装方式下很容易失败:
CREATE SCHEMA dba_tools;
CREATE EXTENSION pgsql_tweaks WITH SCHEMA dba_tools;
如果卸载脚本里写死了类似 pgsql_tweaks.some_function 的对象路径,而真实对象在 dba_tools 中,卸载时就可能出现对象不存在、依赖未清理或 schema 未正确处理的问题。
这类 bug 的麻烦之处在于:安装时看起来一切正常,直到你要清理环境、重建测试库、升级包或迁移数据库时才暴露出来。对生产系统来说,卸载路径也是变更路径的一部分,不能只测安装。
可以这样检查你的安装与卸载流程
下面是一组可以改造到测试环境里的命令,用来验证扩展安装在非默认 schema 时是否能正常卸载。运行前请确认测试数据库中已经可以安装 pgsql_tweaks,并把数据库名、schema 名按需替换。
createdb pgsql_tweaks_check
psql pgsql_tweaks_check <<'SQL'
CREATE SCHEMA dba_tools;
CREATE EXTENSION pgsql_tweaks WITH SCHEMA dba_tools;
SELECT extname, nspname AS schema_name
FROM pg_extension e
JOIN pg_namespace n ON n.oid = e.extnamespace
WHERE extname = 'pgsql_tweaks';
DROP EXTENSION pgsql_tweaks;
DROP SCHEMA dba_tools;
SQL
dropdb pgsql_tweaks_check
如果你在 CI 里维护 PostgreSQL 镜像或数据库初始化脚本,也可以把类似检查加入 smoke test。它不需要覆盖扩展的所有函数行为,但能验证一个关键生命周期:安装到自定义 schema,再卸载。
另一个实用查询是检查当前数据库里扩展所在 schema,适合在升级前记录状态:
SELECT
e.extname,
n.nspname AS schema_name,
e.extversion
FROM pg_extension AS e
JOIN pg_namespace AS n ON n.oid = e.extnamespace
WHERE e.extname = 'pgsql_tweaks';
对 DBA 和平台团队的启发
这个版本提醒我们,扩展管理不应该只关注“能不能装上”。尤其是在团队有统一 schema 规范、最小权限策略或多租户数据库约定时,扩展安装位置往往不是默认值。
建议把下面几项纳入扩展治理清单:
- 在测试库验证
CREATE EXTENSION ... WITH SCHEMA ...。 - 在升级前记录
pg_extension与pg_namespace中的扩展位置。 - 对基础扩展做一次
DROP EXTENSION的可恢复性演练。 - 避免在自写脚本中硬编码扩展 schema,除非这是明确约束。
- 使用包管理器安装扩展时,同步关注卸载和升级脚本变化。
升级建议
如果你已经使用 pgsql_tweaks 1.0 或之后版本,并且曾经把它安装到非默认 schema,1.0.5 值得尽快纳入维护窗口。它不是那种会改变业务 SQL 写法的功能版本,但能减少清理、重装和迁移时的不确定性。
小版本修卸载脚本看起来不起眼,却是 PostgreSQL 扩展质量的一部分。真正可靠的数据库工具,应该在安装、运行、升级、卸载四个阶段都经得起自动化脚本反复执行。