plsql 上對Oracle庫的package 包執行重新編譯時,超時無響應

問題描述:

plsql工具下pkg包正常編譯的,中途有一次編譯較慢,便強制結束了plsql進程,重新登錄plsql編譯同一個包無論如何都會無響應卡死。

plsql中kill掉session後重新編譯同樣卡死

原因分析:

1、在編譯過程時plsql未反應便強制關掉了plsql導致

(1)存儲過程編譯沒完成,或者編譯失敗時,oracle 數據庫會自動把相應的存儲過程鎖起來;

(2)DBA_DDL_LOCKS視圖中記錄存儲過程、表結構、視圖、包等數據庫對象鎖的信息;

(3)V$ACCESS視圖顯示數據庫中當前鎖定的對象及訪問它們的會話 。

查詢鎖定(運行中的)的包對應的SID號:
SELECT * FROM V$ACCESS WHERE OBJECT='CMSVOUCHER';
select * from dba_ddl_locks where name='CMSVOUCHER';
根據SID號查出會話信息:
select sid,serial# from v$session where sid in('78','209');
kill掉:
alter system kill session '78,4883';
alter system kill session '209,57021';

如果以上會話kill掉之後還是不行,查詢V$ACCESS時無法出結果,需要重啓數據庫服務器

1. 停應用層的各種程序

    2. 停Oralce的監聽進程

    $ lsnrctl stop

    3. 在獨佔的系統用戶下,備份控制文件:

    $ sqlplus "/as sysdba"

    SQL> alter database backup controlfile to trace;

    4. 在獨佔的系統用戶下,手工切換重作日誌文件,確保當前已修改過的數據存入文件:

  SQL> alter system switch logfile;

    5. 在獨佔的系統用戶下,運行下面SQL語句,生成殺數據庫用戶連接的kill_all_session.sql文件:

    SQL> set head off;

    SQL> set feedback off;

    SQL> set newpage none;

    SQL> spool ./kill_session.sql

    SQL> select 'alter system kill session '''||sid||','||serial#||''';' from v$session where username is not null;

    SQL> spool off;

    6. 在獨佔的系統用戶下,執行殺數據庫用戶連接的kill_session.sql文件

 SQL> @./kill_session.sql

    7. 在獨佔的系統用戶下,關閉數據庫, 輸入命令: shutdown immediate;

SQL> shutdown immediate;

    或者

    SVRMGRL> shutdown immediate;

 8. 啓動oralce的監聽進程

 $ lsnrctl start

    9. 進入獨佔的系統用戶下,啓動Oralce數據庫

$sqlplus /nolog

進入oracle控制檯。輸入命令: sqlplus  / as sysdba;

  SQL> connect / as sysdba

    SQL> startup;

啓動數據庫,輸入命令: startup;

或者   

 $ svrmgrl

    SVRMGRL> connect internal;

    SVRMGRL> startup;

    10.啓動應用層的各種程序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章