如何快速关闭数据库

“一朝被蛇咬,十年怕井绳”。在没被“蛇”咬之前,很多DBA喜欢使用SHUTDOWN ABORT方式来关闭数据库。因为这种方式是最快速的关闭方法,但用此方式关闭数据库会使数据库处于不一致状态,极端的情况下甚至会损坏数据库,导致数据库无法启动。所以推荐使用SHUTDOWN IMMEDIATE方式来安全稳妥地关闭数据库。
5.9.1 影响数据库关闭速度的因素
当数据库以SHUTDOWN IMMEDIATE方式关闭时,Oracle会自动断开所有的客户端连接,并回滚所有未提交的事务,回滚完成之后还会将所有的脏块从BUFFER CACHE写进数据文件,所以以此方式关闭数据库,数据库内部会处于一致状态。这也就意味着再次启动数据库时,服务进程并不需要CRASH RECOVERY。这种方式是目前最常用的关闭方式,但是关闭速度较慢。数据库关闭速度受以下4个因素影响:
 连接的客户端进程数量。
 未提交的事务占用的UNDO BLOCK数量。
 长时间运行的会话。
 SMON进程清理临时段的速度。
1. 连接的客户端进程数量
    数据库关闭之前,需要清理连接的客户端会话。连接的客户端数量越多,那么SHUTDOWN IMMEDIATE关闭数据库时需要断开的会话就越多,消耗时间也就越长,如下所示:
Sun Jul 15 02:43:33 CDT 2012
Job queue slave processes stopped
Active process 6238404 user 'oracle' program 'oracle@P520'
。。。。。。
Active process 4678106 user 'oracle' program 'oracle@P520'
CLOSE: waiting for server sessions to complete.
为了加快数据库关闭速度,可以先关闭监听,然后手动“杀”死相关的客户端进程,如下所示:
ps -ef|grep "LOCAL=NO"|grep -v grep |awk '{print "kill -9 "  $2}'|sh
2. 未提交的事务占用的UNDO BLOCK数量
UNDO BLOCK的数量越多也就意味着事务越大,数据库关闭也就越慢。当数据库事务很大时,关闭数据库往往停留在如下阶段,如下所示:
Thu Dec 10 15:43:17 2009
ALTER DATABASE CLOSE NORMAL
Thu Dec 10 15:44:07 2009
Waiting for smon to disable tx recovery.
    所以我们在关闭数据库前最好评估回滚事务量的大小,如果事务很大,那只有耐心地等待了,相关SQL如下所示:
select sum(used_ublk) * <block size of the undo / rollback segment tablespace> from v$transaction;
3. 长时间运行的会话
可以kill长时间会话来加快数据库关闭速度。通过以下查询获得长时间运行的会话数量:
SQL> select count(*) from v$session_longops where time_remaining>0;
此外,关闭数据库前手动执行全量CHECKPOINT也能在一定程度上加快关闭速度:
ALTER SYSTEM CHECKPOINT;
    有时使用shutdown immediate不一定能关闭数据库,如在关闭数据库时,警告日志长时间出现如下错误:
Sat Apr 14 18:42:28 2007
Job queue slave processes stopped
Sat Apr 14 18:42:33 2007
Process OS id : 8888 alive after kill
Errors in file
Sat Apr 14 18:42:34 2007
PMON failed to acquire latch, see PMON dump
PMON failed to acquire latch, see PMON dump
PMON failed to acquire latch, see PMON dump
    当出现上述错误时,那么只能选择使用shutdown abort或者kill Oracle核心进程来异常关闭数据库(Instance Crash)。异常关闭数据库可能导致某些资源无法释放干净,所以关闭数据库后需要检查以下内容,如果存在则将其删除:
 数据库后台遗留进程,可以用以下命令检查:
$ ps -ef | grep $ORACLE_SID
 用ipcs命令检查实例的共享内存段和信号量。
 检查$ORACLE_HOME/dbs目录下是否存在lk<SID>,sgadef<sid>.dbf。
5.9.2 数据库无法关闭的诊断方法
有时候以SHUTDOWN IMMEDIATE方式关闭数据库时,会长时间hang住。为了诊断hang住的原因,可以在关闭数据库前设置10400和10046事件。当数据库关闭hang住时,10400事件会每隔5分钟进行SYSTEMSTATE DUMP,如下所示:
SQL> alter session set events '10400 trace name context forever, level 1';
SQL> alter session set events '10046 trace name context forever,level 12';
SQL> shutdown immediate
    如果仍未获得更多的诊断信息,可以使用另外的终端连接至数据库做HANGANALYZE(HANGANALYZE不一定能执行成功),如下所示:
SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug hanganalyze 3
-- wait 90 seconds
SQL> oradebug hanganalyze 3
SQL> exit

注意 除非绝对需要,否则不推荐使用shutdown abort关闭数据库。受时间窗口所限,如果必须要在短时间内关闭数据库,比如升级数据库,那么建议将数据库以abort方式关闭之后,马上以限制模式方式开启数据库,然后再以shutdown immediate方式关闭。

猜你喜欢

转载自dbzone.iteye.com/blog/2430306