how do I gracefully kill stale server process postgres
偶尔在我们的实验室中,我们的postgres 8.3数据库将从pid文件中获取孤立,并且在尝试关闭数据库时会收到此消息:
发生这种情况时,我们立即执行
有没有办法优雅地关闭孤立的postgres进程,所以我们不必通过pg_dump并恢复? 或者有没有办法让数据库在杀死孤立进程后恢复?
根据文档,您可以发送SIGTERM或SIGQUIT。 SIGTERM是首选。无论哪种方式都不使用SIGKILL(正如您从个人经验中所知)。
编辑:另一方面,您遇到的不正常,可能表示错误配置或错误。请在pgsql-admin邮件列表上寻求帮助。
永远不要使用kill -9。
我强烈建议你试着弄清楚这是怎么发生的。错误消息究竟来自哪里?这不是PostgreSQL错误消息。你有没有机会混合不同的方式来启动/停止服务器(有时是initscrises,有时是pg_ctl)?这可能会导致事情不同步。
但要回答直接问题 - 在进程上使用常规kill(no -9)来关闭它。如果有多个postgres进程正在运行,请确保删除所有postgres进程。
数据库将在关闭时始终自动恢复。这个shuold也发生在kill -9上 - 任何提交的数据都应该在那里。这几乎听起来像你有两个不同的数据目录相互叠加或类似的东西 - 至少在此之前这已经成为NFS的一个已知问题。
我使用像cron每分钟运行的以下脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/bin/bash DB="YOUR_DB" # Here's a snippet to watch how long each connection to the db has been open: # watch -n 1 'ps -o pid,cmd,etime -C postgres | grep $DB' # This program kills any postgres workers/connections to the specified database # which have been running for 2 or 3 minutes. It actually kills workers which # have an elapsed time including"02:" or"03:". That'll be anything running # FOR at least 2 minutes AND less than 4. It'll also cover anything that # managed to stay around until an hour and 2 or 3 minutes, etc. # # Run this once a minute via cron and it should catch any connection open # between 2 and 3 minutes. You can temporarily disable it if if you need to run # a long connection once in a while. # # The check for"03:" is in case there's a little lag starting the cron job AND # the timing IS really bad AND it never sees a worker IN the 1 MINUTE window # WHEN it's got"02:". old=$(ps -o pid,cmd,etime -C postgres | grep"$DB" | egrep '0[23]:') if [ -n"$old" ]; then echo"Killing:" echo"$old" echo"$old" | awk '{print $1}' | xargs -I {} kill {} fi |