下面的示例演示如何恢复已删除的行。当Oracle中的行被删除时,数据实际上并没有被删除。行被简单地标记为已删除,空闲空间计数器和指针也相应地进行了调整。行状态存储在行头中,行头占用每一行的前几个字节。

行头由Row Flag、Lock Byte(ITL entry) and Column Count组成。行头由一个字节大小的 the Row Flag开始,它持有一个位掩码来显示行状态。位掩码解码如下:

因此,适合单个块的列,没有被链接、迁移或集群表的一部分,也没有被删除,将具有以下属性:

Head of Row Piece
First Data Piece
Last Data Piece
因此行标记为32 + 8 + 4 = 44 or 0x2c.使用命令dump alter system dump datafile N block Y,以上格式会显示为 --H-FL--.例如,

SQL>altersystemdumpdatafile5block1551;Systemaltered.Blockheaderdump:0x0140060fObjectidonBlock?Yseg/obj:0x15720csc:0x00.111e90itc:2flg:Etyp:1-DATAbrn:0bdba:0x1400608ver:0x01opc:0inc:0exflg:0ItlXidUbaFlagLckScn/Fsc0x010x0002.00a.0000039c0x00c000fd.00c0.13--U-1fsc0x0000.00111e920x020x0000.000.000000000x00000000.0000.00----0fsc0x0000.00000000bdba:0x0140060fdata_block_dump,dataheaderat0x7fa17e07f264===============tsiz:0x1f98hsiz:0x14pbl:0x7fa17e07f26476543210flag=--------ntab=1nrow=1frre=-1fsbo=0x14fseo=0x1f8davsp=0x1f79tosp=0x1f790xe:pti[0]nrow=1offs=00x12:pri[0]offs=0x1f8dblock_row_dump:tab0,row0,@0x1f8dtl:11fb:--H-FL--lb:0x1cc:1col0:[7]78787873746172end_of_block_dump当一行被删除时,行标志被更新,第5(16)位被设置为高。这意味着对于一个典型的行,标志值现在是32 + 16 +8 +4=60或0x3c。在下面的示例中,我们从表中删除orastar的记录。然后使用find命令,查找被删除的行,并转储块的内容:

BBED>find/cstarFile:/oradata/epmsn/hsql01.dbf(5)Block:1551Offsets:8184to8191Dba:0x0140060f------------------------------------------------------------------------737461720106921e<32bytesperline>BBED>p*kdbr[0]rowdata[0]----------ub1rowdata[0]@81770x2cBBED>d/vdba5,1551offset8177File:/oradata/epmsn/hsql01.dbf(5)Block:1551Offsets:8177to8191Dba:0x0140060f-------------------------------------------------------2c010107787878737461720106921el,...xxxstar....<16bytesperline>BBED>d/vdba5,1551offset8177File:/oradata/epmsn/hsql01.dbf(5)Block:1551Offsets:8177to8191Dba:0x0140060f-------------------------------------------------------2c010107787878737461720106921el,...xxxstar....<16bytesperline>************************************************删除数据SQL>select*fromhsql.test4;CONS_NAME------------------------------xxxstarSQL>deletefromhsql.test4;1rowdeleted.SQL>commit;Commitcomplete.SQL>select*fromhsql.test4;norowsselected********************************end删除数据BBED>d/vdba5,1551offset8177File:/oradata/epmsn/hsql01.dbf(5)Block:1551Offsets:8177to8191Dba:0x0140060f-------------------------------------------------------3c020107787878737461720106a028l<...xxxstar...(<16bytesperline>BBED>modify/x2coffset8177File:/oradata/epmsn/hsql01.dbf(5)Block:1551Offsets:8177to8191Dba:0x0140060f------------------------------------------------------------------------2c020107787878737461720106a028<32bytesperline>BBED>sumdba5,1551applyCheckvalueforFile5,Block1551:current=0x9ec9,required=0x9ec9*********************查询un-delete的数据SQL>select*fromhsql.test4;norowsselectedSQL>altersystemflushbuffer_cache;Systemaltered.SQL>select*fromhsql.test4;CONS_NAME------------------------------xxxstarSQL>