排序规则版本不匹配

Miq*_*son 18 postgresql postgresql-15

我复制了一个数据库,它工作正常,但是当我进入复制数据库时,它显示以下消息:

数据库是使用排序规则版本 2.31 创建的,但操作系统提供版本 2.35。

重建此数据库中使用默认排序规则的所有对象并运行 ALTER DATABASE template1 REFRESH COLLATION VERSION,或使用正确的库版本构建 PostgreSQL。

PgPool 也不适用于此复制数据库,它仅在我删除它时才起作用。

尝试登录时 Pgpool 出现以下错误:

child pid 5286: ERROR: unable to read message kind
child pid 5286: DETAIL: kind does not match between main(53) slot[1] (4e)
Run Code Online (Sandbox Code Playgroud)

同样的消息也出现在 postgresql 日志中。

如何重建我的数据库?

小智 23

PostgreSQL 手册ALTER COLLATION中对此警告进行了描述,位于; 这是相关摘录(强调我的):

创建排序规则对象时,特定于提供者的排序规则版本将记录在系统目录中。使用排序规则时,会根据记录的版本检查当前版本,并在不匹配时发出警告,例如:

WARNING:  collation "xx-x-icu" has version mismatch
DETAIL:  The collation in the database was created using version 1.2.3.4, but the operating system provides version 2.3.4.5.
HINT:  Rebuild all objects affected by this collation and run ALTER COLLATION pg_catalog."xx-x-icu" REFRESH VERSION, or build PostgreSQL with the right library version.
Run Code Online (Sandbox Code Playgroud)

排序规则定义的更​​改可能会导致索引损坏和其他问题,因为数据库系统依赖于具有特定排序顺序的存储对象。通常,应该避免这种情况,但在合法情况下可能会发生这种情况,例如将操作系统升级到新的主要版本时或用于pg_upgrade升级到与较新版本的 ICU 链接的服务器二进制文件时。发生这种情况时,应重建所有依赖于排序规则的对象,例如,使用REINDEX. 完成后,可以使用命令刷新排序规则版本ALTER COLLATION ... REFRESH VERSION。这将更新系统目录以记录当前排序规则版本并使警告消失。请注意,这实际上并不会检查所有受影响的对象是否已正确重建。

在我的 ArchLinux 机器上,当我进行定期软件包更新 ( pacman -Syu) 时,PostgreSQL 从 15.3-4 升至 15.3-5。重新启动后,当我输入 psql 提示符时,我收到类似于上面的警告(包含旧版本和新版本2.37以及2.38)。假设dummy是我的数据库,执行以下操作修复了它:

WARNING:  collation "xx-x-icu" has version mismatch
DETAIL:  The collation in the database was created using version 1.2.3.4, but the operating system provides version 2.3.4.5.
HINT:  Rebuild all objects affected by this collation and run ALTER COLLATION pg_catalog."xx-x-icu" REFRESH VERSION, or build PostgreSQL with the right library version.
Run Code Online (Sandbox Code Playgroud)

最后一个命令的输出是

注意:00000:将版本从 2.37 更改为 2.38 位置:AlterDatabaseRefreshColl、dbcommands.c:2397 ALTER DATABASE

不,在执行此操作之前我没有进行任何备份,但如果它是一些生产数据库可能会更好。这彻底解决了这个问题。


Miq*_*son 16

我解决了问题如下

我不需要重建数据库,我不知道这是否会在将来引起问题。

在执行此处的步骤之前,请先备份数据库。

我的主数据库是大约 3 个月前创建的,我的复制数据库是最近创建的,这意味着即使两台服务器都是 ubuntu 22.04,它们的 LTS 版本也是不同的,并且不能通过简单的解决apt upgrade

我的系统的排序规则版本不同,要更新主排序规则,我必须更新 ubuntu LTS 版本

我使用以下命令来更新 ubuntu master

sudo do-release-upgrade
Run Code Online (Sandbox Code Playgroud)

之后我使用了从错误日志本身获得的以下命令

 REINDEX DATABASE <you_database_name>;

 ALTER DATABASE <your-database-name> REFRESH COLLATION VERSION;
Run Code Online (Sandbox Code Playgroud)

由@laurenz-albe 更新