简体   繁体   English

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

[英]Postgres - FATAL: database files are incompatible with server

After restarting my MacBook Pro I am unable to start the database server:重新启动 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"?

I checked the logs and the following line appears over and over again:我检查了日志,并一遍又一遍地出现以下行:

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 was the version that came preinstalled on the mac, 9.2[.4] is the version I installed via Homebrew. 9.0.4 是预装在 mac 上的版本,9.2[.4] 是我通过 Homebrew 安装的版本。

As mentioned, this used to work before the restart, so it can't actually be a compiling issue.如前所述,这曾经在重新启动之前工作,因此它实际上不是编译问题。 I also re-ran initdb /usr/local/var/postgres -E utf8 and the file still exists.我还重新运行了initdb /usr/local/var/postgres -E utf8并且该文件仍然存在。

If you recently upgraded postgres to latest version, you can run the below command to upgrade your postgres data directory retaining all data:如果您最近将 postgres升级到最新版本,您可以运行以下命令来升级您的 postgres 数据目录,保留所有数据:

brew postgresql-upgrade-database

The above command is taken from the output of brew info postgres上面的命令取自brew info postgres的输出

If you are looking for the nuclear option (delete all data and get a fresh database), you can do:如果您正在寻找核选项(删除所有数据并获取新数据库),您可以执行以下操作:

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

and then you'll need to rake db:setup and rake db:migrate from your Rails app to get setup again.然后你需要rake db:setuprake db:migrate从 Rails 应用程序重新设置。

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

It worked perfectly for me.它对我来说非常有效。 In the end it also generates you 2 bash scripts to check your DB and remove the old cluster.最后,它还会为您生成 2 个 bash 脚本来检查您的数据库并删除旧集群。 Really Awesome.非常棒。

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

Found on internet, this solution work fine for me.在互联网上找到,这个解决方案对我来说很好。

When I tried to start postgresql server after upgrade to OS X 10.10 Yosemite, I encountered with a next problem:当我在升级到 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"?

Okay, lets take a look into server logs:好的,让我们看一下服务器日志:

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.

So, we need to follow a few steps after upgrade postgresql:因此,我们需要在升级 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

That's it.而已。

If you want to keep the previous version of postgres, use brew switch :如果要保留以前版本的 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

Otherwise, consider this brew command to migrate existing data: brew postgresql-upgrade-database .否则,请考虑使用此 brew 命令迁移现有数据: brew postgresql-upgrade-database Check out the source code .查看源代码

As @Gowtham mentioned, you can solve this problem by executing a brew command正如@Gowtham 提到的,您可以通过执行 brew 命令来解决此问题

brew postgresql-upgrade-database The above command is taken from the output of brew info postgres brew postgresql-upgrade-database上面的命令取自brew info postgres的输出

However, don't forget to stop the postgres service before executing it, use the following command: `brew services stop postgresql但是,不要忘记在执行 postgres 服务之前停止它,使用以下命令:`brew services stop postgresql

you may have to start the service again.您可能需要重新启动该服务。

So the final order of commands are:所以命令的最终顺序是:

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

Similar to these answers ( 1 , 2 ), my Postgres database files were incompatible to my Postgres version after upgrading to postgresql 13.3 .与这些答案( 12 )类似,我的 Postgres 数据库文件在升级到postgresql 13.3后与我的 Postgres 版本不兼容。

Unfortunately, upgrading my Postgres data directory failed.不幸的是,升级我的 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.

My workaround for this was to reinstall postgresql 12.7 .我的解决方法是重新安装postgresql 12.7

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

It happened for me when I was trying to start Postgres12 with postgres11 mounted volume.当我尝试使用 postgres11 安装卷启动 Postgres12 时,它发生在我身上。 Just deleting the mounted volume for postgres11 and restart worked for me.只需删除 postgres11 的已安装卷并重新启动对我有用。

Previously I was using:以前我使用的是:

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

I deleted /Users/champ/postgres and restarted postgres 12, using我删除 /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 will give you hints Like To migrate existing data from a previous major version of PostgreSQL run: brew info postgres会给你一些提示,比如To migrate existing data from a previous major version of PostgreSQL run:

So in my case removing the old one rm -rf /usr/local/var/postgres.old and upgrading the DB brew postgresql-upgrade-database因此,在我的情况下,删除旧的rm -rf /usr/local/var/postgres.old并升级数据库brew postgresql-upgrade-database

This can also occur when running a new Postgres in Docker, and your old volume isn't updated.在 Docker 中运行新的 Postgres 并且您的旧卷未更新时也会发生这种情况。

If you don't need to keep your data easiest is to clear the old volumes in the docker folder, in Linux that's here:如果您不需要保持数据最简单,请清除 docker 文件夹中的旧卷,在 Linux 中,此处为:

/var/lib/docker/volumes

A stale postmaster.pid file caused this for me.一个陈旧的postmaster.pid文件对我造成了这种影响。

Simply navigate to your postgres directory /Users/st/Library/Application Support/Postgres/ , for me, that's:只需导航到您的 postgres 目录/Users/st/Library/Application Support/Postgres/ ,对我来说,就是:

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

Then delete the file postmaster.pid .然后删除文件postmaster.pid Restart postgres and it will work.重新启动postgres,它会工作。

To me works with this command:对我来说,使用这个命令:

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

Then started Postgres:然后启动 Postgres:

brew services start postgresql@12

You can also check the port 5432 is listen:您还可以检查端口5432是否正在侦听:

netstat -nl |grep 5432

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM