很多情況下,oracle hang導致sqlplus無法連線,從而無法獲得oracle系統和程序狀態,使得定位問題缺少強有力的依據。從 oracle10g 開始, sqlplus 提供了-prelim選項,在系統已經hang的時候可以連線到 sga 而不是資料庫,也就是說沒有 session 被建立。從而在oracle掛起時依然能獲得資料庫狀態。
sqlplus -prelim "/as sysdba"
在prelim模式下,不可以查詢資料字典,但可以關閉資料庫
sql> select status from v$instance;
select status from v$instance
* error at line 1:
ora-01012: not logged on
可以使用oradebug,對於系統診斷,已經足夠了
dump系統狀態
sql> oradebug setmypid
statement processed.
sql> oradebug unlimit
statement processed.
sql> oradebug dump systemstate 266
statement processed.
dump hanganalyze
sql> oradebug hanganalyze 3
對於rac
sql> oradebug setmypiddump 程序狀態sql> oradebug setinst all
sql> oradebug -g def hanganalyze 3
sql> oradebug dump processstate 10
statement processed.
強行關閉資料庫
sql> shutdown abort
oracle instance shut down.
1. 在資料庫上啟用10046事件
sql> alter system set events 『10046 trace name context forever』;
system altered.
2. 先用普通方式連線
sqlplus /nolog
sql*plus: release 11.1.0.6.0 – production on tue feb 23 13:21:59 2010
idle> conn / as sysdba
connected
sql> exit
disconnected from oracle database 11g enterprise edition release 11.1.0.6.0 – 64bit production
3. 加prelim引數連線
sqlplus -prelim /nolog從上面的資訊可以看到,在使用 prelim 連線時,提示為「初級連線已建立」,退出 sqlplus沒有顯示 banner。sql*plus: release 11.1.0.6.0 – production on tue feb 23 13:30:16 2010
idle> conn / as sysdba
prelim connection established
error:
ora-01012: not logged on
process id: 0
session id: 0 serial number: 0
idle> exit
disconnected from oracle
也可以通過下面的方式來用 prelim 方式連線資料庫:
sqlplus /nolog
set _prelim on
connect / as sysdba
prelim connection established
4. 檢視資料庫10046 trace
從trace檔案中可以發現在正常連線時,連線上資料庫後, sqlplus自動執行了下面的sql:
alter session set nls_language='simplified chinese' nls_territory='china' nls_currency= '¥' nls_iso_currency='china' nls_numeric_characters='.,' nls_calendar='gregorian' nls_date_format='dd-mon-rr' nls_date_language='simplified chinese' nls_sort='binary' time_zone='+08:00′ nls_comp='binary' nls_dual_currency='¥' nls_time_format='hh.mi.ssxff am' nls_timestamp_format='dd-mon-rr hh.mi.ssxff am' nls_time_tz_format='hh.mi.ssxff am tzr' nls_timestamp_tz_format='dd-mon-rr hh.mi.ssxff am tzr'
select value$ from props$ where name ='global_db_name'
select sys_context('userenv','server_host'),sys_context('userenv','db_unique_name'),sys_context('userenv','instance_name'),sys_context('userenv','service_name'),instance_number,startup_time,sys_context('userenv','db_domain') from v$instance where instance_name=sys_context('userenv','instance_name')
select decode(failover_method,null,0,'basic',1,'preconnect',2,'preparse',4,0),decode(failover_type,null,1,'none',1,'session',2,'select',4,1),failover_retries,failover_delay,flags from service$ where name = :1
而使用prelim 連線上資料庫後,沒有生成 10046 trace 檔案,沒有執行sql,也就是沒有執行任何初始化動作和查詢必要的資訊。也許這就是稱之為「初級連線」的原因吧。
由於使用prelim方式連線沒有執行sql語句,所以在某些資料庫hang住的情況下,能夠連線上資料庫。比如由於library cache latch被長時間持有不能釋放,不能解析sql語句引起的hang。有的人會說,我的應用剛連上去還沒做任何操作就 hang 住了。這只是表面現象,連線上資料庫後,一般都會做一些初始化的操作,如設定環境之類的。
以上來自《oracle運維最佳實踐》
使用GraphEdit使用
1 註冊元件。其實乙個filter就是乙個com元件,所以使用之前需要註冊,可以有兩種方法對元件進行註冊。1.直接使用命令。命令列下輸入 regsvr32 hqtlystd.ax 編譯之後你會在工程目錄下的debug中找到hqtlystd.ax,這個就是要用的filter 即可註冊成功。2.vc6....
MySQL使用學習使用 mysql學習使用
1 mysql學習 1 安裝 ubuntu下直接安裝 apt get install mysql server 2 檢查伺服器是否啟動 sudo netstat tap grep mysql,如果啟動成功,出現以下資訊 tcp00localhost.localdomain mysql listen ...
學習使用CSDN markdown使用
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...