關閉ORACLE資料庫步驟參考

還不算暈發表於2015-12-21

近期遭遇了多次客戶資料庫無法關閉的問題了,資料庫無法關閉,一般是關閉時有事務需要回滾(可能是客戶端或者JOB等)或者是關閉時使用錯誤關閉引數(如忘加引數預設是NORMAL)或者關閉時有其它原因。

因此分享一下關閉資料庫步驟的指令碼,按照此指令碼進行關閉資料庫,基本上可以迴避無法關閉問題;即使遇到無法關閉,使用kill關閉程式來關閉例項,也很少會造成資料損壞或資料丟失。

近期遇到的幾次關閉問題及相應MOS連結如下:

http://blog.csdn.net/haibusuanyun/article/details/50285527
關閉資料庫遇到SHUTDOWN: Active processes prevent shutdown operation
http://blog.csdn.net/haibusuanyun/article/details/47073459
關閉資料庫時SHUTDOWN: waiting for active calls to complete.處理
供參考MOS文件:
Shutdown Immediate Hangs / Active Processes Prevent Shutdown (文件 ID 416658.1)
Alert Log: Shutdown Waiting for Active Calls to Complete (文件 ID 1039389.6)
What Is The Fastest Way To Cleanly Shutdown An Oracle Database? (文件 ID 386408.1)

-----------------------------------------參考步驟如下:

一、應用停掉

 
二、停監聽器
--對應的LOCAL=NO的程式確認是否需要KILL。
ps -ef|grep LOCAL=NO|wc -l
ps -ef|grep LOCAL=NO
 lsnrctl stop
 
三、檢視有沒有JOB--如有需要確認是否可停掉
ps -ef|grep ora_j
 
四、檢視有沒有事務還未提交的--如有事務未提交確認是否需要等待事務完成
sqlplus '/ as sysdba'
select status,instance_name,to_char(startup_time,'yyyy/mm/dd hh24:mi:ss') starttime from gv$instance;
select open_mode,name from v$database;
是否有大的查詢在進行
 select count(*) from v$transaction;
select count(*) from v$session_longops where time_remaining>0;
是否有大的事務在進行
select sum(used_ublk) from v$transaction;   ---如果有大量返回,參考本文最後
select START_TIME,STATUS from v$transaction;
是否有大事務正在回滾/需要在資料庫OPEN時進行例項恢復
select * from v$fast_start_transactions;
select * from v$fast_start_servers;
 
五、手工做檢查點與手動多次切換log
--確認以上問題解決完後繼續:
先做一次檢查點,目的是把髒資料寫入資料檔案,避免造成資料丟失,減小關閉啟動不起來這種現象發生
alter system checkpoint;
切換一次日誌:
SQL> alter system switch logfile;

再做一次檢查點
alter system checkpoint;
再切換一次日誌:
SQL> alter system switch logfile;
 

六、關機-此時關機速度會正常,有效減少HANG住之類問題。

建議執行關閉資料庫命令時,重新開啟一個會話視窗,重新登陸資料庫進行關閉:

SQL> shutdown immediate;


相關文章