赞
踩
熟悉Oracle的人可能会去经常使用kill -9杀进程,因为有的时候使用SQL命令去杀进程,一些进程的状态只是会被置为"killed"状态,其锁定的资源仍然没有释放,可能会收到提示:
ORA-00031: session marked for kill
因此甚至还建议大家去使用kill -9直接去操作系统上杀掉进程。
又比如我们Oracle停库的时候常常都是先停监听,再手动kill掉LOCAL=NO的进程,然后再去停库。
但是要注意了,切勿在PostgreSQL中使用kill -9去杀掉进程!
首先我们先 看一个例子:
这里我们有一个进程号为474的psql进程,如果我们使用kill -9杀掉该进程会发生什么呢?
我们发现,其它的一些postgresql的后端进程都受到了影响,其进程ID都发生了变化。
通过查看日志,我们发现这些进程确实是被重置了:
这也是为什么我们不建议使用kill -9去杀掉pg的进程,而在Oracle中却不会这样:
这是因为Oracle由于pmon进程的存在,在某个进程非正常退出后,会做好妥善的后事及清理工作。PostgreSQL由于没有,假如某个进程正在修改shared buffer里的某个数据块,然后被异常终止了,Postmaster为了安全,就会主动停下其他后台进程,做修复善后工作,重置其状态来接受新的连接。
所以,千万不要在pg中使用kill -9去杀进程,而是使用select pg_terminate_backend()和pg_cancen_backend(),或者是pg_ctl kill SIGNALNAME PID的方式。
参考链接:
https://postgreshelp.com/operating-system-kill-signals-on-postgresql/
https://www.modb.pro/db/44333
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。