熟悉Oracle的人可能会去经常使用kill -9进程,因为有的时候使用SQL命令去杀进程,一些进程的状态只是会被置为”killed”状态,其锁定的资源仍然没有释放杀进程,可能会收到提示:

ORA-00031: session marked for kill

因此甚至还建议大家去使用kill -9直接去操作系统上杀掉进程。

又比如我们Oracle停库的时候常常都是先停监听,再手动kill掉LOCAL=NO的进程,然后再去停库。

但是要注意了,切勿在PostgreSQL中使用kill -9去杀掉进程!

首先我们先 看一个例子

linux 杀进程_杀oracle数据库进程_杀进程

这里我们有一个进程号为474的psql进程,如果我们使用kill -9杀掉该进程会发生什么呢?

杀进程_linux 杀进程_杀oracle数据库进程

我们发现,其它的一些postgresql的后端进程都受到了影响,其进程ID都发生了变化。

通过查看日志,我们发现这些进程确实是被重置了:

杀进程_linux 杀进程_杀oracle数据库进程

这也是为什么我们不建议使用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的方式。

参考链接:

杀oracle数据库进程_linux 杀进程_杀进程