數據庫關閉和啓動操作步驟

Oracle DB異常時關閉與啓動

1. 生成OS級kill -9腳本

   set head off
   set feedback off
   set pagesize 0
   spool /tmp/kill_9_scripts.sh
   select ' kill -9 ' || spid from (select spid from v$process where addr in(select paddr from v$session where status='ACTIVE' and username is not null));
   spool off


 

2.生成DB級kill session腳本

   set head off
   set feedback off
   set pagesize 0
   spool /tmp/kill_sess_scripts.sql
   select 'alter system kill session ' || '''' || sid || ',' || serial# || '''' || ';'from v$session where status='ACTIVE' and username is not null;
   spool off


 

3.執行kill_sess_scripts.sql腳本

   SQL>@/tmp/kill_sess_scripts.sql
   如果session kill之後不能釋放執行,那麼在OS級執行kill -9腳本
   sh /tmp/kill_9_scripts.sh


 

4. 如果發現kill session無效無法恢復應用進行如下操作

  alter system set job_queue_processes=0;
   alter system set aq_tm_processes=0;
   lsnrctl stop listener_xxx


      sqlplus “/as sysdba”
   oradebug setmypid
   oradebug unlimit
   oradebug dump systemstate 10
   等1分鐘
   oradebug dump systemstate 10
   等1分鐘
   oradebug dump systemstate 10
   Exit   
   
   如果數據庫處於HANG狀態:
   sqlplus “/as sysdba”
   oradebug setmypid
   oradebug unlimit
   oradebug hanganalyze 3
   等1分鐘
   oradebug hanganalyze 3
   oradebug dump systemstate 10
   等1分鐘
   oradebug dump systemstate 10
   等1分鐘
   oradebug dump systemstate 10
   Exit

   該步驟超過15分鐘,停止做systemstate dump
   

    再次生成OS級kill -9腳本,KILL所有ORACLE用戶進程

   再次生成DB級kill session腳本,kill所有ORACLE用戶進程

   Select group#, status, archived from v$log where status in ('ACTIVE', 'CURRENT');   
   select RECOVERY_ESTIMATED_IOS,ACTUAL_REDO_BLKS,TARGET_REDO_BLKS,LOG_FILE_SIZE_REDO_BLKS,TARGET_MTtr,ESTIMATED_MTTR from v$Instance_recovery;
   
   如果group處於active 狀態的個數超過1個,並且v$instance_recovery.estimated_mttr大於600秒則最好延遲數據庫的關閉,等待I/O量下降,
   等到v$instance_recovery.estimated_mttr小於v$instance_recovery.target_mttr,否則數據庫啓動的時間會達到v$instance_recovery.estimated_mttr的時間。
   (如果v$instance_recovery.estimated_mttr小於600秒,啓動數據庫採用方法一,否則採用方法二。)

Alter system checkpoint;
Alter system switch logfile;
Shutdown immediate

等5分鐘,關閉還未結束,alert.log中沒有相關的關閉信息
shutdown abort

ps -ef|grep LOCAL|grep oracle"$ORACLE_SID"
ps -ef|grep ora_|grep "$ORACLE_SID"
使用kill -9 pid


ipcs –a |grep ORACLE_USER
查找信號燈是否未釋放,如果未釋放,使用ipcrm清理信號燈:
ipcrm -m shmid
ipcrm -s semid


6 startup mount

7 alter database open

8 檢查數據庫狀態

   spool /tmp/sess_startup.log
   alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';   
   select sid, serial#, username, machine, program, module, last_call_et,logon_time from v$session;
   select s.sid, s.serial#, s.username, s.machine,s.program,sw.event
   	from v$session_wait sw, v$session s
   	where sw.sid=s.sid
   	and sw.event not like 'SQL%'
   	and sw.event not like 'rdbms%'
   	and sw.event not like '%timer';
   select status from v$instance;
   spool off


9 檢查當前正在進行的回滾事務

   Select ktuxeusn,to_char(sysdate,'DD-MON-YYYY HH24:MI:SS'),ktuxesiz,ktuxesta from x$ktuxe Where ktuxecfl='DEAD';
   ktuxesiz爲0表示事務回滾結束,如果不等於0也不必等待。


 

10 啓動監聽

lsnrctl start $ORACLE_SID


 

發佈了13 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章