Postgres - 致命:数据库文件与服务器不兼容

Posted

技术标签:

【中文标题】Postgres - 致命:数据库文件与服务器不兼容【英文标题】:Postgres - FATAL: database files are incompatible with server 【发布时间】:2013-07-23 06:39:35 【问题描述】:

重新启动我的 MacBook Pro 后,我无法启动数据库服务器:

could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

我检查了日志,并一遍又一遍地出现以下行:

FATAL:  database files are incompatible with server
DETAIL:  The data directory was initialized by PostgreSQL version 9.2, which is not compatible with this version 9.0.4.

9.0.4 是预装在 mac 上的版本,9.2[.4] 是我通过 Homebrew 安装的版本。 如前所述,这曾经在重新启动之前起作用,因此它实际上不是编译问题。我还重新运行了initdb /usr/local/var/postgres -E utf8,文件仍然存在。

不幸的是,我对 Postgres 还很陌生,因此非常感谢任何帮助。

【问题讨论】:

如何启动 postgres?您确定您的 startscript 指向新版本吗?因为根据错误消息,我认为现在两个版本都是并排安装的。 pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start - 回复是server starting 当您搜索名为 pg_ctl 的文件时,我很确定您会找到 2 个副本。并且匹配which pg_ctl的是旧版本,另一个是新版本。 运行pg_ctl --versionpg_ctl (PostgreSQL) 9.2.4 @EvanCarroll 确实做到了。我认为现在他们已将其移动到将其捆绑在 Server.app 中并将其隐藏以使用非默认端口和 unix 套接字目录。终于! 【参考方案1】:

如果您最近从 10.x 升级到 11 或 12,您可以运行以下命令来升级保留所有数据的 postgres 数据目录:

brew postgresql-upgrade-database

以上命令取自brew info postgres的输出

更新:这也适用于升级到 postgres 14。

【讨论】:

也适用于 11 到 12 岁。 可以验证这在从 12 移动到 13 时也可以正常工作。 这是我必须每 6-12 个月查看一次的“所以我们又见面了”的答案之一。 这对我有用,但只有一个警告:我必须确保首先关闭 postgresql 自制程序。 (酿造服务停止 postgresql)。然后我会执行,brew postgresql-upgrade-database——当然我会运行 brew services start postgresql。如果我不这样做,我会收到此错误,“锁定文件“postmaster.pid”已经存在”,我在这些日志中看到“cat /usr/local/var/log/pg_upgrade_server.log” 也适用于 13 => 14。【参考方案2】:

如果您正在寻找核选项(删除所有数据并获取新数据库),您可以这样做:

rm -rf /usr/local/var/postgres && initdb /usr/local/var/postgres -E utf8

然后您需要在 Rails 应用程序中使用 rake db:setuprake db:migrate 重新设置。

【讨论】:

如果上述方法仍然不起作用(对我来说就是这种情况),请尝试为 initdb 提供一个新的数据目录名称,例如/usr/local/var/postgres95. 顺便说一句,在此之后,您可能需要立即运行 createuser -s your_rails_app 来创建 rails 的 postgres 用户。见***.com/questions/11919391/… 或者,如果你像我一样紧张,想去核,但在掩体中保留备份以防万一,请改用mv /usr/local/var/postgres /usr/local/var/postgres_backup && initdb /usr/local/var/postgres -E utf8【参考方案3】:

试试这个: https://gist.github.com/joho/3735740

它对我来说非常有效。 最后,它还会为您生成 2 个 bash 脚本来检查您的数据库并删除旧集群。 真棒。

请参阅:http://www.postgresql.org/docs/9.2/static/pgupgrade.html 了解更多信息。

【讨论】:

从 9.4 迁移到 9.5 对我来说非常适合。 也为我从 9.3.4 迁移到 9.5.2 工作。 以下是使用 Homebrew (macOS) 将 9.5.5 更新到 9.6.1 的步骤:gist.github.com/giannisp/b53a76047b07751ed3ade3c1db1d2c51 这绝对是最好的答案!!并且没有数据丢失。 仅链接的答案不受欢迎【参考方案4】:

在互联网上找到,这个解决方案对我来说很好。

当我升级到 OS X 10.10 Yosemite 后尝试启动 postgresql 服务器时,遇到了下一个问题:

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?

好的,让我们看看服务器日志:

cat /usr/local/var/postgres/server.log

FATAL: database files are incompatible with server
DETAIL: The data directory was initialized by PostgreSQL version 9.2, which is not compatible with this version 9.3.5.

所以,我们需要在升级 postgresql 后遵循几个步骤:

launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

mv /usr/local/var/postgres /usr/local/var/postgres92

brew update

brew upgrade postgresql

initdb /usr/local/var/postgres -E utf8

pg_upgrade -b /usr/local/Cellar/postgresql/9.2.3/bin -B /usr/local/Cellar/postgresql/9.3.5_1/bin -d /usr/local/var/postgres92 -D /usr/local/var/postgres

cp /usr/local/Cellar/postgresql/9.3.5_1/homebrew.mxcl.postgresql.plist ~/Library/LaunchAgents/

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

rm -rf /usr/local/var/postgres92

就是这样。

