问题描述
在进行 PostgreSQL 9.3 到 10 的升级测试过程中遇到了一个问题,具体是 lc_collate values for database "postgres" do not match: old "C.UTF-8", new "en_US.UTF-8"
。这个问题是在执行以下命令时出现的:
time ${PGBINNEW}/pg_upgrade --old-bindir=${PGBINOLD} --new-bindir=${PGBINNEW} --old-datadir=${PGDATAOLD} --new-datadir=${PGDATANEW} --old-port=${PGPORT} --new-port=$5433 --jobs=$(nproc | awk '{ {print ($1 > 4) ? 4 : ($1 == 1 ? 1 : $1 - 1)} }') --link --username=postgres --check
用户询问关于这个错误的原因以及如何解决。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1:更新数据库排序规则(collation)
这个错误的原因是数据库排序规则(collation)不匹配。在升级之前,需要确保旧数据库和新数据库的排序规则一致。
以下是解决这个问题的步骤:
1. 在升级之前,你需要获取旧数据库的排序规则。你可以使用以下 SQL 查询来查看旧数据库的排序规则:
sql
SELECT datname, datcollate FROM pg_database WHERE datname = 'postgres';
2. 获得旧数据库的排序规则后,你需要更新旧数据库的排序规则以与新数据库一致。假设新数据库排序规则是 en_US.UTF-8
,你可以使用以下 SQL 命令来更新旧数据库的排序规则:
sql
ALTER DATABASE postgres COLLATE 'en_US.UTF-8';
3. 确保你已经备份了旧数据库,并在操作之前进行了测试。执行上述 SQL 命令后,旧数据库的排序规则将与新数据库匹配。
4. 现在,你可以继续进行升级过程。
方案2:重新初始化数据库
如果你不想手动更改排序规则,你可以考虑重新初始化数据库,确保新旧数据库的排序规则一致。以下是步骤:
1. 在执行重新初始化之前,确保你备份了数据库中的重要数据。这个过程将会删除数据库,所以请务必提前做好备份工作。
2. 使用以下命令重新初始化数据库,假设 PGBINNEW
是你的 PostgreSQL 10 安装目录,PGDATANEW
是新数据库的数据目录:
bash
${PGBINNEW}/initdb --pgdata="$PGDATANEW" --encoding=UTF8 --no-locale
这个命令将重新初始化数据库,并确保新数据库的排序规则是 en_US.UTF-8
。
3. 重新初始化完成后,你可以继续进行升级过程。
请注意,无论你选择哪种方案,都建议在操作之前备份数据库,并在测试环境中进行操作,以确保数据的安全性和操作的有效性。
方案3:清除旧数据库并重新创建
如果你想要一个更彻底的方法,你可以考虑清除旧数据库并重新创建一个符合你需要排序规则的新数据库。这个过程会删除旧数据库,所以请务必在执行之前做好备份和测试工作。
以上是解决问题的几种方案,你可以根据你的需求和情况选择其中一种来解决 lc_collate 不匹配的问题。在执行任何操作之前,请务必做好数据备份和测试,以免造成数据丢失或不可恢复的问题。