我在OS X中使用自制程序中的postgres,但是当我重新启动系统时,有时postgres在重新启动后没有启动,所以我手动尝试启动它postgres -D /usr/local/var/postgres
,但随后发生了以下消息的错误:FATAL: could not open directory "pg_tblspc": No such file or directory
.
它最后一次发生时,我无法将其恢复到原始状态,所以我决定卸载整个postgres系统,然后重新安装它并创建用户,表格,数据集等等......真是太恶心了,但是它经常发生在我的系统上,比如几个月就会发生一次.
那为什么它pg_tblspc
经常丢失文件?我有什么办法可以避免丢失文件吗?
我没有将我的自制软件和postgres升级到最新版本(即我一直在使用相同的版本).另外,我在postgres数据库上做的所有事情都是删除表并每天填充新数据.我没有更改用户,密码等...
编辑(mbannert):我觉得有必要添加这个,因为这个问题对谷歌来说是最受欢迎的,而且很多症状都不同.Homebrewers可能会遇到此错误消息:
No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
所以,如果你刚刚在优胜美地升级之后经历过这个,那么现在你已经开始阅读这个帖子了.
解决了...部分.
显然,安装最新版本的OS X(例如Yosemite或El Capitan)会删除一些目录/usr/local/var/postgres
.
要解决此问题,您只需重新创建缺少的目录:
mkdir /usr/local/var/postgres/pg_tblspc mkdir /usr/local/var/postgres/pg_twophase mkdir /usr/local/var/postgres/pg_stat mkdir /usr/local/var/postgres/pg_stat_tmp mkdir /usr/local/var/postgres/pg_replslot mkdir /usr/local/var/postgres/pg_snapshots
或者,更简洁(感谢Nate):
mkdir /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/
重新运行pg_ctl start -D /usr/local/var/postgres
现在正常启动服务器,至少对我来说,没有任何数据丢失.
UPDATE
在我的系统上,即使Postgres正在运行,其中一些目录也是空的.也许,作为一些"清理"操作的一部分,Yosemite删除任何空目录?无论如何,我继续在每个目录中创建一个".keep"文件,以防止将来删除.
touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots}/.keep
注意:.keep
在这些目录中创建文件会在日志文件中产生一些噪音,但似乎不会对其他任何内容产生负面影响.
多纳万的回答是现实的,我只是想补充一点,因为我对数据库做了不同的事情(例如rake db:test
),它寻找上面没有提到的不同目录,当它们不存在时会窒息,我的情况pg_logical/mappings
,所以你可能想设置一个终端运行:
tail -f /usr/local/var/postgres/server.log
通过典型的数据库活动观察丢失的文件夹.
这稍微偏离主题,但值得注意的是PostgreSQL Yosemite恢复过程的一部分.我有与上面相同的问题,我遇到了PostgreSQL"貌似"在后台运行的问题所以即使在添加目录后我也无法重启.我试图pg_ctl stop -m fast
用来杀死PostgreSQL服务器,但没有运气.我也尝试直接使用该过程,kill PID
但是一旦我这样做,PostgreSQL进程就会重新出现一个不同的PID.
该密钥最终成为.plist
Homebrew已加载的文件...对我的修复最终成为:
launchctl unload /Users/me/Library/LaunchAgents/homebrew.mxcl.postgresql92.plist
之后,我能够正常启动PostgreSQL.