Postgresql 为什么pgsql有时在启动后的前几秒钟不侦听,即使;“在职博士后身份”;还可以吗?

Postgresql 为什么pgsql有时在启动后的前几秒钟不侦听,即使;“在职博士后身份”;还可以吗?,postgresql,service,centos,dbi,Postgresql,Service,Centos,Dbi,我有一个web应用程序,它使用postgresql 9.0和一些调用我的自定义库的plperl函数。因此,当我想像刚发布一样重新开始时,我的开发区域的构建过程基本上是这样的: 从生产中转储数据和角色 删除开发人员数据和角色 将生产数据和角色恢复到开发人员上 重新启动postgresql,以便刷新自定义库的任何缓存版本,并拾取新更改的库 应用我的开发增量 真空 自从将我的应用程序堆栈从win32切换到CentOS后,我现在在构建脚本尝试应用增量时,有时(也就是说,似乎只有当且仅当我在“一段时间”(

我有一个web应用程序,它使用postgresql 9.0和一些调用我的自定义库的plperl函数。因此,当我想像刚发布一样重新开始时,我的开发区域的构建过程基本上是这样的:

  • 从生产中转储数据和角色
  • 删除开发人员数据和角色
  • 将生产数据和角色恢复到开发人员上
  • 重新启动postgresql,以便刷新自定义库的任何缓存版本,并拾取新更改的库
  • 应用我的开发增量
  • 真空
  • 自从将我的应用程序堆栈从win32切换到CentOS后,我现在在构建脚本尝试应用增量时,有时(也就是说,似乎只有当且仅当我在“一段时间”(可能至少一天)没有运行此构建过程时)会出错:

    psql: 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"?
    
    具体而言,无法在shell级别执行的是:

    psql --host=$host -U $superuser -p $port -d $db -f "$delta_filename.sql"
    
    如果在看到这个错误后,我立即尝试使用psql连接到dev数据库,那么我可以毫不费力地连接到dev数据库。另外,如果我只是重新运行构建脚本,它在第二次运行时就可以正常工作,每次遇到这种情况时都可以。可以接受的解决方法,但根本原因是否值得关注

    到目前为止,在我调试这一点的尝试中,我在服务器重新启动后插入了一个步骤(当然,这会报告OK shutdown,OK startup),在循环中检查
    service postgresql dev status
    的结果,如果失败,在两次尝试之间等待2秒。在我最新的构建脚本运行中,第一次尝试时said循环成功--
    status
    返回“is running”--但应用增量仍然失败,出现上述连接错误。同样,第二次尝试成功,正如在失败后通过脚本外部的psql进行连接一样

    我的下一次调试尝试是在第一次检查
    状态之前休眠5秒钟,看看会发生什么。到目前为止,这似乎解决了问题


    那么,为什么pgsql在启动后不监听套接字,并且状态
    运行正常时不超过5秒,除非它“最近”重新启动过?

    状态检查仅检查进程是否正在运行。它不会检查你是否可以连接。在启动进程和进程准备接受连接之间可以有任意时间。通常是几秒钟,但可能更长。如果需要处理此问题,则需要编写脚本,以便在继续之前检查是否可以连接。你可以说CentOS软件包应该为你做到这一点,但事实并非如此


    事实上,我认为在你的情况下,没有理由完全重启。除非您正在加载带有
    共享预加载\u库的库
    ,否则重新启动连接以获取新库就足够了。

    我实际上正在加载带有共享预加载\u库的库。:-)不过,我想在循环中,我应该只放置一个简单的psql,直到成功,然后运行完整的delta文件。谢谢