自从我上次在 Arch Linux 桌面上使用 PostgreSQL 以来已经有几个月了,显然,在进行一些更新之后,肯定有什么东西坏了。如果我询问服务的状态,我会得到 ( systemctl status postgresql
):
× postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; preset: disabled)
Active: failed (Result: exit-code) since Wed 2024-02-21 16:00:22 -03; 1h 28min ago
CPU: 54ms
fev 21 16:00:22 phili systemd[1]: Starting PostgreSQL database server...
fev 21 16:00:22 phili postgres[11667]: An old version of the database format was found.
fev 21 16:00:22 phili postgres[11667]: See https://wiki.archlinux.org/index.php/PostgreSQL#>
fev 21 16:00:22 phili systemd[1]: postgresql.service: Control process exited, code=exited, >
fev 21 16:00:22 phili systemd[1]: postgresql.service: Failed with result 'exit-code'.
fev 21 16:00:22 phili systemd[1]: Failed to start PostgreSQL database server.
我已经尝试过以各种方式重新安装。但主要是这样的:
pacman -Rsn postgresql
rm -rf /var/lib/postgres
pacman -Syu postgresql
我正在安装的版本是最新的 16,但我已经在 14 上尝试过所有这些。是的,我已经多次尝试重新启动我的电脑。
答案1
当您初始化 PostgreSQL 数据库时,数据库数据将被锁定到该主要版本的 PostgreSQL。
当您升级PostgreSQL的主要版本时,您需要确保数据库数据与新版本兼容。
Arch Linux 提供了一个wiki 条目正是针对这种情况,步骤总结如下:
- 备份您的数据库数据
- 尝试检索
initdb
用于创建初始数据库的参数 - 停止
postgresql.service
- 升级所有 PostgreSQL 软件包
- 删除以前数据库升级中的任何现有旧数据
- 将数据库数据移动到临时位置并创建一个新目录来存储升级后的数据库。
initdb
使用与原始数据库相同的参数初始化新数据库。- 升级您以前的数据库
pg_upgrade
- 开始
postgresql.service
如果没有任何错误,您的 PostgreSQL 数据库服务器现在应该使用升级后的数据库运行。如果您愿意,您现在可以清理任何旧数据和临时目录。
答案2
根据@GracefulRestart的一些评论,最终对我有用的是一些中的步骤8.1pg_upgrade
部分:
- 安装中
postgresql-old-upgrade
- 重命名旧集群目录,然后创建新集群和临时工作目录:
mv /var/lib/postgres/data /var/lib/postgres/olddata mkdir /var/lib/postgres/data /var/lib/postgres/tmp chown postgres:postgres /var/lib/postgres/data /var/lib/postgres/tmp
- 使用与旧集群相同的 initdb 参数初始化新集群:
[postgres]$ initdb -D /var/lib/postgres/data --locale=C.UTF-8 --encoding=UTF8 --data-checksums