有时候在关闭数据库的时候,总是不能很顺畅的关闭它,因为在我们正常发起shutdown immediate命令的时候,PMON进程会把一些进程的资源进行释放,往往在这个过程中会释放的很慢。又或者是你有一些JOB还在运行中。当然还有一些BUG。导致等很久都不能关闭掉数据库。在这个时候。我们通常会使用先杀LOCAL=NO进程,然后在关闭的方式。最近看了一篇文档叫”What Is The Fastest Way To Cleanly Shutdown An Oracle Database? [ID 386408.1]“,受了点启发。其实直接shutdown abort是最快的关闭数据库的方式。但是在重新启动之后,数据库一定会处于一个不一致的状态。在下一次启动的时候需要恢复。如果是大事务没有中断掉,再次启动的话,可能要耗费非常多的时间。这篇文章的方法也是shutdown abort。只是有一些小技巧。
1.确定干净的关闭数据库需要多少的回滚量。
select sum(used_ublk)*(block size of the undo/rollback segment tablespace) from v$transcation;
其实这里是有经验的,最好这个回滚量不要太大,否则重新启动之后,要回滚很长时间的.
2.Shutdown abort数据库发起这个命令之后。将快速终止所有进程(客户端和后台进程)。不会产生任何回滚操作。
3.Startup Restrict
做这一步是为了让数据库回滚,SMON做回滚的时候,最好不要让其他Session连进来,以免其他Session执行同样的SQL报错。
4.观察SMON回滚的进度
select sum(distinct(ktuxesiz)) from x$ktuxe where ktuxecfl = 'DEAD';
5.当回滚完成之后发起Shutdown immediate
再次发起Shutdown immediate.这次会非常快就结束了.然后我们再Startup即可.
这样我们就完成了快速干净的关闭掉一个数据库.当然在运行Shutdown Abort的时候,也是有一定风险的,这个风险的几率极低.我曾经在一套8.1.7的数据库上运行shurdown abort后出现ORA-00600的错误.所以我们要执行该命令之前要关注一下I/O,如果I/O不是很大,我觉得是没问题的。再说了既然MOS有这样的文档,在指定的版本上(9.0.1.0 to 11.2.0.2)。一般情况下也不会出太大问题的。
分享到:
更多