今日一哥们说数据库无法shutdown,一直挂着不动。我问是正常关闭么,答曰shutdown immediate。他问有无应急的办法让其关闭后重启,我说你就等等吧,immediate方式关闭的话很快能正常shutdown的。(许久后)我问down下来了么答曰没。不对劲呀!
[@more@]
telnet上去一看发觉alert日志中有如下信息:
Fri Jun 15 13:48:26 2007
Shutting down instance: further logons disabled
Fri Jun 15 13:49:06 2007
Shutting down instance (immediate)
License high water mark = 990
Fri Jun 15 13:54:14 2007
Active call for process 16590 user 'oracle' program (TNS V1-V3)'
SHUTDOWN: waiting for active calls to complete.
Fri Jun 15 13:55:42 2007
用top查看了一下系统进程,如下:
Memory: 926732K (87056K) real, 1710592K (197156K) virtual, 331688K free Page# 1/11
CPU TTY PID USERNAME PRI NI SIZE RES STATE TIME %WCPU %CPU COMMAND
1 ? 2981 oracle 154 20 21268K 1896K sleep 487:45 4.52 4.51 tnslsnr
0 ? 16590 oracle 181 20 538M 2236K run 11:33 3.75 3.75 oracleora9i
0 ? 2987 oracle 148 20 551M 10440K sleep 65:21 1.62 1.61 ora_dbw0_ora9i
1 ? 35 root 152 20 8064K 8064K run 47:43 0.59 0.59 vxfsd
一看就觉得16590这个oracle用户进程可疑。在发出shutdown命令后,这个进程对应的session事务一定在作回滚操作,导致数据库无法正常关闭。这个事务回滚也太久了吧,有点不正常,无奈现已无法跟踪到这个进程对应的session信息了。立即执行kill -9命令后数据库立马关闭了。
最后,总结一下数据库的正常关闭流程:
先停监听,然后停业务系统。接着ps -ef§grep ora看看还有那些(LOCAL=NO)的oracle用户进程,如果不能及时关闭的将其kill掉后发出shutdown immediate。
最多等待10分钟左右,不行就直接abort方式shutdown了。(到这一步基本没有问题,oracle还是比较安全的)