Oracle BBED 工具 說明

ewelamb發表於2013-11-26

一.  BBED介紹

       有關BBED 詳細使用說明的pdf文件,也是從網上下載的:

              

 

       Thename bbed is an acronym for Block Browser and EDitor and it is shipped with thedatabase. It is intended for Oracle internal use only and the company neverpublishes any details about it. It is a very powerful tool but also extremelydangerous since it can change and/or corrupt data blocks of any Oracledatabase.

       Ifyou use this tool, you do so at your own risk. Any modifications made with thistool render the database unsupported by Oracle.

 

       BBED(Oracle Block Browerand EDitor Tool),用來直接檢視和修改資料檔案資料的一個工具,是Oracle一款內部工具,可以直接修改Oracle資料檔案塊的內容,在一些極端恢復場景下比較有用。該工具不受Oracle支援,所以預設是沒有生成可執行檔案的,在使用前需要重新連線。

 

 

二. BBED 的安裝和使用

2.1 BBED 安裝

       Oracle8i 的BBED在windows 平臺下的$ORACLE_HOME/bin下可以找到,9i中似乎未隨軟體釋出,故在windows沒有這個工具,

 

       在linux上面有,需要編譯。

  

在9i/10g中連線生成bbed:

       cd$ORACLE_HOME/rdbms/lib

       make-f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

 

示例:

[oracle@db2 ~]$ cd $ORACLE_HOME/rdbms/lib