【讨论】:

我已经使用上述步骤从9.53升级到10.0。 pg_upgrade 命令已经升级了一点。新命令是 pg_upgrade -b /usr/local/Cellar/postgresql/9.5.3/bin/ -B /usr/local/Cellar/postgresql/10.0/bin -d /usr/local/var/postgres95 -D /usr /local/var/postgres 下面有更好的解决方案【参考方案5】:

如果要保留以前版本的 postgres,请使用brew switch

$ brew info postgresql

postgresql: stable 10.5 (bottled), HEAD
Object-relational database system
https://www.postgresql.org/
Conflicts with:
  postgres-xc (because postgresql and postgres-xc install the same binaries.)
/usr/local/Cellar/postgresql/9.6.3 (3,259 files, 36.6MB)
  Poured from bottle on 2017-07-09 at 22:15:41
/usr/local/Cellar/postgresql/10.5 (1,705 files, 20.8MB) *
  Poured from bottle on 2018-11-04 at 15:13:13

$ brew switch postgresql 9.6.3
$ brew services stop postgresql
$ brew services start postgresql

否则,请考虑使用此 brew 命令迁移现有数据:brew postgresql-upgrade-database。查看the source code。

【讨论】:

【参考方案6】:

正如@Gowtham 所说,您可以通过执行 brew 命令来解决此问题

brew postgresql-upgrade-database 以上命令取自brew info postgres的输出

但是,不要忘记在执行 postgres 服务之前停止它,使用以下命令: `brew services 停止 postgresql

您可能需要重新启动服务。

所以最终的命令顺序是:

brew services stop postgresql
brew postgresql-upgrade-database
brew services start postgresql  

【讨论】:

谢谢,很有帮助 PS,如果您正在使用虚拟环境,请不要忘记先关闭您的虚拟环境【参考方案7】:

与这些答案(1、2)类似,我的 Postgres 数据库文件在升级到 postgresql 13.3 后与我的 Postgres 版本不兼容。

很遗憾,我的 Postgres 数据目录升级失败。

$ brew postgresql-upgrade-database
...
Setting next OID for new cluster
*failure*

Consult the last few lines of "pg_upgrade_utility.log" for
the probable cause of the failure.
Failure, exiting
Error: Upgrading postgresql data from 12 to 13 failed!
==> Removing empty postgresql initdb database...
==> Moving postgresql data back from /usr/local/var/postgres.old to /usr/local/var/postgres...
Error: Failure while executing; `/usr/local/opt/postgresql/bin/pg_upgrade -r -b /usr/local/Cellar/postgresql@12/12.7/bin -B /usr/local/opt/postgresql/bin -d /usr/local/var/postgres.old -D /usr/local/var/postgres -j 8` exited with 1.

我的解决方法是重新安装postgresql 12.7

$ brew reinstall postgresql@12
$ brew services start postgresql@12

【讨论】:

【参考方案8】:

当我尝试使用 postgres11 安装卷启动 Postgres12 时,这发生在我身上。只需删除 postgres11 的已安装卷并重新启动对我有用。

以前我用的是:

docker run -d --name my_database -v /Users/champ/postgres:/var/lib/postgresql/data -p 54320:5432 postgres:11

我删除了 /Users/champ/postgres 并使用

重新启动了 postgres 12
docker run -d --name my_database -v /Users/champ/postgres:/var/lib/postgresql/data -p 54320:5432 postgres:12

【讨论】:

【参考方案9】:

brew info postgres 会给你提示 Like To migrate existing data from a previous major version of PostgreSQL run:

所以在我的情况下,删除旧的 rm -rf /usr/local/var/postgres.old 并升级 DB brew postgresql-upgrade-database

【讨论】:

【参考方案10】:

在 Docker 中运行新的 Postgres 时也会发生这种情况,而您的旧卷未更新。

如果您不需要保持数据最简单,请在 Linux 中清除 docker 文件夹中的旧卷:

/var/lib/docker/volumes

【讨论】:

【参考方案11】:

一个陈旧的postmaster.pid 文件对我造成了这种影响。

只需导航到您的 postgres 目录 /Users/st/Library/Application Support/Postgres/,对我来说就是:

cd '/Users/<username>/Library/Application Support/Postgres/var-10'

然后删除文件postmaster.pid。重启 postgres 就可以了。

【讨论】:

【参考方案12】:

对我来说使用这个命令:

brew install --build-from-source postgresql@12

然后启动 Postgres:

brew services start postgresql@12

你也可以检查端口5432是否监听:

netstat -nl |grep 5432

【讨论】:

这对我很有用,原来我的问题与我的 Mac 上安装的 Postgres 版本冲突有关

以上是关于Postgres - 致命:数据库文件与服务器不兼容的主要内容,如果未能解决你的问题,请参考以下文章

在 PgAdmin 中取回服务器提示错误“致命:用户“postgres”的密码验证失败”

psql:致命:用户“postgres”的身份验证失败

psql:致命:角色“postgres”不存在

Postgres on Rails 致命:数据库不存在

Createuser:无法连接到数据库 postgres:致命:角色“tom”不存在

Postgres 在通过 JBOSS 运行我的应用程序时出现致命错误