国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Oracle ErrorStack 使用和閱讀詳解

一、概述
在Oracle數(shù)據(jù)庫(kù)運(yùn)行過程中,我們經(jīng)常會(huì)遇到這樣或那樣的錯(cuò)誤,但是錯(cuò)誤的提示并不具體,加大了我們?cè)谠\斷問題時(shí)的難度。
ErrorStack是Oracle提供的一種對(duì)于錯(cuò)誤堆棧進(jìn)行跟蹤的方法,通過設(shè)置跟蹤可以將一些指定錯(cuò)誤的后臺(tái)信息詳細(xì)的轉(zhuǎn)儲(chǔ)出來,寫入跟蹤文件,幫助我們?cè)\斷問題。
備注:
1、當(dāng)oracle發(fā)生關(guān)鍵的錯(cuò)誤諸如:ora-600,Errorstack是自動(dòng)被oracle dump寫入trace文件中。
2、當(dāng)你在alert.log里面看見這類錯(cuò)誤,并提示已經(jīng)產(chǎn)生trace文件。打開對(duì)應(yīng)的trace后,你會(huì)發(fā)現(xiàn)這類trace文件一般都是以“ksedmp:internal or fatal error"開頭,"kesdmp"意味著Kernel Service Error Dump,這一行下面的內(nèi)容就是errorstack記錄的錯(cuò)誤堆棧!

Errorstack dump也可以通過使用Oradebug errorstack 3手工調(diào)用,前提是先使用Oradebug setospid設(shè)定了目標(biāo)進(jìn)程之后。Oradebug Errorstack對(duì)于診斷一個(gè)session似乎Hang住(但是在v$session_wait里面并未出現(xiàn)合理的wait event)或者是比正常時(shí)消耗更多資源時(shí),獲取當(dāng)前session執(zhí)行sql、具體的變量值等等信息,從而幫助你找到問題根源!

二、跟蹤級(jí)別和方法
ErrorStack主要有4個(gè)跟蹤級(jí)別,如下
  • 0 僅轉(zhuǎn)儲(chǔ)錯(cuò)誤堆棧
  • 1 轉(zhuǎn)儲(chǔ)錯(cuò)誤堆棧和函數(shù)調(diào)用堆棧
  • 2 Level 1 + ProcessState
  • 3 Level 2 + Context area (一般我們?cè)\斷問題,都是使用這個(gè)級(jí)別的跟蹤!)
ErrorStack設(shè)置方法,如下(僅指定特定的錯(cuò)誤代碼,只有這個(gè)特定的錯(cuò)誤出現(xiàn)時(shí)才能被觸發(fā)?。?/span>
  • 實(shí)例級(jí)別:alter system set events='984 trace name errorstack forever,level 3' scope=spfile;
  • 會(huì)話級(jí)別: alter session set events='984 trace name errorstack forever,level 3';
  • oradebug: 1、oradebug setospid xxxx; 2、oradebug dump errorstack 3   --當(dāng)前session正在運(yùn)行的語句
三、ErrorStack跟蹤文件中的內(nèi)容
Errorstack跟蹤文件有很多信息,這里我們主要講解對(duì)我們?cè)\斷問題最有用的四個(gè)部分的內(nèi)容(其它很多內(nèi)容我們無法看懂),如下
  • 從Errorstack跟蹤文件中發(fā)現(xiàn)當(dāng)前正在執(zhí)行SQL文本。
  • 從Errorstack跟蹤文件中發(fā)現(xiàn)當(dāng)前正在執(zhí)行PL/SQL包和PL/SQL source code line number。
  • 從Errorstack跟蹤文件中發(fā)現(xiàn)當(dāng)前bind variable value。
  • 從Errorstack跟蹤文件中發(fā)現(xiàn)一個(gè)cursor正在使用多少private memory(UGA)。
