oradebug工具使用系列一

wisdomone1發表於2015-11-01

結論

1,oracle oradebug檢視命令用oradebug help
2,oradebug各種命令一定要進行分類,不然學習沒有條理性,也不能把相關的命令整合使用
3,oradebug dumplist顯示所有可用的dump列表
4,oradebug dump可以針對dumplist某個dump進行針對性分析與測試;dump列表有不同用途的dump,比如有:asm,library cache,row cache,scn,buffer_cache,flush buffer cache,debug rac os比如crs,css
  等等
5,oradebug peek檢視某個記憶體地址的內容
6,oradebug poke修改某個記憶體地址的內容,也可以回退,請以poke後顯示before為基礎
7,oradebug dump poke_address相關的dump含義暫未理解
8,測試oracebug dump pin_blocks報錯
   ORA-00600: internal error code, arguments: [kssadf_numa:  null parent], [], [], [], [], [], [], [], [], [], [], []


測試



1,資料庫版本
SQL> select * from v$version where rownum=1;


BANNER
----------------------------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production


2,oradebug所有命令
SQL> oradebug help
HELP           [command]                 Describe one or all commands
SETMYPID                                 Debug current process
SETOSPID       <ospid>                   Set OS pid of process to debug
SETORAPID      <orapid> ['force']        Set Oracle pid of process to debug
SETORAPNAME    <orapname>                Set Oracle process name to debug
SHORT_STACK                              Get abridged OS stack
CURRENT_SQL                              Get current SQL
DUMP           <dump_name> <lvl> [addr]  Invoke named dump
DUMPSGA        [bytes]                   Dump fixed SGA
DUMPLIST                                 Print a list of available dumps
EVENT          <text>                    Set trace event in process
SESSION_EVENT  <text>                    Set trace event in session
DUMPVAR        <p|s|uga> <name> [level]  Print/dump a fixed PGA/SGA/UGA variable
DUMPTYPE       <address> <type> <count>  Print/dump an address with type info
SETVAR         <p|s|uga> <name> <value>  Modify a fixed PGA/SGA/UGA variable
PEEK           <addr> <len> [level]      Print/Dump memory
POKE           <addr> <len> <value>      Modify memory
WAKEUP         <orapid>                  Wake up Oracle process
SUSPEND                                  Suspend execution
RESUME                                   Resume execution
FLUSH                                    Flush pending writes to trace file
CLOSE_TRACE                              Close trace file
TRACEFILE_NAME                           Get name of trace file
LKDEBUG                                  Invoke global enqueue service debugger
NSDBX                                    Invoke CGS name-service debugger
-G             <Inst-List | def | all>   Parallel oradebug command prefix
-R             <Inst-List | def | all>   Parallel oradebug prefix (return output
SETINST        <instance# .. | all>      Set instance list in double quotes
SGATOFILE      <SGA dump dir>         Dump SGA to file; dirname in double quotes
DMPCOWSGA      <SGA dump dir> Dump & map SGA as COW; dirname in double quotes
MAPCOWSGA      <SGA dump dir>         Map SGA as COW; dirname in double quotes
HANGANALYZE    [level] [syslevel]        Analyze system hang
FFBEGIN                                  Flash Freeze the Instance
FFDEREGISTER                             FF deregister instance from cluster
FFTERMINST                               Call exit and terminate instance
FFRESUMEINST                             Resume the flash frozen instance
FFSTATUS                                 Flash freeze status of instance
SKDSTTPCS      <ifname>  <ofname>        Helps translate PCs to names
WATCH          <address> <len> <self|exist|all|target>  Watch a region of memory
DELETE         <local|global|target> watchpoint <id>    Delete a watchpoint
SHOW           <local|global|target> watchpoints        Show  watchpoints
DIRECT_ACCESS  <set/enable/disable command | select query> Fixed table access
CORE                                     Dump core without crashing process
IPC                                      Dump ipc information
UNLIMIT                                  Unlimit the size of the trace file
PROCSTAT                                 Dump process statistics
CALL           [-t count] <func> [arg1]...[argn]  Invoke function with arguments
SQL> 


3,oradebug dumplist顯示所有的dump,dump就是可以實時獲取當行某些操作的一些動態執行資訊,便於分析這個操作或物件的,進而進一步進行診斷
從dumplist顯示結果而言,可以大致進行分類,有基於buffer cache,block,redo header,heap dump,rac css各種用途,可見oradebug強大相當牛比
SQL> oradebug dumplist
TRACE_BUFFER_ON
TRACE_BUFFER_OFF
LATCHES --latches哈哈
PROCESSSTATE --processstat
SYSTEMSTATE --systemstate
INSTANTIATIONSTATE
REFRESH_OS_STATS
CROSSIC
CONTEXTAREA
HANGDIAG_HEADER
HEAPDUMP --heapdump,heap就是儲存物件的堆
HEAPDUMP_ADDR
POKE_ADDRESS --poke
POKE_LENGTH
POKE_VALUE
POKE_VALUE0
GLOBAL_AREA
REALFREEDUMP
FLUSH_JAVA_POOL
POOL_SIMULATOR --pga
PGA_DETAIL_GET
PGA_DETAIL_DUMP
PGA_DETAIL_CANCEL
PGA_SUMMARY
MODIFIED_PARAMETERS
EVENT_TSM_TEST
ERRORSTACK ---errorstack
CALLSTACK --callstack
TEST_STACK_DUMP
TEST_GET_CALLER
RECORD_CALLSTACK
EXCEPTION_DUMP
BG_MESSAGES
ENQUEUES --enqueues
KSTDUMPCURPROC
KSTDUMPALLPROCS
KSTDUMPALLPROCS_CLUSTER
SIMULATE_EOV
KSFQP_LIMIT
KSKDUMPTRACE
DBSCHEDULER
LDAP_USER_DUMP
LDAP_KERNEL_DUMP
DUMP_ALL_OBJSTATS
DUMPGLOBALDATA
HANGANALYZE --hanganalyze
HANGANALYZE_PROC --hanganalyze_proc
HANGANALYZE_GLOBAL --hanganalyze_global
GES_STATE --ges_state
OCR --ocr
CSS --css
CRS --crs
SYSTEMSTATE_GLOBAL
GIPC --related rac
MMAN_ALLOC_MEMORY --mman
MMAN_CREATE_DEF_REQUEST
MMAN_CREATE_IMM_REQUEST
MMAN_IMM_REQUEST
DUMP_ALL_COMP_GRANULE_ADDRS
DUMP_ALL_COMP_GRANULES
DUMP_ALL_REQS
DUMP_TRANSFER_OPS
DUMP_ADV_SNAPSHOTS
ADJUST_SCN --adjust scn,相當重要,推進SCN
NEXT_SCN_WRAP
CONTROLF--控制檔案
FLUSH_CACHE --重新整理緩衝池
FULL_DUMPS
BUFFERS
RECOVERY --恢復
SET_TSN_P1
BUFFER
PIN_BLOCKS --pin block
BC_SANITY_CHECK
PIN_RANDOM_BLOCKS
SET_NBLOCKS
CHECK_ROREUSE_SANITY
DUMP_PINNED_BUFFER_HISTORY --dump pinned buffer history
KCBO_OBJ_CHECK_DUMP
KCB_WORKING_SET_DUMP
REDOLOGS --redo logs
ARCHIVE_ERROR --archive errors
LOGHIST
REDOHDR --redo header
LOGERROR 
OPEN_FILES
DATA_ERR_ON
DATA_READ_ERR_ON
DATA_ERR_OFF
BLK0_FMTCHG
UPDATE_BLOCK0_FORMAT ---update block format
TR_SET_BLOCK --tr
TR_SET_ALL_BLOCKS
TR_SET_SIDE
TR_CRASH_AFTER_WRITE
TR_READ_ONE_SIDE
TR_CORRUPT_ONE_SIDE
TR_RESET_NORMAL
TEST_DB_ROBUSTNESS
LOCKS --lock
GC_ELEMENTS   --gc_elements
FILE_HDRS  ---file header
KRB_CORRUPT_INTERVAL  ---krb
KRB_CORRUPT_SIZE
KRB_CORRUPT_REPEAT
KRB_CORRUPT_OFFSET
KRB_PIECE_FAIL
KRB_OPTIONS
KRB_FAIL_INPUT_FILENO
KRB_SIMULATE_NODE_AFFINITY
KRB_TRACE
KRB_BSET_DAYS
KRB_SET_TIME_SWITCH
KRB_OVERWRITE_ACTION
KRB_CORRUPT_SPHEADER_INTERVAL
KRB_CORRUPT_SPHEADER_REPEAT
KRB_CORRUPT_SPBITMAP_INTERVAL
KRB_CORRUPT_SPBITMAP_REPEAT
KRB_CORRUPT_SPBAD_INTERVAL
KRB_CORRUPT_SPBAD_REPEAT
KRB_UNUSED_OPTION
KRBMRSR_LIMIT
KRBMROR_LIMIT
KRBABR_TRACE
KRDRSBF
KRC_TRACE
KRA_OPTIONS
KRA_TRACE
FBTAIL
FBINC
FBHDR
FLASHBACK_GEN
KTPR_DEBUG
DUMP_TEMP  --dump temp
DROP_SEGMENTS  --drop segment
TEST_SPACEBG
TREEDUMP  --treedump ,for index
LONGF_CREATE
KDLIDMP
ROW_CACHE  --row cache
LIBRARY_CACHE  --library cache
LIBRARY_CACHE_OBJECT  --library cache object
CURSORDUMP  --cursor dump
CURSORTRACE  --cursor trace
CURSOR_STATS  --cursor state
XS_SESSION_STATE
SHARED_SERVER_STATE
LISTENER_REGISTRATION  --listener registion
JAVAINFO
KXFPCLEARSTATS  ---kxf
KXFPDUMPTRACE
KXFPBLATCHTEST
KXFXSLAVESTATE
KXFXCURSORSTATE
KXFRHASHMAP
WORKAREATAB_DUMP
KUPPLATCHTEST
OBJECT_CACHE  --object cache
SAVEPOINTS  
RULESETDUMP
RULESETDUMP_ADDR
FAILOVER
OLAP_DUMP
SELFTESTASM
ASMDISK_ERR_ON  --asm
ASMDISK_READ_ERR_ON
ASMDISK_ERR_OFF
IOERREMUL 
IOERREMULRNG
ALRT_TEST --alert
AWR_TEST  --awr
AWR_FLUSH_TABLE_ON
AWR_FLUSH_TABLE_OFF
ASHDUMP  ---ash
MMON_TEST  --mmon
ATSK_TEST
HM_FW_TRACE
HM_FDG_VERS
IR_FW_TRACE
KSDTRADV_TEST


4,dump命令可以用上述dumplist指定的dump進行針對性的分析,也就是說學習要分類
SQL> oradebug help dump
DUMP           <dump_name> <lvl> [addr]  Invoke named dump
SQL> 


我們以row_cache為例進行測試,一為了解命令用法,二瞭解如何深入掌握dumplist不同的dump的含義及用途,這是最重要的價值
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dump row_cache 2;
Statement processed.
SQL> oradebug tracefile_name
/oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_23113.trc
SQL> 


摘取部分上述TRC檔案內容,可見row cache也是採用hash table,和library cache相同,更一步引申,也就是說透過oradebug dump row_cache 2可以深入研究row cache的構成及原理
可以解決一些與row cache相關的故障或效能問題,這才是我們學習它的目的
ROW CACHE HASH TABLE: cid=35 ht=0xd5a624c0 size=512
Buckets with more than 20 objects:
NONE
Hash Chain Size     Number of Buckets
---------------     -----------------
              0                   512
              1                     0
              2                     0
              3                     0
              4                     0
              5                     0
              6                     0
              7                     0
              8                     0
              9                     0
             10                     0
             11                     0
             12                     0
             13                     0
             14                     0


再看另一個dump,我們以poke_address為例
但是我們不知這個poke_address的含義是什麼,但從oracebug help可知,裡面有個poke命令,從字面上聯絡,我感覺poke_address與poke有關
所以我們先看看poke
SQL> oradebug dump poke_address
ORA-00073: command DUMP takes between 2 and 3 argument(s)
SQL> 




--可見poke是修改記憶體內容的
SQL> oradebug help poke
POKE           <addr> <len> <value>      Modify memory




那麼既然要修改記憶體內容,我們先要確認記憶體地址,如下以LATCH地址為例


SQL> select addr,latch#,name from v$latch where rownum=1;


ADDR                 LATCH# NAME
---------------- ---------- --------------------------------------------------
0000000060001008          0 PC and Classifier lists for WLM             


我想到,即使poke是修改記憶體內容,肯定有檢視記憶體內容的,經查幫助手冊,可知是peek
SQL> oradebug help peek
PEEK           <addr> <len> [level]      Print/Dump memory


我們就用peek檢視下指定記憶體地址的內容,可見len是指定顯示記憶體中的長度,它是字度的寬度,即多少個位元組,可見每個部分(即用空格分割的8位十六進位制數)4個位元組,即每2個數字代表1個位元組
SQL> oradebug setmypid
Statement processed.
SQL> oradebug peek 60001008 1
[003938AF0, 003938AF4) = 40958B4C
SQL> oradebug peek 60001008 10
[003938AF0, 003938AFC) = 40958B4C 48FFFFFF
SQL> oradebug peek 60001008 12
[003938AF0, 003938AFC) = 40958B4C 48FFFFFF E910C483
SQL> oradebug peek 60001008 16
[003938AF0, 003938B00) = 40958B4C 48FFFFFF E910C483 FFFFFCCC
SQL> oradebug peek 60001008 18
[003938AF0, 003938B04) = 40958B4C 48FFFFFF E910C483 FFFFFCCC
SQL> oradebug peek 60001008 20
[003938AF0, 003938B04) = 40958B4C 48FFFFFF E910C483 FFFFFCCC 48D88949


可見level不同級別不影響顯示內容,當然也可能是針對不同的dump的level級別會有區別
SQL> oradebug peek 60001008 20
[003938AF0, 003938B04) = 40958B4C 48FFFFFF E910C483 FFFFFCCC 48D88949
SQL> oradebug peek 60001008 20 1
[003938AF0, 003938B04) = 40958B4C 48FFFFFF E910C483 FFFFFCCC 48D88949
SQL> oradebug peek 60001008 20 2
[003938AF0, 003938B04) = 40958B4C 48FFFFFF E910C483 FFFFFCCC 48D88949
SQL> oradebug peek 60001008 20 10
[003938AF0, 003938B04) = 40958B4C 48FFFFFF E910C483 FFFFFCCC 48D88949
SQL> 


我們修改上述的指定latch的地址的內容,然後顯示
SQL> oradebug peek 60001008 1
[003938AF0, 003938AF4) = 40958B4C


SQL> oradebug help poke
POKE           <addr> <len> <value>      Modify memory


SQL> oradebug poke 0x0000000060001008 4 88888888
BEFORE: [060001008, 06000100C) = 00000000
AFTER:  [060001008, 06000100C) = 054C5638


使用peek顯示poke修改後的記憶體內容
SQL> oradebug peek 0x0000000060001008 4
[060001008, 06000100C) = 054C5638
SQL> 


使用poke_address
SQL> oradebug dump poke_address 60001008 2
Statement processed.
SQL> oradebug tracefile_name
/oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_25629.trc


摘錄相關TRC檔案,沒看到有價值的內容,表明還沒有搞清楚oradebug dump poke_address的含義是什麼
*** 2015-10-31 01:44:20.104
Oradebug command 'poke 0x0000000060001008 4 88888888' console output: 
BEFORE: [060001008, 06000100C) = 00000000
AFTER:  [060001008, 06000100C) = 054C5638


*** 2015-10-31 01:45:18.106
Processing Oradebug command 'peek 60001008 1'


*** 2015-10-31 01:45:18.106
Oradebug command 'peek 60001008 1' console output: 
[003938AF0, 003938AF4) = 40958B4C


*** 2015-10-31 01:46:41.610
Processing Oradebug command 'dump poke_address 60001008'


*** 2015-10-31 01:46:41.744
Error while executing Oradebug command 'dump poke_address 60001008':
ORA-00073: command POKE_ADDRESS takes between 2 and 2 argument(s)


我們換個思路,再看有關聯的poke_length,仍然TRC檔案沒有有價值的內容
SQL> oradebug dump poke_length 3
Statement processed.
SQL> oradebug tracefile_name
/oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_25629.trc


把poke修改記憶體後的內容回退回去,記得以before為基礎
SQL> oradebug poke 0x0000000060001008 4 0x00000000
BEFORE: [060001008, 06000100C) = 054C5638
AFTER:  [060001008, 06000100C) = 00000000
SQL> 
SQL> 
SQL> oradebug peek 0x0000000060001008 4
[060001008, 06000100C) = 00000000


再看看pin_blocks
SQL> oradebug dump pin_blocks 1
Statement processed.
SQL> oradebug tracefile_name
/oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_26147.trc


個人簡介:


8年oracle從業經驗,具備豐富的oracle技能,目前在國內北京某專業oracle服務公司從事高階技術顧問。
   
   服務過的客戶:
          中國電信
          中國移動
          中國聯通
          中國電通
          國家電網
          四川達州商業銀行
          湖南老百姓大藥房
          山西省公安廳
          中國郵政
          北京302醫院     
          河北廊坊新奧集團公司
  
 專案經驗:
           中國電信3G專案AAA系統資料庫部署及最佳化
           中國聯通CRM資料庫效能最佳化
           中國移動10086電商平臺資料庫部署及最佳化
           湖南老百姓大藥房ERR資料庫sql最佳化專案
           四川達州商業銀行TCBS核心業務系統資料庫模型設計和RAC部署及最佳化
           四川達州商業銀行TCBS核心業務系統後端批處理儲存過程功能模組編寫及最佳化
           北京高鐵訊號監控系統RAC資料庫部署及最佳化
           河南宇通客車資料庫效能最佳化
           中國電信電商平臺核心採購模組表模型設計及最佳化
           中國郵政儲蓄系統資料庫效能最佳化及sql最佳化
           北京302醫院資料庫遷移實施
           河北廊坊新奧data guard部署及最佳化
           山西公安廳身份證審計資料庫系統故障評估
         
 聯絡方式:
          手機:18201115468
          qq   :   305076427
          qq微博: wisdomone1
          新浪微博:wisdomone9
          qq群:275813900    
          itpub部落格名稱:wisdomone1    http://blog.itpub.net/9240380/


檢視上述的trc檔案,有ORA-600報錯資訊
*** 2015-10-31 02:03:12.228
Incident 261392 created, dump file: /oracle/diag/rdbms/guowang/guowang/incident/incdir_261392/guowang_ora_26147_i261392.trc
ORA-00600: internal error code, arguments: [kssadf_numa:  null parent], [], [], [], [], [], [], [], [], [], [], []


Force pin got error 600 for 4194306




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-1820305/,如需轉載,請註明出處,否則將追究法律責任。

相關文章