Postgres从12升级到15后出现template1排序规则版本错误求助
Postgres 12 升级至 15 后 template1 排序规则版本错误解决
错误信息
template database "template1" has a collation version, but no actual collation version could be determined
环境与升级信息
- 操作系统:Debian GNU/Linux 10 (buster)
- 部署方式:Docker容器
- 升级工具:使用Postgres 12-to-15容器化升级脚本
排查结果
- Postgres 15 中 template1 的排序规则配置:

- Postgres 12 中 template1 的排序规则配置:

- 核心差异:
- Postgres 12 的
pg_collation表中无en_US.utf8排序规则 - Postgres 15 的
pg_collation表中存在en_US.utf8规则,版本为 2.31
- Postgres 12 的
解决办法
1. 重建 template1 数据库(推荐)
template1 基于 template0 创建,重建可确保排序规则与系统兼容:
- 停止Postgres容器:
docker stop [postgres-container-name]
- 以单用户模式启动容器内的Postgres服务:
docker exec -it [postgres-container-name] postgres --single -D /var/lib/postgresql/data
- 在单用户交互界面执行SQL:
DROP DATABASE template1; CREATE DATABASE template1 WITH TEMPLATE template0 ENCODING 'UTF8' LC_COLLATE='en_US.utf8' LC_CTYPE='en_US.utf8'; ALTER DATABASE template1 IS_TEMPLATE = true;
- 按
Ctrl+D退出单用户模式,重启容器:
docker start [postgres-container-name]
2. 手动修正 pg_collation 表版本
若需保留现有 template1 配置,可直接调整系统表(操作前请备份数据):
- 连接到Postgres数据库,执行SQL确认排序规则:
SELECT datcollate, datctype FROM pg_database WHERE datname = 'template1';
- 更新对应排序规则的版本:
UPDATE pg_collation SET collversion = '2.31' WHERE collname = 'en_us.utf8';
- 刷新系统表统计信息:
ANALYZE pg_collation;
3. 重新执行升级并指定排序规则
若上述方法无效,可重新执行升级流程,明确指定排序规则:
- 备份当前Postgres 15数据卷
- 运行升级容器时,添加环境变量统一排序规则:
docker run -e LC_COLLATE=en_US.utf8 -e LC_CTYPE=en_US.utf8 \ -v [postgres12-data-dir]:/var/lib/postgresql/12/data \ -v [postgres15-data-dir]:/var/lib/postgresql/15/data \ tianon/postgres-upgrade:12-to-15
注:若Postgres 12使用的是其他排序规则(如C或POSIX),需替换为对应值
内容的提问来源于stack exchange,提问作者buddy2891
相关产品推荐
相关产品推荐