針對(duì)上面的四個(gè)部分,我將通過一個(gè)具體的errorstack跟蹤文件示例來展示盒加深理解,errorstack的跟蹤文件如下(具體生成方式代碼,放在最后了)。這一部分的內(nèi)容主要參考tanelpoder大牛的博客。
1、從Errorstack跟蹤文件中發(fā)現(xiàn)當(dāng)前正在執(zhí)行SQL文本
這一部分非常容易找到,當(dāng)前sql語句的文本信息在跟蹤文件的最前面部分(可以搜索Current SQL statement for this session)
Trace file /u01/oracle/diag/rdbms/cn100/cn100/trace/cn100_ora_10848.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options
ORACLE_HOME = /u01/oracle/product/11.2.0
System name:    Linux
Node name:      192oracle.cn100.com
Release:        2.6.32-358.el6.x86_64
Version:        #1 SMP Fri Feb 22 00:31:26 UTC 2013
Machine:        x86_64
Instance name: cn100
Redo thread mounted by this instance1
Oracle process number26
Unix process pid: 10848, image: oracle@192oracle.cn100.com (TNS V1-V3)


*** 2014-07-01 11:16:36.260
*** SESSION ID:(61.133602014-07-01 11:16:36.260
*** CLIENT ID:() 2014-07-01 11:16:36.260
*** SERVICE NAME:(SYS$USERS) 2014-07-01 11:16:36.260
*** MODULE NAME:(SQL*Plus) 2014-07-01 11:16:36.260
*** ACTION NAME:() 2014-07-01 11:16:36.260
 
dbkedDefDump(): Starting a non-incident diagnostic dump (flags=0x0, level=3, mask=0x0)
----- Error Stack Dump -----
ORA-01438value larger than specified precision allowed for this column
----- Current SQL Statement for this session (sql_id=b8n03s73k7d39) -----  --可以看到,當(dāng)前SQL就在這一行下面
INSERT INTO DH_T VALUES (:B2 ,:B1 )
----- PL/SQL Stack -----
----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
0x1075fcd10         6  procedure DBMON.P_DH1
0xfcfaebe8         7  procedure DBMON.P_DH2
0x10e7d6420         1  anonymous block

----- Call Stack Trace -----
calling              call     entry                argument values in hex      
location             type     point                (? means dubious value)     
-------------------- -------- -------------------- ----------------------------
skdstdst()+36        call     kgdsdst()            000000000 ? 000000000 ?
                                                   7FFF332C8AD8 ? 000000001 ?
                                                   7FFF332CCFD8 ? 000000000 ?
......為了排版,后續(xù)省略......

2、從Errorstack跟蹤文件中發(fā)現(xiàn)當(dāng)前正在執(zhí)行PL/SQL包和PL/SQL source code line number
Errorstack跟蹤文件和前面一樣,如下
Trace file /u01/oracle/diag/rdbms/cn100/cn100/trace/cn100_ora_10848.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options
ORACLE_HOME = /u01/oracle/product/11.2.0
System name:    Linux
Node name:      192oracle.cn100.com
Release:        2.6.32-358.el6.x86_64
Version:        #1 SMP Fri Feb 22 00:31:26 UTC 2013
Machine:        x86_64
Instance name: cn100
Redo thread mounted by this instance1
Oracle process number26
Unix process pid: 10848, image: oracle@192oracle.cn100.com (TNS V1-V3)


*** 2014-07-01 11:16:36.260
*** SESSION ID:(61.133602014-07-01 11:16:36.260
*** CLIENT ID:() 2014-07-01 11:16:36.260
*** SERVICE NAME:(SYS$USERS) 2014-07-01 11:16:36.260
*** MODULE NAME:(SQL*Plus) 2014-07-01 11:16:36.260
*** ACTION NAME:() 2014-07-01 11:16:36.260
 
dbkedDefDump(): Starting a non-incident diagnostic dump (flags=0x0, level=3, mask=0x0)
----- Error Stack Dump -----
ORA-01438value larger than specified precision allowed for this column
----- Current SQL Statement for this session (sql_id=b8n03s73k7d39) -----  --可以看到,當(dāng)前SQL就在這一行下面
INSERT INTO DH_T VALUES (:B2 ,:B1 )
----- PL/SQL Stack -----
----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
0x1075fcd10         6  procedure DBMON.P_DH1
0xfcfaebe8         7  procedure DBMON.P_DH2
0x10e7d6420         1  anonymous block


----- Call Stack Trace -----
calling              call     entry                argument values in hex      
location             type     point                (? means dubious value)     
-------------------- -------- -------------------- ----------------------------
skdstdst()+36        call     kgdsdst()            000000000 ? 000000000 ?
                                                   7FFF332C8AD8 ? 000000001 ?
                                                   7FFF332CCFD8 ? 000000000 ?
......為了排版,后續(xù)省略......
注意上面跟蹤文件中PL/SQL標(biāo)紅那一部分,就是我們關(guān)注的部分。
如果進(jìn)行errorstack跟蹤式,跟蹤進(jìn)程執(zhí)行的是一個(gè)PL/SQL調(diào)用,那么PL/SQL調(diào)用堆也將被跟蹤下來(在PL/SQL Call Stack部分)。這部分告訴你錯(cuò)誤發(fā)生時(shí)Oracle在執(zhí)行具體哪個(gè)PL/SQL過程(包or函數(shù))以及errorstack跟蹤過程中的具體哪個(gè)調(diào)用發(fā)生錯(cuò)誤。這對(duì)我們?cè)\斷問題非常有幫助
PL/SQL Call Stack包含三列,如下
  1. object handle
  2. line number
  3. object name
下面我們一一介紹這三列的含義:
1、object handle
object handle是這個(gè)對(duì)象(PL/SQL過程、包、函數(shù)、匿名塊)被load進(jìn)library cache中的內(nèi)存地址,可以通過這個(gè)映射地址和X$KGLOB.KGLHDADR表列關(guān)聯(lián)起來以發(fā)現(xiàn)那個(gè)對(duì)象是正在被處理。如下
SQL> select kglnaown,kglnaobj,kglhdadr from X$KGLOB a where KGLHDADR='00000001075FCD10';
KGLNAOWN   KGLNAOBJ   KGLHDADR
---------- ---------- ----------------
DBMON      P_DH1      00000001075FCD10
2、line number
這個(gè)是非常重要的信息,它將告訴你當(dāng)errorstack調(diào)用發(fā)生時(shí)正在執(zhí)行的PL/SQL代碼(可以定位到代碼中的具體行)。例如,在如上的輸出中,在這個(gè)匿名塊的第1行調(diào)用了DBMON.P_DH2存儲(chǔ)過程,而DBMON.P_DH2存儲(chǔ)過程在第7行調(diào)用了另外一個(gè)存儲(chǔ)過程DBMON.P_DH1,當(dāng)errorstack跟蹤發(fā)生時(shí)正在執(zhí)行DBMON.P_DH2存儲(chǔ)過程中的第6行代碼。
3、object name
PL/SQL存儲(chǔ)的對(duì)象名(或者匿名塊,當(dāng)對(duì)象并沒有存儲(chǔ)在一個(gè)過程中),如果是匿名塊(匿名塊的文本可以通過V$SQL發(fā)現(xiàn)),你可以關(guān)聯(lián)這個(gè)地址和V$SQL.ADDRESS來發(fā)現(xiàn)匿名塊的文本信息。

以上的PL/SQL call stack僅僅包含三行。
0x1075fcd10         6  procedure DBMON.P_DH1
0xfcfaebe8          7  procedure DBMON.P_DH2
0x10e7d6420         1  anonymous block

應(yīng)該從下而上來閱讀一個(gè)PL/SQL call stack,例如
1.底部的行可以告訴我們正在執(zhí)行一個(gè)匿名塊以及在這個(gè)匿名塊的第一行,它在調(diào)用DBMON.P_DH2存儲(chǔ)過程
2.第二行可以告訴我們DBMON.P_DH2存儲(chǔ)過程在第7行調(diào)用了另外一個(gè)存儲(chǔ)過程DBMON.P_DH1
3.DBMON.P_DH2存儲(chǔ)過程中的第6行代碼出現(xiàn)錯(cuò)誤,errorstack信息被轉(zhuǎn)儲(chǔ)。

通過查詢DBA_SOURCE,我們可以與errorstack跟蹤文件中的PL/SQL call stack部分信息進(jìn)行驗(yàn)證,如下。            
SQL> select line, text from dba_source where owner = 'DBMON' and  name = 'P_DH2' order by line asc;
      LINE TEXT
---------- ------------------------------------------------------------
         1 procedure p_dh2 as
         2    v_cnt number;
         3 begin
         4    ----just for errorstack test
         5    select count(*) into v_cnt from dh_t;
         6    dbms_output.put_line('the dh_t count is '||v_cnt);
         7    p_dh1;
         8 end;
         9
9 rows selected.
SQL> select line, text from dba_source where owner = 'DBMON' and  name = 'P_DH1' order by line asc;
      LINE TEXT
---------- ------------------------------------------------------------
         1 procedure p_dh1 as
         2   v_id number :=1234335;
         3   v_name varchar2(200) :='oradh';
         4 begin
         5    --just for errorstack test
         6    insert into dh_t values (v_id,v_name);
         7    commit;
         8 end;
         9
9 rows selected.
你可以發(fā)現(xiàn)會(huì)話正在執(zhí)行的PL/SQL第6行(一個(gè)insert語句導(dǎo)致錯(cuò)誤)。
通常,當(dāng)error dump,crash,hang發(fā)生時(shí)(頂部的行是”parent" function遞歸調(diào)用的“child”function正在執(zhí)行的代碼),PL/SQL errorstack告訴我們精確的PL/SQL code。     

3、從Errorstack跟蹤文件中發(fā)現(xiàn)當(dāng)前bind variable value
為什么找到具體的語句后,我們還需要尋找具體的綁定變量值??可以歸納為如下四種原因
  1. 一個(gè)會(huì)話可能以某種方式變的非常消耗CPU,并且會(huì)話的wait等待時(shí)間沒有任何意義.
  2. 你需要調(diào)查什么SQL正在被執(zhí)行,并且你需要查看SQL帶有的綁定變量
  3. SQL的執(zhí)行計(jì)劃是正常的,但是性能卻非常低下
  4. 可以假設(shè)當(dāng)某些表或者行源變的大的時(shí)候,存在數(shù)據(jù)傾斜,CBO沒有計(jì)算出正確的執(zhí)行計(jì)劃。
因此,你需要知道當(dāng)問題發(fā)生時(shí)SQL使用的綁定變量是什么,不幸的是Oracle中并沒有一個(gè)V$視圖讓我們?nèi)ゲ榭茨硞€(gè)session的當(dāng)前綁定變量值。V$SQL_BIND_CAPTURE視圖僅僅隨機(jī)的采樣綁定變量值,并不存儲(chǔ)所有的被使用的綁定變量值,而dbms_xplan.display_cursor中顯示的也只是第一次窺探的綁定變量值.

Oracle 11gR2中實(shí)時(shí)的SQL Monitoring特性能夠達(dá)到此目的。在V$SQL_MONITOR中有一列BIND_XML,此列包含正在運(yùn)行的足夠長(zhǎng)時(shí)間(默認(rèn)占用CPU超過5s的SQL,都會(huì)出現(xiàn)在次視圖中)的bind variable values.但是這個(gè)只有在11gR2并且具有Diag+Tuning pack licenses時(shí)才有效。
注意:由于SQL語句的綁定變量值存在于進(jìn)程的PGA中的私有內(nèi)存中,因此不能輕易的跟蹤另一個(gè)進(jìn)程私有內(nèi)存。errorstack跟蹤文件中中包含CURSORDUMP,也就包含我們想要得到的bind variable value。

我們繼續(xù)看開始的跟蹤文件,如下
Trace file /u01/oracle/diag/rdbms/cn100/cn100/trace/cn100_ora_10848.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options
ORACLE_HOME = /u01/oracle/product/11.2.0
System name:    Linux
Node name:      192oracle.cn100.com
Release:        2.6.32-358.el6.x86_64
Version:        #1 SMP Fri Feb 22 00:31:26 UTC 2013
Machine:        x86_64
Instance name: cn100
Redo thread mounted by this instance1
Oracle process number26
Unix process pid: 10848, image: oracle@192oracle.cn100.com (TNS V1-V3)


*** 2014-07-01 11:16:36.260
*** SESSION ID:(61.133602014-07-01 11:16:36.260
*** CLIENT ID:() 2014-07-01 11:16:36.260
*** SERVICE NAME:(SYS$USERS) 2014-07-01 11:16:36.260
*** MODULE NAME:(SQL*Plus) 2014-07-01 11:16:36.260
*** ACTION NAME:() 2014-07-01 11:16:36.260
 
dbkedDefDump(): Starting a non-incident diagnostic dump (flags=0x0, level=3, mask=0x0)
----- Error Stack Dump -----
ORA-01438value larger than specified precision allowed for this column
----- Current SQL Statement for this session (sql_id=b8n03s73k7d39) -----  --可以看到,當(dāng)前SQL就在這一行下面
INSERT INTO DH_T VALUES (:B2 ,:B1 )
----- PL/SQL Stack -----
----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
0x1075fcd10         6  procedure DBMON.P_DH1
0xfcfaebe8         7  procedure DBMON.P_DH2
0x10e7d6420         1  anonymous block


----- Call Stack Trace -----
calling              call     entry                argument values in hex      
location             type     point                (? means dubious value)     
-------------------- -------- -------------------- ----------------------------
skdstdst()+36        call     kgdsdst()            000000000 ? 000000000 ?
                                                   7FFF332C8AD8 ? 000000001 ?
                                                   7FFF332CCFD8 ? 000000000 ?
......為了排版,后續(xù)省略......

打開跟蹤文件,通常第一步做的是搜索第一個(gè)"Session Cursor Dump",當(dāng)搜索它的時(shí)候,將看到如下的輸出
----- Session Cursor Dump -----
Current cursor2, pgadep=1

Open cursors(pls, sys, hwm, max): 3(11641000)
 NULL=0 SYNTAX=0 PARSE=0 BOUND=3 FETCH=0 ROW=0
Cached frame pages(total, free):
 4k(118), 8k(00), 16k(00), 32k(00)

----- Current Cursor -----

  xsc=0x7f5227898580 ctx=0xf92d7aa8 pgactx=0xf92d7aa8 ctxcbk=0xf92d74f8 ctxqbc=(nil) ctxrws=0x10293a4c0
----- Explain Plan Dump -----
----- Compact Format (Stream) -----
 
Dumping stream from 0 to 22
----------------------------------
 
0000: 143 137  23   1   1   0 105   0   0   0   1   0   0   0   0  21   9   4   6   7    ......i.............
0020:   0 142                                                                            ..
----- Plan Table -----
 
============
Plan Table
============
--------------------------------------------+-----------------------------------+
| Id  | Operation                 | Name    | Rows  | Bytes | Cost  | Time      |
--------------------------------------------+-----------------------------------+
0   | INSERT STATEMENT          |         |       |       |     1 |           |
1   |  LOAD TABLE CONVENTIONAL  |         |       |       |       |           |
--------------------------------------------+-----------------------------------+
 
Content of other_xml column
===========================
  db_version     : 11.2.0.1
  parse_schema   : DBMON
  plan_hash      : 0
  plan_hash_2    : 0
 
Compilation Environment Dump
optimizer_mode_hinted               = false
optimizer_features_hinted           = 0.0.0
parallel_execution_enabled          = true
parallel_query_forced_dop           = 0
......為了排版,后續(xù)省略......
我們可以發(fā)現(xiàn)如下有用的內(nèi)容
  1. Current cursor: 2,這個(gè)告訴我們?cè)谶@個(gè)會(huì)話的UGA打開的cursor中,當(dāng)前正在執(zhí)行Cursor# 6 游標(biāo)
  2. the pgadep:1變量告訴我們PGA depth,也就是這個(gè)查詢執(zhí)行的遞歸的深度
如果pgadep為0,它意味著這個(gè)查詢是一個(gè)top-level查詢,正在被用戶或者應(yīng)用通過OCI接口在執(zhí)行。
pgadep為1,意味著它是一個(gè)遞歸的查詢,通過遞歸程序接口(RPI)來執(zhí)行,可能是數(shù)據(jù)字典查詢或者僅僅通過PL/SQL調(diào)用執(zhí)行的SQL。
所以,能夠發(fā)現(xiàn)當(dāng)前正在執(zhí)行的當(dāng)前查詢的綁定變量值,我們需要做的是在trace file中朝前搜索Cursor2#,如下
注意:這個(gè)搜索詞是大小寫敏感的。
Cursor#2(0x7f5227951aa0) state=BOUND curiob=0x7f5227898580
 curflg=cd fl2=0 par=(nil) ses=0x129a8edc0
----- Dump Cursor sql_id=b8n03s73k7d39 xsc=0x7f5227898580 cur=0x7f5227951aa0 -----

LibraryHandle:  Address=f68ce8d8 Hash=c723b469 LockMode=N PinMode=0 LoadLockMode=0 Status=VALD
  ObjectName:  Name=INSERT INTO DH_T VALUES (:B2 ,:B1 )

    FullHashValue=38f6bac85b76f427b45003c1c723b469 Namespace=SQL AREA(00) Type=CURSOR(00) Identifier=3341005929 OwnerIdn=148
  Statistics:  InvalidationCount=0 ExecutionCount=1 LoadCount=2 ActiveLocks=1 TotalLockCount=1 TotalPinCount=1
  Counters:  BrokenCount=1 RevocablePointer=1 KeepDependency=1 KeepHandle=1 BucketInUse=0 HandleInUse=0
  Concurrency:  DependencyMutex=f68ce988(0100) Mutex=f68cea00(611906)
  Flags=RON/PIN/TIM/PN0/DBN/[10012841]
  WaitersLists:
    Lock=f68ce968[f68ce968,f68ce968]
    Pin=f68ce978[f68ce948,f68ce948]
  Timestamp:  Current=07-01-2014 11:16:35
  LibraryObject:  Address=f6b87d18 HeapMask=0000-0001-0001 Flags=EXS[0000] Flags2=[0000] PublicFlags=[0000]
    ChildTable:  size='16'
      Child:  id='0' Table=f6b88bc8 Reference=f6b88668 Handle=fab7b4c0
    Children:
      Child:  childNum='0'
        LibraryHandle:  Address=fab7b4c0 Hash=0 LockMode=N PinMode=S LoadLockMode=0 Status=VALD
          Name:  Namespace=SQL AREA(00) Type=CURSOR(00)
          Statistics:  InvalidationCount=0 ExecutionCount=1 LoadCount=1 ActiveLocks=1 TotalLockCount=1 TotalPinCount=2
          Counters:  BrokenCount=1 RevocablePointer=1 KeepDependency=0 KeepHandle=0 BucketInUse=0 HandleInUse=0
          Concurrency:  DependencyMutex=fab7b570(0000) Mutex=f68cea00(611906)
          Flags=RON/PIN/PN0/EXP/[10012111]
          WaitersLists:
            Lock=fab7b550[fab7b550,fab7b550]
            Pin=fab7b560[fab7b530,fab7b530]
          LibraryObject:  Address=f6569b20 HeapMask=0000-0001-0001 Flags=EXS[0000] Flags2=[0000] PublicFlags=[0000]
            DataBlocks:
              Block:  #='0' name=CCUR^c723b469 pins=0 Change=NONE
                Heap=f6a0b38 Pointer=f6569c08 Extent=f6569aa0 Flags=I/-/P/A/-/-
                FreedLocation=0 Alloc=3.093750 Size=3.937500 LoadTime=11473268840
              Block:  #='6' name=SQLA^c723b469 pins=0 Change=NONE
                Heap=f6b88438 Pointer=f92d7aa8 Extent=f92d6e48 Flags=I/-/P/A/-/E
                FreedLocation=0 Alloc=8.890625 Size=11.859375 LoadTime=0
          NamespaceDump:
            Child Cursor:  Heap0=0xf6569c08 Heap6=0xf92d7aa8 Heap0 Load Time=07-01-2014 11:16:35 Heap6 Load Time=07-01-2014 11:16:35
  NamespaceDump:
    Parent Cursor:  sql_id=b8n03s73k7d39 parent=0xf6b87e00 maxchild=1 plk=y ppn=n    kkscs=0xf6b88308 nxt=(nil) flg=18 cld=0 hd=0xfab7b4c0 par=0xf6b87e00
   Mutex 0xf6b88308(00) idn 3000000000
   ct=0 hsh=0 unp=(nil) unn=0 hvl=f6b88c60 nhv=0 ses=(nil)
   hep=0xf6b88398 flg=80 ld=1 ob=0xf6569b20 ptr=0xf92d7aa8 fex=0xf92d6e48
cursor instantiation=0x7f5227898580 used=1404184595 exec_id=16777216 exec=1
 child#0(0xfab7b4c0) pcs=0xf6b88308
  clk=0x10d6111e0 ci=0xf6569c08 pn=0xfdf4c890 ctx=0xf92d7aa8
 kgsccflg=1 llk[0x7f5227898588,0x7f5227898588] idx=6a
 xscflg=c0110676 fl2=d120000 fl3=422a2188 fl4=100
----- Bind Byte Code (IN-----
  Opcode = 6   Bind Rpi Scalar Sql In(may be out) Nocopy NoSkip
  Offsi = 48, Offsi = 0
  Opcode = 6   Bind Rpi Scalar Sql In(may be out) Nocopy NoSkip
  Offsi = 48, Offsi = 32
----- Bind Info (kkscoacd) -----
 Bind#0
  oacdty=02 mxl=22(21) mxlc=00 mal=00 scl=00 pre=00
  oacflg=13 fl2=206001 frm=00 csi=00 siz=24 off=0
  kxsbbbfp=7f5227943d08  bln=22  avl=05  flg=09
  value=1234335
 Bind#1
  oacdty=01 mxl=2000(200) mxlc=00 mal=00 scl=00 pre=00
  oacflg=13 fl2=206001 frm=01 csi=852 siz=2000 off=0
  kxsbbbfp=7f5227943d48  bln=2000  avl=05  flg=09
  value="oradh"
 Frames pfr 0x7f5227897c18 siz=3424 efr 0x7f5227897b38 siz=3376
 Cursor frame dump
  enxt: 3.0x00000550  enxt: 2.0x00000040  enxt: 1.0x000007a0
  pnxt: 1.0x00000030
 kxscphp=0x7f5227961030 siz=984 inu=584 nps=360
 kxscbhp=0x7f5227961920 siz=984 inu=152 nps=0
 kxscwhp=0x7f5227960f40 siz=4056 inu=56 nps=0
注意:重點(diǎn)關(guān)注上面標(biāo)紅字體部份
ErrorStack dump是我們可以很可靠的找到SQL語句當(dāng)前使用的綁定變量值一種方法。另外,還有如下說明:
  • 在errorstack跟蹤文件中發(fā)現(xiàn)Cursor#2,它的state=BOUND,意味著綁定變量值已經(jīng)被賦予的
  • SQL文本是我們?cè)谇懊嬉呀?jīng)查找出來的,我們可以看到兩個(gè)綁定變量值
  • Bind variale numbering是從0開始,所以如果我們想搜索第一個(gè)綁定值,需要搜索Bind#0
