love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

update global_name为空的恢复

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: update global_name为空的恢复

今天突然看到惜分飞的网站上描述关于global_name设置为空的文章,想起以前老熊和dbsnake也都
写过一篇,其中老熊是参考的mos文档1431334.1。我这里也是模仿的他们使用bbed的方式,当是
自己随便玩玩了。大家就不要模仿了。

从上来看来,global_name信息来源于props$数据字典表,而该数据字典表的信息都
集中在一个block上,那就是file 1,block 722.

—-下面是整个模拟过程

那么我们需要定位的这一行记录的准确的位置应该是多少呢?
那根据算法来看,我们这里第25行记录的实际位置应该是:6526+76+(2-1)*24=6626

下面我们开始使用bbed来进行操作:

下面将上面的字符串进行转换:

可以看到global name一共是update了2次,转换以后分别是SEEDDATA,和roger,当然最后我们更新为”了。

我们来看下offset的变化:
初始化:SEEDDATA offset 6938
第一次update: ROGER offset 6676
第二次update: ” offset 6636

我们知道update语句的实质,oracle并没有将原始记录删除,而是是修改了row directory 指针而已。
比如这里,从6676改到了6636. 按照dbsnake的描述,我们只需要将指针修改为回去即可。

那么,能否就在远处修改呢?比如尝试将ff14 直接修改为05 52 4f 47 45 52 14呢? 很显然不行。
因为ff14 对于2个offset,而后面对于7个offset了。

由于2c00030e 是行前面的信息,2c是行头,所以我们在进行修改的时候,offset要向前推进4个offset。
那么应该是offset应该是 6662-4=6658. 此时你观察下面信息你就发现和rowdata的offset是相差了92个offset的。

—- 下面开始进行修改

至此,整个block 校验不再出现任何问题了,最后启动数据库。

再说声明,这样的恢复没有什么实际意义,纯粹是玩玩。

One Response to “update global_name为空的恢复”

  1. Mfkqwyc86 Says:

Leave a Reply

You must be logged in to post a comment.