Postgres—FATAL:数据库文件与服务器不兼容

重新启动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上预装的版本。4]是我通过Homebrew安装的版本。

如前所述,这在重新启动之前是可以工作的,因此它实际上不可能是编译问题。我还重新运行了initdb /usr/local/var/postgres -E utf8,文件仍然存在。

168869 次浏览
试试这个: https://gist.github.com/joho/3735740 < / p > 这对我来说非常有效。 最后,它还生成2个bash脚本来检查数据库并删除旧的集群。 真的太棒了。< / p >

参见:http://www.postgresql.org/docs/9.2/static/pgupgrade.html了解更多。

如果你正在寻找核心选项(删除所有数据并获得一个新的数据库),你可以这样做:

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

然后你需要从你的Rails应用中rake db:setuprake db:migrate来重新设置。

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

当我试图在升级到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

就是这样。

如果你想保留以前版本的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。看看源代码

如果你最近升级 postgres到最新版本,你可以运行下面的命令来升级你的postgres数据目录,保留所有数据:

brew postgresql-upgrade-database

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

当我试图用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

brew info postgres会给你一些提示,比如To migrate existing data from a previous major version of PostgreSQL run:

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

一个陈旧的postmaster.pid文件导致了这个问题。

简单地导航到你的postgres目录/Users/st/Library/Application Support/Postgres/,对我来说,这是:

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

然后删除文件postmaster.pid。重新启动postgres,它将工作。

对我来说,这是一个命令:

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

然后创办了Postgres:

brew services start postgresql@12

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

netstat -nl |grep 5432

类似于这些答案(12),我的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

当在Docker中运行新的Postgres时,旧的卷没有更新,也会发生这种情况。

如果你不需要保存你的数据,最简单的方法是清除docker文件夹中的旧卷,在Linux中:

/var/lib/docker/volumes

正如@Gowtham提到的,您可以通过执行brew命令来解决这个问题

< p > brew postgresql-upgrade-database 上面的命令取自brew info postgres

的输出

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

.

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

所以命令的最终顺序是:

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