4、從Errorstack跟蹤文件中發(fā)現(xiàn)一個(gè)cursor正在使用多少private memory(UGA)
繼續(xù)我們前面的示例,跟蹤文件中能夠度量一個(gè)session的某些游標(biāo)使用了多少UGA私有內(nèi)存。如下

 Cursor#2游標(biāo)部分:
 Cursor frame dump
  enxt: 3.0x00000550  enxt: 2.0x00000040  enxt: 1.0x000007a0
  pnxt: 1.0x00000030
 kxscphp=0x7f5227961030 siz=984 inu=584 nps=360
 kxscbhp=0x7f5227961920 siz=984 inu=152 nps=0
 kxscwhp=0x7f5227960f40 siz=4056 inu=56 nps=0
 Cursor#1游標(biāo)部分:
 Cursor frame dump
  enxt: 12.0x000005c0  enxt: 11.0x00000fd8  enxt: 10.0x00000fa0  enxt: 9.0x00000658
  enxt: 8.0x00000228  enxt: 7.0x00000fd8  enxt: 6.0x00000fa0  enxt: 5.0x00000248
  enxt: 4.0x00000fa0  enxt: 3.0x00000410  enxt: 2.0x00000480  enxt: 1.0x00000f70
  pnxt: 1.0x00000030
 kxscphp=0x7f5227960c70 siz=2792 inu=1056 nps=424
 kxscbhp=0x7f5227960e50 siz=10376 inu=10008 nps=8768

