主题:如何有效的关闭生产数据库?
在运行系统上大家都采用哪种关闭方式?昨日运行系统中需要关闭数据库重新启动,为了安全起见采用了shutdown immediate方式,但是等了20多分钟系统还没有关闭,无奈取消该操作接着采用了shutdown abort。
请问大家一般都采用哪种方式的?大家采用shutdown abort关闭然后启动数据库有没有遇到过启动错误?
回复:
一般规范的操作在关闭DB 的时候就是安全的使用 shutdown immediate 了,但是如果在使用immediate 关闭数据库的时候数据库正在进行大的事务,或者数据库比较慢,这个时候虽然说别的session 无法连接DB ,但是数据库要rollback 那些未提交的事务,如果这个时候有大的事务在处理还没有提交的话,那immediate 就很慢了,这在7*24小时不间断运行的DB 重新启动中,这个时间是不能容忍的。
www.ixdba.net
那么建议最好在数据库不忙,事务少小的情况下重新启动DB 比较的好,或者可以事先关闭连接到DB的程序,比如webserver 或者其他的程序。然后手工kill 掉所有的session 然后再immediate 比较的好一点了。
较好的重新启动数据库的步骤 :
因为各种各样的原因,有时候工作数据库需要重新启动.
我列出一个较好的操作步骤,希望对初学者有些帮助.
1. 停应用层的各种程序.
2. 停oralce的监听进程:
$lsnrctl stop
3. 在独占的系统用户下,备份控制文件:
SQL>alter database backup controlfile to trace;
4.SQL> alter system checkpoint;
5. 在独占的系统用户下,手工切换重作日志文件,确保当前已修改过的数据存入文件:
SQL>alter system switch logfile;
6. 在独占的系统用户下,运行下面SQL语句,生成杀数据库用户连接的kill_all_session.sql文件:
set head off;
set feedback off;
set newpage none;
spool /oracle_backup/bin/kill_all_session.sql
select 'alter system kill session '''||sid||','||serial#||''';' from v$session where username is not null;
spool off;
7. 在独占的系统用户下,执行杀数据库用户连接的kill_all_session.sql文件
SQL>@/oracle_backup/bin/kill_all_session.sql
8. 在独占的系统用户下,用immediate方式关闭数据库:
SQL>shutdown immediate;
或者
SVRMGRL>shutdown immediate;
9. 启动oralce的监听进程
$lsnrctl start
10. 进入独占的系统用户下,启动oralce数据库
$sqlplus /nolog
SQL>connect / as sysdba
SQL>startup;
或者
$svrmgrl
SVRMGRL>connect internal;
SVRMGRL>startup;
11.启动应用层的各种程序.
我们是电信移动的数据库,不能停很久的,每次重新启动数据库的时候,先中断所有与DB 的连接,然后stop listener.然后kill 掉所有的session ,然后用shutdown immediate 但是时间还是很长,最后还是停不了,NND 直接abort ,好几次了,也没有出现过大的问题,只是open 的时候慢一点,因为open 的时候还是要回滚的
有点不明白,abort 之后重新启动DB,open 的时候同样要回滚那些应该在immediate 需要回滚的事务,为什么open 的时候速度还是比较的快的而immediate 的时候怎么回滚那么慢呢?不排除immediate 的时候要触发dbwr 写脏数据到数据文件,但是这个过程还是比较的快的,就算回滚量大,但是也不能immediate 需要等1个多小时啊,特别在大的数据库里面,难道immediate 的时候还需要 做别的大的动作处理吗?
回答:
shutdown immediate的时候,要等待所有的回滚完成,所有数据文件同步。而启动做实例恢复 instance recovery 时,只需要前滚完成,也就是说,将日志里的动作做完,并不等待 recovery 的完成就可以open数据库了。在使用到需要回滚的数据块时,再执行回滚。所以,open的速度要快很多。因为有很多应该完成的工作,在 open的时候都没有做。