You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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容器化升级脚本

排查结果

  1. Postgres 15 中 template1 的排序规则配置:
    Postgres15 template1排序规则详情
  2. Postgres 12 中 template1 的排序规则配置:
    Postgres12 template1排序规则详情
  3. 核心差异:
    • Postgres 12 的 pg_collation 表中无 en_US.utf8 排序规则
    • Postgres 15 的 pg_collation 表中存在 en_US.utf8 规则,版本为 2.31
      Postgres15 pg_collation表中en_US.utf8条目

解决办法

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:20:29