在cursor frame dump部分我們可以看見kxsc開始的一些信息,這些意味著Kernel eXECUTION Shared Cursor,其中的每一行的siz參數(shù)告訴我們當(dāng)前分配的私有內(nèi)存大小。當(dāng)然,我們需要匯總所有的siz,這個(gè)值就是此游標(biāo)的memory usage。
下面是我的一些猜測(cè)匯總:
01.Heap description     Meaning  
02.kxscphp              Cursor permanent heap. Allocated when cursor is opened     
03.kxscdfhp             Cursor default heap - default duration allocations  
04.kxscehp              Cursor ephemeral heap - short lived duration allocations  
05.kxscwhp              Cursor Work heap - used when actually executing the cursor (workareas etc)  
06.kxscbhp              Cursor Bind heap - this is where bind variable values and their metadata are kept.


四、實(shí)驗(yàn)代碼
1、創(chuàng)建表和PL/SQL函數(shù)
create table dh_t (id number(2,1),name varchar2(200));
create or replace procedure p_dh1 as
  v_id number :=1234335;
  v_name varchar2(200) :='oradh';
begin
   --just for errorstack test
   insert into dh_t values (v_id,v_name);
   commit;
end;
/
create or replace procedure p_dh2 as
   v_cnt number;
begin
   ----just for errorstack test
   select count(*into v_cnt from dh_t;
   dbms_output.put_line('the dh_t count is '||v_cnt);
   p_dh1;
end;
/  
2、進(jìn)行errorstack跟蹤
SQL*Plus: Release 11.2.0.1.0 Production on Tue Jul 1 11:15:52 2014
Copyright (c19822009, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options
SQL> set linesize 200 pagesize 999
SQL> col tracefile format a100
SQL> select spid,tracefile from v$process a where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));

