問題描述:
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.啓動應用層的各種程序