怎樣獲取發生錯誤的會話資訊(轉)
我們可以設定一個事件,在發生錯誤時,產生一個Trace檔案,事件通常使用下面的命令格式:
- alter system set events '
trace name errorstack level ;' - alter session set events '
trace name errorstack level ;'
alter system set events 'trace name errorstack level '; alter session set events ' trace name errorstack level ';
然而,使用alter system命令設定事件後,只會對新連線的會話有效。比如下面的測試:
[@more@]某些Oracle錯誤,並不是總是伴隨著產生trace檔案,這些錯誤,對Oracle來說並不是嚴重的錯誤,比如像ORA-01555這樣的錯誤。我們可以設定一個事件,在發生錯誤時,產生一個Trace檔案,事件通常使用下面的命令格式:
- alter system set events '
trace name errorstack level ;' - alter session set events '
trace name errorstack level ;'
alter system set events 'trace name errorstack level '; alter session set events ' trace name errorstack level ';
然而,使用alter system命令設定事件後,只會對新連線的會話有效。比如下面的測試:
- 會話一:
- [oracle@xty scripts]$ sqlplus test/test
- SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jul 25 23:25:51 2009
- Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
- Connected to:
- Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
- With the Partitioning, OLAP, Data Mining and Real Application Testing options
- SQL> drop table t1;
- Table dropped.
- SQL>
- SQL> create table t1 ( a number primary key);
- Table created.
- SQL> insert into t1 values (1);
- 1 row created.
- SQL> commit;
- Commit complete.
- 會話二:
- alter system set events '1 trace name errorstack level 1';
- 會話一:
- SQL> insert into t1 values (1);
- insert into t1 values (1)
- *
- ERROR at line 1:
- ORA-00001: unique constraint (TEST.SYS_C005801) violated
會話一: [oracle@xty scripts]$ sqlplus test/test SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jul 25 23:25:51 2009 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> drop table t1; Table dropped. SQL> SQL> create table t1 ( a number primary key); Table created. SQL> insert into t1 values (1); 1 row created. SQL> commit; Commit complete. 會話二: alter system set events '1 trace name errorstack level 1'; 會話一: SQL> insert into t1 values (1); insert into t1 values (1) * ERROR at line 1: ORA-00001: unique constraint (TEST.SYS_C005801) violated
此時檢查user_dump_dest目錄,沒有相應的trace檔案產生,如果我們再執行下面的動作:
- SQL> conn test/test
- Connected.
- SQL> insert into t1 values (1);
- insert into t1 values (1)
- *
- ERROR at line 1:
- ORA-00001: unique constraint (TEST.SYS_C005801) violated
SQL> conn test/test Connected. SQL> insert into t1 values (1); insert into t1 values (1) * ERROR at line 1: ORA-00001: unique constraint (TEST.SYS_C005801) violated
就可以在user_dump_dest發現產生的trace檔案。
那麼發生錯誤的會話已經連線到資料庫一段時間了,怎麼得到這個會話在的資訊?比如某個資料庫,資料庫中頻繁地報下面的錯誤:
- select sysdate create_time from dual
- ORA-01555 caused by SQL statement below (Query Duration=0 sec, SCN: 0x09e5.0c3c77b1):
- Wed Jul 22 11:17:51 2009
- select g.*,m.* from Tb_Model m right outer join (select t.*,v.table_name from.....
select sysdate create_time from dual ORA-01555 caused by SQL statement below (Query Duration=0 sec, SCN: 0x09e5.0c3c77b1): Wed Jul 22 11:17:51 2009 select g.*,m.* from Tb_Model m right outer join (select t.*,v.table_name from.....
這個ORA-01555錯誤是非常怪異的,首先是查詢DUAL表都會報錯,其次,每次報錯都是“Query Duration=0 sec, SCN: 0×09e5.0c3c77b1”,這裡除了BUG,實在想不到其他的理由 。不過為了查明到底是哪個會話和哪個應用,是不是同一個會話引起,我們需要得到這個引起錯誤的會話的資訊。
這裡,我們可以用觸發器。以SYS使用者執行下面的程式碼:
- create table t ( msg varchar2(4000));
- create or replace trigger xj_error
- after servererror on database
- declare
- l_sql_text ora_name_list_t;
- l_n number;
- begin
- if ( is_servererror(1555) )
- then
- insert into t values ( 'ora_sysevent = ' || ora_sysevent );
- insert into t values ( 'ora_login_user = ' || ora_login_user );
- insert into t values ( 'ora_server_error = ' || ora_server_error(1) );
- l_n := ora_sql_txt( l_sql_text );
- for i in 1 .. l_n
- loop
- insert into t values ( 'l_sql_text(' || i || ') = ' || l_sql_text(i) );
- end loop;
- insert into t
- select 'sid:' || sid || ' machina:' || machine || ' program:' || program || ' module:' || module from v$session where sid=(select sid from v$mystat where rownum=1);
- insert into t values ('IP:' || sys_context('USERENV', 'IP_ADDRESS') || ' HOST:' || sys_context('USERENV', 'HOST'));
- end if;
- end;
- /
create table t ( msg varchar2(4000)); create or replace trigger xj_error after servererror on database declare l_sql_text ora_name_list_t; l_n number; begin if ( is_servererror(1555) ) then insert into t values ( 'ora_sysevent = ' || ora_sysevent ); insert into t values ( 'ora_login_user = ' || ora_login_user ); insert into t values ( 'ora_server_error = ' || ora_server_error(1) ); l_n := ora_sql_txt( l_sql_text ); for i in 1 .. l_n loop insert into t values ( 'l_sql_text(' || i || ') = ' || l_sql_text(i) ); end loop; insert into t select 'sid:' || sid || ' machina:' || machine || ' program:' || program || ' module:' || module from v$session where sid=(select sid from v$mystat where rownum=1); insert into t values ('IP:' || sys_context('USERENV', 'IP_ADDRESS') || ' HOST:' || sys_context('USERENV', 'HOST')); end if; end; /
過一段時間,然後可以從SYS.T表可以得到:
- SQL> select * from t;
- MSG
- --------------------------------------------------------------------
- ora_sysevent = SERVERERROR
- ora_login_user = XXX
- ora_server_error = 1555
- l_sql_text(1) = select g.*,m.* from Tb_Model m right outer join (select t.*,v.t
- ....
- sid:434 machine :temp1 program: module:
- IP:xxx.xxx.xxx.xxx HOST: temp1
SQL> select * from t; MSG -------------------------------------------------------------------- ora_sysevent = SERVERERROR ora_login_user = XXX ora_server_error = 1555 l_sql_text(1) = select g.*,m.* from Tb_Model m right outer join (select t.*,v.t .... sid:434 machine :temp1 program: module: IP:xxx.xxx.xxx.xxx HOST: temp1
透過得到的會話資訊,得知是一個Web應用的連線,可以安全地KILL之。將這個會話KILL掉,錯誤不再出現。
轉自:http://www.laoxiong.net/how_to_get_session_occured_error.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/789833/viewspace-1037096/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如果往錯誤的NEO地址轉賬會發生什麼
- 怎樣獲取jstree的節點資料_大資料獲客是怎樣獲取精準客源的JS大資料
- Python下獲取視訊的旋轉角度資訊Python
- photoshop匯出png發生未知錯誤的解決方案,ps匯出發生未知錯誤怎麼解決
- 如何獲取 C# 類中發生資料變化的屬性資訊C#
- jQuery Validate獲取驗證錯誤的數目jQuery
- steam磁碟寫入錯誤怎麼解決 steam安裝時發生錯誤怎麼辦
- Python怎樣忽略warning警告錯誤?Python
- JavaScript錯誤資訊JavaScript
- PbootCMS錯誤提示:執行SQL發生錯誤!錯誤:no such column: def1bootSQL
- Javascript 怎樣獲取副檔名?JavaScript
- request保持會話,尋找set-cookie來獲取資料會話Cookie
- 執行SQL發生錯誤!錯誤:disk I/O errorSQLError
- 獲取位置資訊
- 轉自知乎:醫生髮現自己得了癌症,會怎麼樣?
- IDEA發生“Error:java: 錯誤: 不支援發行版本 5”錯誤的解決方案IdeaErrorJava
- PbootCMS執行SQL發生錯誤!錯誤:no such column: def1bootSQL
- PbootCMS 執行SQL發生錯誤!錯誤: no such table:ay_configbootSQL
- tasklist 遠端獲取程式報錯賬號密碼錯誤密碼
- 記錄一次根據錯誤資訊無法定位錯誤的錯誤
- Web應用怎樣獲取Access Token?Web
- 網站首頁系統發生錯誤怎麼處理網站
- 錯誤捕獲
- Linux: 獲取硬碟的UUID資訊Linux硬碟UI
- 獲取.crt證書的資訊
- python 用traceback列印錯誤訊息(轉)Python
- Request 驗證錯誤沒有返回錯誤資訊?
- java學習路程(javaEE)之獲取表單資料、獲取引數、request域、會話技術(Cookie)Java會話Cookie
- 使用捕獲 獲取身份證號的資訊
- 利用DBMS_METADATA包獲取許可權資訊(轉)
- 怎樣高效的爬取資料?
- 顯示驗證的錯誤資訊
- PbootCMS登入請求發生錯誤boot
- mysql-發生系統錯誤1067MySql
- _findnext()除錯中斷,發生訪問錯誤,錯誤定位到ntdll.dll除錯
- 請問PBOOTCMS網站程式提示“執行SQL發生錯誤!錯誤:DISK I/O ERROR”怎麼辦boot網站SQLError
- dcat-admin 怎麼提示不能為空等錯誤資訊
- 劫持SSH會話注入埠轉發會話
- 解決 PBootCMS 中因資料庫名稱錯誤導致的“執行 SQL 發生錯誤!錯誤:no such table: ay_config”問題boot資料庫SQL