SPID                     TRACEFILE
---------------    --------------------------------------------------------------------------------------------------
10848                    /u01/oracle/diag/rdbms/cn100/cn100/trace/cn100_ora_10848.trc

SQL> alter session set events='1438 trace name errorstack forever,level 3';
Session altered.
SQL> exec p_dh2;
BEGIN p_dh2; END;

*
ERROR at line 1:
ORA-01438value larger than specified precision allowed for this column
ORA-06512at "DBMON.P_DH1", line 6
ORA-06512at "DBMON.P_DH2", line 7
ORA-06512at line 1

[oracle@192oracle ~]$ ls -ltr /u01/oracle/diag/rdbms/cn100/cn100/trace/cn100_ora_10848.trc
-rw-r----- 1 oracle oinstall 12190347 Jul  1 11:16 /u01/oracle/diag/rdbms/cn100/cn100/trace/cn100_ora_10848.trc

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Oracle 數(shù)據(jù)庫(kù)的綁定變量特性及應(yīng)用
PL/SQL導(dǎo)出表數(shù)據(jù)時(shí)發(fā)生 ORA-00904: "XXXXX": 標(biāo)識(shí)符無效,處理記錄
使用ErrorStack進(jìn)行Oracle錯(cuò)誤跟蹤及診斷
最全的Java筆試題庫(kù)之選擇題篇-總共234道【181~234】
ODAC(V9.5.15) 學(xué)習(xí)筆記(四)TOraDataSet
Oracle學(xué)習(xí)總結(jié)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服