Disassembling the Oracle Data Block - A Guide to the BBED
今回はOracleの秘密ツールであるBBEDのガイドをご紹介したいと思います。
BBEDとはBlock Browser and Editorの略で、その名の通りブロックを参照したり
更新したりできるツールです。
Traceファイルなどにブロックダンプを出力せずに対話式で
ブロックの内容を確認できるので便利なツールだと思います。
使用開始にあたっての準備は簡単です。Oracle解説のコーナーで説明しています。
このドキュメントでは後半のExampleコーナーで非常に丁寧に
どのようにBBEDを使用するのかを説明しているので、
英語がわからないとしてもブロックの参照はできると思います。
(もし英語でわからないところがあれば気軽にお尋ねください!)
!!!!要注意!!!!
このツールの勝手な使用はサポート対象外になります。
商用環境での使用はサポートからの明確な指示が無い限り絶対に止めましょう。
もちろんその他の環境での使用もツールの仕様を良く理解した上で
自己責任で利用しましょう。
このツールは便利である反面、悪用するとDBを乗っ取ったり、
ログインや監査をすり抜けてデータを改ざんすることもできる
恐ろしいツールです。もし悪用が起きてしまった場合、今後のリリースで
デフォルトで配置されなくなってしまう可能性があります。
絶対に悪用はやめましょう。
また余程のことが無い限り、editモードを使用するのは止めましょう。
browseモードでブロックの中身を見る程度にしておきましょう。
!!!!要注意 おわり!!!!
引用箇所はDeleteしてしまったレコードを復活するためのExampleです。
(お詫び)
引用PDFファイルがTEXTコピーできない為、全て私自身のタイプ入力です。
誤字などあるかもしれませんのでご注意ください。
このガイドの紹介サイトとしては、PL/SQLの暗号解読の回でご紹介した
Pete Finniganさんが丁寧に解説してくださっているのでそちらをご覧下さい。
(暗号解読の回はこちら:http://imoment.web.fc2.com/20060827.html)
■ Pete Finnigan's Oracle security weblog
http://www.petefinnigan.com/weblog/archives/00000999.htm
■ Excerpt(引用記事)
http://orafaq.com/papers/dissassembling_the_data_block.pdf
___________________________________
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
記事本文
___________________________________
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
◆ Disassembling the Oracle Data Block - A Guide to the BBED
Example #5 - Recovering Deleted / Damaged Data
The following example demonstrates the recovery of deleted data using an
older copy of the data file. This has potential uses for clients who have
deleted or erroneously updated their data, but cannot afford the time
required to restore the database to another location and export the table
to a dump file.
Connect to the database and delete the data from the table
SQL> delete from scott.presidents;
9 rows deleted.
SQL> commit;
Commit complete.
Prepare a bbed parameter file and file list with the current copy of the
data file (with the deleted table) and the one from an older back with the
data still intact.
[oracle@pingu bbed]$ cat bed_copy.par
blocksize=8192
listfile=/home/oracle/bbed/fileunix_copy.log
mode=edit
[oracle@ping bbed]$ cat fileunix_copy.log
1 /home/oracle/OraHome1/oradata/gctdev2/users01.dbf 26214400
2 /gct/oradata/backup2/users01.dbf 26214400
From the current database, determine the number and location of the
blocks that comprise the table affected:
SQL> select owner, segment_name, header_file, header_block, blocks
2 from dba_segments
3 where owner = 'SCOTT' and segment_name = "PRESIDENTS';
OWNER SEGMENT_NAME HEADER_FILE HEADER_BLOCK BLOCKS
-------- -------------- ----------- ------------ ----------
SCOTT PRESIDENTS 7 11 8
So we can see that we need to restore blocks in file 7 from block 11
forward through 8 blocks. However the DBA_SEGMENTS view counts blocks from
zero whereas bbed counts them from one. Therefore the bbed block where the
table starts is in fact block 12. We can verify this with bbed by printing
the ktbbh structure which shows the object id(see the section on the map
command) as follows:
BBED> set dba 1,11
DBA 0X0040000b (4194315 1,11)
BBED> p ktbbh
BBED-00400: invalid blocktype (35)
Block 11 is empty,however when we check block 12:
BBED> set dba 1,12
DBA 0X0040000c (4194316 1,12)
BBED> p ktbbh
struct ktbbh, 72 bytes @20
ub1 ktbbhtyp @20 0x01 (KDDBTDATA)
union ktbbhsid, 4 bytes @24
ub4 ktbbhsg1 @24 0x00006c27
ub4 ktbbhod1 @24 0x00006c27
struct ktbbhcsc, 8 bytes @28
BBEDとはBlock Browser and Editorの略で、その名の通りブロックを参照したり
更新したりできるツールです。
Traceファイルなどにブロックダンプを出力せずに対話式で
ブロックの内容を確認できるので便利なツールだと思います。
使用開始にあたっての準備は簡単です。Oracle解説のコーナーで説明しています。
このドキュメントでは後半のExampleコーナーで非常に丁寧に
どのようにBBEDを使用するのかを説明しているので、
英語がわからないとしてもブロックの参照はできると思います。
(もし英語でわからないところがあれば気軽にお尋ねください!)
!!!!要注意!!!!
このツールの勝手な使用はサポート対象外になります。
商用環境での使用はサポートからの明確な指示が無い限り絶対に止めましょう。
もちろんその他の環境での使用もツールの仕様を良く理解した上で
自己責任で利用しましょう。
このツールは便利である反面、悪用するとDBを乗っ取ったり、
ログインや監査をすり抜けてデータを改ざんすることもできる
恐ろしいツールです。もし悪用が起きてしまった場合、今後のリリースで
デフォルトで配置されなくなってしまう可能性があります。
絶対に悪用はやめましょう。
また余程のことが無い限り、editモードを使用するのは止めましょう。
browseモードでブロックの中身を見る程度にしておきましょう。
!!!!要注意 おわり!!!!
引用箇所はDeleteしてしまったレコードを復活するためのExampleです。
(お詫び)
引用PDFファイルがTEXTコピーできない為、全て私自身のタイプ入力です。
誤字などあるかもしれませんのでご注意ください。
このガイドの紹介サイトとしては、PL/SQLの暗号解読の回でご紹介した
Pete Finniganさんが丁寧に解説してくださっているのでそちらをご覧下さい。
(暗号解読の回はこちら:http://imoment.web.fc2.com/20060827.html)
■ Pete Finnigan's Oracle security weblog
http://www.petefinnigan.com/weblog/archives/00000999.htm
■ Excerpt(引用記事)
http://orafaq.com/papers/dissassembling_the_data_block.pdf
___________________________________
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
記事本文
___________________________________
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
◆ Disassembling the Oracle Data Block - A Guide to the BBED
Example #5 - Recovering Deleted / Damaged Data
The following example demonstrates the recovery of deleted data using an
older copy of the data file. This has potential uses for clients who have
deleted or erroneously updated their data, but cannot afford the time
required to restore the database to another location and export the table
to a dump file.
Connect to the database and delete the data from the table
SQL> delete from scott.presidents;
9 rows deleted.
SQL> commit;
Commit complete.
Prepare a bbed parameter file and file list with the current copy of the
data file (with the deleted table) and the one from an older back with the
data still intact.
[oracle@pingu bbed]$ cat bed_copy.par
blocksize=8192
listfile=/home/oracle/bbed/fileunix_copy.log
mode=edit
[oracle@ping bbed]$ cat fileunix_copy.log
1 /home/oracle/OraHome1/oradata/gctdev2/users01.dbf 26214400
2 /gct/oradata/backup2/users01.dbf 26214400
From the current database, determine the number and location of the
blocks that comprise the table affected:
SQL> select owner, segment_name, header_file, header_block, blocks
2 from dba_segments
3 where owner = 'SCOTT' and segment_name = "PRESIDENTS';
OWNER SEGMENT_NAME HEADER_FILE HEADER_BLOCK BLOCKS
-------- -------------- ----------- ------------ ----------
SCOTT PRESIDENTS 7 11 8
So we can see that we need to restore blocks in file 7 from block 11
forward through 8 blocks. However the DBA_SEGMENTS view counts blocks from
zero whereas bbed counts them from one. Therefore the bbed block where the
table starts is in fact block 12. We can verify this with bbed by printing
the ktbbh structure which shows the object id(see the section on the map
command) as follows:
BBED> set dba 1,11
DBA 0X0040000b (4194315 1,11)
BBED> p ktbbh
BBED-00400: invalid blocktype (35)
Block 11 is empty,however when we check block 12:
BBED> set dba 1,12
DBA 0X0040000c (4194316 1,12)
BBED> p ktbbh
struct ktbbh, 72 bytes @20
ub1 ktbbhtyp @20 0x01 (KDDBTDATA)
union ktbbhsid, 4 bytes @24
ub4 ktbbhsg1 @24 0x00006c27
ub4 ktbbhod1 @24 0x00006c27
struct ktbbhcsc, 8 bytes @28