首页 文章

安装最新版OS X(Yosemite或El Capitan)后缺少`pg_tblspc`

提问于
浏览
457

我在我的操作系统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"?

所以,如果你刚刚在优胜美地升级后经历过这个,那么现在你已经开始阅读这个帖子了 .

5 回答

  • 923

    Donavan的答案很明显,我只是想补充一点,因为我对数据库做了不同的事情(例如 rake db:test ),它去寻找不同的目录't been mentioned above and would choke when they weren't,在我的情况下 pg_logical/mappings ,所以你可能想要设置终端运行:

    tail -f /usr/local/var/postgres/server.log
    

    通过典型的数据库活动观察丢失的文件夹 .

  • 9

    丢失的目录需要存在于PostgreSQL数据目录中 . 默认数据目录是 /usr/local/var/postgres/ . 如果您设置了不同的数据目录,则需要在那里重新创建缺少的目录 . 如果您修改了启动PostgreSQL的自制软件推荐的 .plist 文件,您可以在那里找到数据目录:

    cat ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
    

    (这是你用postgres开始的 -D 选项:)

    <key>ProgramArguments</key>
      <array>
        <string>/usr/local/bin/postgres</string>
        <string>-D</string>
        <string>/usr/local/pgsql/data</string>
    

    在上面的示例中,您将在 /usr/local/pgsql/data 中创建缺少的目录,如下所示:

    cd /usr/local/pgsql/data
    mkdir {pg_tblspc,pg_twophase,pg_stat,pg_stat_tmp,pg_replslot,pg_snapshots,pg_logical}
    mkdir pg_logical/{snapshots,mappings}
    
  • 6

    这稍微偏离主题,但值得注意的是PostgreSQL Yosemite恢复过程的一部分 . 我遇到了与上面相同的问题而且我在后台运行PostgreSQL "seemingly"时遇到了问题,所以即使在添加目录后我也无法重启 . 我尝试使用 pg_ctl stop -m fast 来杀死PostgreSQL服务器,但没有运气 . 我也尝试直接使用 kill PID 进行处理,但是一旦我这样做,PostgreSQL进程就会重新出现一个不同的PID .

    密钥最终成为Homebrew加载的 .plist 文件...对我的修复最终成为:

    launchctl unload /Users/me/Library/LaunchAgents/homebrew.mxcl.postgresql92.plist
    

    之后,我能够正常启动PostgreSQL .

  • 4

    解决了...部分 .

    显然,安装最新版本的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
    

    Note :在这些目录中创建 .keep 文件会在日志文件中产生一些噪音,但似乎不会对其他任何内容产生负面影响 .

  • -21

    创建丢失的目录肯定有效但我通过重新初始化postgres db来修复它,这是一种避免将来出现问题的更简洁的方法 .

    NOTE: This approach will delete existing databases

    $ rm -r /usr/local/var/postgres
    $ initdb -D /usr/local/var/postgres
    

相关问题