pgsql如何重启

正常情况下,pgsql 停止可以执行一下命令:

bin/pg_ctl stop -s -D pg_data/ -m fast

此命令和 kill -15 PID 效果相同

但是有时候 pgsql 也会抽风,无法通过正常的方式停止,这个时候我们就需要暴力拆解了

kill -9 PID 大法,没有什么进程是可以抵抗的(除了用户权限不对外,基本是遇神杀神,遇佛杀佛哦)

但是kill -9 这个方式太暴力,导致pgsql 在下次启动时,会爆出乱七八糟的错误

例如 PID 已存在的问题

FATAL:  pre-existing shared memory block (key 4432001, ID 1245189) is still in use
HINT:  If you're sure there are no old server processes still running, remove the shared memory block or just delete the file "post
master.pid".

解决方式是将 pg_data/postmaster.opts 和 pg_data/postmaster.pid 两个文件删除
因为pgsql 在启动时,会去检测是否存在这两个文件


另外在kill -9 强杀进程时,有时候也会误伤数据库的日志文件,这个时候,就会出现以下的问题

LOG:  database system was interrupted; last known up at 2016-03-23 10:55:25 CST
LOG:  invalid record length at 0/1A97600
LOG:  invalid primary checkpoint record
LOG:  invalid record length at 0/1A97598
LOG:  invalid secondary checkpoint record
PANIC:  could not locate a valid checkpoint record
LOG:  startup process (PID 2348) was terminated by signal 6: Aborted
LOG:  aborting startup due to startup process failure

解决方式如下
bin/pg_resetxlog -f pg_data/
这个命令应该是恢复pgsql 的日志,有可能会造成pgsql 里面的数据丢失或者损坏,但是你在kill -9 时就应该了解这个风险。

否则呢,你就自己想明白为啥不能 kill -15 吧!!!

posted @ 2016-03-29 11:56  chenfool  阅读(14539)  评论(1编辑  收藏  举报