正常情况下,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 吧!!!