pg_upgrade:“数据库“ postgres”的lc_collat​​e值不匹配”

Jos*_*urg 5 postgresql homebrew postgis macos-sierra

我刚刚升级了(使用Homebrew)我的postgreSql和postGis安装。我再也不能“酿造postgresql-upgrade-database”了(因为这告诉我我的数据是“错误:已从上一次尝试升级”;由于尝试失败,所以没有升级),并且按照手工的“ pg_upgrade”路线进行操作很好,直到处理'template1'数据库抛出一个

    lc_collate values for database "postgres" do not match:  old "C", new "en_US.UTF-8"
Run Code Online (Sandbox Code Playgroud)

错误。我没有创建该“ template1”数据库,因此如果可以某种方式覆盖字符串匹配要求,则它是消耗性的(如果不需要)。在此先感谢您的任何建议。

小智 11

只需更新排序规则和 ctype 编码?:

UPDATE pg_database SET datcollate='en_US.UTF-8', datctype='en_US.UTF-8' WHERE datname='postgres';

template1&template0也重复这个查询——或者如果你只有这三个数据库,你可以删除这个WHERE子句。

\l.

  • 对于centos7,没有datctype UTF-8,您应该使用,例如datctype='en_US.UTF-8'。否则,您将毁掉您的服务器并且将无法再连接! (2认同)

Lau*_*lbe 6

您不清楚哪个数据库受到影响:postgrestemplate1

要使用pg_upgrade,新旧群集必须使用相同的语言环境进行安装。所以尝试

initdb --locale=C ...
Run Code Online (Sandbox Code Playgroud)

创建新集群。

template1是必不可少的数据库–没有它,CREATE DATABASE将会有问题。您还应该保留postgres管理数据库。

如果两个数据库都具有不同的语言环境,则需要以相同的方式创建新集群,例如:

DROP DATABASE postgres;
CREATE DATABASE postgres
   LC_COLLATE 'C' LC_CTYPE 'C'
   TEMPLATE template0;
Run Code Online (Sandbox Code Playgroud)