ODU里unload delete的原理

| No Comments

熊哥ODU302开始加了一个unload delete的功能(只需要把unload_deleted设为yes就可以了),用于在"数据被意外DELETE了,然后日志也被覆盖了,闪回也不行了"了的情况下恢复被delete掉的数据。

 

有没有朋友深究过这里恢复的原理是什么?

 

其实在oracle里,某一行被删掉后,这一行的数据并没有丢,oracle这里只是在行头累加了一个0x10的标记

这就是ODUunload delete的原理。

 

行头的row flag有这样一些值:

#define KDRHFK 0x80  Cluster Key

#define KDRHFC 0x40  Clustered table member

#define KDRHFH 0x20  Head piece of row

#define KDRHFD 0x10  Deleted row

#define KDRHFF 0x08  First data piece|

#define KDRHFL 0x04  Last data piece

#define KDRHFP 0x02  First column continues from Previous

piece

#define KDRHFN 0x01  Last column continues in Next piece

 

A hexadecimal dump of a data block showing an entire row has a row flag value of "2c." This sets the bits KDRHFH, KDRHFF, KDRHFL, which would display as --H-FL-- in a logical dump. That is, the row piece contains the header, the first column, and the last column.

 

这里的含义是一目了然的,2c0x20+0x08+0x04

 

如果这一行被删除了,oracle这里只是在行头累加了一个0x10的标记,也就是说这里的行头的row flag会变成0x20+0x08+0x04+0x100x3c

Leave a comment