熟悉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的方式。
参考链接:
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。