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


183

重新启动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来说还很陌生,因此对您的帮助将不胜感激。


1
您如何启动postgres?您确定起始脚本指向新版本吗?因为基于错误消息,我认为两个版本现在并排安装。
fvu

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start-而回应是server starting
klaffenboeck

1
当您搜索名为pg_ctl I的文件时,我敢肯定您会找到2个副本。匹配的一个which pg_ctl将是旧版本,另一个将是新版本。
fvu

跑步pg_ctl --versionpg_ctl (PostgreSQL) 9.2.4
klaffenboeck

2
@EvanCarroll当然可以了。我认为现在他们已将其移动到将其捆绑到内部Server.app并隐藏以使用非默认端口和Unix套接字目录的位置。最后!
Craig Ringer

Answers:


357

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

brew postgresql-upgrade-database

上面的命令取自 brew info postgres


2
这就像一个魅力,但是在工作之后,它引入了第二个错误,请记住先使用initdb创建的数据库升级,brew postgresql-upgrade-database然后重新启动postgres
Shemogumbe

也适用于9.5到11。还显示了如何使用的荣誉brew info
yacc

2
从10到11.5。您是救生员。<3
Thomas

4
也适用于11到12。
stevex '19


167

如果您正在寻找核选项(删除所有数据并获取新的数据库),则可以执行以下操作:

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

然后你需要rake db:setuprake db:migrate您的Rails应用程序重新获得设置。


3
如果以上方法仍然无效(对我而言就是这种情况),请尝试为initdb指定一个新的数据目录名称,例如/ usr / local / var / postgres95。
mpelzsherman '02

顺便说一句,在此之后,您可能需要立即运行createuser -s your_rails_app以创建Rails的postgres用户。见stackoverflow.com/questions/11919391/…–
Meekohi

38

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

它对我来说很完美。最后,它还会生成2个bash脚本来检查数据库并删除旧集群。非常棒。

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


2
从9.4迁移到9.5对我来说非常理想。
tftdias '16

从9.3.4到9.5.2的迁移也对我有用。
Steve Jorgensen

1
以下是使用Homebrew(macOS)将9.5.5更新到9.6.1的步骤:gist.github.com/giannisp/b53a76047b07751ed3ade3c1db1d2c51
Giannis

那绝对是最好的答案!而且没有数据丢失。
FlorianB

9

在互联网上可以找到此解决方案,对我来说效果很好。

升级到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

而已。


1
我已经按照上述步骤从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
techvineet

更好的解决方案
盖迪

8

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


0

当我尝试使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.