[oracle@db2 lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

 

Linking BBED utility (bbed)

rm -f /u01/app/oracle/product/10.2.0/db_1/rdbms/lib/bbed

gcc -o/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/bbed-L/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/-L/u01/app/oracle/product/10.2.0/db_1/lib/-L/u01/app/oracle/product/10.2.0/db_1/lib/stubs/ -L/usr/lib -lirc  /u01/app/oracle/product/10.2.0/db_1/lib/s0main.o/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/ssbbded.o/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/sbbdpt.o `cat/u01/app/oracle/product/10.2.0/db_1/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10-lnnz10 -lnl10 /u01/app/oracle/product/10.2.0/db_1/rdbms/lib/defopt.o-ldbtools10 -lclntsh  `cat/u01/app/oracle/product/10.2.0/db_1/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10-ln10 -lnnz10 -lnl10 -lnro10 `cat /u01/app/oracle/product/10.2.0/db_1/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10-ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -lmm -lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10-lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat/u01/app/oracle/product/10.2.0/db_1/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10-ln10 -lnnz10 -lnl10 -lnro10 `cat/u01/app/oracle/product/10.2.0/db_1/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10-ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10  -lsnls10 -lnls10  -lcore10-lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10-lnls10 -lcore10 -lnls10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10-lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10   `cat/u01/app/oracle/product/10.2.0/db_1/lib/sysliblist`-Wl,-rpath,/u01/app/oracle/product/10.2.0/db_1/lib -lm    `cat /u01/app/oracle/product/10.2.0/db_1/lib/sysliblist`-ldl -lm  -L/u01/app/oracle/product/10.2.0/db_1/lib

[oracle@db2 lib]$

 

       以上生成的bbed可執行檔案在$ORACLE_HOME/rdbms/lib目錄,可以複製到其他位置或者其他同Oracle版本的機器上執行。

 

也可透過以下命令將bbed生成到$ORACLE_HOME/bin目錄

[oracle@db2 lib]$ make -f ins_rdbms.mk  BBED=$ORACLE_HOME/bin/bbed  $ORACLE_HOME/bin/bbed

 

Linking BBED utility (bbed)

rm -f /u01/app/oracle/product/10.2.0/db_1/bin/bbed

gcc -o/u01/app/oracle/product/10.2.0/db_1/bin/bbed-L/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/-L/u01/app/oracle/product/10.2.0/db_1/lib/-L/u01/app/oracle/product/10.2.0/db_1/lib/stubs/ -L/usr/lib -lirc  /u01/app/oracle/product/10.2.0/db_1/lib/s0main.o/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/ssbbded.o/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/sbbdpt.o `cat/u01/app/oracle/product/10.2.0/db_1/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10-ln10 -lnnz10 -lnl10 /u01/app/oracle/product/10.2.0/db_1/rdbms/lib/defopt.o-ldbtools10 -lclntsh  `cat/u01/app/oracle/product/10.2.0/db_1/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10-ln10 -lnnz10 -lnl10 -lnro10 `cat/u01/app/oracle/product/10.2.0/db_1/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10-ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -lmm -lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10-lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat /u01/app/oracle/product/10.2.0/db_1/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10-ln10 -lnnz10 -lnl10 -lnro10 `cat/u01/app/oracle/product/10.2.0/db_1/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10-ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10  -lsnls10 -lnls10  -lcore10-lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10-lnls10 -lcore10 -lnls10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10-lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10   `cat/u01/app/oracle/product/10.2.0/db_1/lib/sysliblist`-Wl,-rpath,/u01/app/oracle/product/10.2.0/db_1/lib -lm    `cat/u01/app/oracle/product/10.2.0/db_1/lib/sysliblist` -ldl -lm   -L/u01/app/oracle/product/10.2.0/db_1/lib

 

[oracle@db2 lib]$ ls -lrt bbed

-rwxr-xr-x 1 oracle oinstall 536161 Aug 1118:30 bbed

[oracle@db2 lib]$ cd $ORACLE_HOME/bin

[oracle@db2 bin]$ ls -lrt bbed

-rwxr-xr-x 1 oracle oinstall 536161 Aug 11 18:33bbed

 

 OracleDatabase 11g中預設的未提供BBED庫檔案,但是可以用10g的檔案編譯出來,需要先從10g中複製如下檔案到相應目錄,然後再執行上述連線命令,參考如下步驟:
(1)複製Oracle 10g檔案

Copy $ORA10g_HOME/rdbms/lib/ssbbded.o to$ORA11g_HOME/rdbms/lib
Copy $ORA10g_HOME/rdbms/lib/sbbdpt.o to $ORA11g_HOME/rdbms/lib

Copy $ORA10g_HOME/rdbms/mesg/bbedus.msb to $ORA11g_HOME/rdbms/mesg
Copy $ORA10g_HOME/rdbms/mesg/bbedus.msg to $ORA11g_HOME/rdbms/mesg
Copy $ORA10g_HOME/rdbms/mesg/bbedar.msb to $ORA11g_HOME/rdbms/mesg

(2)編譯

make -f $ORA11g_HOME/rdbms/lib/ins_rdbms.mkBBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed

 

 

2.2 使用BBED

       BBED是Oracle 內部使用的命令,所以Oracle 不提供技術支援。 為了安全,BBED設定了口令保護,預設密碼為blockedit。

 

[oracle@db2 bin]$ bbed

Password:

BBED-00113: Invalid password. Please rerunutility with the correct password.

 

[oracle@db2 bin]$ bbed

Password:

 

BBED: Release 2.0.0.0.0 - LimitedProduction on Thu Aug 11 18:51:47 2011

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

************* !!! For Oracle Internal Useonly !!! ***************

 

BBED>

 

       一般使用bbed,都是將一些配置資訊寫入到一個引數文字里,在呼叫bbed時,指定該引數檔案。如:

       $bbedparfile=bbed.par

 

 

相關的引數可以透過help 檢視:

[oracle@db2 admin]$ bbed help=y

PASSWORD - Required parameter

FILENAME - Database file name

BLOCKSIZE - Database block size

LISTFILE - List file name

MODE - [browse/edit]

SPOOL - Spool to logfile [no/yes]

CMDFILE - BBED command file name

LOGFILE - BBED log file name

PARFILE - Parameter file name

BIFILE - BBED before-image file name

REVERT - Rollback changes from BIFILE[no/yes]

SILENT - Hide banner [no/yes]

HELP - Show all valid parameters [no/yes]

 

這裡我們先演示一個示例。

(1)先獲取datafile 的資訊

       將datafile 的資訊寫入一個檔案,格式為:檔案編號  檔名字 檔案大小。可以透過如下SQL   獲取:

 

SYS@dave2(db2)>  select file#||' '||name||' '||bytes from v$datafile ;

 

FILE#||''||NAME||''||BYTES

--------------------------------------------------------------------------------

1/u01/app/oracle/oradata/dave2/system01.dbf 1761607680

2/u01/app/oracle/oradata/dave2/undotbs01.dbf 927989760

3/u01/app/oracle/oradata/dave2/sysaux01.dbf 398458880

4 /u01/app/oracle/oradata/dave2/users01.dbf5242880

5 /u01/app/oracle/oradata/dave2/example01.dbf104857600

6 /u01/app/oracle/oradata/dave2/dave01.dbf10485760

7/u01/app/oracle/oradata/dave2/undotbs02.dbf 1048576

8/u01/app/oracle/oradata/dave2/huaining01.dbf 52428800

 

8 rows selected.

 

       注意,這裡的file id。 我們這裡的file id 和 oracle 系統內部的file id 相同。 當然這個id 我們也可以自己指定。 當我們在bbed 裡設定file id 時,就是根據這個引數檔案中的的設定來的。 最好設定為相同,不然以後可能會混淆。

 

將上面查詢出來的datafile資訊儲存到文字里。

 

[oracle@db2 ~]$ cat /u01/filelist.txt

1/u01/app/oracle/oradata/dave2/system01.dbf 1761607680

2/u01/app/oracle/oradata/dave2/undotbs01.dbf 927989760

3/u01/app/oracle/oradata/dave2/sysaux01.dbf 398458880

4 /u01/app/oracle/oradata/dave2/users01.dbf5242880

5/u01/app/oracle/oradata/dave2/example01.dbf 104857600

6 /u01/app/oracle/oradata/dave2/dave01.dbf10485760

7/u01/app/oracle/oradata/dave2/undotbs02.dbf 1048576

8/u01/app/oracle/oradata/dave2/huaining01.dbf 52428800

 

(2) 建立parameter file:

[oracle@db2 ~]$ cat /u01/bbed.par

blocksize=8192

listfile=/u01/filelist.txt

mode=edit

 

(3)使用parameter file 連線bbed:

 

[oracle@db2 ~]$ bbed parfile=/u01/bbed.par

Password:

 

BBED: Release 2.0.0.0.0 - LimitedProduction on Thu Aug 11 20:47:49 2011

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

************* !!! For Oracle Internal Useonly !!! ***************

 

BBED> show

       FILE#           1

       BLOCK#          1

       OFFSET          0

       DBA             0x00400001(4194305 1,1)

       FILENAME       /u01/app/oracle/oradata/dave2/system01.dbf

       BIFILE          bifile.bbd

        LISTFILE        /u01/filelist.txt

       BLOCKSIZE       8192

       MODE            Edit

       EDIT            Unrecoverable

       IBASE           Dec

       OBASE           Dec

       WIDTH           80

       COUNT           512

       LOGFILE         log.bbd

       SPOOL           No

 

三. BBED命令說明

先看幫助的說明:

BBED> help all

SET DBA [ dba | file#, block# ]

SET FILENAME 'filename'

SET FILE file#

SET BLOCK [+/-]block#

SET OFFSET [ [+/-]byte offset | symbol |*symbol ]

SET BLOCKSIZE bytes

SET LIST[FILE] 'filename'

SET WIDTH character_count

SET COUNT bytes_to_display

SET IBASE [ HEX | OCT | DEC ]

SET OBASE [ HEX | OCT | DEC ]

SET MODE [ BROWSE | EDIT ]

SET SPOOL [ Y | N ]

SHOW [ | ALL ]

INFO

MAP[/v] [ DBA | FILENAME | FILE | BLOCK ]

DUMP[/v] [ DBA | FILENAME | FILE | BLOCK |OFFSET | COUNT ]

PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME |BLOCK | OFFSET | symbol | *symbol ]

EXAMINE[/Nuf] [ DBA | FILE | FILENAME |BLOCK | OFFSET | symbol | *symbol ]

:

N - a number which specifies a repeatcount.

u - a letter which specifies a unit size:

  b -b1, ub1 (byte)

  h -b2, ub2 (half-word)

  w -b4, ub4(word)

  r -Oracle table/index row

f - a letter which specifies a displayformat:

  x -hexadecimal

  d -decimal

  u -unsigned decimal

  o -octal

  c -character (native)

  n -Oracle number

  t -Oracle date

  i -Oracle rowid

FIND[/x|d|u|o|c] numeric/character string [TOP | CURR ]

COPY [ DBA | FILE | FILENAME | BLOCK ] TO [DBA | FILE | FILENAME | BLOCK ]

MODIFY[/x|d|u|o|c] numeric/character string

     [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]

ASSIGN[/x|d|u|o] = <source>

: [ DBA | FILE |FILENAME | BLOCK | OFFSET | symbol | *symbol ]

: [ value | ] <source>

SUM [ DBA | FILE | FILENAME | BLOCK ] [APPLY ]

PUSH [ DBA | FILE | FILENAME | BLOCK |OFFSET ]

POP [ALL]

REVERT [ DBA | FILE | FILENAME | BLOCK ]

UNDO

HELP [ | ALL ]

VERIFY [ DBA | FILE | FILENAME | BLOCK ]

CORRUPT [ DBA | FILE | FILENAME | BLOCK ]

 

下面是幾個常用的:

set 設定當前的環境

show 檢視當前的環境引數,跟sqlplus的同名命令類似。

dump 列出指定block的內容

find 在指定的block中查詢指定的字串,結果是顯示出字串,及其偏移量--offset,偏移量就是在block中的位元組數

modify 修改指定block的指定偏移量的值,可以線上修改。

copy 把一個block的內容copy到另一個block中

verify 檢查當前環境是否有壞塊

sum 計算block的checksum,modify之後block就被標識為壞塊,current checksum與reqired checksum不一致,sum命令可以計算出新的checksum並應用到當前塊。

undo 回滾當前的修改操作,如果手誤做錯了,undo一下就ok了,回到原來的狀態。

revert 回滾所有之前的修改操作,意思就是 undo all

 

 

3.1 SET 命令

3.1.1 set dba

       Setsthe current data block using the standard Oracle DBA (Data Block Address)format. This is entered as file_id, block.

       關於DBA 說明,參考:

       Oracle rdba和 dba 說明

       http://blog.csdn.net/tianlesoftware/article/details/6529346

 

SQL> select

 2  rowid,

 3  dbms_rowid.rowid_relative_fno(rowid)rel_fno,

dbms_rowid.rowid_block_number(rowid)blockno,

dbms_rowid.rowid_row_number(rowid) rowno

from t1 where object_id=100;

 

ROWID                 REL_FNO    BLOCKNO     ROWNO

------------------ ---------- --------------------

AAAMxZAABAAAO3SAAA          1     60882          0

AAAMxZAABAAAO3TAAH          1     60883          7

 

設定file 1,block 60882

BBED> set dba 1,60882

       DBA             0x0040edd2(4255186 1,60882)

       如果設定成功,會返回該block的RDBA (Relative Data Block Address),rdba就是rowid中的rfile#+block#。括號裡面的是DBA值和block 和 file id。 我們驗證一下:

 

SYS@dave2(db2)> variable dbavarchar2(30);

SYS@dave2(db2)> exec :dba :=dbms_utility.make_data_block_address(1,60882);

PL/SQL procedure successfully completed.

SYS@dave2(db2)> print dba

DBA

----------------------------------------------------------

4255186

 

3.1.2 set filename

       Setsthe current file to the one specified. It must be a valid Oracle data file andit must be enclosed in single quotes. If the file is not in the current path itmust also be fully qualified. If successful, bbed will respond showing the filenow being accessed.

 

BBED> set filename '/u01/app/oracle/oradata/dave2/users01.dbf'

       FILENAME       /u01/app/oracle/oradata/dave2/users01.dbf

--必須是一個有效的datafile,並且用單引號括起來

 

3.1.3 set file

       Setsthe current file to the number specified. The number specified must be one ofthe file ids supplied in the filelist referenced at startup. If successful,bbed will respond showing the file id now being accessed.

BBED> set file 4

       FILE#           4

--注意這裡的number,是我們之前配置的filelist裡的number。它可以和我們db 裡的file id 不一樣。 不過最好是配置一樣的。

 

3.1.4 set block

       Setsthe current block. The block is relative to the filename or file already set.The absolute block can be specified, or an offset to the current block can bespecified using the plus (+) or (-) symbols. If successful, bbed will respondshowing the current block.

       --注意這裡的block 是一個相對的位置,我們需要先指定一個file,然後在指定block。 即對應file裡的block。可以對當前block的位置進行+和-操作。

 

BBED> set file 4

       FILE#           4

BBED> set block 60882

BBED-00309: out of range block number(60882)

BBED> set file 1

       FILE#           1

BBED> set block 60882

       BLOCK#          60882

BBED> set bock +10

BBED-00202: invalid parameter (bock)

BBED> set block +10

       BLOCK#          60892

BBED> set block -10

       BLOCK#          60882

 

3.1.5 set offset

       Setsthe current offset. The offset is relative to the block already set. Theabsolute offset can be specified, or an offset to the current offset can bespecified using the plus (+) or minus (-) symbols. If successful, bbed willrespond showing the current offset.

       --偏移量是相對某個block裡的偏移量,可以用+和-進行操作

 

BBED> set offset 20

       OFFSET          20

BBED> set offset +2

       OFFSET          22

BBED> set offset -2

       OFFSET          20

 

3.1.6 set blocksize

       Setsthe blocksize of the current file. The blocksize must match the file selectedor an error will be reported. If successful, bbed will respond showing thecurrent blocksize.

       設定當前datafile 的blocksize 大小,該大小必須和datafile 的實際block 匹配,否則會報錯。

BBED> set blocksize 8192

       BLOCKSIZE       8192

 

3.1.7 set listfile

      Setsthe listfile to the specified file. This option can be used if the listfile wasnot specified on the command line. The listfile must be enclosed in singlequotes. If successful, bbed will respond showing the current listfile.

       --在前面講過,可以透過parameter file 來指定bbed的屬性,當然也可以透過set 來指定這些資訊。對於listfile的檔案,必須用單引號括起來。

 

BBED> set listfile '/u01/filelist.txt'

       LISTFILE        /u01/filelist.txt

 

3.1.8 set width

       Setsthe current screen width. If not specified bbed will assume an 80-characterdisplay.

       設定當前螢幕的寬度,預設是80.

BBED> set width 200

       WIDTH           200

 

3.1.9 set count

       Setsthe number of bytes of the data block to display from the dump command. Thedefault is 512.

       Tosee an entire 8Kb block therefore you would need to dump the block eight timesat offsets 0, 512, 1024, 1536, 2048, 2560, 3092 and 3604.

       Bysetting the count higher bbed will dump more of the block each time. Byreducing it a smaller dump can be achieved.

       設定dump 命令顯示bytes的數量。預設是512 bytes。

 

BBED> set count 512

       COUNT           512

 

3.1.10 set ibase

       Setsthe internal number base. The default is decimal. However it can also be set tohexadecimal or octal. This allows the set file, set block and set offsetcommands to use an alternate base to decimal. If successful, bbed will respondshowing the current base:

       --設定內部的數字格式,預設是十進位制。 也可以設定為十六進位制或者八進位制。設定完數字格式之後,可是使用該格式來設定blcok,offset等。

 

BBED> set ibase hex

       IBASE           Hex

BBED> set block +D

       BLOCK#          14

BBED> set ibase decimal

       IBASE           Dec

 

3.1.11 set obase

       Thepurpose of this command is unknown.

 

3.1.12 set mode

       Setsthe bbed mode. The options are browse or edit. In browse mode no changes can bemade. This is the suggested mode for first-time users, or if you are intendingto use the tool only to inspect data blocks.

       --設定bbed 的模式,該預設有2種:browse 和 edit。 browse 模式不允許進行修改。 如果要修改,就選擇edit模式。 這個在我們的之前的配置檔案裡,我們選擇了edit。

 

BBED> set mode browse

       MODE            Browse

BBED> set mode edit

       MODE            Edit

 

3.1.13 set spool

       Thiscommand appears to not be implemented.

 

 

3.2 show 命令

       顯示當前的配置選項。

 

BBED> show

       FILE#           1

       BLOCK#          14

       OFFSET          0

       DBA             0x0040000e(4194318 1,14)

       --注意這裡的block 變成了14. 是我們剛才設定的。

       FILENAME       /u01/app/oracle/oradata/dave2/system01.dbf

       BIFILE          bifile.bbd

       LISTFILE        /u01/filelist.txt

       BLOCKSIZE       8192

       MODE            Edit

       EDIT            Unrecoverable

       IBASE           Dec

       OBASE           Dec

       WIDTH           200

       COUNT           512

       LOGFILE         log.bbd

       SPOOL           No

 

3.3 info

       顯示當前可以進行browse 或者edit 的file。即我們filelist 裡指定的datafile資訊。

 

BBED> info

 File# Name                                                       Size(blks)

 ----- ----                                                       ----------

    1  /u01/app/oracle/oradata/dave2/system01.dbf                      215040

    2 /u01/app/oracle/oradata/dave2/undotbs01.dbf                     113280

    3 /u01/app/oracle/oradata/dave2/sysaux01.dbf                       48640

    4 /u01/app/oracle/oradata/dave2/users01.dbf                          640

    5 /u01/app/oracle/oradata/dave2/example01.dbf                      12800

    6 /u01/app/oracle/oradata/dave2/dave01.dbf                          1280

    7 /u01/app/oracle/oradata/dave2/undotbs02.dbf                        128

    8 /u01/app/oracle/oradata/dave2/huaining01.dbf                      6400

 

--一行不能完整顯示,設定一下width 引數,就ok了

BBED> set width 65

       WIDTH           65

 

BBED> info

 File# Name                                        Size(blks)

 ----- ----                                        ----------

    1 /u01/app/oracle/oradata/dave2/system01.dbf       215040

    2 /u01/app/oracle/oradata/dave2/undotbs01.dbf      113280

    3 /u01/app/oracle/oradata/dave2/sysaux01.dbf        48640

    4  /u01/app/oracle/oradata/dave2/users01.dbf           640

    5 /u01/app/oracle/oradata/dave2/example01.dbf       12800

    6 /u01/app/oracle/oradata/dave2/dave01.dbf           1280

    7 /u01/app/oracle/oradata/dave2/undotbs02.dbf         128

    8  /u01/app/oracle/oradata/dave2/huaining01.db        6400                                                                                        

 

3.4 Map

       Themap command shows a map of the current block. It can be combined with the /voption to produce a more verbose output. The map shows the offsets throughoutthe block where certain information can be found such as the block header, thedata block header or the row directory.

       Ifthe set commands have not been used to set a current block, or it the user simplywishes to examine another block while keeping the current block their focus,the file name, file id, block or DBA can be specified with the command.

 

       Map會透過偏移量來顯示block裡的詳細資訊,如block header,data block header 和row directory。 使用/v 選項,可以檢視更詳細的資訊。

       在不指定block的情況下,會顯示當前block的資訊,如果想顯示其他block的資訊,可以使用file name,file id,block 和DBA 來指定要顯示的block。

 

BBED> map

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 60882                                 Dba:0x0040edd2

------------------------------------------------------------

 KTBData Block (Table/Cluster)

 

 struct kcbh, 20 bytes                      @0      

 struct ktbbh, 72 bytes                     @20     

 struct kdbh, 14 bytes                      @92     

 struct kdbt[2], 8 bytes                    @106    

 sb2kdbr[4]                               @114    

 ub1freespace[7974]                       @122    

 ub1rowdata[92]                           @8096   

 ub4tailchk                               @8188   

--這個是預設情況,@後面代表的對應的資訊在block裡的偏移量,即offset。

 

--透過dba 來指定某個block

BBED> map /v dba 1,60882

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 60882                                 Dba:0x0040edd2

------------------------------------------------------------

 KTBData Block (Table/Cluster)

 

 struct kcbh, 20 bytes                      @0      

   ub1 type_kcbh                          @0      

   ub1 frmt_kcbh                          @1      

   ub1 spare1_kcbh                        @2      

   ub1 spare2_kcbh                        @3      

   ub4 rdba_kcbh                          @4      

   ub4 bas_kcbh                           @8      

   ub2 wrp_kcbh                           @12     

   ub1 seq_kcbh                           @14     

   ub1 flg_kcbh                           @15     

   ub2 chkval_kcbh                        @16     

   ub2 spare3_kcbh                        @18     

 

 struct ktbbh, 72 bytes                     @20     

   ub1 ktbbhtyp                            @20     

   union ktbbhsid, 4 bytes                @24     

   struct ktbbhcsc, 8 bytes               @28     

   b2 ktbbhict                            @36     

   ub1 ktbbhflg                           @38     

   ub1 ktbbhfsl                           @39     

   ub4 ktbbhfnx                           @40     

   struct ktbbhitl[2], 48 bytes           @44     

 

 struct kdbh, 14 bytes                      @92     

   ub1 kdbhflag                           @92      

   b1 kdbhntab                            @93     

   b2 kdbhnrow                            @94     

   sb2 kdbhfrre                           @96     

   sb2 kdbhfsbo                           @98     

   sb2 kdbhfseo                            @100    

   b2 kdbhavsp                            @102    

   b2 kdbhtosp                            @104    

 

 struct kdbt[2], 8 bytes                    @106    

   b2 kdbtoffs                            @106    

   b2 kdbtnrow                             @108    

 

 sb2kdbr[4]                               @114    

 ub1freespace[7974]                       @122    

 ub1rowdata[92]                           @8096   

 ub4tailchk                               @8188   

 

--透過block 來map

BBED> map block 60888

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 60888                                 Dba:0x0040edd8

------------------------------------------------------------

 KTBData Block (Table/Cluster)

 

 struct kcbh, 20 bytes                      @0      

 struct ktbbh, 72 bytes                     @20     

 struct kdbh, 14 bytes                      @92     

 struct kdbt[2], 8 bytes                    @106    

 sb2kdbr[4]                               @114     

 ub1freespace[7936]                       @122    

 ub1rowdata[130]                          @8058   

 ub4tailchk                               @8188   

 

 

Map 顯示的具體資訊解釋如下:

 

struct kcbh, 20 bytes

Block Header Structure

  ub1 type_kcbh

Block type (see Header Block Types below)

  ub1 frmt_kcbh

Block format 1=Oracle 7, 2=Oracle 8+

  ub1 spare1_kcbh

Not used

  ub1 spare2_kcbh

Not used

  ub4 rdba_kcbh

RDBA -Relative Data Block Address

  ub4 bas_kcbh

SCN Base

  ub2 wrp_kcbh

SCN Wrap

  ub1 seq_kcbh

Sequence number, incremented for every change made to the block at the same SCN

  ub1 flg_kcbh

Flag:

0x01 New Block

0x02 Delayed Logging Change advanced SCN/seq 0x04 Check value saved - block XOR‘s to zero

0x08 Temporary block

  ub2 chkval_kcbh

Optional block checksum (if DB_BLOCK_CHECKSUM=TRUE)

  ub2 spare3_kcbh

Not used

struct ktbbh, 72 bytes

Transaction Fixed Header Structure

  ub1 ktbbhtyp

Block type (1=DATA, 2=INDEX)

  union ktbbhsid, 4 bytes

Segment/Object ID

  struct ktbbhcsc, 8 bytes

SCN at last block cleanout

  b2 ktbbhict

Number of ITL slots

  ub1 ktbbhflg

0=on the freelist

  ub1 ktbbhfsl

ITL TX freelist slot

  ub4 ktbbhfnx

DBA of next block on the freelist

  struct ktbbhitl[2], 48 bytes

ITL list index

struct kdbh, 14 bytes

Data Header Structure

  ub1 kdbhflag

N=pctfree hit(clusters); F=do not put on freelist; K=flushable cluster keys

  b1 kdbhntab

Number of tables (>1 in clusters)

  b2 kdbhnrow

Number of rows

  sb2 kdbhfrre

First free row entry index; -1 = you have to add one

  sb2 kdbhfsbo

Freespace begin offset

  sb2 kdbhfseo

Freespace end offset

  b2 kdbhavsp

Available space in the block

  b2 kdbhtosp

Total available space when all TXs commit

struct kdbt[1], 4 bytes

Table Directory Entry Structure

  b2 kdbtoffs

 

  b2 kdbtnrow

 

sb2 kdbr[1]

Row Directory

ub1 freespace[8030]

Free Space

ub1 rowdata[38]

Row Data

ub4 tailchk

(See Tailchecks below)

 

 

       Differentblock types are designated by the first byte of the block. The following tableshows how to decode the block type:

       不同的block 可以第一個byte的值是不一樣的。 具體值對應block 型別如下。

Header Block Types

ID

Type

01

Undo segment header

02

Undo data block

03

Save undo header

04

Save undo data block

05

Data segment header (temp, index, data and so on)

06

KTB managed data block (with ITL)

07

Temp table data block (no ITL)

08

Sort Key

09

Sort Run

10

Segment free list block

11

Data file header

 

可以透過dump block來檢視對應的具體的值。 下文講dump時會有相關的示例。

 

       oracleblocks 的最後4個bytes 是tail check。 下面看一下oracle 9i block的tail check 組成。

 

Tailchecks

       Thetail of an Oracle 8+ block is a concatenation of the lower order two bytes ofthe SCN base, the block type and the SCN sequence number.

       Oracleblock tail 由4個bytes組成,但實際上只用了低2個bytes來存放。 2個bytes的tail 由scn base,block type 和 scn sequence 組成。

 

E.g, if the SCN base number is 0x00029728,the block type is 06 and the SCN sequence number is 0x02, the tail check wouldbe 0x97280602:

 

SCN base     Type   SCN seq

 9728           06        02

 

       Althoughthis tail check value is generated from three components, Oracle treats thefinal value as a single unsigned integer stored as a word (4-bytes). Onlittle-endian architecture machines, which include Intel, the value will bestores as low-order byte first.

       雖然tail check 由3個部分組成,但是oracle 把這3部分作為一個整體來儲存,並且佔用4個bytes。

       對於little-endian(低端)架構的機器,包括Intel, 他們會先存放low-order byte,即低位位元組。

      

       Thereforeif the tail check is examined in the block using a standard block editor, orthe dump command which will be explained in the next section, the byte ordermay look different. A tail check of 0x97280602 stored on an Intel machine wouldbe written to disk as "02062897".

       可以透過標準block editor 或者dump 來檢視tail check。 對於不同的機器,他們儲存的順序是不一樣的。比如tail check 0x97280602 在Intel Machine 就被儲存為02062897,因為它會先儲存low-order bytes。

 

3.5 dump(d)

       Thedump command dumps the content of the block to the screen. It can be combinedwith the /v option to produce a more verbose output. TheDBA, Filename, File, Block and/or Offset to dump can be specified with thecommand. If these are not specified the current file, block and offsetas established with the set command will be dumped. The size of the dump islimited by the set count option and defaults to 512 bytes or alternatively thesize of the dump can be specified with the command.

       dump命令可以講block 的內從顯示到螢幕。 每次顯示的bytes由count 控制,預設是512 bytes。 使用 /v 選項,可以顯示更多詳細資訊。

 

示例:

BBED> dump /vdba 1,60884 offset 0 count 128

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 60884  Offsets:    0 to  127 Dba:0x0040edd4

-------------------------------------------------------

 06a20000 d4ed4000 e3580900 00000106 l.?..?í@.?X......

 64610000 01000000 fb000000 de580900 lda......?...?X..

 00000000 02000200 00000000 01002900 l..............).

 15010000 a3008000 ce002700 00800000 l....?...?.'.....

 de580900 01002800 15010000 a4008000 l?X....(.....¤...

 ce003500 06200000 e3580900 01020700 l ?.5....?X......

 ffff2400 021fde1e de1e0000 01000100 l..$...?.?.......

 0600851f 6f1f591f 441f2e1f 181f021f l....o.Y.D.......

 

 <16 bytes per line>

 

我們看一下blockheader 中第一行16個bytes 的架構:

 

Type

Format

Unused

RDBA

SCN Base

SCN Wrap

Seq

Flag

06

a2

0000

d4ed4000

e3580900

0000

01

06

 

在上一節講到不同的blocktype id 代表不同的型別:

06

KTB managed data block (with ITL)

 

我們在dump 一個看看:

 

BBED> dump /v dba 1,6081 offset 0 count128

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 6081   Offsets:    0 to  127 Dba:0x004017c1

-------------------------------------------------------

 10a20000 c1174000 972a0000 00000104 l.?..?.@..*......

 cbf20000 00000000 00000000 00000000 l?ò..............

 00000000 01000000 07000000 20100000 l............ ...

 00000000 01000000 07000000 c3174000 l............?.@.

 00000000 00000000 00000000 01000000 l................

 00000000 00000000 00000000 01000000 l ................

 00000000 7e030000 00000040 c2174000 l....~......@?.@.

 07000000 00000000 00000000 00000000 l................

 

這個block headertype 就變成了10.

 

3.6 print(p)

       Theprint command allows data structures to be printed in raw or formatted output.The DBA, Filename, File, Block and/or Offset to print can be specified with thecommand. If these are not specified the current file, block and offset asestablished with the set command will be printed.

       print命令輸出datastructures。 在使用print時,可以指定dba,block 等引數來限定輸出特定block。      

       Ifthe print command is issued with just the block and offset to print, bbed willdisplay the data structure at that offset.

 

       在3.4 節map裡講了block的結構,在前面,我們講過,可以透過dump 來檢視block 的type。透過print 也可以檢視。現在我們print 一個file 1,block 60811的Data Block Header 的type。

 

BBED> set dba 1,60811

       DBA             0x0040ed8b(4255115 1,60811)

BBED> set offset 0

       OFFSET          0

BBED> p kcbh.type_kcbh

ub1 type_kcbh                               @0        0x06

--type 型別為06.

 

       Itis also possible to use the print command to print individual data structuresby specifying the name.

       可以透過print 輸出指定名稱的block structures。

 

BBED> p kcbh

struct kcbh, 20 bytes                       @0      

  ub1 type_kcbh                           @0        0x06

  ub1 frmt_kcbh                           @1        0xa2

  ub1 spare1_kcbh                         @2        0x00

  ub1 spare2_kcbh                         @3        0x00

  ub4 rdba_kcbh                           @4        0x0040ed8b

  ub4 bas_kcbh                             @8        0x00095560

  ub2 wrp_kcbh                            @12       0x0000

  ub1 seq_kcbh                            @14       0x01

  ub1 flg_kcbh                            @15       0x06 (KCBHFDLC,KCBHFCKV)

  ub2 chkval_kcbh                         @16       0x4667

  ub2 spare3_kcbh                         @18       0x0000

 

       Ifwe wanted to determine the number of rows in the block, we could print the dataheader structure or kdbh:

       如果我們想確定block 中row的數量,可以print data header structure 或者kdbh。

       struct kdbh, 14 bytes

Data Header Structure

 

BBED> p kdbh

struct kdbh, 14 bytes                       @92     

  ub1 kdbhflag                            @92       0x01 (KDBHFFK)

   b1kdbhntab                              @93       2

   b2kdbhnrow                             @94       10

  sb2 kdbhfrre                            @96      -1

  sb2 kdbhfsbo                            @98       42

  sb2 kdbhfseo                            @100      7917

   b2kdbhavsp                             @102      7875

   b2kdbhtosp                             @104      7875

 

We can also specifying certain datastructure elements to print such as the row count:

也可以指定某個具體的structure元素進行print。

BBED> p kdbhnrow

b2 kdbhnrow                                 @94       10

 

該block裡儲存了10行rows。

 

注意:

       當print 一個data structure 時,輸出的格式如下:

              UnitSize* | Name | Offset|  Value

 

       *Unit size is shown in bytes and indicates if the value is signed (s) orunsigned (u).

       Inaddition to printing information about the specified data structure, the printcommand can also be used to print information about thelocation the data structure points to by using the pointer (*) prefix.

       --在pointer 加字首* 可以print location data structure。

      

       For example we can display the block row information by printing the kdbr datastructure,kdbr 裡儲存的是row directory 的資訊。

 

sb2 kdbr[1]

Row Directory

 

BBED> p kdbr

sb2 kdbr[0]                                 @114      8070

sb2 kdbr[1]                                 @116      8053

sb2 kdbr[2]                                 @118      8036

sb2 kdbr[3]                                 @120      8019

sb2 kdbr[4]                                 @122      8002

sb2 kdbr[5]                                 @124      7985

sb2 kdbr[6]                                 @126      7968

sb2 kdbr[7]                                 @128      7951

sb2 kdbr[8]                                 @130      7934

sb2 kdbr[9]                                 @132      7917

 

格式的對應關係:

Unit Size*    |  Name    | Offset |  Value

sb2            kdbr[9]    @132    7917

 

       從上面的結果,可以看出,在這個資料塊裡有10行記錄。 每行的pointer 需要2個bytes來儲存。 這10行row的offset 從114 到132.

       我們可以使用kdbr[0] 作為一個指標來print 它對應的內容。這個kdbr[0] 是一個本地的data structure,我們print 需要加*號字首。

 

BBED> p *kdbr[0]

rowdata[153]

------------

ub1 rowdata[153]                            @8162     0xac

 

       透過這個資訊,我們可以知道該行記錄的偏移量是8162. 我們就dump 它的具體資訊。

 

BBED> d /v dba 1,60811 offset 8162 count128

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 60811  Offsets: 8162 to 8191 Dba:0x0040ed8b

-------------------------------------------------------

 ac000209 00090000 40ed8b00 000040ed l?.......@í....@í

 8b000003 c2052702 c1020106 6055     l ....?.'.?...`U

 

 <16 bytes per line>

 

       Theprint command can also print absolute offsets, although it does not offer thecount option like the dump command:

       print命令也可以直接輸出一個絕對的offset內容。

 

BBED> p offset 8162

rowdata[153]

------------

ub1 rowdata[153]                            @8162     0xac

 

這個輸出結果預設是16進位制的。我們可以將其修改成其他格式。

 

Switch

Display Format

/x

Hex

/d

signed decimal

/u

unsigned decimal

/o

Octal

/c

Character

/n

Oracle Number

/t

Oracle Date

/i

Oracle ROWID

 

BBED> p offset 8162

rowdata[153]

------------

ub1 rowdata[153]                            @8162    0xac

 

BBED> p /d offset 8162

rowdata[153]

------------

ub1 rowdata[153]                            @8162     172

 

3.7 examine(x)

       Theexamine command is used to display data from the block in raw or formattedoutput. The DBA, Filename, File, Block and/or Offset to examine can bespecified with the command. If these are not specified the current file, blockand offset as established with the set command will be examined. If the examinecommand is issued with just the block and offset to examine, bbed will displaythe data structure at that offset.

       --examine命令也是用來顯示datablock的內容的。

       Unlikethe print command it cannot interpret data structures, but it can be used todisplay row information. Combined with knowledge of the data type of the row,it can be used to retrieve complete rows from the block:

       --print命令不能對datastructures 進行一個解釋說明。

 

       Theexamine command will interpret the data in the block according to the followingswitches:

Switch

Display Format

/b

b1, ub1 (byte)

/h

b2, ub2 (half-word)

/w

b4, ub4 (word)

/l

b8, ub8 (long) (was b4/ub4 in Oracle7).

/r

Oracle table/index row

 

       Theexamine command allows switches from the print command to be combined withthese specific switches to interpret data.

       --examine可以根據switch的方式和print 命令進行一個結合來對data 進行解釋說明。

 

       Forexample if we wanted to interpret data as an Oracle table row with the firstcolumn character and the second and third columns numeric, we would execute thecommand as follows:

       BBED>x /rcnn

 

       Thefollowing example shows the print and examine commands being used to step throughthe first and second rows of a block, with the data interpreted as a row in theformat: character, number, number:

 

BBED> set dba 1,60811

       DBA             0x0040ed8b(4255115 1,60811)

 

BBED> p *kdbr[0]

rowdata[153]

------------

ub1 rowdata[153]                            @8162     0xac

 

BBED> x /rcnn

rowdata[153]                                @8162   

------------

flag@8162: 0xac (KDRHFL, KDRHFF, KDRHFH,KDRHFK)

lock@8163: 0x00

cols@8164:    2

kref@8165:    9

mref@8167:    9

hrid@8169:0x0040ed8b.0

nrid@8175:0x0040ed8b.0

 

col   0[3] @8181: ?.'

col   1[2] @8185: 1

 

 

BBED> p *kdbr[1]

rowdata[136]

------------

ub1 rowdata[136]                            @8145     0x6c

 

BBED> x /rcnn

rowdata[136]                                @8145   

------------

flag@8145: 0x6c (KDRHFL, KDRHFF, KDRHFH,KDRHFC)

lock@8146: 0x02

cols@8147:    4

 

col   0[2] @8149: ?.

col   1[1] @8152: 0

col   2[2] @8154: 3

col   3[4] @8157: 42092

 

 

       Arepeat count can also be specified to repeat the examine command for subsequentrows. The following shows the print command being used to position the offsetat the last row and then the next three rows are examined.

       examine命令也可以指定多行進行顯示。 下面的示例我們透過print命令講offset 指向到最後一個位置。 然後repeat 3次。

 

BBED> p kdbhnrow

b2 kdbhnrow                                 @94       10

--這個block上總共有10 個rows。

 

BBED> p *kdbr[9]

rowdata[0]

----------

ub1 rowdata[0]                              @8009     0x6c

--用print 將位置指向最後一個row。

 

BBED> x /3rcnn

rowdata[0]                                  @8009   

----------

flag@8009: 0x6c (KDRHFL, KDRHFF, KDRHFH,KDRHFC)

lock@8010: 0x02

cols@8011:    4

 

col   0[2] @8013: ?.

col   1[1] @8016: 0

col   2[2] @8018: 27

col   3[4] @8021: 52385

 

rowdata[17]                                 @8026   

-----------

flag@8026: 0x6c (KDRHFL, KDRHFF, KDRHFH,KDRHFC)

lock@8027: 0x02

cols@8028:    4

 

col   0[2] @8030: ?.

col   1[1] @8033: 0

col   2[2] @8035: 24

col   3[4] @8038: 42280

 

rowdata[34]                                 @8043   

-----------

flag@8043: 0x6c (KDRHFL, KDRHFF, KDRHFH,KDRHFC)

lock@8044: 0x02

cols@8045:    4

 

col   0[2] @8047: ?.

col   1[1] @8050: 0

col   2[2] @8052: 21

col   3[4] @8055: 42224

--examine 顯示3次。

 

注意:

       Notethat Oracle fills data blocks from the bottom-up, so setting the offset to thefirst row will prohibit the use of the repeat option.

       Oracle使用block 是從底向上的。 如果講offset 設定為0. 那麼將會組織repeat 的操作。

       假如當前current row 是3,repeat 2次,那麼row 3 和row 2 將被顯示。 如果current row 是9, repeat 3次,那麼row 9,row 8 和row 7 將被顯示。

       如果不能滿足repeat,就會返回錯誤。

 

3.8 find(f)

       Thefind command is used to locate data within a block. The command allows hex,string or numeric data to be searched for. The pattern can be searched for fromthe top of the block (offset 0) using the TOP directive, or from the currentposition using the CURR directive.

       find命令可以用來搜尋關鍵字。 可以從offset 0 搜尋到top 或者從當前的offset 搜尋到top。

 

       Switchesare used to determine the data type of the pattern to search for. These areshown below:

Switch

Datatype

/x

Hexadecimal

/d

Decimal

/u

unsigned decimal

/o

Octal

/c

character (native)

Note: Number and Dates are not supported bythe find command.

       find 命令支援的switch 型別如上表,注意,find 不支援number和Date 。

 

示例:

--建立表並insert資料

SYS@dave2(db2)> create table dvd(jobvarchar2(100));

Table created.

SYS@dave2(db2)> insert into dvdvalues('Dave is DBA!');

1 row created.

SYS@dave2(db2)> commit;

Commit complete.

SYS@dave2(db2)> insert into dvdvalues('Dave like Oracle!');

1 row created.

SYS@dave2(db2)> commit;

Commit complete.

 

--檢視block 情況:

SYS@dave2(db2)>  select

rowid,

dbms_rowid.rowid_relative_fno(rowid) rel_fno,

dbms_rowid.rowid_block_number(rowid) blockno,

dbms_rowid.rowid_row_number(rowid) rowno

from dvd;

 

ROWID                 REL_FNO    BLOCKNO     ROWNO

------------------ ---------- --------------------

AAAN9VAABAAAcKiAAA          1    115362          0

AAAN9VAABAAAcKiAAB          1    115362          1

 

--設定block 和 offset

BBED> set file 1

       FILE#           1

 

BBED> set block 115362

       BLOCK#          115362

 

BBED> set offset 0

       OFFSET          0

 

--查詢Dave

BBED> find /c Dave top

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 115362           Offsets: 8155 to 8191           Dba:0x0041c2a2

------------------------------------------------------------------------

 44617665 206c696b 65204f72 61636c65 212c01010c446176 65206973 20444241

 21020616 b3

 

 <32 bytes per line>

bbed 顯示在offset 8155的為位置,我們dump 該offset 看看

 

BBED> d /v dba1,115362 offset 8155 count 128

 File: /u01/app/oracle/oradata/dave2/system01.dbf(1)

 Block: 115362 Offsets: 8155 to 8191 Dba:0x0041c2a2

-------------------------------------------------------

 44617665 206c696b 65204f72 61636c65 l Dave like Oracle

 212c0101 0c446176 65206973 20444241 l!,...Dave is DBA

 21020616 b3                         l !...?

 

 <16 bytes per line>

--結果顯示的頭四個字母就是Dave

 

如果我們要繼續搜尋Dave,那麼只需要按下f 就可以了,不需要跟引數。

BBED> f

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 115362           Offsets: 8176 to 8191           Dba:0x0041c2a2

------------------------------------------------------------------------

 44617665 20697320 44424121 020616b3

 

 <32 bytes per line>

 

BBED> d /v dba1,115362 offset 8176 count 128

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 115362 Offsets: 8176 to 8191 Dba:0x0041c2a2

-------------------------------------------------------

 44617665 20697320 44424121 020616b3 l Dave is DBA!...?

 

 <16 bytes per line>

 

 

3.9 Copy

       Thecopy command is used to copy blocks from one location to another. As with othercommands, the file or filename and offset can be specified, or the DBA can bespecified instead.

 

命令格式如下:

BBED> copy dba 1,115362 to dba 1,115363

copy 是個危險的命令,慎用。

 

3.10 modify(m)

       Themodify command is used to change data inside a block. The DBA, Filename, File,Block and/or Offset to modify can be specified with the command. If these arenot specified the current file, block and offset as established with the setcommand will be modified. Alternatively a symbol or symbol pointer can bespecified for modification.

       Thepattern of bytes used to overwrite the original can be specified inhexadecimal, decimal, unsigned decimal, octal or character data using the sameswitches as the find command.

 

       在file 1,block 115362 有我們的Dave,我們這裡把Dave 改成dmm。

 

BBED> modify /c dmm dba 1, 115362 offset 8155

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 115362           Offsets: 8155 to 8191           Dba:0x0041c2a2

------------------------------------------------------------------------

 646d6d65 206c696b 65204f72 61636c65 212c01010c446176 65206973 20444241

 21020616 b3

 

 <32 bytes per line>

--dump 驗證一下

BBED> d /v dba 1,115362 offset8155 count 128

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 115362 Offsets: 8155 to 8191 Dba:0x0041c2a2

-------------------------------------------------------

 646d6d65 206c696b 65204f72 61636c65 l dmme like Oracle

 212c0101 0c446176 65206973 20444241 l!,...Dave is DBA

 21020616 b3                         l !...?

 

 <16 bytes per line>

--注意,這裡只修改了Dave的前三個字母,即把Dave變成了dmme。

 

注意一點,這裡僅僅是修改,還沒有進行update,即sum apply, select 才會改變。

SYS@dave2(db2)> select * from dvd;

 

JOB

--------------------------------------------------------------------------------

Dave is DBA!

Dave like Oracle!

 

 

3.11 assign

       Theassign command does symbolic assignment, with type and range checking. Eithertarget or source can be omitted for the current offset.

       Forexample, the following command assigns structure at current offset to file 4,block 2 ”s first ITL entry

BBED> assign dba 4, 2 ktbbhitl[0]

 

3.12 sum

       Thesum command is used to check and set the block checksum. The DBA, Filename,File, Block and/or Offset to check can be specified with the command. If theseare not specified the current file, block and offset as established with theset command will be checked.

       Theapply directive can be used to update the checksum.

       我們可以使用bbed 對block 進行修改。 要使這些修改生效,就要使用sum命令。

 

BBED> sum dba 1,115362

Check value for File 1, Block 115362:

current = 0xe5fb, required = 0xe5fb

 

BBED> sum dba 1,115362 apply

Check value for File 1, Block 115362:

current = 0xe5fb, required = 0xe5fb

 

正常情況下,apply 以後,就已改生效了,但是我測試的時候apply 並沒有生效,而是把db 重啟之後,modify 才生效。

 

SYS@dave2(db2)> select * from dvd;

 

JOB

--------------------------------------------------------------------------------

Dave is DBA!

Dave like Oracle!

 

SYS@dave2(db2)> startup force

ORACLE instance started.

 

Total System Global Area  239075328 bytes

Fixed Size                  1218724 bytes

Variable Size              83887964 bytes

Database Buffers          150994944 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

SYS@dave2(db2)> select * from dvd;

 

JOB

--------------------------------------------------------------------------------

Dave is DBA!

dmme like Oracle!

 

 

3.13 push / pop

       Thepush and pop commands are used to push a file, block and offset location onto amemory backed stack and then pop them back. This allows a current locationbeing edited to be temporarily saved while another location is examined ormodified.

Note that the stack only stores the location? it does notsave the contents.

       --push命令將物件放到記憶體的stack,pop 將物件從記憶體寫回磁碟。

 

       Thefollowing example shows file 7, block 16, offset 8163 being examined. Thelocation is saved with the push command. We then move to file 6, block 1 beforereturning to DBA 7,16 with the pop command.

 

BBED> push dba 7,16

DBA 0x01c00010 (29360144 7,16)

OFFSET 8163

 

BBED> set dba 6,1

DBA 0x01800001 (25165825 6,1)

 

BBED> pop

DBA 0x01c00010 (29360144 7,16)

OFFSET 8163

       Thecommand pop all can be used to remove all push‘d entries from the stack. Thecommand show all can be used to show all saved locations.

 

 

3.14 revert

       Therevert command is used to restore a file, filename, block or DBA to it‘soriginal state when bbed was started.

       revert是恢復自bbed 啟動以來的所有修改。

 

BBED> revert dba 1,115362

All changes made to this block will berolled back. Proceed? (Y/N) y

Reverted file'/u01/app/oracle/oradata/dave2/system01.dbf', block 115362

 

BBED> sum dba 1,115362 apply

Check value for File 1, Block 115362:

current = 0xdef7, required = 0xdef7

 

這個block是我們之前修改成dmme 的。 我們應用之後,再次select:

SYS@dave2(db2)> select * from dvd;

 

JOB

--------------------------------------------------------------------------------

Dave is DBA!

dmme like Oracle!

 

還是沒有改變,flush 一下buffer cache之後就更改回來了。我們剛才在之前的測試時,是重啟了DB。 看來也是啟了flush buffer cache的作用。

SYS@dave2(db2)> alter system flushbuffer_cache;

System altered.

 

SYS@dave2(db2)> select * from dvd;

JOB

--------------------------------------------------------------------------------

Dave is DBA!

Dave like Oracle!

 

3.15 undo

       Theundo command rolls back the last modify or assign command. If the undo commandis issued again the modification is re-done.

       undo命令是回滾最後一次的操作。

 

BBED> modify /cdmm dba 1, 115362 offset 8155

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 115362           Offsets: 8155 to 8191           Dba:0x0041c2a2

------------------------------------------------------------------------

 646d6d65 206c696b 65204f72 61636c65 212c01010c446176 65206973 20444241

 21020616 b3

 

 <32 bytes per line>

 

BBED> d /v dba1,115362 offset 8155 count 128

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 115362 Offsets: 8155 to 8191 Dba:0x0041c2a2

-------------------------------------------------------

 646d6d65 206c696b 65204f72 61636c65 l dmmelike Oracle

 212c0101 0c446176 65206973 20444241 l!,...Dave is DBA

 21020616 b3                         l !...?

 

 <16 bytes per line>

 

BBED> undo

BBED>modify /x446176 filename '/u01/app/oracle/oradata/dave2/system01.dbf' block115362. offset 8155.

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 115362           Offsets: 8155 to 8191           Dba:0x0041c2a2

------------------------------------------------------------------------

 44617665 206c696b 65204f72 61636c65 212c01010c446176 65206973 20444241

 21020616 b3

 <32 bytes per line>

--undo 下面的modify是oracle 自己執行的。

 

BBED> d /v dba 1,115362 offset 8155count 128

 File:/u01/app/oracle/oradata/dave2/system01.dbf (1)

 Block: 115362 Offsets: 8155 to 8191 Dba:0x0041c2a2

-------------------------------------------------------

 44617665 206c696b 65204f72 61636c65 l Davelike Oracle

 212c0101 0c446176 65206973 20444241 l!,...Dave is DBA

 21020616 b3                         l !...?

 

 <16 bytes per line>

 

3.16 verify

       Theverify command is used to verify the integrity of the block. It performs asimilar function to the dbverify utility.

       verify命令用來驗證block的完整性。

 

BBED> verify dba 6,15

DBVERIFY - Verification starting

FILE = /u01/app/oracle/oradata/dave2/dave01.dbf

BLOCK = 15

 

 

DBVERIFY - Verification complete

 

Total Blocks Examined         : 1

Total Blocks Processed (Data) : 1

Total Blocks Failing   (Data) : 0

Total Blocks Processed (Index): 0

Total Blocks Failing   (Index): 0

Total Blocks Empty            : 0

Total Blocks Marked Corrupt   : 0

Total Blocks Influx           : 0

 

 

3.17 corrupt

       Thecorrupt command is used to mark blocks as media corrupt.

       corrupt命令將一個block 標記為corrupt,這樣db 在操作時就會跳過該block,從而避免錯誤。

 

BBED> corrupt dba 6,15

Block marked media corrupt

 

Note: The undo command does not undo acorruption. The revert command however does.

注意: undo 命令不能undo 一個corruption,但是revert 命令卻可以。

 

 

 

小結:

       關於bbed 命令的語法部分就這麼多。 下篇將重點看一下BBED 命令的使用。

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

相關文章